diff --git a/overcooked_simulator/game_server.py b/overcooked_simulator/game_server.py index 92aaad5af0a9703805d431577dac8069b8425b72..cedf5560cab9b4e41094f8cf21413bad3ecddee7 100644 --- a/overcooked_simulator/game_server.py +++ b/overcooked_simulator/game_server.py @@ -35,7 +35,7 @@ WEBSOCKET_PORT = 8000 @dataclasses.dataclass class PlayerData: - player_id: int + player_id: str env_id: str websocket_id: str | None = None connected: bool = False @@ -99,7 +99,7 @@ class EnvironmentHandler: return {"env_id": env_id, "player_info": player_info} - def create_player(self, env, env_id, player_id): + def create_player(self, env: Environment, env_id: str, player_id: str) -> dict: player_hash = uuid.uuid4().hex client_id = uuid.uuid4().hex player_data = PlayerData( @@ -126,6 +126,7 @@ class EnvironmentHandler: ): n_players = len(self.envs[config.env_id].player_hashes) for player_id in range(n_players, n_players + config.number_players): + player_id = str(player_id) new_player_info[player_id] = self.create_player( env=self.envs[config.env_id].environment, env_id=config.env_id, @@ -217,7 +218,7 @@ class EnvironmentHandler: for player_hash in self.envs[env_id].player_hashes ) - def get_not_connected_players(self, env_id: str) -> list[int]: + def get_not_connected_players(self, env_id: str) -> list[str]: if env_id in self.envs: return [ self.player_data[player_hash].player_id @@ -225,7 +226,7 @@ class EnvironmentHandler: if not self.player_data[player_hash].connected ] - def get_not_ready_players(self, env_id: str) -> list[int]: + def get_not_ready_players(self, env_id: str) -> list[str]: if env_id in self.envs: return [ self.player_data[player_hash].player_id @@ -365,7 +366,7 @@ def read_root(): class CreateEnvironmentConfig(BaseModel): manager_id: str number_players: int - same_websocket_player: list[list[int]] | None = None + same_websocket_player: list[list[str]] | None = None environment_settings: EnvironmentSettings item_info_config: str environment_config: str diff --git a/overcooked_simulator/gui_2d_vis/drawing.py b/overcooked_simulator/gui_2d_vis/drawing.py index 00f5990c0bce8124ef56b56e61803b358febd6b5..11ee0c93137eccb0fd0c0c471a589755728bc5c7 100644 --- a/overcooked_simulator/gui_2d_vis/drawing.py +++ b/overcooked_simulator/gui_2d_vis/drawing.py @@ -10,6 +10,15 @@ from scipy.spatial import KDTree from overcooked_simulator import ROOT_DIR from overcooked_simulator.gui_2d_vis.game_colors import colors +from overcooked_simulator.state_representation import ( + PlayerState, + CookingEquipmentState, + ItemState, +) + +USE_PLAYER_COOK_SPRITES = True +SHOW_INTERACTION_RANGE = False +SHOW_COUNTER_CENTERS = False def create_polygon(n, length): @@ -60,9 +69,6 @@ class Visualizer: width, height, grid_size, - SHOW_COUNTER_CENTERS=False, - USE_PLAYER_COOK_SPRITES=False, - SHOW_INTERACTION_RANGE=False, ): self.draw_background( surface=screen, @@ -74,15 +80,12 @@ class Visualizer: screen, state, grid_size, - SHOW_COUNTER_CENTERS, ) self.draw_players( screen, state, grid_size, - USE_PLAYER_COOK_SPRITES=USE_PLAYER_COOK_SPRITES, - SHOW_INTERACTION_RANGE=SHOW_INTERACTION_RANGE, ) def draw_background(self, surface, width, height, grid_size): @@ -129,14 +132,13 @@ class Visualizer: screen: pygame.Surface, state_dict: dict, grid_size: float, - USE_PLAYER_COOK_SPRITES: bool = True, - SHOW_INTERACTION_RANGE: bool = False, ): """Visualizes the players as circles with a triangle for the facing direction. If the player holds something in their hands, it is displayed Args: state: The game state returned by the environment. """ for p_idx, player_dict in enumerate(state_dict["players"]): + player_dict: PlayerState pos = np.array(player_dict["pos"]) * grid_size facing = np.array(player_dict["facing_direction"]) @@ -225,6 +227,8 @@ class Visualizer: """Draws an item, based on its visual parts specified in the visualization config. Args: + screen: the game screen to draw on. + grid_size: size of a grid cell. pos: Where to draw the item parts. parts: The visual parts to draw. scale: Rescale the item by this factor. @@ -275,9 +279,9 @@ class Visualizer: def draw_item( self, - pos: npt.NDArray[float], - grid_size, - item, + pos: npt.NDArray[float] | list[float], + grid_size: float, + item: ItemState | CookingEquipmentState, scale: float = 1.0, plate=False, screen=None, @@ -287,6 +291,7 @@ class Visualizer: different parts to be drawn. Args: + grid_size: size of a grid cell. pos: The position of the item to draw. item: The item do be drawn in the game. scale: Rescale the item by this factor. @@ -294,7 +299,7 @@ class Visualizer: plate: item is on a plate (soup are is different on a plate and pot) """ - if not isinstance(item, list): + if not isinstance(item, list): # can we remove this check? if item["type"] in self.config: item_key = item["type"] if "Soup" in item_key and plate: diff --git a/overcooked_simulator/gui_2d_vis/overcooked_gui.py b/overcooked_simulator/gui_2d_vis/overcooked_gui.py index e8ee5df80f6fa43d6dc5bfdd93feffb496cd0caa..5dd4326f00cee70039b35a50bce29d21ae321b5c 100644 --- a/overcooked_simulator/gui_2d_vis/overcooked_gui.py +++ b/overcooked_simulator/gui_2d_vis/overcooked_gui.py @@ -18,10 +18,6 @@ from overcooked_simulator.gui_2d_vis.drawing import Visualizer from overcooked_simulator.gui_2d_vis.game_colors import colors from overcooked_simulator.overcooked_environment import Action -USE_PLAYER_COOK_SPRITES = True -SHOW_INTERACTION_RANGE = False -SHOW_COUNTER_CENTERS = False - class MenuStates(Enum): Start = "Start" @@ -332,9 +328,6 @@ class PyGameGUI: self.game_width, self.game_height, self.grid_size, - SHOW_COUNTER_CENTERS, - USE_PLAYER_COOK_SPRITES, - SHOW_INTERACTION_RANGE, ) # self.manager.draw_ui(self.main_window) diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py index d4b2bdee8af7e20e78ddaa41ff33e64a8aae3f4c..84336327de574ddf989a8a2917c7a5ed9a2bd23c 100644 --- a/overcooked_simulator/overcooked_environment.py +++ b/overcooked_simulator/overcooked_environment.py @@ -550,7 +550,7 @@ class Environment: distance = np.linalg.norm([dx, dy]) return distance < (player.radius) - def add_player(self, player_name: int | str, pos: npt.NDArray = None): + def add_player(self, player_name: str, pos: npt.NDArray = None): log.debug(f"Add player {player_name} to the game") player = Player( player_name, player_config=self.environment_config["player_config"], pos=pos @@ -618,7 +618,7 @@ class Environment: "remaining_time": max(self.env_time_end - self.env_time, timedelta(0)), } - def get_json_state(self, player_id: str | int = None): + def get_json_state(self, player_id: str = None): state = { "players": [p.to_dict() for p in self.players.values()], "counters": [c.to_dict() for c in self.counters], diff --git a/overcooked_simulator/player.py b/overcooked_simulator/player.py index 4283e76f43b77725b7410d279f5859456548c998..e75be94681015999b966adf9e9abe1fd2e6d8f2e 100644 --- a/overcooked_simulator/player.py +++ b/overcooked_simulator/player.py @@ -8,6 +8,7 @@ import numpy.typing as npt from overcooked_simulator.counters import Counter from overcooked_simulator.game_items import Item, Plate +from overcooked_simulator.state_representation import PlayerState log = logging.getLogger(__name__) @@ -21,11 +22,11 @@ class Player: def __init__( self, - name: int | str, + name: str, player_config: dict[str, Any], pos: Optional[npt.NDArray[float]] = None, ): - self.name: int | str = name + self.name: str = name self.player_config = player_config if pos is not None: self.pos: npt.NDArray[float] = np.array(pos, dtype=float) @@ -145,7 +146,7 @@ class Player: def __repr__(self): return f"Player(name:{self.name},pos:{str(self.pos)},holds:{self.holding})" - def to_dict(self): + def to_dict(self) -> PlayerState: # TODO add color to player class for vis independent player color return { "id": self.name,