use strict qw(vars subs);
use warnings;
use vars qw($ScriptName);
use vars qw(%in @Log $Day $ID $PASS $VillageNm $VillageName %Char $LoginFlag $EndFlag);
#my (%in,%Char,@Log,$ID,$PASS,$Day,$LoginFlag,$EndFlag,$VillageNm,$VillageName,$ajax,$footer);
#
# &Output2(
# 'in' =>{},
# 'Char'=>{},
# 'Log' =>[],
# 'ID' =>'temp',
# 'PASS'=>'temp',
# 'Day' =>0,
# 'LoginFlag' =>1,
# 'EndFlag' =>1,
# 'VillageNm' =>0,
# 'VillageName'=>'test'
# );
# exit;
my ($ajax,$footer);
$footer='';
sub Output
{
if($in{ajax} and $in{Last})
{
&DispAjaxText();
}
else
{
&DispHTML();
}
exit;
}
sub Output2
{
my %args = @_;
%in = %{$args{'in' }};
%Char= %{$args{'Char'}};
@Log = @{$args{'Log'}};
$ID = $args{'ID'};
$PASS= $args{'PASS'};
$Day = $args{'Day'};
$LoginFlag = $args{'LoginFlag'};
$EndFlag = $args{'EndFlag'};
$VillageNm = $args{'VillageNm'};
$VillageName = $args{'VillageName'};
&Output();
}
#---------------------------------------
sub error
{
if($in{ajax} and $in{Last})
{
print "Content-Type: text/xml; charset=utf-8\n\n";
print "-1\n";
print shift;
}
else
{
print <<"ERROR_END";
Content-type: text/html
error
$_[0]
戻る
ERROR_END
}
exit;
}
#■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
sub DispHTML
{
@Log=grep{($in{Day}?$in{Day}-1:$Day)==$_->{'Day'}}@Log;
# ○HEADER部
my $Cookie='';
if($LoginFlag)
{
my @TIM=split(/ +/,localtime(time+86400000));
my $TIM2=$TIM[0].', '.join('-',@TIM[2,1,4]).' '.$TIM[3].' GMT';
$Cookie="Set-Cookie:jinro=${ID}_$PASS; expires=$TIM2;\n";
}
print <<"HEADER_END";
Content-type:text/html
$Cookie
人狼怪奇ファイル:$VillageName
HEADER_END
#-----------------------------------------------------------
if($in{'ajax'})
{
print <<'JAVA_SCRIPT_END';
JAVA_SCRIPT_END
print "";
$ajax=' onSubmit="Send(this);return false;" ';
}
#-----------------------------------------------------------
else
{
print "\n";
}
#-----------------------------------------------------------
print <<"HEADER2_END";
HEADER2_END
#-----------------------------
unless($LoginFlag)
{
print <<"LOGIN_FORM_END";
LOGIN_FORM_END
}
#-------------------
print "\n$VillageName\n
\n";
#===========================================================
# ○BODY
&DispDays();
unless ($in{ajax})
{
&DispLogs();
}
else
{
print '
';
}
&DispForm() ;
#===========================================================
print <<"FOOTER_END";
$footer
FOOTER_END
}
#■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
sub DispAjaxText
{
my $Last = $Log[-1]{Time};
print "Content-Type: text/xml; charset=utf-8\n\n";
print "$Last\n";
exit if $in{Last} eq $Last;
my $today;
my $LastDay=$Log[$#Log]{'Day'};
if($in{Last}==1)
{
$today=$LastDay;
}
else
{
$today = $Log[&BinarySearch($in{'Last'},@Log)]{'Day'};
}
@Log=@Log[&BinarySearch($in{'Last'}+1,@Log) .. $#Log];
@Log=grep{ $_->{'Day'} == $today }@Log; #これも後でバイナリサーチに置き換え
@Log=GrepLog(@Log);
my %Conv=(
'MES'=>'say',
'WIS'=>'whisper',
'GROAN'=>'groan',
'MEMO'=>'think',
'SYS'=>'SYS',
'POW'=>'SYS'
);
foreach(@Log)
{
print "$Char{$_->{'ID'}}{'Name'},$Conv{$_->{'Type'}},$_->{'Time'},$_->{'Message'}\n";
}
if( $today != $LastDay )
{
print ",Next,,\n";
}
}
#■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
#◆ログ表示◆
sub DispLogs
{
#0=>通常発言、1=>独り言、2=>人狼会話、3=>墓会話、4=>アナウンス、5=>投票結果表示,6=>能力結果表示,7=>襲撃結果表示
print "\n\n";
@Log=GrepLog(@Log);
unless($in{'ALL'})
{
@Log=@Log[(@Log<15?0:@Log-15)..$#Log];
}
foreach(@Log)
{
if(defined(&{'Disp'.$_->{'Type'}}))
{
&{'Disp'.$_->{'Type'}}($_);
}
}
print "\n
\n";
}
#◆各ログの処理◆
sub DispMES
{
&DispMessage(shift,'say');
}
sub DispWIS
{
&DispMessage(shift,'whisper');
}
sub DispGROAN
{
&DispMessage(shift,'groan');
}
sub DispMEMO
{
&DispMessage(shift,'think');
}
sub DispKILL
{
&DispMessage(shift,'whisper');
}
sub DispSYS
{
&DispSysMessage(shift);
}
sub DispPOW
{
&DispSysMessage(shift);
}
#---------------------------------------
#◆ログ表示のサブルーチン◆
my @Position=(' center',' left',' right');
sub DispMessage
{
my %Log =%{$_[0]};
my $Detail=$_[1];
my %C =%{$Char{$Log{'ID'}}};
print <<"MESSAGE_H_END";
\n";
}
#-------------------
sub DispSysMessage
{
my %Log =%{$_[0]};
print <<"MESSAGE_END"
MESSAGE_END
}
#■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
sub DispForm
{
if($LoginFlag)
{
&DispActionForm();
}
elsif($Day==0)
{
&DispEntryForm();
}
}
#===========================================================
sub DispEntryForm
{
print <<"ENTRY_FORM_END";
ID、passは再ログイン時に使用します。
IDは村終了後に公開されます。普段使用しているHN等でどうぞ。
Nameには村の中で使用する名前を入力してください。
「ゲーム開始」を押すと1日目が始まります。
占い師が占い先を指定すると2日目が始まります。
それ以降は、全員が投票先を指定した時点で日付が変わります。
ENTRY_FORM_END
$footer='';
}
#===========================================================
sub DispActionForm
{
print <<"FORM_HEADER_END";
FOOTER_END
}
#===========================================================
sub DispCharList
{
my $s=shift;
print qq($Char{$Char{$ID}{$s}}{'Job'} $Char{$Char{$ID}{$s}}{'Name'});
foreach(keys %Char)
{
next if $Char{$_}{'State'} eq 'Dead' or $_ eq '' or $ID eq $_;
print qq( $Char{$_}{'Job'} $Char{$_}{'Name'});
}
}
#■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
sub PowerVillager
{
print <<"DISP_POWER_END";
あなたは、ただの村人です。しかしあなたの推理力や発言が、
村人側の勝利の鍵となるかもしれません。
DISP_POWER_END
}
#-------------------------------------------------
sub PowerWereWolf
{
print <<"POWER_HEADER_END";
POWER_FOOTER_END
}
#-------------------------------------------------
sub PowerLunatic
{
print <<"DISP_POWER_END";
あなたは狂人です。人狼側の勝利を望んでいます。
よって、人狼側の勝利があなたの勝利となります。
人狼側の勝利のため、存分に議論をかきまわして下さい。
DISP_POWER_END
}
#-------------------------------------------------
sub PowerShaman
{
print <<"POWER_HEADER_END";
POWER_FOOTER_END
}
#=================================================
sub PowerSpiritualism
{
print <<"DISP_POWER_END";
あなたは、霊能者です。処刑によって命を失ったものが、人間であったか人狼であったかを知ることができます。
DISP_POWER_END
}
#=================================================
sub PowerHunter
{
print <<"POWER_HEADER_END";
POWER_FOOTER_END
}
#=================================================
sub PowerEsper
{
print <<"POWER_FOOTER_END";
あなたは、共有者です。もうひとりの共有者が誰であるかを知ることができます。
POWER_FOOTER_END
}
#■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
#◆日付表示◆
sub DispDays
{
my @dayCaption=('プロローグ','一日目','ニ日目','三日目','四日目','五日目','六日目','七日目','八日目','九日目');
$dayCaption[$Day]='最新日' if $Day>0;
foreach(0..$Day)
{
print ''.$dayCaption[$_].' ';
}
}
#■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
sub DispTime
{
my($sec, $min, $hour, $mday, $mon, $year, $wday)= localtime(shift);
return ($hour<12?"午前 $hour時 $min分":"午後 ".($hour-12)."時 $min分");
}
sub GrepLog
{
return grep
{
($EndFlag or
(
$_->{'Type'} eq 'MES' or
$_->{'Type'} eq 'SYS' or
#自分のみ
(($_->{'Type'} eq 'MEMO' or $_->{'Type'} eq 'POW') and $ID eq $_->{'ID'}) or
#人狼のみ
(($_->{'Type'} eq 'WIS' or $_->{'Type'} eq 'KILL') and $Char{$ID}{'Role'} eq 'WereWolf') or
#死者のみ
(($_->{'Type'} eq 'GROAN') and $Char{$ID}{'State'} eq 'Dead')
)
)
}@_;
}
return 1;