From fe21742fe6dce88efea79d1d96fdcc51e296ba01 Mon Sep 17 00:00:00 2001 From: fheinrich <fheinrich@techfak.uni-bielefeld.de> Date: Tue, 13 Feb 2024 09:52:36 +0100 Subject: [PATCH] Player view can have a restricted range, like a flashlight cone --- .../game_content/environment_config.yaml | 3 +- overcooked_simulator/gui_2d_vis/drawing.py | 28 +++++++++++++++++-- .../overcooked_environment.py | 6 +++- overcooked_simulator/player.py | 5 +++- overcooked_simulator/state_representation.py | 1 + 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/overcooked_simulator/game_content/environment_config.yaml b/overcooked_simulator/game_content/environment_config.yaml index fdbe1db2..96b6660b 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/gui_2d_vis/drawing.py b/overcooked_simulator/gui_2d_vis/drawing.py index d9e5e8e2..64f05f45 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/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py index 5302f55a..c38ad387 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() @@ -663,8 +666,8 @@ class Environment: for idx, p in enumerate(self.players.values()): if not (new_positions[idx] == player_positions[idx]).all(): - p.turn(player_movement_vectors[idx]) p.move_abs(new_positions[idx]) + p.turn(player_movement_vectors[idx]) def add_player(self, player_name: str, pos: npt.NDArray = None): """Add a player to the environment. @@ -780,6 +783,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 c367561e..82c2c8cd 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 @@ -165,7 +168,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 9d4e7427..2faa1a19 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): -- GitLab