require 'ebs_sub2.cgi';
require 'doumei.cgi';
$alliance_num = 2; #最大同盟国数(0は無制限)
$penalty_money = 1000; #強制破棄で減る国費の額(0はペナルティなし)
sub ALLIANCE_START{ #エントリ
$gErrMSG_Al = ''; #エラーメッセージ
my %aCookie = ();
if(&nazGetCookie(\%aCookie,$ENV{'HTTP_COOKIE'}) != 0)
{
&ERROR('COOKIEが無効になっています。');
}
&DBM_INPORT(P);
&DBM_INPORT(C);
my @aSelfPerson = split(/\s/,$P{$aCookie{'pname'}});
my @aSelfCntry = split(/\s/,$C{$aSelfPerson[5]});
&ERROR('Passwordが無効です。') if crypt("$aCookie{'pass'}",eb) ne "$aSelfPerson[2]";
if($FORM{'CNTRY'} eq "")
{
#表示のみのものはさっさと返す
&HEADER;
&AL_VIEW(\%C, \@aSelfPerson);
&FOOTER;
return;
}
#操作系で権限がない時はエラー
if( &AL_AUTHORITYCHECK($aSelfPerson[6]) != 0 )
{
&ERROR( $gErrMSG_Al );
}
#各操作系コマンド実行
if ($FORM{'ALLIANCE'} eq "締結")
{
&AL_JOIN($aSelfPerson[5], $FORM{'CNTRY'});
}
elsif ($FORM{'ALLIANCE'} eq "破棄")
{
&AL_CANCEL($aSelfPerson[5],$FORM{'CNTRY'});
}
elsif ($FORM{'ALLIANCE'} eq "強制破棄")
{
&LOCK;
dbmopen (%CNTRY,"$DBM_C",0666);
&AL_FORCECANCEL(\%CNTRY, $aSelfPerson[5], $FORM{'CNTRY'});
dbmclose %CNTRY;
&UNLOCK;
}
if($gErrMSG_Al ne '')
{
#上の操作でエラーになっているのでエラーメッセージ表示
&ERROR( $gErrMSG_Al );
}
&HEADER;
&AL_VIEW(\%C, \@aSelfPerson);
&FOOTER;
}
sub AL_VIEW{ #状態表示(すべての国DataRef,自分のDataRef)
my $aAllCntry = shift;
my $aSelfPerson = shift;
if($aSelfPerson->[5] eq "")
{
$gErrMSG_Al = "$aNone_NATIONALITYは同盟を組めません。";
return;
}
my $aNone = '
−
';
print << "END_OF_HTML";
\n";
}
sub AL_JOIN{ #締結(自国,相手国)
my $aSelfCntryName = shift;
my $aTargCntryName = shift;
my $count = '';
$count = &AL_LIST(\%C,$aSelfCntryName);
if($alliance_num and $count + 1 > $alliance_num){
$gErrMSG_Al = 'これ以上同盟を結べません。';
return;
}
$count = &AL_LIST(\%C,$aTargCntryName);
if($alliance_num and $count + 1 > $alliance_num){
$gErrMSG_Al = '相手国はこれ以上同盟を結べません。';
return;
}
if(&allianceJoin($aSelfCntryName,$aTargCntryName) != 0){
$gErrMSG_Al = $gErrMSG;
return;
}
}
sub AL_CANCEL{ #破棄(自国,相手国)
my $aSelfCntryName = shift;
my $aTargCntryName = shift;
if(&allianceCancel($aSelfCntryName,$aTargCntryName) != 0){
$gErrMSG_Al = $gErrMSG;
return;
}
}
sub AL_FORCECANCEL{ #強制破棄(すべての国,自国,相手国)
my $aAllCntry = shift;
my $aSelfCntryName = shift;
my $aTargCntryName = shift;
my @aSelfCntry = split(/\s/,$aAllCntry->{$aSelfCntryName});
if($aSelfCntry[1] < $penalty_money)
{
$gErrMSG_Al = "国費が足りません。";
return;
}
if(&allianceForceCancel($aSelfCntryName,$aTargCntryName) != 0)
{
$gErrMSG_Al = $gErrMSG;
return;
}
$aSelfCntry[1] -= $penalty_money;
$aAllCntry->{$aSelfCntryName} = "@aSelfCntry";
}
sub AL_AUTHORITYCHECK{ #隊長総帥以外はガード(自分のランク)
my $aMRank = shift;
if($aMRank == 0){
$gErrMSG_Al = '隊長、総帥ランク以外は同盟交渉できません。';
return -1;
}
return 0;
}
sub AL_LIST{ #対象の国の同盟国のリストを返す
my $aAllCntry = shift;
my $aTargCntryName = shift;
my @country = ();
foreach $aName (keys %$aAllCntry)
{
if($aName eq $aTargCntryName){ next;}
if(&allianceCheck($aTargCntryName,$aName) == 0){
push(@country,$aName);
}
}
return @country;
}
sub AL_YOUSAITIMECHECK{ #対象国が同盟国の戦略発動先かチェック(すべての国DataRef,自国,相手国)
my $aAllCntry = shift;
my $aSelfCntryName = shift;
my $aTargCntryName = shift;
my @aAllianceCntry = ();
foreach $aName (&AL_LIST($aAllCntry,$aSelfCntryName)) {
@aAllianceCntry = split(/\s/,$aAllCntry->{$aName});
if($aAllianceCntry[6] eq $aTargCntryName and $aAllianceCntry[7] > time ){
return $aAllianceCntry[7]; #同盟国の戦略の期限
}
}
return 0;
}
sub nazGetCookie{ #クッキー取得(格納するHashRef,元Data)
my $aCkHash = shift;
my $aCkData = shift;
my @aPair = ();
my $aEBData = '';
@aPair = split(/;/, $aCkData);
foreach (@aPair)
{
my ($aKey, $aVal) = split(/=/);
if($aKey eq 'EB')
{
$aEBData = $aVal;
last;
}
}
@aPair = split(/,/, $aEBData);
foreach (@aPair)
{
my($aKey, $aVal) = split(/:/);
$aCkHash->{"$aKey"} = $aVal;
}
return 1 if !$aCkHash->{'pname'};
return 0;
}
1;