##################################################################################### # # 攻城戦のログ集計用perlスクリプト 0.5.0b用サブルーチン # # お使いの時は subkoujou_fort.pl の名前を subkoujou.pl に変更して上書き # してください。 # 19th Oct 2004 # ※砦名表示改造(※バグ修正含む) # 12th Nov 2004 # 獲得砦名、RoWikiランキングの砦名、ギルド名にリンクを張るようにしました。 # by 冬物語の人 in Lydia # http://winter.sgv417.jp/ # ###################################################################################### require 5.6.0; use strict; require './timeutil.pl'; require './subhtml.pl'; #--------------------------------------------------------------------------- sub hashAjito($) #ログを読み込んで砦毎のハッシュに砦を落としたギルドとその時間の配列を格納する。 #戻り値は上記のハッシュへのリファレンスを返す。 #ログfile名を引数としてとる。 { my $logfile = shift; my %ajito; my ($timestamp, $ajitoName, $guild); $logfile = 'log\\' . $logfile; open(FH, '<', $logfile) or die "ログファイル$logfileが開けませんでした。\n"; while () { chomp;#改行コードはチョップ next if (/^\s*$/);#スペースのみの行はスキップ next if (/^\s*#/);# '#'から行末まではコメントなのでスキップ ($timestamp, $ajitoName, $guild) = split /\t/; my ($date, $time) = split / /, $timestamp; push @{$ajito{$ajitoName}}, $time . '<>' . $guild; } close(FH); return \%ajito; } #------------------------------------------------------------------------- sub dispAjito($$$) #第1引数: ログファイル名。このファイル名から書き込みファイル名を生成する。 #第2引数: 砦名をキー、時刻とギルドの配列を値としたハッシュへのリファレンス。 #第3引数: 城主リストを格納するハッシュへのリファレンス #戻り値: ギルド毎の集計を格納するハッシュへのリファレンス。 #砦毎の攻城結果を表示しながらギルドの戦歴の配列をハッシュにとる。 #配列には時刻、砦名、保持時間、落としたギルド名、落とされたギルド名を格納 { my ($fileName, $ajito_ref, $castellan_ref) = @_; my (%guild, $preTime, $time, $period, $guildName, $preGuild, $prepreGuild); my $ajitoFile = 'result\\' . $fileName . '_ajito.html'; my $guildFile = './' . $fileName . '_guild.html'; open(FH, '>', $ajitoFile) or die "アジト集計ファイル$ajitoFileが開けませんでした。\n"; htmlhead("$fileName砦別戦績"); ankerlink($ajitoFile); print FH "

$fileName 砦別戦績

\n"; my ($cnt, $firstGuild, $totalCnt); $totalCnt = 0; for my $torideName (sort keys %{$ajito_ref}) { ($time, $period, $guildName) = (); $preTime = '20:00:00'; $preGuild = '前回より保持'; print FH<$torideName EOHTM $cnt = -1; $firstGuild = ''; for (sort @{$$ajito_ref{$torideName}}) { ($time, $guildName) = split /<>/; $period = diffTime($time, $preTime); $firstGuild = $guildName unless ($firstGuild); printf FH "", $time, $period, $guildName; printf FH "\n", $guildName; #砦が落ちたとき以前の砦主をキーとして,配列へのリファレンスを値とするハッシュに格納 #配列に格納されるのは砦奪取時刻、保持時間、砦名、やっつけたギルド、やられたギルド if ($preGuild ne '前回より保持') { push @{$guild{$preGuild}}, $preTime . '<>' . $period . '<>' . $torideName . '<>' . $prepreGuild . '<>' . $guildName; } $prepreGuild = $preGuild; $preGuild = $guildName; $preTime = $time; $cnt++; } print FH "
陥落時刻 陥落に要した時間 奪取したギルド名
%s%s%s
\n"; #最終的な砦主について $period = diffTime('22:00:00', $preTime); push @{$guild{$preGuild}}, $preTime . '<>' . $period . '<>' . $torideName . '<>' . $prepreGuild . '<>防衛'; #最終結果書き出し printf FH "陥落回数%d回  商業値 -%d
\n", $cnt, $cnt * 5; $totalCnt += $cnt; if ($cnt == 0) { print FH "完全防衛
\n"; } elsif ($preGuild eq $firstGuild) { print FH "陥落後奪回
\n"; } print FH "最終的な砦主は[$preGuild]
\n"; #城主ファイル作成のためハッシュにとっておく $$castellan_ref{$torideName} = $preGuild . '<>' . $period; } print FH "
\n"; printf FH "

総陥落回数 %d回

\n

平均保持時間%s

\n", $totalCnt, modTime('40:00:00', $totalCnt); print FH "
\n"; ankerlink($ajitoFile); htmltail(); close(FH); return \%guild; } #------------------------------------------------------------------------- sub dispGuild($$$$$) #第1引数: ログファイル名。このファイル名から書き込みファイル名を生成する。 #ギルド戦績が格納されたハッシュへのリファレンスを第2引数としてとる。 #キーがギルド名要素は、そのギルドの戦績のリスト。 #ランキング集計用ハッシュへのリファレンスを第3〜5引数として受け取る。 { my ($fileName, $guild_ref, $cnt_ref, $total_ref, $longest_ref) = @_; my ($cnt, $totalTime, $longestTime); #ランキング集計用変数 my $guildFile = 'result\\' . $fileName . '_guild.html'; my $ajitoFile = './' . $fileName . '_ajito.html'; open(FH, '>', $guildFile) or die "ギルド集計ファイル$guildFileが開けませんでした。\n"; htmlhead('ギルド別戦績'); ankerlink($guildFile); print FH "

$fileName ギルド別戦績

"; for my $guildName (sort keys %$guild_ref) { print FH<[$guildName] の戦績 EOHTM my ($time, $period, $ajito, $win, $lost); #ランキング集計用変数初期化 ($cnt, $totalTime, $longestTime) = (0, 0, '00:00:00'); for (sort @{$$guild_ref{$guildName}}) { ($time, $period, $ajito, $win, $lost) = split /<>/; printf FH "", $time, $period; printf FH "", $ajito; printf FH "", $win; printf FH "", $lost; $cnt++; $totalTime += str2sec($period); $longestTime = (timecmp($longestTime, $period) > 0) ? $longestTime: $period; } print FH "
奪取時刻 保持時間 砦名 落としたギルド 落とされたギルド
%s%18s%18s%24s%24s
"; print FH "砦奪取回数 $cnt回
\n"; printf FH "総支配時間 %s
\n", sec2str($totalTime); print FH "最長支配時間 $longestTime
\n"; print FH "
\n"; $$cnt_ref{$guildName} = $cnt; $$total_ref{$guildName} = $totalTime; $$longest_ref{$guildName} = $longestTime; } ankerlink($guildFile); htmltail(); close(FH); } #------------------------------------------------------------------------- sub dispRanks($$$$$) #ランキング表示 #第1引数: ログファイル名。このファイル名から書き込みファイル名を生成する。 #砦奪取回数、保持時間総合計、最長保持時間のそれぞれにてランキング表示 { my ($fileName, $cnt_ref, $total_ref, $long_ref, $castellan_ref) = @_; my $cnt; my $rankFile = 'result\\' . $fileName . '_rank.html'; my $guildFile = './' . $fileName . '_guild.html'; my $ajitoFile = './' . $fileName . '_ajito.html'; open(FH, '>', $rankFile) or die "ランキング集計ファイル$rankFileが開けませんでした。\n"; htmlhead('ランキング戦績'); ankerlink($rankFile); print FH "

$fileName各種ランキング

"; #奪取回数ランキング print FH "

砦奪取回数

"; print FH ""; $cnt = 1; for (sort{scalar($$cnt_ref{$b}) <=> scalar($$cnt_ref{$a})} keys %$cnt_ref) { printf FH "\n", $cnt++; printf FH "\n", $$cnt_ref{$_}; &getCastle($_, $ajitoFile, $castellan_ref); # if (isCastellan($_, $castellan_ref)) { # print FH "\n"; # } else { # print FH "\n"; # } printf FH "\n", $_; } print FH "
順位回数砦主ギルド名
%3d位%3s回 %s
"; #砦保持時間ランキング print FH "

砦保持時間総計

"; print FH ""; my $total; $cnt = 1; for (sort{scalar($$total_ref{$b}) <=> scalar($$total_ref{$a})} keys %$total_ref) { $total = sec2str($$total_ref{$_}); printf FH "", $cnt++; printf FH "", $total; &getCastle($_, $ajitoFile, $castellan_ref); # if (isCastellan($_, $castellan_ref)) { # print FH "\n"; # } else { # print FH "\n"; # } printf FH "", $_; } print FH "
順位時間砦主ギルド名
%3d位%s %s
"; #砦最長保持時間ランキング print FH "

最長保持時間

"; print FH ""; $cnt = 1; for (sort{scalar($$long_ref{$b}) cmp scalar($$long_ref{$a})} keys %$long_ref) { printf FH "", $cnt++; printf FH "", $$long_ref{$_}; &getCastle($_, $ajitoFile, $castellan_ref); # if (isCastellan($_, $castellan_ref)) { # print FH "\n"; # } else { # print FH "\n"; # } printf FH "", $_; } print FH "
順位時間砦主ギルド名
%3d位%s %s
"; #RoWikiRank print FH "

RoWikiPoint

"; print FH ""; rankRoWiki($ajitoFile, $guildFile, $castellan_ref); print FH "
ギルド名ポイント
"; ankerlink($rankFile); htmltail(); close(FH); } #----------------------------------------------------------------------------- sub dispCastellan($$) #ファイルを生成して最終城主リストを書き込む #このファイルは次週初めの砦持ちを読み込むために使用する。 #ファイル名はworld名日付.lstとする。 #引数は用意されたcsvファイル名を与える。 { my ($listFile, $castellan_ref) = @_; $listFile = 'log\\' . $listFile . '_toridenusi.lst'; open(FH, '>', $listFile) or die "砦主リストファイル$listFileが開けません\n"; print FH "######### 最終城主リスト ##########\n"; print FH "$_\t$$castellan_ref{$_}\n" for (sort keys %$castellan_ref ); close(FH); } #-# 改造部分 sub isCastellan($$) #第一引数ギルド名、第二引数砦持ちハッシュ #ギルドが砦持ちなら1,宿無しなら''を返す。 { my ($guildName, $castellan_ref) = @_; my ($guild , $temp); # $_ はいじらない for (values %$castellan_ref) { ($guild, $temp) = split /<>/, $_; # ギルド名だけを取り出す return 1 if ($guildName eq $guild); } return ''; } sub rankRoWiki($$) #最終城主の一覧リストを作成 #落城時間からポイントを算出 { my ($ajitoFile, $guildFile, $castellan_ref) = @_; my %rate = ('Britoniah' => 1.5, 'Chung-Rim' => 1.2, 'Luina' => 1, 'Valkyrie' => 0.5); my ($toride, $guild, $period, $point); for (sort keys %$castellan_ref) { ($toride, undef, undef) = split/ /, $_; ($guild, $period) = split/<>/, $$castellan_ref{$_}; $period = str2sec($period); $period = int($period / 60) + ($period % 60 ? 1 : 0); $point = $rate{$toride} * (5 + int($period / 5) + ($period % 5 ? 1 : 0) + ($period >= 120 ? 6 : 0)); $point = int($point); print FH "$_$guild$point\n"; } } sub getCastle($$) #砦名を取得 { my ($guildName, $ajitoFile, $castellan_ref) = @_; if (isCastellan($_, $castellan_ref)) { print FH ""; my($fortress, $fort, $guild, $temp, $flag); $flag = 0; while (($fort, $guild) = each(%$castellan_ref)) { ($guild, $temp) = split /<>/, $guild; # ギルド名だけを取り出す $fortress = $fort; if ($_ eq $guild){ if ($flag == 1){ print FH ","; # 砦名の間の区切り文字 } if ($fort =~ /^(\w)(.+) (\w+) (\d)/){ $fort = $1.$4; } print FH "$fort"; $flag = 1; # 次の砦の前にスペースを入れるための判定 } } print FH "\n"; } else { print FH " \n"; } } 1; __END__