#!/usr/bin/perl -w my $ENCAPSULATE_TIMEOUT = 10; my $last_encapsulate_time = 0; my $encapsulate_process_flag = 0; my %player_ticks = ( ); my %player_damage = ( ); my $encap_timestamp_str; my %healthstone_watch = ( ); my %arcane_pot_watch = ( ); my @unit_death = ( ); open(LOG, "WoWCombatLog.txt") || die "Cannot open combat log: $!"; while() { my $line = $_; if ($line =~ /.*? (.*?\d+)\s+(.*)/) { #print "Timestamp: $1\n"; #print "Rest: $2\n"; #print "Total seconds: " . timestamp_to_seconds($1) . "\n"; my $timestamp = timestamp_to_seconds($1); my @tokens = split(/,/, $2); if ($timestamp - $last_encapsulate_time >= $ENCAPSULATE_TIMEOUT && $encapsulate_process_flag) { print "$encap_timestamp_str - Encapsulate Results:\n"; #foreach (keys(%player_ticks)) { print " Total ticks and damage:\n"; foreach (order_names_by_tick()) { my $name = $_; my $dmg = $player_damage{$name}; my $ticks = $player_ticks{$name}; print " $name - $ticks ticks, $dmg damage (" . $dmg/$ticks . " damage/tick)\n"; } if ( scalar keys(%healthstone_watch) > 0) { print " People who used Healthstone during that time:\n"; foreach (keys(%healthstone_watch)) { print " $_\n"; } } if (scalar keys(%arcane_pot_watch) > 0) { print " People who used Arcane Potion during that time:\n"; foreach (keys(%arcane_pot_watch)) { print " $_\n"; } } if (scalar @unit_death > 0) { print " People who died during that time:\n"; foreach (@unit_death) { print " $_\n"; } } $encapsulate_process_flag = 0; } if ($tokens[0] eq 'SPELL_DAMAGE' && $tokens[7] == 45662) { $tokens[5] = strip_quotes($tokens[5]); if (!$encapsulate_process_flag) { # New encapsulate. Clear data structurs. %player_ticks = ( ); %player_damage = ( ); %healthstone_watch = ( ); %arcane_pot_watch = ( ); $encap_timestamp_str = $1; @unit_death = ( ); } $encapsulate_process_flag = 1; $last_encapsulate_time = $timestamp; if (!defined($player_ticks{$tokens[5]})) { $player_ticks{$tokens[5]} = 0; } $player_ticks{$tokens[5]}++; if (!defined($player_damage{$tokens[5]})) { $player_damage{$tokens[5]} = 0; } $player_damage{$tokens[5]} += $tokens[10]; #print "Encapsulate: $tokens[5] - $tokens[10]\n"; } if ($tokens[0] eq 'SPELL_HEAL' && $tokens[8] eq '"Master Healthstone"' && $encapsulate_process_flag) { $tokens[2] = strip_quotes($tokens[2]); $healthstone_watch{$tokens[2]} = "y"; } if ($tokens[0] eq 'SPELL_CAST_SUCCESS' && $tokens[8] eq '"Arcane Protection"' && $encapsulate_process_flag) { $tokens[2] = strip_quotes($tokens[2]); $arcane_pot_watch{$tokens[2]} = "y"; } if ($tokens[0] eq 'UNIT_DIED' && $encapsulate_process_flag) { $tokens[5] = strip_quotes($tokens[5]); push(@unit_death, $tokens[5]); } } } close(LOG); sub timestamp_to_seconds { my $timestamp = shift; my @tokens = split(/:/, $timestamp); my $seconds = $tokens[0] * 3600; $seconds += $tokens[1] * 60; $seconds += $tokens[2]; return $seconds; } sub order_names_by_tick { my @names = ( ); foreach(keys(%player_ticks)) { my $name = $_; my $ticks = $player_ticks{$name}; push(@names, $name); my $i = $#names; while($i > 0) { #print "i = $i\n"; #print "Checking $name ($ticks) with $names[$i-1] ($player_ticks{$names[$i-1]})...\n"; if ($ticks > $player_ticks{$names[$i-1]}) { my $temp = $names[$i-1]; $names[$i-1] = $name; $names[$i] = $temp; } $i--; } } return @names; } sub strip_quotes { my $str = shift; return substr($str, 1, length($str)-2); }