diff --git a/overcooked_simulator/counters.py b/overcooked_simulator/counters.py index 3d930aa54e15a4c6ad9f187b3766eee34f96cc07..40779e5cb228c993a65b5264f684225ea1ff78bc 100644 --- a/overcooked_simulator/counters.py +++ b/overcooked_simulator/counters.py @@ -623,7 +623,7 @@ class Trashcan(Counter): return None def can_drop_off(self, item: Item) -> bool: - return True + return item.name != "Extinguisher" class CookingCounter(Counter): diff --git a/overcooked_simulator/game_content/environment_config.yaml b/overcooked_simulator/game_content/environment_config.yaml index fdbe1db23264984fa1521d2641c1b49dc2915b41..96b6660b50523f0caa5481c18d9edefebd317da3 100644 --- a/overcooked_simulator/game_content/environment_config.yaml +++ b/overcooked_simulator/game_content/environment_config.yaml @@ -88,7 +88,8 @@ player_config: player_speed_units_per_seconds: 6 interaction_range: 1.6 restricted_view: False - view_angle: 95 + view_angle: 60 + view_range: 3 # in grid units, can be "null" effect_manager: FireManager: diff --git a/overcooked_simulator/game_server.py b/overcooked_simulator/game_server.py index c5bb5d2577dd0dde98a76f54474893fd0a838b56..d54341a53d2a8100a0a2b9aa12c4bf3879e27f8b 100644 --- a/overcooked_simulator/game_server.py +++ b/overcooked_simulator/game_server.py @@ -675,6 +675,12 @@ class CreateEnvironmentConfig(BaseModel): seed: int +class ManageEnv(BaseModel): + manager_id: str + env_id: str + reason: str + + class AdditionalPlayer(BaseModel): manager_id: str env_id: str @@ -697,8 +703,10 @@ async def additional_player(creation: AdditionalPlayer) -> dict[str, PlayerInfo] @app.post("/manage/stop_env/") -async def stop_env(manager_id: str, env_id: str, reason: str) -> str: - accept = environment_handler.stop_env(manager_id, env_id, reason) +async def stop_env(manage_env: ManageEnv) -> str: + accept = environment_handler.stop_env( + manage_env.manager_id, manage_env.env_id, manage_env.reason + ) if accept: raise HTTPException( status_code=403 if accept == 1 else 409, diff --git a/overcooked_simulator/gui_2d_vis/drawing.py b/overcooked_simulator/gui_2d_vis/drawing.py index d9e5e8e22b0c3ad16df665e496c759178cd26262..64f05f4513139b1c405ccf23afa04bc82342b5eb 100644 --- a/overcooked_simulator/gui_2d_vis/drawing.py +++ b/overcooked_simulator/gui_2d_vis/drawing.py @@ -153,20 +153,23 @@ class Visualizer: direction = pygame.math.Vector2(state["view_restriction"]["direction"]) pos = pygame.math.Vector2(state["view_restriction"]["position"]) angle = state["view_restriction"]["angle"] / 2 + range = state["view_restriction"]["range"] pos = pos * grid_size + pygame.math.Vector2([grid_size / 2, grid_size / 2]) rect_scale = max(width, height) + # rect_scale = 2 * grid_size left_beam = pos + (direction.rotate(angle) * rect_scale * 2) right_beam = pos + (direction.rotate(-angle) * rect_scale * 2) + offset_front = direction * grid_size * 0.2 pygame.draw.polygon( screen, colors["black"], ( - pos - (direction * grid_size * 0.6), - left_beam - (direction * grid_size * 0.6), + pos - offset_front, + left_beam - offset_front, left_beam + (direction.rotate(90) * rect_scale), pos - (direction * rect_scale * 2) @@ -175,9 +178,28 @@ class Visualizer: - (direction * rect_scale * 2) + (direction.rotate(-90) * rect_scale), right_beam + (direction.rotate(-90) * rect_scale), - right_beam - (direction * grid_size * 0.6), + right_beam - offset_front, ), ) + if range: + pygame.draw.polygon( + screen, + colors["black"], + ( + pos + + (direction.rotate(90) * rect_scale) + + (direction * range * grid_size), + pos + + (direction.rotate(-90) * rect_scale) + + (direction * range * grid_size), + pos + + (direction.rotate(-90) * rect_scale) + + (direction * rect_scale), + pos + + (direction.rotate(90) * rect_scale) + + (direction * rect_scale), + ), + ) def draw_background( self, surface: pygame.Surface, width: int, height: int, grid_size: int diff --git a/overcooked_simulator/gui_2d_vis/overcooked_gui.py b/overcooked_simulator/gui_2d_vis/overcooked_gui.py index a4d28c5cb9fe468683db502766b2f2f0c37a7371..8808d1dbb0be8194625b0f1872298fc0b3a5a8de 100644 --- a/overcooked_simulator/gui_2d_vis/overcooked_gui.py +++ b/overcooked_simulator/gui_2d_vis/overcooked_gui.py @@ -860,7 +860,7 @@ class PyGameGUI: def finished_button_press(self): requests.post( - f"{self.request_url}/manage/stop_env", + f"{self.request_url}/manage/stop_env/", json={ "manager_id": self.manager_id, "env_id": self.current_env_id, diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py index 2c259a7f0e2952c443608ca4ff4f288a0860a559..0cd22554c736c8aae47d7673d9ad156979b013ce 100644 --- a/overcooked_simulator/overcooked_environment.py +++ b/overcooked_simulator/overcooked_environment.py @@ -167,6 +167,9 @@ class Environment: self.player_view_angle = self.environment_config["player_config"][ "view_angle" ] + self.player_view_range = self.environment_config["player_config"][ + "view_range" + ] self.extra_setup_functions() @@ -788,6 +791,7 @@ class Environment: "position": self.players[player_id].pos.tolist(), "angle": self.player_view_angle, "counter_mask": None, + "range": self.player_view_range, } if self.player_view_restricted else None, diff --git a/overcooked_simulator/player.py b/overcooked_simulator/player.py index 2a8f58a6905165af665dccee7ce3e45016273e6f..638bc4cd5c0d537aa5823af96543a008b43c3300 100644 --- a/overcooked_simulator/player.py +++ b/overcooked_simulator/player.py @@ -37,6 +37,9 @@ class PlayerConfig: """Whether or not the player can see the entire map at once or just a view frustrum.""" view_angle: int | None = None """Angle of the players view if restricted.""" + view_range: float | None = None + """Range of the players view if restricted. In grid units.""" + class Player: """Class representing a player in the game environment. A player consists of a name, their position and what @@ -153,7 +156,7 @@ class Player: self.holding.combine(returned_by_counter) log.debug( - f"Self: {self.holding}, {counter.__class__.__name__}: {counter.occupied_by}" + f"Self: {self.holding.__class__.__name__}: {self.holding}, {counter.__class__.__name__}: {counter.occupied_by}" ) # if isinstance(self.holding, Plate): # log.debug(self.holding.clean) diff --git a/overcooked_simulator/state_representation.py b/overcooked_simulator/state_representation.py index 9d4e7427f092fb77769873dd570988e1e3c94f4d..2faa1a1932035342e57b27df9865d673efdcc8cb 100644 --- a/overcooked_simulator/state_representation.py +++ b/overcooked_simulator/state_representation.py @@ -71,6 +71,7 @@ class ViewRestriction(BaseModel): position: list[float] angle: int # degrees counter_mask: None | list[bool] + range: float | None class StateRepresentation(BaseModel): diff --git a/setup.py b/setup.py index 8daf673c953090b4bbf6ce910949487412e300a5..a4b8f900e5aa215bba1ef9b2d66078e5ce9096ab 100644 --- a/setup.py +++ b/setup.py @@ -11,17 +11,18 @@ with open("CHANGELOG.md") as history_file: history = history_file.read() requirements = [ - "numpy", - "pygame", - "scipy", + "numpy>=1.26.2", + "pygame>=2.5.2", + "scipy>=1.11.4", "pytest>=3", - "pyyaml", - "pygame-gui", - "fastapi", - "uvicorn", - "websockets", - "requests", - "platformdirs", + "pyyaml>=6.0.1", + "pygame-gui>=0.6.9", + "pydantic>=2.5.3", + "fastapi>=0.109.2", + "uvicorn>=0.27.0", + "websockets>=12.0", + "requests>=2.31.0", + "platformdirs>=4.1.0", ] test_requirements = [ @@ -56,4 +57,12 @@ setup( url="https://gitlab.ub.uni-bielefeld.de/scs/cocosy/overcooked-simulator", version="0.1.0", zip_safe=False, + extras_requires={ + "rl": [ + "gymnasium>=0.28.1", + "stable-baselines3[extra]>=2.2.1", + "opencv-python>=4.9", + "wandb>=0.16.3", + ] + }, )