Source code for metrics.plugins.apm
from collections import defaultdict
from metrics.sc2metric import Sc2MetricAnalyzer
from metrics.util import convert_to_realtime_r
[docs]class APMTracker(object):
"""
Provides ``player.metrics.avg_apm`` which is defined as the sum of
any Selection, ControlGroup, or Command event issued by the player
divided by the number of seconds played by the player (not
necessarily the whole game) multiplied by 60.
APM is 0 for games under 1 minute in length.
*Note: APM is generally calculated starting after an initial time.
For example, APM in Brood War was calculated after the initial
150 seconds of game time. Therefore, actions before 150 seconds
were not counted towards actual APM.
**Note: These APM calculations include the actions taken before 150
seconds, but they do not include that 150 seconds of time, which is
standard among most APM calculators.
"""
name = 'APMTracker'
def __init__(self):
#self._aps = {}
self._actions = defaultdict(int)
self._seconds_played = defaultdict(int)
self.initial_apm_seconds_skipped = 210 #150
def handleInitGame(self, event, replay):
for player in replay.players:
player.metrics = Sc2MetricAnalyzer()
self._actions[player.pid] = 0
self._seconds_played[player.pid] = 0
def handleControlGroupEvent(self, event, replay):
#if event.second > self.initial_apm_seconds_skipped:
self._actions[event.player.pid] += 1
def handleSelectionEvent(self, event, replay):
#if event.second > self.initial_apm_seconds_skipped:
self._actions[event.player.pid] += 1
def handleCommandEvent(self, event, replay):
#if event.second > self.initial_apm_seconds_skipped:
self._actions[event.player.pid] += 1
def handlePlayerLeaveEvent(self, event, replay):
self._seconds_played[event.player.pid] = convert_to_realtime_r(replay, event.second) - self.initial_apm_seconds_skipped #convert_to_realtime_r(replay, self.initial_apm_seconds_skipped)
def handleEndGame(self, event, replay):
for player in replay.players:
if self._actions[player.pid] > 0 and self._seconds_played[player.pid] > 0:
player.metrics.avg_apm = self._actions[player.pid] / self._seconds_played[player.pid] * 60
else:
player.metrics.avg_apm = 0