diff --git a/.gitignore b/.gitignore index 6643915a..768aa621 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ PKG-INFO.txt sc2reader/bin sc2reader/include sc2reader/lib +.DS_Store diff --git a/README.txt b/README.txt index 03e7dca9..bbdb3249 100644 --- a/README.txt +++ b/README.txt @@ -209,6 +209,13 @@ patch files. It is highly recommended you get in touch with us before working on patches. +Testing +------------------- + + mkdir testcache + GGFACTORY_CACHE_DIR=testcache py.test + + Community ============== diff --git a/sc2reader/data/__init__.py b/sc2reader/data/__init__.py index fbee9df3..5858708c 100755 --- a/sc2reader/data/__init__.py +++ b/sc2reader/data/__init__.py @@ -158,7 +158,7 @@ 'BuildwarHound': ('WarHound',45), 'BuildWidowMine': ('WidowMine',40), 'BuildHellion': ('Hellion',30), - 'BuildBattleHellion': ('BattleHellion',30), + 'BuildBattleHellion': ('Hellion',30), 'TrainMedivac': ('Medivac',42), 'TrainBanshee': ('Banshee',60), 'TrainRaven': ('Raven',60), @@ -276,12 +276,7 @@ def __str__(self): return "{0} [{1:X}]".format(self.name, self.id) def __cmp__(self, other): - if self._cmp_val == other._cmp_val: - return 0 - elif self._cmp_val > other._cmp_val: - return 1 - else: - return -1 + return cmp(self._cmp_val, other._cmp_val) def __hash__(self): return hash(self._cmp_val) @@ -289,18 +284,6 @@ def __hash__(self): def __repr__(self): return str(self) - def __cmp__(self, other): - if other.id > self.id: - return -1 - elif other.id < self.id: - return 1 - else: - if other.type > self.type: - return -1 - elif other.type < self.type: - return 1 - else: - return 0 class Ability(object): pass diff --git a/sc2reader/events.py b/sc2reader/events.py index 8e6f3145..18d1eeb4 100644 --- a/sc2reader/events.py +++ b/sc2reader/events.py @@ -168,8 +168,11 @@ def __str__(self): def load_context(self, replay): super(SendResourceEvent, self).load_context(replay) - self.sender = replay.player[self.sender] - self.reciever = replay.players[self.reciever] + # DJ disabled this on 20130222 because GGTracker doesnt use this event + # and it is currently broken for a replay thats now in the test suite. + # + # self.sender = replay.player[self.sender] + # self.reciever = replay.players[self.reciever] @loggable class RequestResourceEvent(PlayerActionEvent): @@ -335,6 +338,10 @@ def load_context(self, replay): objects = list() data = replay.datapack for (obj_id, obj_type, obj_flags) in self.raw_objects: + # Hack that defaults viking selection to fighter mode instead of assault + if replay.versions[1] == 2 and replay.build >= 23925 and obj_type == 71: + obj_type = 72 + if (obj_id, obj_type) in replay.objects: obj = replay.objects[(obj_id,obj_type)] else: diff --git a/sc2reader/plugins/replay.py b/sc2reader/plugins/replay.py index 953e3ea3..fc777bb2 100644 --- a/sc2reader/plugins/replay.py +++ b/sc2reader/plugins/replay.py @@ -95,6 +95,8 @@ def APMTracker(replay): else: player.avg_apm = 0 + return replay + @plugin def SelectionTracker(replay): @@ -145,3 +147,5 @@ def SelectionTracker(replay): person.selection = player_selection # Not a real lock, so don't change it! person.selection.locked = True + + return replay diff --git a/sc2reader/readers.py b/sc2reader/readers.py index 34d1713d..682e7bf6 100644 --- a/sc2reader/readers.py +++ b/sc2reader/readers.py @@ -2,7 +2,6 @@ from __future__ import absolute_import import struct - from collections import defaultdict from itertools import chain diff --git a/sc2reader/resources.py b/sc2reader/resources.py index 1ac299d5..4468b9ef 100644 --- a/sc2reader/resources.py +++ b/sc2reader/resources.py @@ -569,7 +569,8 @@ def register_default_datapacks(self): self.register_datapack(datapacks['WoL']['17326'], lambda r: r.expansion=='WoL' and 17326 <= r.build < 18092) self.register_datapack(datapacks['WoL']['18092'], lambda r: r.expansion=='WoL' and 18092 <= r.build < 19458) self.register_datapack(datapacks['WoL']['19458'], lambda r: r.expansion=='WoL' and 19458 <= r.build < 22612) - self.register_datapack(datapacks['WoL']['22612'], lambda r: r.expansion=='WoL' and 22612 <= r.build) + self.register_datapack(datapacks['WoL']['22612'], lambda r: r.expansion=='WoL' and 22612 <= r.build < 24764) + self.register_datapack(datapacks['HotS']['24764'], lambda r: r.expansion=='WoL' and 24764 <= r.build ) self.register_datapack(datapacks['HotS']['base'], lambda r: r.expansion=='HotS' and r.build < 23925) self.register_datapack(datapacks['HotS']['23925'], lambda r: r.expansion=='HotS' and 23925 <= r.build < 24247) self.register_datapack(datapacks['HotS']['24247'], lambda r: r.expansion=='HotS' and 24247 <= r.build <= 24764 ) diff --git a/test_replays/test_all.py b/test_replays/test_all.py index 8594a19d..ef2de2a0 100644 --- a/test_replays/test_all.py +++ b/test_replays/test_all.py @@ -9,10 +9,23 @@ import sc2reader from sc2reader.exceptions import ParseError +from sc2reader.plugins.replay import APMTracker, SelectionTracker sc2reader.log_utils.log_to_console('INFO') # Tests for build 17811 replays +class SC2TestFactory(sc2reader.factories.DoubleCachedSC2Factory): + def __init__(self, cache_dir, max_cache_size=0, **options): + """cache_dir must be an absolute path, max_cache_size=0 => unlimited""" + if not cache_dir: + raise ValueError("cache_dir is now required.") + + super(SC2TestFactory, self).__init__(cache_dir, max_cache_size, **options) + + self.register_plugin('Replay',APMTracker()) + self.register_plugin('Replay',SelectionTracker()) + + def test_standard_1v1(): replay = sc2reader.load_replay("test_replays/1.2.2.17811/1.SC2Replay") @@ -238,6 +251,9 @@ def test_clan_players(): replay = sc2reader.load_replay("test_replays/2.0.4.24944/Lunar Colony V.SC2Replay") assert replay.expansion == 'WoL' assert len(replay.people) == 4 + for obj in replay.objects.values(): + assert obj.name != 'Ultralisk' + def test_WoL_204(): replay = sc2reader.load_replay("test_replays/2.0.4.24944/ggtracker_1789768.SC2Replay") @@ -252,3 +268,7 @@ def test_cn_replays(): assert replay.gateway == 'cn' assert replay.expansion == 'WoL' +def test_plugins(): + CACHE_DIR = os.environ.get('GGFACTORY_CACHE_DIR',None) + factory = SC2TestFactory(cache_dir=CACHE_DIR) + replay = factory.load_replay("test_replays/2.0.5.25092/cn1.SC2Replay")