--- t2matchlog/t2matchlog 2003/12/21 00:09:21 45 +++ t2matchlog/t2matchlog 2003/12/21 00:09:48 46 @@ -8,7 +8,7 @@ my $outdir = $ARGV[1]; mkdir $outdir or die "Failed to create output directory $outdir: $!"; my $dir = $0; -$dir =~ s!(^|/)[^/]+$!$1!; +$dir =~ s#(^|/)[^/]+$#$1#; (system "cp ${dir}t2matchlog.css $outdir/") == 0 or die "Failed to copy stylesheet: $!"; $/ = "\r\n"; @@ -70,24 +70,29 @@ $icon{'solar'} = load_image("${dir}icons/com_icon_solar_gen.png"); my %colour = ('S' => 0xffff00, 'A' => 0xff8000, 'KK' => 0x00ff00, 'K' => 0xff0000, + 'KS' => 0xff0000, 'L' => 0xff8000, 'F+' => 0x00ffff, 'F-' => 0xff00ff, 'P' => 0xff8000, 'V' => 0xffff00, 'W' => 0xff0000, 'G' => 0x0080ff, 'J' => 0x00ff80, - 'GG' => 0x0080ff, 'JJ' => 0x00ff80); + 'GG' => 0x0080ff, 'JJ' => 0x00ff80, + 'C' => 0x00ff00, 'R' => 0x00ff00); my $colour_me = 0xffffff; my %desc = ('S' => 'spawned on team $team_name[$p1]', 'A' => '$p1 armour', 'KK' => 'killed $enemy using $DamageTypeText[$p2]', 'K' => 'killed by $DamageTypeText[$p2] $enemy', + 'KS' => 'killed himself using $DamageTypeText[$p2]', 'L' => 'left the game', - 'F+' => 'took the $team_name[$p1] flag', - 'F-' => 'dropped the $team_name[$p1] flag', + 'F+' => '${melink}took the $team_name[$p1] flag', + 'F-' => '${melink}dropped the $team_name[$p1] flag', 'P' => '$p1', 'V' => 'vehicle created', 'W' => 'vehicle destroyed', 'G' => 'entered " . vehicle_link($p1) . " as ${seat{$p2}}', 'J' => 'ejected from vehicle', 'GG' => '$p1 entered as ${seat{$p2}}', - 'JJ' => '$p1 ejected'); + 'JJ' => '$p1 ejected', + 'C' => '${melink}captured the $team_name[$p1] flag!', + 'R' => '${melink}returned the $team_name[$p1] flag',); my @teamcol = (0xffffff, 0x0000ff, 0xff00ff); my %seat = ('' => 'a passenger', 'p' => 'pilot', 'w' => 'gunner'); my %veh_name = ('BomberFlyer' => 'Bomber', @@ -108,11 +113,16 @@ my %score = (); my %kills = (); my %deaths = (); +my %grabs = (); +my %caps = (); +my %returns = (); my %player = (); my %vehicle = (); my %team = (); my $end_time; my (@final_score, @team_name); +my %flag = (); +my @flag_coords = (); read_data(); print ".\n"; @@ -132,6 +142,12 @@ write_vehicle_report($name, $team); print ".\n"; } +my $team; +foreach $team (keys %flag) { + print "$team_name[$team] flag"; + write_flag_report($team); + print ".\n"; +} write_summary_report(); exit; @@ -180,6 +196,7 @@ my %name = (); my @flag_carrier; my %player_veh; + my %player_flag; while () { chomp; @@ -200,20 +217,22 @@ } elsif ($cmd eq 'K') { # player killed my ($victim, $killer, $weapon) = split / /, $params; + next unless exists $name{$victim}; $deaths{$name{$victim}}++; $kills{$name{$killer}}++ if exists $name{$killer}; push @events, [$time, 'K', $name{$victim}, $name{$killer}, $weapon]; push @events, [$time, 'KK', $name{$killer}, $name{$victim}, $weapon] - if exists $name{$killer}; + if exists $name{$killer} and $killer != $victim; if (exists $name{$killer} and $player_veh{$name{$killer}}) { push @events, [$time, 'KK', $name{$player_veh{$name{$killer}}}, $name{$victim}, $weapon]; } # if (defined $player_veh{$name}) TODO - delete $name{$victim}; + # delete $name{$victim}; } elsif ($cmd eq 'L') { # player left my ($id, $score) = split / /, $params; + next unless exists $name{$id}; push @events, [$time, 'L', $name{$id}]; $score{$name{$id}} += $score; delete $name{$id}; @@ -252,10 +271,13 @@ } elsif ($cmd eq 'F') { # flag position my ($team, @data) = split / /, $params; my $carrier; + $flag{$team} = 1; + $team{"$team flag"} = $team; $flag_carrier[$team] = 0 unless defined $flag_carrier[$team]; if (@data == 3) { my ($x, $y, $z) = @data; $x -= $x0; $y = $height - $y + $y0; + ${$coords[$time]}{"$team flag"} = "$x $y $z"; $carrier = 0; } else { $carrier = $name{$data[0]}; @@ -263,13 +285,27 @@ if ($carrier ne $flag_carrier[$team]) { if ($flag_carrier[$team]) { push @events, [$time, 'F-', $flag_carrier[$team], $team]; + delete $player_flag{$flag_carrier[$team]}; } if ($carrier) { push @events, [$time, 'F+', $carrier, $team]; + $grabs{$carrier}++; + $player_flag{$carrier} = $team; } $flag_carrier[$team] = $carrier; } + } elsif ($cmd eq 'C') { # flag captured (CTF) + my ($team, $id) = split / /, $params; + push @events, [$time, 'C', $name{$id}, $team]; + $flag_carrier[$team] = 0; + $caps{$name{$id}}++; + + } elsif ($cmd eq 'R') { # flag returned (CTF) + my ($team, $id) = split / /, $params; + push @events, [$time, 'R', exists $name{$id} ? $name{$id} : '', $team]; + $returns{$name{$id}}++; + } else { # player / vehicle position my $id = $cmd; next unless exists $name{$id}; @@ -292,6 +328,9 @@ } $player_veh{$name} = $vehicle; } + if (exists $player_flag{$name}) { + ${$coords[$time]}{$player_flag{$name} . " flag"} = "$x $y $z"; + } } } $end_time = $time + 1; @@ -343,17 +382,29 @@ my $time0 = shift; my $time1 = shift; - my $prev_time = -1; - - my $html = "\n"; - my $im = create_image(); plot_route($im, $player, $time0, $time1); my @evs = grep {$$_[2] eq $player and $time0 <= $$_[0] and $$_[0] <= $time1} @events; + my $html = write_events($player, \@evs, $im); + + save_image($im, $imname); + + return $html; +} + +#################################################################################################### + +sub write_events { + my $player = shift; + my $evs = shift; + my $im = shift; + + my $prev_time = -1; + my $html = "
\n"; my $event; - foreach $event (@evs) { + foreach $event (@$evs) { my ($time, $ev, $me, $p1, $p2) = @$event; my $nicetime = nice_time($time); @@ -363,8 +414,14 @@ $html .= ""; } + my $melink = ''; my $enemy = ''; - if (($ev eq 'K' or $ev eq 'KK') and defined $p1) { + $ev = 'KS' if ($ev eq 'K' and defined $p1 and $p1 eq $player); + if (defined $me and $me ne $player) { + my $sname_me = safe_name($me); + $melink = "$me "; + } + if (defined $p1) { my $sname_en = safe_name($p1); $enemy = "$p1"; } @@ -383,7 +440,6 @@ } $html .= "
$nicetime
\n"; - save_image($im, $imname); return $html; } @@ -485,6 +541,67 @@ #################################################################################################### +sub write_flag_report { + my $team = shift; + + my $html = create_html($team_name[$team] . ' flag'); + + my @grab; + my @return; + + my @fevs = grep {($$_[1] eq 'F+' or $$_[1] eq 'F-' or $$_[1] eq 'C' or $$_[1] eq 'R') and + $$_[3] == $team} @events; + my $event; + my $at_stand = 1; + foreach $event (@fevs) { + if ($at_stand and $$event[1] eq 'F+') { + push @grab, $$event[0]; + $at_stand = 0; + } elsif (!$at_stand and ($$event[1] eq 'C' or $$event[1] eq 'R')) { + push @return, $$event[0]; + $at_stand = 1; + } + } + + for (my $grab = 0; $grab != @grab; $grab++) { + my $nicetime = nice_time($grab[$grab]); + my $nicedtime = nice_time($return[$grab]); + my $grab1 = $grab + 1; + $html .= <

Grab $grab1 ($nicetime - $nicedtime)

+
+END + + my $im = create_image(); + plot_route($im, "$team flag", $grab[$grab], $return[$grab] - 1); + + my @fevs; + my $carrier = ''; + foreach $event (grep {$grab[$grab] <= $$_[0] and $$_[0] <= $return[$grab]} @events) { + if ($$event[1] eq 'F+' and $$event[3] == $team) { + $carrier = $$event[2]; + } elsif (($$event[1] eq 'F-' or $$event[1] eq 'C' or $$event[1] eq 'R') + and $$event[3] == $team) { + $carrier = ''; + } elsif ($$event[1] eq 'K' and $$event[2] eq $carrier) { + ; + } else { + next; + } + push @fevs, $event; + } + $html .= write_events("$team flag", \@fevs, $im); + $html .= ''; + + save_image($im, "${team}_flag_$grab1.png"); + } + + save_html("${team}_flag.html", $html); +} + +#################################################################################################### + sub write_summary_report { my $html = create_html("Match Summary"); my $name; @@ -500,34 +617,53 @@ for ($i = 1; $i != @team_name; $i++) { $html .= "${team_name[$i]}${final_score[$i]}\n"; } + $html .= "\n"; + + my $team; + foreach $team (keys %flag) { + $html .= "

${team_name[$team]} flag

\n"; + } $html .= < +

Players and Vehicles

- + END + sub lookup { + my $hash = shift; + my $name = shift; + my $max = 0; grep { $max = $_ if $max < $_ } values %$hash; + my $n = exists $$hash{$name} ? $$hash{$name} : 0; + return $n == $max ? "" : ""; + } + foreach $name (sort keys %player) { my $sname = safe_name($name); - my $score = exists $score{$name} ? $score{$name} : 0; - my $deaths = exists $deaths{$name} ? $deaths{$name} : 0; - my $kills = exists $kills{$name} ? $kills{$name} : 0; - $html .= < -END + $html .= "" . + "" . + lookup(\%score, $name) . + lookup(\%deaths, $name) . + lookup(\%kills, $name) . + lookup(\%grabs, $name) . + lookup(\%caps, $name) . + lookup(\%returns, $name) . + "\n"; } $html .= "
PlayerTeamScoreDeathsKills
PlayerTeamScoreDeathsKillsGrabsCapsReturns
$n$n$name$team_name[$team{$name}]$score$deaths$kills
$name$team_name[$team{$name}]
\n"; - $html .= "\n"; - foreach $vehicle (sort keys %vehicle) { - my ($team, $name) = split / /, $vehicle, 2; - my $sname = safe_name($name); - $html .= < END + } + $html .= "
VehiclesTotal used
$team_name[$team] $veh_name{$name}s${vehicle{"$team $name"}}
\n"; } - $html .= "\n"; save_html('index.html', $html); save_image($imall, 'Overview.png');