From 226c333738c319a2f81d96e0ed0fc6ad797d2bdf Mon Sep 17 00:00:00 2001 From: fheinrich <fheinrich@techfak.uni-bielefeld.de> Date: Mon, 18 Dec 2023 16:58:50 +0100 Subject: [PATCH] Sizes in configs (kitchen, players and viz) relative to counter size. Doc missing --- .../game_content/environment_config.yaml | 7 ++-- .../game_content/player_config.yaml | 3 ++ .../overcooked_environment.py | 36 +++++++++++++------ overcooked_simulator/player.py | 21 ++++++++--- overcooked_simulator/pygame_gui/pygame_gui.py | 31 +++++++++------- 5 files changed, 68 insertions(+), 30 deletions(-) create mode 100644 overcooked_simulator/game_content/player_config.yaml diff --git a/overcooked_simulator/game_content/environment_config.yaml b/overcooked_simulator/game_content/environment_config.yaml index e70b00e2..673b9d2d 100644 --- a/overcooked_simulator/game_content/environment_config.yaml +++ b/overcooked_simulator/game_content/environment_config.yaml @@ -1,3 +1,4 @@ -kitchen: - layout_path: layouts/basic.layout - counter_side_length: 40 \ No newline at end of file +layout_path: layouts/basic.layout +counter_side_length: 15 +world_width: 800 +world_height: 600 diff --git a/overcooked_simulator/game_content/player_config.yaml b/overcooked_simulator/game_content/player_config.yaml new file mode 100644 index 00000000..d418bd52 --- /dev/null +++ b/overcooked_simulator/game_content/player_config.yaml @@ -0,0 +1,3 @@ +radius: 0.4 +move_dist: 5 +interaction_range: 1.5 \ No newline at end of file diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py index b3602c33..1657907d 100644 --- a/overcooked_simulator/overcooked_environment.py +++ b/overcooked_simulator/overcooked_environment.py @@ -67,9 +67,9 @@ class Environment: with open(env_config_path, "r") as file: environment_config = yaml.safe_load(file) self.layout_path: Path = Path( - ROOT_DIR / "game_content" / environment_config["kitchen"]["layout_path"] + ROOT_DIR / "game_content" / environment_config["layout_path"] ) - self.counter_side_length = environment_config["kitchen"]["counter_side_length"] + self.counter_side_length = environment_config["counter_side_length"] self.item_info_path: Path = item_info_path self.item_info = self.load_item_info() @@ -83,7 +83,7 @@ class Environment: "T": lambda pos: Dispenser(pos, self.item_info["Tomato"]), "L": lambda pos: Dispenser(pos, self.item_info["Lettuce"]), "P": lambda pos: Dispenser(pos, self.item_info["Plate"]), - "N": lambda pos: Dispenser(pos, self.item_info["Onion"]), + "N": lambda pos: Dispenser(pos, self.item_info["Onion"]), # N for oNioN "_": "Free", "A": "Agent", "U": lambda pos: Stove( @@ -97,9 +97,11 @@ class Environment: self.designated_player_positions, self.free_positions, ) = self.parse_layout_file(self.layout_path) + self.score: int = 0 - self.world_width: int = 800 - self.world_height: int = 600 + + self.world_width: int = environment_config["world_width"] + self.world_height: int = environment_config["world_height"] def load_item_info(self) -> dict[str, ItemInfo]: with open(self.item_info_path, "r") as file: @@ -205,7 +207,11 @@ class Environment: Returns: """ - facing_point = player.pos + (player.facing_direction * player.interaction_range) + facing_point = player.pos + ( + player.facing_direction + * player.interaction_range + * self.counter_side_length + ) facing_counter = self.get_closest_counter(facing_point) return facing_counter @@ -291,7 +297,9 @@ class Environment: other_players = filter(lambda p: p.name != player.name, self.players.values()) def collide(p): - return np.linalg.norm(player.pos - p.pos) <= (player.radius + p.radius) + return np.linalg.norm(player.pos - p.pos) <= ( + player.radius * self.counter_side_length + ) + (p.radius * self.counter_side_length) return list(filter(collide, other_players)) @@ -309,7 +317,10 @@ class Environment: other_players = filter(lambda p: p.name != player.name, self.players.values()) def collide(p): - return np.linalg.norm(player.pos - p.pos) <= (player.radius + p.radius) + return np.linalg.norm(player.pos - p.pos) <= ( + (player.radius * self.counter_side_length) + + (p.radius * self.counter_side_length) + ) return any(map(collide, other_players)) @@ -348,7 +359,7 @@ class Environment: dx = max(np.abs(cx - counter.pos[0]) - size / 2, 0) dy = max(np.abs(cy - counter.pos[1]) - size / 2, 0) distance = np.linalg.norm([dx, dy]) - return distance < player.radius + return distance < (player.radius * self.counter_side_length) def add_player(self, player: Player): # print(f"Added player {player.name} to the game.") @@ -374,9 +385,12 @@ class Environment: Returns: True if the player touches the world bounds, False if not. """ - collisions_lower = any((player.pos - player.radius) < 0) + collisions_lower = any( + (player.pos - (player.radius * self.counter_side_length)) < 0 + ) collisions_upper = any( - (player.pos + player.radius) > [self.world_width, self.world_height] + (player.pos + (player.radius * self.counter_side_length)) + > [self.world_width, self.world_height] ) return collisions_lower or collisions_upper diff --git a/overcooked_simulator/player.py b/overcooked_simulator/player.py index 51f459e3..0d5d4bc2 100644 --- a/overcooked_simulator/player.py +++ b/overcooked_simulator/player.py @@ -1,8 +1,11 @@ +from pathlib import Path from typing import Optional import numpy as np import numpy.typing as npt +import yaml +from overcooked_simulator import ROOT_DIR from overcooked_simulator.counters import Counter from overcooked_simulator.game_items import Item @@ -14,7 +17,11 @@ class Player: """ - def __init__(self, name: str, pos: Optional[npt.NDArray[float]] = None): + def __init__( + self, + name: str, + pos: Optional[npt.NDArray[float]] = None, + ): self.name: str = name if pos is not None: self.pos: npt.NDArray[float] = np.array(pos, dtype=float) @@ -23,9 +30,15 @@ class Player: self.holding: Optional[Item] = None - self.radius: int = 18 - self.move_dist: int = 5 - self.interaction_range: int = 60 + self.player_config_path: Path = Path( + ROOT_DIR / "game_content" / "player_config.yaml" + ) + with open(self.player_config_path, "r") as file: + self.player_config = yaml.safe_load(file) + + self.radius: float = self.player_config["radius"] + self.move_dist: int = self.player_config["move_dist"] + self.interaction_range: int = self.player_config["interaction_range"] self.facing_direction: npt.NDArray[float] = np.array([0, 1]) self.last_interacted_counter: Optional[ Counter diff --git a/overcooked_simulator/pygame_gui/pygame_gui.py b/overcooked_simulator/pygame_gui/pygame_gui.py index df6c622e..a9efc44a 100644 --- a/overcooked_simulator/pygame_gui/pygame_gui.py +++ b/overcooked_simulator/pygame_gui/pygame_gui.py @@ -212,6 +212,16 @@ class PyGameGUI: """ for p_idx, player in enumerate(state["players"].values()): if USE_PLAYER_COOK_SPRITES: + img_path = self.visualization_config["Cook"]["parts"][0]["path"] + rel_x, rel_y = player.facing_direction + angle = -np.rad2deg(math.atan2(rel_y, rel_x)) + 90 + size = ( + self.visualization_config["Cook"]["parts"][0]["size"] + * self.counter_size + ) + self.draw_image(img_path, size, player.pos, angle) + + else: pos = player.pos size = player.radius * self.counter_size color1 = self.player_colors[p_idx] @@ -227,20 +237,17 @@ class PyGameGUI: self.screen, BLUE, ( - (pos[0] + (facing[1] * 5), pos[1] - (facing[0] * 5)), - (pos[0] - (facing[1] * 5), pos[1] + (facing[0] * 5)), - player.pos + (facing * 25), + ( + pos[0] + (facing[1] * 0.1 * self.counter_size), + pos[1] - (facing[0] * 0.1 * self.counter_size), + ), + ( + pos[0] - (facing[1] * 0.1 * self.counter_size), + pos[1] + (facing[0] * 0.1 * self.counter_size), + ), + player.pos + (facing * 0.5 * self.counter_size), ), ) - else: - img_path = self.visualization_config["Cook"]["parts"][0]["path"] - rel_x, rel_y = player.facing_direction - angle = -np.rad2deg(math.atan2(rel_y, rel_x)) + 90 - size = ( - self.visualization_config["Cook"]["parts"][0]["size"] - * self.counter_size - ) - self.draw_image(img_path, size, player.pos, angle) if SHOW_INTERACTION_RANGE: pygame.draw.circle( -- GitLab