X-Git-Url: http://git.shiar.net/perl/schtarr.git/blobdiff_plain/5e197a36431a61974bd5d0a158d2d9855aac1baf..a6843225598eb51580b75a4131386b45e5617d4c:/screp diff --git a/screp b/screp index 910f3d2..4b896b5 100755 --- a/screp +++ b/screp @@ -3,11 +3,15 @@ use strict; use warnings; use Data::Dumper; +our $VERSION = '1.00'; + my $SHOWWARN = 0; +my $APMSVG = undef; -use Getopt::Long; +use Getopt::Long qw(:config bundling auto_version auto_help); GetOptions( "verbose|v!" => \$SHOWWARN, + "apm|a=s" => \$APMSVG, ); use constant { APM_FIRSTFRAME => 80 / .042 }; @@ -455,7 +459,7 @@ for (0 .. 11) { my $number = shift @playdata; defined $player[$number] and warn "Player #$number redefined"; my ($data) = unpackhash("VcccZ25", shift @playdata, qw( - slot type race unknown name + slot type race team name )); defined $race[$_] ? ($data->{race} = $race[$_]) : warn "Unknown race #$_ for player $number" @@ -520,7 +524,8 @@ for my $player (sort keys %stats) { $row->{last} ||= $map->[-1][0]; # printf("%-16s%6d actions (%3d micro,%4d macro);%4d APM\n", my $name = showplayer($player); - printf("%-16s%6d actions in%7d frames (%s) = %d APM\n", + printf("%d %-16s%6d actions in%7d frames (%s) = %d APM\n", + $row->{slot}, $name, $row->{actions}, $row->{last}, showtime($row->{last}), # $row->{micro} / $row->{last} * 60 / .042 * 1.05, @@ -557,3 +562,81 @@ for my $player (sort keys %stats) { ) if 0; } +if ($APMSVG) { + my @seq; # player => time (s) => actions + $seq[$_->[1]][$_->[0] * .042]++ for @$map; + my $flatten = 120; + my @apm; + for my $player (0 .. $#seq) { + my $range = 0; + $range += $seq[$player][$_] || 0 for 0 .. $flatten - 1; + my $leadfill = $range / $flatten; + for my $frame (0 .. $#{$seq[$player]}) { + $range += $seq[$player][$frame] || 0; + $range -= $frame < $flatten ? $leadfill : + $seq[$player][$frame - $flatten] || 0; + $apm[$player][$frame] = $range / $flatten; + } + } + + BEGIN { unshift @INC, '.' } + use SVG::TT::Graph::TimeSeries; + my $graph = SVG::TT::Graph::TimeSeries->new({ + height => 1200, + width => 1600, + style_sheet => "apm.css", + show_data_values => 0, + show_data_points => 0, + x_label_format => '%k:%M', + key => 1, + timescale_divisions => "5 minutes", + # compress => 1, + }); + + for my $player (0 .. $#apm) { + $graph->add_data({ + data => [map { + time2str('%Y-%m-%d %X', 946681200 + $_), + $apm[$player][$_] * 60 + } 0 .. $#{$apm[$player]} ], + title => showplayer($player), + }); + } + + my ($name) = $APMSVG =~ /([^.]+)/; + my $title = "APM timeline" . ($name && " for $name"); + my $lead = sprintf "\n%s", $title; + + my $svg = $graph->burn(); + s/^[ \t\r]+\n//gm, # remove lines with only whitespace (many useless ^M) + s/[ \t\r]+$//gm, # trailing whitespace + s/ {4}\r*/\t/g, # tabs for indenting + s/^(]*>)/${1}100%${2}100%$3$lead/m, + for $svg; # cleanup xml + + open my $apmfile, '>', "$APMSVG.svg"; + print $apmfile $svg; +} + +__END__ + +=head1 NAME + +screp - StarCraft replay parser + +=head1 SYNOPSIS + +screp [options] < [replay data] + + Options: + --verbose + --apm + +=head1 OPTIONS + +=head1 AUTHOR + +Mischa POSLAWSKY + +=head1 STUFF +