diff --git a/overcooked_simulator/game_server.py b/overcooked_simulator/game_server.py index 95e8e18fb6733f319d85fc58dfcef18471e66521..ba9ab75fe2ff948196e35dd6a70e1316da5dda24 100644 --- a/overcooked_simulator/game_server.py +++ b/overcooked_simulator/game_server.py @@ -235,7 +235,7 @@ class EnvironmentHandler: ): return self.envs[ self.player_data[player_hash].env_id - ].environment.get_json_state() + ].environment.get_json_state(self.player_data[player_hash].player_id) def pause_env(self, manager_id: str, env_id: str, reason: str): """Pause the specified environment. diff --git a/overcooked_simulator/gui_2d_vis/drawing.py b/overcooked_simulator/gui_2d_vis/drawing.py index d2f44c42de154e0f98b59bb02c572518422c7a63..e7279571af2e163bdc976e0f4d04daa9957fd4d7 100644 --- a/overcooked_simulator/gui_2d_vis/drawing.py +++ b/overcooked_simulator/gui_2d_vis/drawing.py @@ -91,7 +91,11 @@ class Visualizer: grid_size, ) - print(state) + if "view_restriction" in state: + direction = state["view_restriction"][0] + angel = state["view_restriction"][1] + # rotate direction vector in both direction with the angel + # draw 2 large rect which are rotated so that one edge is the viewing border def draw_background(self, surface, width, height, grid_size): """Visualizes a game background.""" diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py index 84d6312821e9cb74b1e488d850e2e13f73429c99..64757f8c2b6fe36bcb4b4d4090048f05891f4dc7 100644 --- a/overcooked_simulator/overcooked_environment.py +++ b/overcooked_simulator/overcooked_environment.py @@ -31,6 +31,8 @@ from overcooked_simulator.utils import create_init_env_time, get_closest log = logging.getLogger(__name__) +FOG_OF_WAR = True + class ActionType(Enum): """The 3 different types of valid actions. They can be extended via the `Action.action_data` attribute.""" @@ -605,22 +607,30 @@ class Environment: "remaining_time": max(self.env_time_end - self.env_time, timedelta(0)), } - 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], - "kitchen": {"width": self.kitchen_width, "height": self.kitchen_height}, - "score": self.order_and_score.score, - "orders": self.order_and_score.order_state(), - "ended": self.game_ended, - "env_time": self.env_time.isoformat(), - "remaining_time": max( - self.env_time_end - self.env_time, timedelta(0) - ).total_seconds(), - } - json_data = json.dumps(state) - assert StateRepresentation.model_validate_json(json_data=json_data) - return json_data + def get_json_state(self, player_id: str = None) -> str: + if player_id in self.players: + state = { + "players": [p.to_dict() for p in self.players.values()], + "counters": [c.to_dict() for c in self.counters], + "kitchen": {"width": self.kitchen_width, "height": self.kitchen_height}, + "score": self.order_and_score.score, + "orders": self.order_and_score.order_state(), + "ended": self.game_ended, + "env_time": self.env_time.isoformat(), + "remaining_time": max( + self.env_time_end - self.env_time, timedelta(0) + ).total_seconds(), + "view_restriction": [ + self.players[player_id].facing_direction.tolist(), + 40.0, + ] + if FOG_OF_WAR + else None, + } + json_data = json.dumps(state) + assert StateRepresentation.model_validate_json(json_data=json_data) + return json_data + raise ValueError(f"No valid {player_id=}") def reset_env_time(self): """Reset the env time to the initial time, defined by `create_init_env_time`.""" diff --git a/overcooked_simulator/state_representation.py b/overcooked_simulator/state_representation.py index 4fc0a137a097a81047c790c1a8741399c2ad220d..199a61e388fb1149743f86132e4090361597ed8e 100644 --- a/overcooked_simulator/state_representation.py +++ b/overcooked_simulator/state_representation.py @@ -64,6 +64,7 @@ class StateRepresentation(BaseModel): ended: bool env_time: datetime # isoformat str remaining_time: float + view_restriction: None | list[list[float] | float] def create_json_schema():