def test_gameheartnormalizer_plugin(self): from sc2reader.engine.plugins import GameHeartNormalizer sc2reader.engine.register_plugin(GameHeartNormalizer()) # Not a GameHeart game! replay = sc2reader.load_replay("test_replays/2.0.0.24247/molten.SC2Replay") player_pids = set([ player.pid for player in replay.players]) spawner_pids = set([ event.player.pid for event in replay.events if "TargetAbilityEvent" in event.name and event.ability.name == "SpawnLarva"]) self.assertTrue(spawner_pids.issubset(player_pids)) replay = sc2reader.load_replay("test_replays/gameheart/gameheart.SC2Replay") self.assertEqual(replay.events[0].frame, 0) self.assertEqual(replay.game_length.seconds, 636) self.assertEqual(len(replay.observers), 5) self.assertEqual(replay.players[0].name, 'SjoWBBII') self.assertEqual(replay.players[0].play_race, 'Terran') self.assertEqual(replay.players[1].name, 'Stardust') self.assertEqual(replay.players[1].play_race, 'Protoss') self.assertEqual(len(replay.teams), 2) self.assertEqual(replay.teams[0].players[0].name, 'SjoWBBII') self.assertEqual(replay.teams[1].players[0].name, 'Stardust') self.assertEqual(replay.winner, replay.teams[1]) replay = sc2reader.load_replay("test_replays/gameheart/gh_sameteam.SC2Replay") self.assertEqual(replay.events[0].frame, 0) self.assertEqual(replay.game_length.seconds, 424) self.assertEqual(len(replay.observers), 5) self.assertEqual(replay.players[0].name, 'EGJDRC') self.assertEqual(replay.players[0].play_race, 'Zerg') self.assertEqual(replay.players[1].name, 'LiquidTaeJa') self.assertEqual(replay.players[1].play_race, 'Terran') self.assertEqual(len(replay.teams), 2) self.assertEqual(replay.teams[0].players[0].name, 'EGJDRC') self.assertEqual(replay.teams[1].players[0].name, 'LiquidTaeJa') self.assertEqual(replay.winner, replay.teams[0])
def test_worker_milestones(): replay = sc2reader.load_replay( 'replays/Nerchio vs Neeb ZvP Newkirk Precinct TE (Void) WCS Austin.SC2Replay', engine=sc2reader.engine.GameEngine(plugins=[ APMTracker(), SelectionTracker(), ContextLoader(), GameHeartNormalizer(), workers_analysis(), ]), load_map=False) if replay.players[0].name == "Neeb": neeb = replay.players[0] nerchio = replay.players[1] else: nerchio = replay.players[0] neeb = replay.players[1] assert neeb.worker_milestones[40] == 5493 assert nerchio.worker_milestones[40] == 5213 assert neeb.worker_milestones[50] == 7466 assert nerchio.worker_milestones[50] == 7247 assert neeb.worker_milestones[60] == 8668 assert nerchio.worker_milestones[60] == 11838 assert neeb.worker_milestones[70] == 14631 assert nerchio.worker_milestones[70] == 17087
def test_workers_at_frame(): replay = sc2reader.load_replay( 'replays/Nerchio vs Neeb ZvP Newkirk Precinct TE (Void) WCS Austin.SC2Replay', engine=sc2reader.engine.GameEngine(plugins=[ APMTracker(), SelectionTracker(), ContextLoader(), GameHeartNormalizer(), workers_analysis(), ]), load_map=False) if replay.players[0].name == "Neeb": neeb = replay.players[0] nerchio = replay.players[1] else: nerchio = replay.players[0] neeb = replay.players[1] assert workers_at_frame(neeb, time_to_frame('4:06')) == 40 assert workers_at_frame(nerchio, time_to_frame('4:31')) == 40 assert workers_at_frame(nerchio, time_to_frame('5:25')) == 50 assert workers_at_frame(neeb, time_to_frame('5:34')) == 50 assert workers_at_frame(neeb, time_to_frame('6:28')) == 60 assert workers_at_frame(neeb, time_to_frame('10:56')) == 70 assert workers_at_frame(nerchio, time_to_frame('12:22')) == 58 assert workers_at_frame(nerchio, time_to_frame('12:23')) == 61
def test_alive_at_this_time(): replay = sc2reader.load_replay( 'replays/Nerchio vs Neeb ZvP Newkirk Precinct TE (Void) WCS Austin.SC2Replay', engine=sc2reader.engine.GameEngine(plugins=[ APMTracker(), SelectionTracker(), ContextLoader(), GameHeartNormalizer(), workers_analysis(), ]), load_map=False) if replay.players[0].name == "Neeb": neeb = replay.players[0] nerchio = replay.players[1] else: nerchio = replay.players[0] neeb = replay.players[1] probe = neeb.units[54] assert alive_at_this_time(probe, 0, replay.frames) is False assert alive_at_this_time(probe, 28870, replay.frames) is False assert alive_at_this_time(probe, 26000, replay.frames) is False assert alive_at_this_time(probe, 4500, replay.frames) is True assert alive_at_this_time(probe, 2000, replay.frames) is False
def main(): args = parse_args(sys.argv[1:]) print("Accessing replay, id: {0}".format(args.sha1sum)) r = get_replay(args.sha1sum) replay = sc2reader.load_replay(r, engine=sc2reader.engine.GameEngine(plugins=[ ContextLoader(), GameHeartNormalizer(), ])) for p in replay.players: print(p)
def main(): # noqa: C901 args = parse_args(sys.argv[1:]) r = get_replay(args.sha1sum) replay = sc2reader.load_replay(r, engine=sc2reader.engine.GameEngine(plugins=[ ContextLoader(), GameHeartNormalizer(), ])) data = {} data['map'] = replay.map_name data['players'] = [] for player in replay.players: if not player.is_human: continue if player.is_observer: continue player_data = {} player_data['name'] = player.name unit_supplies = {} for unit_type in army_units: unit_supplies[unit_type] = [] # All done in frames times = [] game_end = replay.frames game_start = 0 for current_frame in range(game_start, game_end, 160): times.append(current_frame) supply_per_unit = {} for unit_type in army_units: supply_per_unit[unit_type] = 0 # Scan all units owned by player for unit in player.units: if unit.name not in army_units: continue if alive_at_this_time(unit, current_frame, replay.frames): supply_per_unit[unit.name] += unit.supply for unit_name, supply in supply_per_unit.items(): unit_supplies[unit_name].append(supply) to_pop = [] for key, value in unit_supplies.items(): if sum(value) == 0: to_pop.append(key) for key in to_pop: unit_supplies.pop(key, None) # Create visualization-ready json object constructed_data = [] for key, value in unit_supplies.items(): obj = {} obj['name'] = key color = "#" + hashlib.sha224(bytes(key, 'utf-8')).hexdigest()[:6] obj['color'] = color xy_tuples = [] for index, number in enumerate(value): point = {} point['x'] = times[index] point['y'] = number xy_tuples.append(point) obj['data'] = xy_tuples constructed_data.append(obj) player_data['army_supply'] = constructed_data data['players'].append(player_data) print(json.dumps(data))
matchup = "v".join(race[0] for race in sorted(races)) return matchup if __name__ == "__main__": data = [] replays = glob.glob("all_replays/**/*.SC2Replay", recursive=True) for filename in replays: replay = sc2reader.load_replay( filename, engine=sc2reader.engine.GameEngine(plugins=[ APMTracker(), SelectionTracker(), ContextLoader(), GameHeartNormalizer(), ])) #game['matchup'] = replay.matchup for human in replay.players: game = {} game['length'] = replay.frames / 22.4 game['map'] = replay.map_name game['matchup'] = classify_matchup(replay) game['name'] = human.name game['race'] = human.play_race game['players'] = str(replay.players) game['buildings'] = {} game['buildings']['stargates'] = [] for unit in human.units: if unit.name == 'Stargate': gate = {}
import sc2reader from sc2reader.engine.plugins import SelectionTracker, APMTracker,\ ContextLoader, GameHeartNormalizer sc2reader.engine.register_plugin(SelectionTracker()) sc2reader.engine.register_plugin(APMTracker()) sc2reader.engine.register_plugin(ContextLoader()) sc2reader.engine.register_plugin(GameHeartNormalizer()) from src.db.raw.config import db from src.db.raw.models.datapack.unit_type import UNIT_TYPE from src.db.raw.models.datapack.ability import ABILITY from src.db.raw.models.replay.info import INFO from src.db.raw.models.replay.map import MAP from src.db.raw.models.replay.objects import OBJECT from src.db.raw.models.replay.player import PLAYER from src.db.raw.inject import INJECT from os import listdir import argparse parser = argparse.ArgumentParser(description='sdm : Starcraft 2 Data Project') parser.add_argument('action', metavar='action', type=str, help='db : run database injection \n app : run app') args = parser.parse_args() action = args.action