def getHeader(self): if len(self.replayHeader) <= 0: # Read the protocol header, this can be read with any protocol self.replayHeader = protocol15405.decode_replay_header( self.mpqArchive.header['user_data_header']['content']) return self.replayHeader
def handleMessage(message): print "handleMessage from " + message.author.name savedReplayName = "tmp/working.SC2Replay" replayLink = funcs.isMessageBodyValidLink(message) if not replayLink: funcs.messageReply(message, "replay link not found in message") return False urllib.urlretrieve(replayLink, savedReplayName) archive = mpyq.MPQArchive(savedReplayName) # Read the protocol header, this can be read with any protocol contents = archive.header['user_data_header']['content'] header = protocol15405.decode_replay_header(contents) # The header's baseBuild determines which protocol to use baseBuild = header['m_version']['m_baseBuild'] try: _temp = __import__('s2protocol', globals(), locals(), ['protocol%s' % (baseBuild,)]) protocol = getattr(_temp, 'protocol%s' % (baseBuild,)) except: print >> sys.stderr, 'Unsupported base build: %d' % baseBuild sys.exit(1) contents = archive.read_file('replay.details') details = protocol.decode_replay_details(contents) events = protocol.decode_replay_message_events(archive.read_file('replay.message.events')) return handleReplayDetails(details, message, events)
def getHeader(self): if len(self.replayHeader) <= 0: # Read the protocol header, this can be read with any protocol self.replayHeader = protocol15405.decode_replay_header( self.mpqArchive.header["user_data_header"]["content"] ) return self.replayHeader
def _get_replay_reader(self): # Read the protocol header, this can be read with any protocol contents = self.archive.header['user_data_header']['content'] header = protocol15405.decode_replay_header(contents) # The header's baseBuild determines which protocol to use baseBuild = header['m_version']['m_baseBuild'] protocol_name = 'protocol%s' % (baseBuild, ) module = __import__('s2protocol', globals(), locals(), [protocol_name], -1) return getattr(module, protocol_name)
def __init__(self, replayFile): # The replayFile can be either the name of a file or any object that has a 'read()' method. self.mpq = mpyq.MPQArchive(replayFile) self.buildStormReplay = protocol15405.decode_replay_header(self.mpq.header['user_data_header']['content'])['m_version']['m_baseBuild'] try: self.protocol = __import__('s2protocol' + '.protocol%s' % self.buildStormReplay, fromlist=['protocol2']) except ImportError: raise Exception('Unsupported build number: %i' % self.buildStormReplay)
def __init__(self, replay_path): self.__archive = mpyq.MPQArchive(replay_path) # Read the protocol header, this can be read with any protocol contents = self.__archive.header['user_data_header']['content'] self.__header = initial_protocol.decode_replay_header(contents) # The header's baseBuild determines which protocol to use self.__base_build = self.__header['m_version']['m_baseBuild'] try: self.__protocol = __import__('s2protocol'+'.protocol%s' % self.__base_build,fromlist=['protocol2']) except: print >> sys.stderr, 'Unsupported base build: %d' % self.__base_build sys.exit(1)
def __init__(self, replay_path): self.__archive = mpyq.MPQArchive(replay_path) # Read the protocol header, this can be read with any protocol contents = self.__archive.header['user_data_header']['content'] self.__header = initial_protocol.decode_replay_header(contents) # The header's baseBuild determines which protocol to use self.__base_build = self.__header['m_version']['m_baseBuild'] try: self.__protocol = __import__('s2protocol' + '.protocol%s' % self.__base_build, fromlist=['protocol2']) except: print >> sys.stderr, 'Unsupported base build: %d' % self.__base_build sys.exit(1)
def __init__(self, replayFile): # The replayFile can be either the name of a file or any object that has a 'read()' method. self.mpq = mpyq.MPQArchive(replayFile) self.buildStormReplay = protocol15405.decode_replay_header( self.mpq.header['user_data_header'] ['content'])['m_version']['m_baseBuild'] try: self.protocol = __import__('s2protocol' + '.protocol%s' % self.buildStormReplay, fromlist=['protocol2']) except ImportError: raise Exception('Unsupported build number: %i' % self.buildStormReplay)
def parse_replay(args): """ Parse replay for build order related events """ archive = mpyq.MPQArchive(args.replay_file) contents = archive.header['user_data_header']['content'] header = protocol15405.decode_replay_header(contents) base_build = header['m_version']['m_baseBuild'] parsed_data = {'build': base_build} protocol = get_protocol(base_build) if not protocol: raise ReplayFormatError('Could locate the replay version') contents = archive.read_file('replay.details') details = protocol.decode_replay_details(contents) parsed_data['numPlayers'] = len(details["m_playerList"]) parsed_data['map'] = details['m_title'] parsed_data['players'] = [ { 'name': raw_data['m_name'], 'race': raw_data['m_race'], 'is_winner': raw_data['m_result'] == 1, 'supply': [[0, 6]] } for raw_data in details['m_playerList'] ] return parse_events( archive, args.cutoff_time, header, parsed_data, protocol )
def load(load_args): parser = argparse.ArgumentParser() parser.add_argument('replay_file', help='.SC2Replay file to load') parser.add_argument("--gameevents", help="print game events", action="store_true") parser.add_argument("--messageevents", help="print message events", action="store_true") parser.add_argument("--trackerevents", help="print tracker events", action="store_true") parser.add_argument("--attributeevents", help="print attributes events", action="store_true") parser.add_argument("--header", help="print protocol header", action="store_true") parser.add_argument("--details", help="print protocol details", action="store_true") parser.add_argument("--initdata", help="print protocol initdata", action="store_true") parser.add_argument("--stats", help="print stats", action="store_true") args = parser.parse_args(load_args) archive = mpyq.MPQArchive(args.replay_file) logger = EventLogger() # Read the protocol header, this can be read with any protocol contents = archive.header['user_data_header']['content'] header = protocol15405.decode_replay_header(contents) if args.header: logger.log(sys.stdout, header) # The header's baseBuild determines which protocol to use baseBuild = header['m_version']['m_baseBuild'] sys.path.append('s2protocol/') try: protocol = __import__('protocol%s' % (baseBuild,)) except: print >> sys.stderr, 'Unsupported base build: %d' % baseBuild sys.exit(1) # Print protocol details if args.details: contents = archive.read_file('replay.details') details = protocol.decode_replay_details(contents) logger.log(sys.stdout, details) # Print protocol init data if args.initdata: contents = archive.read_file('replay.initData') initdata = protocol.decode_replay_initdata(contents) logger.log(sys.stdout, initdata['m_syncLobbyState']['m_gameDescription']['m_cacheHandles']) logger.log(sys.stdout, initdata) # Print game events and/or game events stats if args.gameevents: contents = archive.read_file('replay.game.events') for event in protocol.decode_replay_game_events(contents): logger.log(sys.stdout, event) # Print message events if args.messageevents: contents = archive.read_file('replay.message.events') for event in protocol.decode_replay_message_events(contents): logger.log(sys.stdout, event) # Print tracker events if args.trackerevents: if hasattr(protocol, 'decode_replay_tracker_events'): contents = archive.read_file('replay.tracker.events') for event in protocol.decode_replay_tracker_events(contents): logger.log(sys.stdout, event) # Print attributes events if args.attributeevents: contents = archive.read_file('replay.attributes.events') attributes = protocol.decode_replay_attributes_events(contents) logger.log(sys.stdout, attributes) # Print stats if args.stats: logger.log_stats(sys.stderr) return logger
from s2protocol.mpyq import mpyq from s2protocol import protocol15405 import argparse import sys # Unarchive the file parser = argparse.ArgumentParser() parser.add_argument('replay_file', help='.SC2Replay file to load') args = parser.parse_args() archive = mpyq.MPQArchive(args.replay_file) # Import the correct build protocol contents = archive.header['user_data_header']['content'] header = protocol15405.decode_replay_header(contents) baseBuild = header['m_version']['m_baseBuild'] print baseBuild try: protocol = 'protocol%s' % baseBuild module = __import__('s2protocol',globals(),locals(),[protocol],-1) protocol = getattr(module, protocol) except: print >> sys.stderr, 'Unsupported base build: %d' % baseBuild sys.exit(1) # Extract initdata contents = archive.read_file('replay.initData') initdata = protocol.decode_replay_initdata(contents)
def load(load_args): parser = argparse.ArgumentParser() parser.add_argument('replay_file', help='.SC2Replay file to load') parser.add_argument("--gameevents", help="print game events", action="store_true") parser.add_argument("--messageevents", help="print message events", action="store_true") parser.add_argument("--trackerevents", help="print tracker events", action="store_true") parser.add_argument("--attributeevents", help="print attributes events", action="store_true") parser.add_argument("--header", help="print protocol header", action="store_true") parser.add_argument("--details", help="print protocol details", action="store_true") parser.add_argument("--initdata", help="print protocol initdata", action="store_true") parser.add_argument("--stats", help="print stats", action="store_true") args = parser.parse_args(load_args) archive = mpyq.MPQArchive(args.replay_file) logger = EventLogger() # Read the protocol header, this can be read with any protocol contents = archive.header['user_data_header']['content'] header = protocol15405.decode_replay_header(contents) if args.header: logger.log(sys.stdout, header) # The header's baseBuild determines which protocol to use baseBuild = header['m_version']['m_baseBuild'] sys.path.append('s2protocol/') try: protocol = __import__('protocol%s' % (baseBuild, )) except: print >> sys.stderr, 'Unsupported base build: %d' % baseBuild sys.exit(1) # Print protocol details if args.details: contents = archive.read_file('replay.details') details = protocol.decode_replay_details(contents) logger.log(sys.stdout, details) # Print protocol init data if args.initdata: contents = archive.read_file('replay.initData') initdata = protocol.decode_replay_initdata(contents) logger.log( sys.stdout, initdata['m_syncLobbyState']['m_gameDescription'] ['m_cacheHandles']) logger.log(sys.stdout, initdata) # Print game events and/or game events stats if args.gameevents: contents = archive.read_file('replay.game.events') for event in protocol.decode_replay_game_events(contents): logger.log(sys.stdout, event) # Print message events if args.messageevents: contents = archive.read_file('replay.message.events') for event in protocol.decode_replay_message_events(contents): logger.log(sys.stdout, event) # Print tracker events if args.trackerevents: if hasattr(protocol, 'decode_replay_tracker_events'): contents = archive.read_file('replay.tracker.events') for event in protocol.decode_replay_tracker_events(contents): logger.log(sys.stdout, event) # Print attributes events if args.attributeevents: contents = archive.read_file('replay.attributes.events') attributes = protocol.decode_replay_attributes_events(contents) logger.log(sys.stdout, attributes) # Print stats if args.stats: logger.log_stats(sys.stderr) return logger
def parse_replay(file_name): archive = mpyq.MPQArchive(file_name) contents = archive.header['user_data_header']['content'] header = protocol15405.decode_replay_header(contents) baseBuild = header['m_version']['m_baseBuild'] try: protocol_name = 'protocol%s' % (baseBuild,) _temp = __import__('s2protocol', globals(), locals(), [protocol_name]) protocol = getattr(_temp, protocol_name) except: return False builds = [GameTimeline() for i in range(2)] supplies = [[[0, 6]] for i in range(2)] if hasattr(protocol, 'decode_replay_tracker_events'): contents = archive.read_file('replay.tracker.events') for event in protocol.decode_replay_tracker_events(contents): event_type = event['_event'] if event['_gameloop'] == 0: continue if event_type == 'NNet.Replay.Tracker.SPlayerStatsEvent': supplies[event['m_playerId'] - 1].append( [event['_gameloop'], event['m_stats']['m_scoreValueFoodUsed'] / 4096]) elif event_type == 'NNet.Replay.Tracker.SUnitBornEvent': # need to reverse this player = event['m_controlPlayerId'] unit_name = event['m_unitTypeName'] if unit_name in BO_EXCLUDED or player == 0: continue try: gameloop = event['_gameloop'] - BUILD_TIMES[unit_name] except KeyError: gameloop = event['_gameloop'] unit_name += ' (Error on time)' supply = get_supply(supplies[player - 1], gameloop) builds[player - 1].add_event(BuildEvent(unit_name, gameloop, supply)) elif event_type == 'NNet.Replay.Tracker.SUnitInitEvent': player = event['m_controlPlayerId'] unit_name = event['m_unitTypeName'] if unit_name in BO_EXCLUDED or player == 0: continue gameloop = event['_gameloop'] supply = supplies[player - 1][-1][1] builds[player - 1].add_event(BuildEvent(unit_name, gameloop, supply)) elif event_type == 'NNet.Replay.Tracker.SUpgradeEvent': # need to reverse this player = event['m_playerId'] if player == 0: continue unit_name = event['m_upgradeTypeName'] try: gameloop = event['_gameloop'] - BUILD_TIMES[unit_name] except KeyError: gameloop = event['_gameloop'] unit_name += ' (Error on time)' supply = get_supply(supplies[player - 1], gameloop) builds[player - 1].add_event(BuildEvent(unit_name, gameloop, supply)) for build in builds: build.sort() return [unicode(build) for build in builds] return False