async def observe_replay(self, step=24, id=0): previous = None game_units_by_tag = {} while self.status == "started" or self.status == "replay": async with websockets.connect("ws://{0}:{1}/sc2api".format( self.host.address, self.host.port), ping_interval=1, ping_timeout=1, close_timeout=1) as ws: try: request_payload = api.Request() request_payload.observation.disable_fog = False await asyncio.wait_for(ws.send( request_payload.SerializeToString()), timeout=1) result = await asyncio.wait_for(ws.recv(), timeout=1) obs = api.Response.FromString(result) obs = MessageToDict(obs) obs = str(obs) obs = obs.replace("\'", "\"") obs = obs.replace("False", "false") obs = obs.replace("True", "true") obs = json.loads(obs, encoding="UTF-8") if obs.get("observation", {}).get("observation", {}): game_units_by_tag.update( units_by_tag(obs, self.game_info)) actual = obs_to_case_replay(obs, self.replay_info, self.game_info, game_units_by_tag) if previous: previous["actions"] = actual["actions"] previous["observation"].pop("playerId") yield previous print(previous["observation"]["loop"]) previous = actual request_payload = api.Request() request_payload.step.count = step await asyncio.wait_for(ws.send( request_payload.SerializeToString()), timeout=1) result = await asyncio.wait_for(ws.recv(), timeout=1) response = api.Response.FromString(result) if response.status == 4: self.status = "replay" else: self.status = "finished" except Exception: print(traceback.format_exc()) continue self.host.status = "idle"
async def play(self, ws, observation): success = True request_data = api.Request( data=api.RequestData(ability_id=True, unit_type_id=True, upgrade_id=True) ) await asyncio.wait_for(ws.send(request_data.SerializeToString()), 5) try: result = await asyncio.wait_for(ws.recv(), 5) data_response = api.Response.FromString(result) game_data = data_response.data request_game_info = api.Request(game_info=api.RequestGameInfo()) await asyncio.wait_for(ws.send(request_game_info.SerializeToString()), 5) result = await asyncio.wait_for(ws.recv(), 5) game_info_response = api.Response.FromString(result) # If game is still on if game_data.units: obj = decode_observation(observation.observation.observation, game_data, game_info_response) obs = MessageToDict(observation) obs = str(obs) obs = obs.replace("\'", "\"") obs = obs.replace("False", "false") obs = obs.replace("True", "true") obs = json.loads(obs,encoding="UTF-8") game_meta = api.Request( game_info=api.RequestGameInfo() ) await ws.send(game_meta.SerializeToString()) result = await ws.recv() game_meta = api.Response.FromString(result) game_meta = MessageToDict(game_meta) game_meta = str(game_meta) game_meta = game_meta.replace("\'", "\"") game_meta = game_meta.replace("False", "false") game_meta = game_meta.replace("True", "true") game_meta = json.loads(game_meta,encoding="UTF-8") game_meta = game_meta.get("gameInfo", None) game_meta.pop("modNames") game_meta.pop("options") game_meta.pop("mapName") if("localMapPath" in game_meta.keys()): game_meta.pop("localMapPath") game_meta.pop("playerInfo") game_meta.update(game_meta["startRaw"]) game_meta.pop("startRaw") game_meta.pop("mapSize") await self.process_step(ws, obj, raw=(obs, game_meta, game_data)) # function = self.decision_function # alvailable_actions = self.query_alvailable_actions() # to_do_action = function(observation, alvailable_actions) # while(to_do_action and alvailable_actions): # self.send_order(self, to_do_action) # to_do_action = self.query_alvailable_actions() except asyncio.TimeoutError: return False return True
async def load_replay(self, replay_file, id=0): print(replay_file) async with websockets.connect("ws://{0}:{1}/sc2api".format( self.host.address, self.host.port)) as ws: replay_meta = api.Request(replay_info=api.RequestReplayInfo( replay_path=replay_file)) await ws.send(replay_meta.SerializeToString()) result = await ws.recv() metadata = api.Response.FromString(result) self.replay_info = { "map": metadata.replay_info.map_name, "races": [ metadata.replay_info.player_info[0].player_info. race_requested, metadata.replay_info.player_info[1].player_info. race_requested, ], "results": [ metadata.replay_info.player_info[0].player_result.result, metadata.replay_info.player_info[1].player_result.result, ], } print(self.replay_info) msg = api.Request(start_replay=api.RequestStartReplay( replay_path=replay_file, observed_player_id=id, options=api.InterfaceOptions(raw=True, score=False), )) await ws.send(msg.SerializeToString()) time.sleep(1) result = await ws.recv() response = api.Response.FromString(result) print(response) game_meta = api.Request(game_info=api.RequestGameInfo()) await ws.send(game_meta.SerializeToString()) result = await ws.recv() game_meta = api.Response.FromString(result) game_meta = MessageToDict(game_meta) game_meta = str(game_meta) game_meta = game_meta.replace("\'", "\"") game_meta = game_meta.replace("False", "false") game_meta = game_meta.replace("True", "true") game_meta = json.loads(game_meta, encoding="UTF-8") if "gameInfo" in game_meta.keys(): game_meta = game_meta.get("gameInfo", None) game_meta.pop("modNames") game_meta.pop("options") game_meta.pop("mapName") if ("localMapPath" in game_meta.keys()): game_meta.pop("localMapPath") game_meta.pop("playerInfo") game_meta.update(game_meta["startRaw"]) game_meta.pop("startRaw") game_meta.pop("mapSize") self.game_info = game_meta self.status = "started" return True else: return False