diff options
author | Dominique Martinet <asmadeus@codewreck.org> | 2019-01-15 07:49:16 +0900 |
---|---|---|
committer | Dominique Martinet <asmadeus@codewreck.org> | 2019-01-15 07:49:16 +0900 |
commit | faf7fde9ea9f337ddc2ddaae40439d4ae849188f (patch) | |
tree | d3096cda8c541676fa13657b359e310f7148585a | |
parent | e266a250dd8830f71f5bdd9e819da504eae622f1 (diff) |
parser: add pets, forum output, missing melees...
-rw-r--r-- | Logs/parse.pl | 129 |
1 files changed, 100 insertions, 29 deletions
diff --git a/Logs/parse.pl b/Logs/parse.pl index 73c9d31..6a2d8d8 100644 --- a/Logs/parse.pl +++ b/Logs/parse.pl @@ -9,48 +9,108 @@ use Data::Dumper qw(Dumper); my $debug = 0; my $me = "Asmadeus"; -my $interbattle_time = 30; +my $interbattle_time = 15; +my $eq_copypaste_limit = 430; +my $eq_copypaste_prefix = '/9 '; my ($time, $rawtime, $line); my ($player, $dmg); my ($time_start, $time_end); -my %mobs = (); my %players = (); -my %pets = ( 'Petpower' => 'Novethir', 'Kenaner' => 'Asmadeus' ); +my %pets = ( 'Petpower' => 'Novethir', 'Seggl' => 'Waldmaus', 'Shadow' => 'Darkform', + 'Tinkerbelle' => 'Helvetinker', 'Eddepet' => 'Slet', 'Slacker' => 'Ggagar' + ); 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); + + + + + + + + + + + +sub print_forum { + our ($total_damage, $mainmob, $duration); + my $i = 1; + + print "FORUM ----------------------\n"; + printf "[b]Total %s (and possibly friends)[/b]\n", $mainmob; + printf "[b]--- DMG:[/b] %dk @ %ddps (%ds)\n\n", $total_damage/1000, $total_damage/$duration, $duration; + foreach my $player (sort { $players{$b}{total} <=> $players{$a}{total} } keys %players) { + next if $players{$player}{mob}; + next unless $players{$player}{total}; 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; - + printf "[b]#%d %s[/b]\n", $i++, $player; + printf "[b]--- DMG:[/b] %dk @ %ddps (%ds)\n", $players{$player}{total}, $players{$player}{total} / $player_duration, $player_duration; + printf "[b]---- melee:[/b] %dk (%dk (%d%%) crit)\n", $players{$player}{melee} / 1000, $players{$player}{melee_crit} / 1000, $players{$player}{melee_crit} * 100 / $players{$player}{melee} if $players{$player}{melee}; + printf "[b]---- dd:[/b] %dk (%dk (%d%%) crit)\n", $players{$player}{dd} / 1000, $players{$player}{dd_crit} / 1000, $players{$player}{dd_crit} * 100 / $players{$player}{dd} if $players{$player}{dd}; + printf "[b]---- dot:[/b] %dk (%dk (%d%%) crit)\n", $players{$player}{dot} / 1000, $players{$player}{dot_crit} / 1000, $players{$player}{dot_crit} * 100 / $players{$player}{dot} if $players{$player}{dot}; + print "\n"; } +} +sub print_selfdetails { print "\nSelf nuke summary\n"; - my @dds = keys %{$players{$me}{dds_count}}; - foreach my $spell (sort { $players{$me}{dds}{$b} <=> $players{$me}{dds}{$a} } @dds) { + foreach my $spell (sort { $players{$me}{dds}{$b} <=> $players{$me}{dds}{$a} } keys %{$players{$me}{dds_count}}) { printf "%s: %d / %d = %d\n", $spell, $players{$me}{dds}{$spell}, $players{$me}{dds_count}{$spell}, $players{$me}{dds}{$spell} / $players{$me}{dds_count}{$spell}; } print "\nSelf dot summary\n"; - my @dots = keys %{$players{$me}{dots_count}}; - foreach my $spell (sort { $players{$me}{dots}{$b} <=> $players{$me}{dots}{$a} } @dots) { + foreach my $spell (sort { $players{$me}{dots}{$b} <=> $players{$me}{dots}{$a} } keys %{$players{$me}{dots_count}}) { printf "%s: %d / %d = %d\n", $spell, $players{$me}{dots}{$spell}, $players{$me}{dots_count}{$spell}, $players{$me}{dots}{$spell} / $players{$me}{dots_count}{$spell}; } + print "\n"; +} + +sub print_summary { + our $duration = $time_end - $time_start + 1; + our $total_damage; + our $mainmob = 'fight'; + printf "Duration: %d (%s - %s)\n", $duration, time2str("%Y-%m-%d %T", $time_start), time2str("%T", $time_end); + foreach my $player (sort { $players{$b}{damaged} <=> $players{$a}{damaged} } keys %players) { + next unless $players{$player}{mob}; + printf "%s (%dk @%d dps in %d)\n", $player, $players{$player}{damaged} / 1000, $players{$player}{damaged} / $duration, $duration; + $mainmob = $player if $mainmob eq 'fight'; + } + foreach my $player (keys %players) { + next if $players{$player}{mob}; + $total_damage += $players{$player}{total}; + } + + print "\nEQ copypaste string\n"; + my ($eqstring, $len, $i) = ($eq_copypaste_prefix, length $eq_copypaste_prefix, 1); + $eqstring .= sprintf "%s in %ds, ", $mainmob, $duration; + $eqstring .= sprintf "%dk @%ddps --- ", $total_damage / 1000, $total_damage / $duration; + foreach my $player (sort { $players{$b}{total} <=> $players{$a}{total} } keys %players) { + next if $players{$player}{mob}; + next unless $players{$player}{total}; + my $player_duration = $players{$player}{time_end} - $players{$player}{time_start} + 1; + $_ = sprintf "#%d %s %dk@(%d dps in %ds)", $i++, $player, $players{$player}{total}/1000, $players{$player}{total} / $player_duration, $player_duration; + $len += length; + if ($len > $eq_copypaste_limit) { + print $eqstring, "\n"; + $eqstring = $eq_copypaste_prefix; + $len = length $eqstring + length; + } else { + $eqstring .= ", " unless $i == 2; + } + $eqstring .= $_; + } + print $eqstring, "\n"; + + print_selfdetails; + print_forum; print "\n"; print Dumper \%players{$me} if $debug; @@ -61,8 +121,12 @@ sub add_dd { my ($mob, $player, $dmg) = @_; $player = check_pet($player); $mob = normalize_mob($mob); - $mobs{$mob}++; + if ($player eq $me and $mob ne $me) { + $players{$mob}{mob} = 1; + } $players{$player}{total} += $dmg; + $players{$mob}{damaged} += $dmg; + $players{$player}{count}++; $players{$player}{dd} += $dmg; $players{$player}{dd_count}++; $players{$player}{time_start} = $time unless $players{$player}{time_start}; @@ -84,8 +148,9 @@ sub add_dot { my ($mob, $player, $dmg, $dot) = @_; $player = check_pet($player); $mob = normalize_mob($mob); - $mobs{$mob}++; $players{$player}{total} += $dmg; + $players{$mob}{damaged} += $dmg; + $players{$player}{count}++; $players{$player}{dots}{$dot} += $dmg; $players{$player}{dots_count}{$dot}++; $players{$player}{dot} += $dmg; @@ -101,13 +166,16 @@ sub add_dot { } sub add_melee { - my ($mob, $player, $dmg) = @_; + my ($mob, $player, $dmg, $type) = @_; $player = check_pet($player); $mob = normalize_mob($mob); - $mobs{$mob}++; $players{$player}{total} += $dmg; + $players{$mob}{damaged} += $dmg; + $players{$player}{count}++; $players{$player}{melee} += $dmg; $players{$player}{melee_count}++; + $players{$player}{melees}{$type} += $dmg; + $players{$player}{melees_count}{$type} += $dmg; $players{$player}{time_start} = $time unless $players{$player}{time_start}; $players{$player}{time_end} = $time; if ($line =~ /\(Critical\)/) { @@ -135,6 +203,7 @@ sub record_twincast { sub check_pet { my ($player) = @_; $player = $1 if $player =~ /^(.*)`s pet/; + $player = $1 if $player =~ /^(.*)`s warder/; return $pets{$player} ? $pets{$player} : $player; } @@ -165,25 +234,27 @@ while (<>) { print_summary(); reset_stats(); } - if ($line =~ /^([\w ]+) hit ([\w ]+) for (\d+) points of non-melee damage./) { + 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\))/) { + 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 ]+)./) { + 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 `]+) (hits?|kicks?|bash(?:es)?|slash(?:es)?|bit(?:es)?|frenz(?:y|ies)|shoots?|pierces?|stabs?|sweeps?|strikes?|backstabs?|crush(?:es)?|smash(?:es)?|pieces?|claws?|punch(?:es)?) ([\w `]+) for (\d+) points of damage./) { + add_melee($3, $1 eq "You" ? $me : $1, $4, $2); + } elsif ($line =~ /for \d+ points of damage./) { + print "missed line: $line\n" unless $line =~ /The gods have healed/; } # if ($line =~ /^([\w ]+) says, 'My leader is (\w+)./) { # merge_pet($1, $2); # } - if ($line =~ /^(?:(You) begin casting |([\w ]+) begins to cast a spell. <)([\w .-]+)(>|\.)/) { + if ($line =~ /^(?:(You) begin casting |([\w ]+) begins to cast a spell. <)([\w .`-]+)(>|\.)/) { record_spell($1 eq "You" ? $me : $2, $3); } - if ($line =~ /^You twincast ([\w .-]+)\./) { + if ($line =~ /^You twincast ([\w .`-]+)\./) { record_twincast($me, $1); } } |