diff --git a/overcooked_simulator/game_content/layouts/basic.layout b/overcooked_simulator/game_content/layouts/basic.layout index d26d393175a6fa636a1ecdd30791a06ffd4661de..da7352dd372718b26c43d5dce25a1c40c503cd01 100644 --- a/overcooked_simulator/game_content/layouts/basic.layout +++ b/overcooked_simulator/game_content/layouts/basic.layout @@ -1,11 +1,11 @@ -___________ -_CCUCTCLCC_ -_C_______C_ -_C_______C_ -_W_________ -_C_________ -_P_________ -_C_______C_ -_C_______X_ -_CCBBCCCCC_ -___________ +__________________ +_CCUCTCLCC________ +_C_______C________ +_C_______C________ +_W________________ +_C________________ +_P________________ +_C_______C________ +_C_______X________ +_CCBBCCCCC________ +__________________ diff --git a/overcooked_simulator/main.py b/overcooked_simulator/main.py index 05d6f0c0c62a9c2ba0df540c5a8b68c15d185a11..bd969d3c22a51098abf1ac621c3f51dfd0eda762 100644 --- a/overcooked_simulator/main.py +++ b/overcooked_simulator/main.py @@ -1,6 +1,5 @@ import sys -import numpy as np import pygame from overcooked_simulator import ROOT_DIR @@ -13,8 +12,12 @@ def main(): simulator = Simulator(ROOT_DIR / "game_content" / "layouts" / "basic.layout", 600) player_one_name = "p1" player_two_name = "p2" - simulator.register_player(Player(player_one_name, np.array([350.0, 200.0]))) - simulator.register_player(Player(player_two_name, np.array([100.0, 200.0]))) + # simulator.register_player(Player(player_one_name, np.array([350.0, 200.0]))) + # simulator.register_player(Player(player_two_name, np.array([100.0, 200.0]))) + for i in range(90): + simulator.register_player(Player(f"p{i+3}")) + simulator.register_player(Player(player_one_name)) + simulator.register_player(Player(player_two_name)) # TODO maybe read the player names and keyboard keys from config file? keys1 = [ diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py index d5d8544220cfa28e3b63d5866f7136712d2168fc..35b780927a624d9cc0a4fb7adf9f75e90f456a55 100644 --- a/overcooked_simulator/overcooked_environment.py +++ b/overcooked_simulator/overcooked_environment.py @@ -2,6 +2,7 @@ from __future__ import annotations from typing import TYPE_CHECKING +import numpy.typing as npt import yaml from overcooked_simulator.game_items import ItemInfo @@ -81,7 +82,7 @@ class Environment: ), # Stove with pot: U because it looks like a pot } - self.counters: list[Counter] = self.create_counters(self.layout_path) + self.counters, self.free_positions = self.create_counters(self.layout_path) self.score: int = 0 self.world_width: int = 800 self.world_height: int = 600 @@ -107,8 +108,9 @@ class Environment: Args: layout_file: Path to the layout file. """ - current_y = self.counter_side_length / 2 - counters = [] + current_y: float = self.counter_side_length / 2 + counters: list[Counter] = [] + free_positions: list[npt.NDArray] = [] with open(layout_file, "r") as layout_file: lines = layout_file.readlines() @@ -122,9 +124,13 @@ class Environment: if counter_class is not None: counter = counter_class(pos) counters.append(counter) + else: + free_positions.append(np.array([current_x, current_y])) current_x += self.counter_side_length current_y += self.counter_side_length - return counters + + + return counters, free_positions def perform_action(self, action: Action): """Performs an action of a player in the environment. Maps different types of action inputs to the diff --git a/overcooked_simulator/player.py b/overcooked_simulator/player.py index ce7a749737561af07bda49fe903b02a78ab269d8..b1b8afdb8378670ac3eaa8e5474bcd7560f837da 100644 --- a/overcooked_simulator/player.py +++ b/overcooked_simulator/player.py @@ -14,9 +14,13 @@ class Player: """ - def __init__(self, name: str, pos: npt.NDArray[float]): + def __init__(self, name: str, pos: Optional[npt.NDArray[float]] = None): self.name: str = name - self.pos: npt.NDArray[float] = np.array(pos, dtype=float) + if pos is not None: + self.pos: npt.NDArray[float] = np.array(pos, dtype=float) + else: + self.pos = None + self.holding: Optional[Item] = None self.radius: int = 18 diff --git a/overcooked_simulator/simulation_runner.py b/overcooked_simulator/simulation_runner.py index 6c9cf367ca96478711ec0aa717bc16c22a88f0d9..dbb3d4c491b82995f19126ca414ab6ad4b5dc4ab 100644 --- a/overcooked_simulator/simulation_runner.py +++ b/overcooked_simulator/simulation_runner.py @@ -1,3 +1,4 @@ +import random import time from threading import Thread @@ -73,6 +74,13 @@ class Simulator(Thread): # print(f"Added player {player.name} to the game.") self.env.players[player.name] = player + if player.pos is None: + if len(self.env.free_positions) > 0: + free_idx = random.randint(0, len(self.env.free_positions) - 1) + player.move_abs(self.env.free_positions[free_idx]) + del self.env.free_positions[free_idx] + else: + print("No free positions left in kitchens.") def register_players(self, players: list[Player]): """Registers multiple players from a list @@ -86,6 +94,13 @@ class Simulator(Thread): def run(self): """Starts the simulator thread. Runs in a loop until stopped.""" + + for p in self.env.players.values(): + print(p.pos) + assert all( + p.pos is not None for p in self.env.players.values() + ), "At least one player position not initialized" + overslept_in_ns = 0 while not self.finished: