def __init__(self, pid, slot_data, detail_data, attribute_data): #: The player's unique in-game player id self.pid = int(pid) #: The player's replay.initData slot data self.slot_data = slot_data #: The replay.details data on this player self.detail_data = detail_data #: The replay.attributes.events data on this player self.attribute_data = attribute_data #: The player result, one of "Win", "Loss", or None self.result = None if detail_data['result'] == 1: self.result = "Win" elif detail_data['result'] == 2: self.result = "Loss" #: A reference to the player's :class:`Team` object self.team = None #: The race the player picked prior to the game starting. #: One of Protoss, Terran, Zerg, Random self.pick_race = attribute_data.get('Race', 'Unknown') #: The difficulty setting for the player. Always Medium for human players. #: Very Easy, Easy, Medium, Hard, Harder, Very hard, Elite, Insane, #: Cheater 2 (Resources), Cheater 1 (Vision) self.difficulty = attribute_data.get('Difficulty', 'Unknown') #: The race the player played the game with. #: One of Protoss, Terran, Zerg self.play_race = LOCALIZED_RACES.get(detail_data['race'], detail_data['race']) #: The co-op commander the player picked self.commander = slot_data['commander'].decode('utf8') #: A reference to a :class:`~sc2reader.utils.Color` object representing the player's color self.color = utils.Color(**detail_data['color']) #: A list of references to the :class:`~sc2reader.data.Unit` objects the player had this game self.units = list() #: A list of references to the :class:`~sc2reader.data.Unit` objects that the player killed this game self.killed_units = list() #: The Battle.net region the entity is registered to self.region = GATEWAY_LOOKUP[detail_data['bnet']['region']] #: The Battle.net subregion the entity is registered to self.subregion = detail_data['bnet']['subregion'] #: The Battle.net acount identifier. Used to construct the #: bnet profile url. This value can be zero for games #: played offline when a user was not logged in to battle.net. self.toon_id = detail_data['bnet']['uid']
def createPlayer(pid, pdata, attributes): # make sure to strip the clan tag out of the name # in newer replays, the clan tag can be separated from the # player name with a <sp/> symbol. It should also be stripped. name = pdata.name.split("]", 1)[-1].split(">", 1)[-1] player = Player(pid, name) # In some beta patches attribute information is missing # Just assign them to team 2 to keep the issue from being fatal team_number = int( attributes.get('Teams' + self.type, "Team 2")[5:]) if not team_number in self.team: self.team[team_number] = Team(team_number) self.teams.append(self.team[team_number]) self.team[team_number].players.append(player) player.team = self.team[team_number] # Do basic win/loss processing from details data if pdata.result == 1: player.team.result = "Win" self.winner = player.team elif pdata.result == 2: player.team.result = "Loss" else: player.team.result = None player.pick_race = attributes.get('Race', 'Unknown') player.play_race = LOCALIZED_RACES.get(pdata.race, pdata.race) player.difficulty = attributes.get('Difficulty', 'Unknown') player.is_human = (attributes.get('Controller', 'Computer') == 'User') player.uid = pdata.bnet.uid player.subregion = pdata.bnet.subregion player.gateway = GATEWAY_LOOKUP[pdata.bnet.gateway] player.handicap = pdata.handicap player.color = utils.Color(**pdata.color._asdict()) return player
def load_players(self): for index, struct in enumerate(self.parts[0][3]): if not struct[0] or not struct[0][1]: continue # Slot is closed player = PlayerSummary(struct[0][0]) stats = self.player_stats.get(index, dict()) settings = self.player_settings[index] player.is_ai = not isinstance(struct[0][1], dict) if not player.is_ai: player.gateway = self.gateway player.subregion = struct[0][1][0][2] player.region = REGIONS[player.gateway].get( player.subregion, 'Unknown') player.bnetid = struct[0][1][0][3] player.unknown1 = struct[0][1][0] player.unknown2 = struct[0][1][1] # Either a referee or a spectator, nothing else to do if settings.get('Participant Role', '') != 'Participant': self.observers.append(player) continue player.play_race = LOBBY_PROPERTIES[0xBB9][1].get(struct[2], None) player.is_winner = isinstance(struct[1], dict) and struct[1][0] == 0 if player.is_winner: self.winners.append(player.pid) team_id = int(settings['Team'].split(' ')[1]) if team_id not in self.team: self.team[team_id] = Team(team_id) self.teams.append(self.team[team_id]) player.team = self.team[team_id] self.team[team_id].players.append(player) # We can just copy these settings right over player.color = utils.Color(name=settings.get('Color', None)) player.pick_race = settings.get('Race', None) player.handicap = settings.get('Handicap', None) # Overview Tab player.resource_score = stats.get('Resources', None) player.structure_score = stats.get('Structures', None) player.unit_score = stats.get('Units', None) player.overview_score = stats.get('Overview', None) # Units Tab player.units_killed = stats.get('Killed Unit Count', None) player.structures_built = stats.get('Structures Built', None) player.units_trained = stats.get('Units Trained', None) player.structures_razed = stats.get('Structures Razed Count', None) # Graphs Tab # Keep income_graph for backwards compatibility player.army_graph = stats.get('Army Value') player.resource_collection_graph = stats.get( 'Resource Collection Rate', None) player.income_graph = player.resource_collection_graph # HotS Stats player.upgrade_spending_graph = stats.get('Upgrade Spending', None) player.workers_active_graph = stats.get('Workers Active', None) player.enemies_destroyed = stats.get('Enemies Destroyed:', None) player.time_supply_capped = stats.get('Time Supply Capped', None) player.idle_production_time = stats.get('Idle Production Time', None) player.resources_spent = stats.get('Resources Spent:', None) player.apm = stats.get('APM', None) # Economic Breakdown Tab if isinstance(player.income_graph, Graph): values = player.income_graph.values player.resource_collection_rate = int( sum(values) / len(values)) else: # In old s2gs files the field with this name was actually a number not a graph player.resource_collection_rate = player.income_graph player.resource_collection_graph = None player.income_graph = None player.avg_unspent_resources = stats.get( 'Average Unspent Resources', None) player.workers_created = stats.get('Workers Created', None) # Build Orders Tab player.build_order = self.build_orders.get(index, None) self.players.append(player) self.player[player.pid] = player
def __init__(self, pid, slot_data, detail_data, attribute_data): #: The player's unique in-game player id self.pid = int(pid) #: The player's replay.initData slot data self.slot_data = slot_data #: The replay.details data on this player self.detail_data = detail_data #: The replay.attributes.events data on this player self.attribute_data = attribute_data #: The player result, one of "Win", "Loss", or None self.result = None if detail_data["result"] == 1: self.result = "Win" elif detail_data["result"] == 2: self.result = "Loss" #: A reference to the player's :class:`Team` object self.team = None #: The race the player picked prior to the game starting. #: One of Protoss, Terran, Zerg, Random self.pick_race = attribute_data.get("Race", "Unknown") #: The difficulty setting for the player. Always Medium for human players. #: Very Easy, Easy, Medium, Hard, Harder, Very hard, Elite, Insane, #: Cheater 2 (Resources), Cheater 1 (Vision) self.difficulty = attribute_data.get("Difficulty", "Unknown") #: The race the player played the game with. #: One of Protoss, Terran, Zerg self.play_race = LOCALIZED_RACES.get(detail_data["race"], detail_data["race"]) #: The co-op commander the player picked #: Kerrigan, Raynor, etc. self.commander = slot_data["commander"] if self.commander is not None: self.commander = self.commander.decode("utf8") #: The level of the co-op commander #: 1-15 or None self.commander_level = slot_data["commander_level"] #: The mastery level of the co-op commander #: >0 or None self.commander_mastery_level = slot_data["commander_mastery_talents"] #: Trophy ID #: >0 or None self.trophy_id = slot_data["trophy_id"] #: The mastery talents picked for the co-op commander #: list of longs of length 6, each between 0 and 30 self.commander_mastery_talents = slot_data["commander_mastery_talents"] #: A reference to a :class:`~sc2reader.utils.Color` object representing the player's color self.color = utils.Color(**detail_data["color"]) #: A list of references to the :class:`~sc2reader.data.Unit` objects the player had this game self.units = list() #: A list of references to the :class:`~sc2reader.data.Unit` objects that the player killed this game self.killed_units = list() #: The Battle.net region the entity is registered to self.region = GATEWAY_LOOKUP[detail_data["bnet"]["region"]] #: The Battle.net subregion the entity is registered to self.subregion = detail_data["bnet"]["subregion"] #: The Battle.net account identifier. Used to construct the #: bnet profile url. This value can be zero for games #: played offline when a user was not logged in to battle.net. self.toon_id = detail_data["bnet"]["uid"]