diff options
author | Dominique Martinet <asmadeus@codewreck.org> | 2019-01-14 15:22:11 +0900 |
---|---|---|
committer | Dominique Martinet <asmadeus@codewreck.org> | 2019-01-14 15:22:11 +0900 |
commit | 18f3872e68b08ca20b652e5c65f13d67cf710112 (patch) | |
tree | 9546e2e5233e5c256e7fda124dd9f6d4eb490917 | |
parent | 3e85021cc46e062acac5a5a36faac0ec4aded6ee (diff) |
parse v0
-rw-r--r-- | Logs/parse.pl | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/Logs/parse.pl b/Logs/parse.pl new file mode 100644 index 0000000..6c1476a --- /dev/null +++ b/Logs/parse.pl @@ -0,0 +1,150 @@ +#!/usr/bin/perl + +use strict; +#use warnings; + +use Date::Parse; +use Date::Format; +use Data::Dumper qw(Dumper); + +my $debug = 1; +my $me = "Asmadeus"; + +my ($time, $rawtime, $line); +my ($player, $dmg); + +my ($time_start, $time_end); +my %mobs = (); +my %players = (); +my %pets = ( 'Petpower' => 'Novethir', 'Kenaner' => 'Asmadeus' ); + +sub reset_stats { + %mobs = (); + %players = (); + $time_start = 0; + return; +} + +sub print_summary { + foreach my $mob (keys %mobs) { + printf "%s\n", $mob, $mobs{$mob}; + } + my $duration = $time_end - $time_start + 1; + printf "Duration: %d (%s - %s)\n", $duration, time2str("%Y-%m-%d %T", $time_start), time2str("%T", $time_end); + foreach my $player (sort { $players{$b}{total} <=> $players{$a}{total} } keys %players) { + my $player_duration = $players{$player}{time_end} - $players{$player}{time_start} + 1; + printf "%s: total %d (%d, %d, %d)", $player, $players{$player}{total}, $players{$player}{melee}, $players{$player}{dd}, $players{$player}{dot}; + printf " / dps %d (%d, %d, %d)", $players{$player}{total} / $duration, $players{$player}{melee} / $duration, $players{$player}{dd} / $duration, $players{$player}{dot} / $duration; + printf " / sdps %d (%d, %d, %d) (in %ds)\n", $players{$player}{total} / $player_duration, $players{$player}{melee} / $player_duration, $players{$player}{dd} / $player_duration, $players{$player}{dot} / $player_duration, $player_duration; + + } + print Dumper \%players if $debug; + return; +} + +sub add_dd { + my ($mob, $player, $dmg) = @_; + $player = check_pet($player); + $mob = normalize_mob($mob); + $mobs{$mob}++; + $players{$player}{total} += $dmg; + $players{$player}{dd} += $dmg; + $players{$player}{dd_count}++; + $players{$player}{time_start} = $time unless $players{$player}{time_start}; + $players{$player}{time_end} = $time; + if ($line =~ /\(Critical\)/) { + $players{$player}{dd_crit} += $dmg; + $players{$player}{dd_crit_count}++; + } + $time_start = $time unless $time_start; + $time_end = $time; +} + +sub add_dot { + my ($mob, $player, $dmg, $dot) = @_; + $player = check_pet($player); + $mob = normalize_mob($mob); + $mobs{$mob}++; + $players{$player}{total} += $dmg; + $players{$player}{dots}{$dot} += $dmg; + $players{$player}{dot} += $dmg; + $players{$player}{dot_count}++; + $players{$player}{time_start} = $time unless $players{$player}{time_start}; + $players{$player}{time_end} = $time; + if ($line =~ /\(Critical\)/) { + $players{$player}{dot_crit} += $dmg; + $players{$player}{dot_crit_count}++; + } + $time_start = $time unless $time_start; + $time_end = $time; +} + +sub add_melee { + my ($mob, $player, $dmg) = @_; + $player = check_pet($player); + $mob = normalize_mob($mob); + $mobs{$mob}++; + $players{$player}{total} += $dmg; + $players{$player}{melee} += $dmg; + $players{$player}{melee_count}++; + $players{$player}{time_start} = $time unless $players{$player}{time_start}; + $players{$player}{time_end} = $time; + if ($line =~ /\(Critical\)/) { + $players{$player}{melee_crit} += $dmg; + $players{$player}{melee_crit_count}++; + } + $time_start = $time unless $time_start; + $time_end = $time; +} + +sub check_pet { + my ($player) = @_; + $player = $1 if $player =~ /^(.*)`s pet/; + return $pets{$player} ? $pets{$player} : $player; +} + +sub normalize_mob { + my ($mob) = @_; + return ucfirst($mob); +} + +# sub merge_pet { +# my ($pet, $master) = @_; +# $pets{$pet} = $master; +# foreach my $k (keys %players{$pet}) { +# next if $k =~ /time.*/; +# $players{$master}{$k} += $players{$pet}{$k}; +# } +# $players{$master}{time_start} = $players{$pet}{time_start} if $players{$pet}{time_start} < $players{$pet}{time_start}; +# $players{$master}{time_end} = $players{$pet}{time_end} if $players{$pet}{time_end} > $players{$pet}{time_end}; +# undef %players{$pet}; +# } + +while (<>) { + chomp; + next unless /^\[([^]]*)\] (.*)$/; + $time = str2time($1) unless $1 eq $rawtime; + $rawtime = $1; + $line = $2; + if ($time_start && $time > $time_end + 30) { + print_summary(); + reset_stats(); + } + if ($line =~ /^([\w ]+) hit ([\w ]+) for (\d+) points of non-melee damage./) { + add_dd($2, $1, $3); + } + if ($line =~ /^([\w ]+) has taken (\d+) damage from your ([\w .]+)\.($| \(Critical\))/) { + add_dot($1, $me, $2, $3); + } + if ($line =~ /^([\w ]+) has taken (\d+) damage from ([\w .]+) by ([\w ]+)./) { + add_dot($1, $4, $2, $3); + } + if ($line =~ /^([\w ]+) (?:hits?|kicks?|bash(?:es)?|slash(?:es)?|crush(?:es)?|smash(?:es)?|pieces?) ([\w ]+) for (\d+) points of damage./) { + add_melee($2, $1 eq "You" ? $me : $1, $3); + } + # if ($line =~ /^([\w ]+) says, 'My leader is (\w+)./) { + # merge_pet($1, $2); + # } +} + +print_summary() if $time_start; |