summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominique Martinet <asmadeus@codewreck.org>2019-01-15 07:49:16 +0900
committerDominique Martinet <asmadeus@codewreck.org>2019-01-15 07:49:16 +0900
commitfaf7fde9ea9f337ddc2ddaae40439d4ae849188f (patch)
treed3096cda8c541676fa13657b359e310f7148585a
parente266a250dd8830f71f5bdd9e819da504eae622f1 (diff)
parser: add pets, forum output, missing melees...
-rw-r--r--Logs/parse.pl129
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);
}
}