summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominique Martinet <asmadeus@codewreck.org>2019-01-14 15:22:11 +0900
committerDominique Martinet <asmadeus@codewreck.org>2019-01-14 15:22:11 +0900
commit18f3872e68b08ca20b652e5c65f13d67cf710112 (patch)
tree9546e2e5233e5c256e7fda124dd9f6d4eb490917
parent3e85021cc46e062acac5a5a36faac0ec4aded6ee (diff)
parse v0
-rw-r--r--Logs/parse.pl150
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;