Skip to content
Snippets Groups Projects
Commit 27efb5df authored by Florian Schröder's avatar Florian Schröder
Browse files

updated sinks without sink manager and find sink addon.

Stack plates in sink.
parent 787a2948
No related branches found
No related tags found
1 merge request!20Resolve "Plate washing cycle"
Pipeline #42396 failed
...@@ -8,7 +8,6 @@ from typing import TYPE_CHECKING, Optional ...@@ -8,7 +8,6 @@ from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING: if TYPE_CHECKING:
from overcooked_simulator.overcooked_environment import ( from overcooked_simulator.overcooked_environment import (
GameScore, GameScore,
SinkManager,
) )
import numpy as np import numpy as np
...@@ -20,7 +19,6 @@ from overcooked_simulator.game_items import ( ...@@ -20,7 +19,6 @@ from overcooked_simulator.game_items import (
CookingEquipment, CookingEquipment,
Meal, Meal,
Plate, Plate,
ItemInfo,
) )
...@@ -202,15 +200,8 @@ class PlateDispenser(Counter): ...@@ -202,15 +200,8 @@ class PlateDispenser(Counter):
if self.occupied_by: if self.occupied_by:
return self.occupied_by.pop() return self.occupied_by.pop()
# def can_drop_off(self, item: Item) -> bool:
# return False
def can_drop_off(self, item: Item) -> bool: def can_drop_off(self, item: Item) -> bool:
return ( return not self.occupied_by or self.occupied_by[-1].can_combine(item)
not self.occupied_by
or isinstance(item, Plate)
or self.occupied_by[-1].can_combine(item)
)
def drop_off(self, item: Item) -> Item | None: def drop_off(self, item: Item) -> Item | None:
"""Takes the thing dropped of by the player. """Takes the thing dropped of by the player.
...@@ -223,8 +214,6 @@ class PlateDispenser(Counter): ...@@ -223,8 +214,6 @@ class PlateDispenser(Counter):
""" """
if not self.occupied_by: if not self.occupied_by:
self.occupied_by.append(item) self.occupied_by.append(item)
elif isinstance(item, Plate):
self.occupied_by.append(item)
elif self.occupied_by[-1].can_combine(item): elif self.occupied_by[-1].can_combine(item):
return self.occupied_by[-1].combine(item) return self.occupied_by[-1].combine(item)
return None return None
...@@ -316,23 +305,23 @@ class Stove(Counter): ...@@ -316,23 +305,23 @@ class Stove(Counter):
class Sink(Counter): class Sink(Counter):
def __init__(self, pos, sink_manager): def __init__(self, pos, sink_addon=None):
super().__init__(pos) super().__init__(pos)
self.progressing = False self.progressing = False
self.sink_manager: SinkManager = sink_manager self.sink_addon: SinkAddon = sink_addon
self.occupied_by = None self.occupied_by = deque()
# TODO: can put multiple things in here and hold the button to do all.
def progress(self): def progress(self):
"""Called by environment step function for time progression""" """Called by environment step function for time progression"""
if self.progressing: if self.progressing:
if isinstance(self.occupied_by, Plate): if self.occupied_by:
self.occupied_by.progress() self.occupied_by[-1].progress()
if self.occupied_by.finished: if self.occupied_by[-1].finished:
self.progressing = False plate = self.occupied_by.pop()
self.occupied_by = None if not self.occupied_by:
self.sink_manager.update_move_plate() self.pause_progress()
plate.finished_call()
self.sink_addon.add_clean_plate(plate)
def start_progress(self): def start_progress(self):
"""Starts the cutting process.""" """Starts the cutting process."""
...@@ -356,26 +345,43 @@ class Sink(Counter): ...@@ -356,26 +345,43 @@ class Sink(Counter):
def can_drop_off(self, item: Item) -> bool: def can_drop_off(self, item: Item) -> bool:
return isinstance(item, Plate) and not item.clean return isinstance(item, Plate) and not item.clean
def drop_off(self, item: Item) -> Item | None:
self.occupied_by.appendleft(item)
return None
def pick_up(self, on_hands: bool = True):
return
def set_addon(self, sink_addon):
self.sink_addon = sink_addon
class SinkAddon(Counter): class SinkAddon(Counter):
def __init__(self, pos, dispensing: ItemInfo): def __init__(self, pos, occupied_by=None):
super().__init__(pos) super().__init__(pos)
self.dispensing = dispensing self.occupied_by = deque(occupied_by) if occupied_by else deque()
self.number_clean_plates = 0
self.occupied_by = [
self.dispensing.create_item() for _ in range(self.number_clean_plates)
]
def can_drop_off(self, item: Item) -> bool: def can_drop_off(self, item: Item) -> bool:
return False return not self.occupied_by or self.occupied_by[-1].can_combine(item)
def add_clean_plate(self): def drop_off(self, item: Item) -> Item | None:
self.number_clean_plates += 1 """Takes the thing dropped of by the player.
plate = self.dispensing.create_item()
if isinstance(plate, Plate): Args:
plate.finished_call() item: The item to be placed on the counter.
self.occupied_by.append(plate)
Returns: TODO Return information, whether the score is affected (Serving Window?)
"""
if not self.occupied_by:
self.occupied_by.append(item)
elif self.occupied_by[-1].can_combine(item):
return self.occupied_by[-1].combine(item)
return None
def add_clean_plate(self, plate: Plate):
self.occupied_by.appendleft(plate)
def pick_up(self, on_hands: bool = True): def pick_up(self, on_hands: bool = True):
return_this = self.occupied_by.pop() if self.occupied_by:
return return_this return self.occupied_by.pop()
...@@ -2,6 +2,6 @@ counter_side_length: 40 ...@@ -2,6 +2,6 @@ counter_side_length: 40
world_width: 800 world_width: 800
world_height: 600 world_height: 600
plates: plates:
clean_plates: 1 clean_plates: 0
dirty_plates: 0 dirty_plates: 10
plate_delay: [ 5, 10 ] plate_delay: [ 5, 10 ]
\ No newline at end of file
...@@ -4,8 +4,8 @@ _#_______#_______ ...@@ -4,8 +4,8 @@ _#_______#_______
_#_______#_______ _#_______#_______
_W_______________ _W_______________
_#__A__A_________ _#__A__A_________
_P_______________ _B_______________
_#_______#_______ _B_______#_______
_#_______X_______ _#_______X_______
_##BB##S+#_______ _#P#S+#S+#_______
_________________ _________________
...@@ -72,7 +72,7 @@ class ItemInfo: ...@@ -72,7 +72,7 @@ class ItemInfo:
def can_start_meal(self, start_item: Item): def can_start_meal(self, start_item: Item):
# TODO check specific order / only specific start items # TODO check specific order / only specific start items
return any( return start_item and any(
[start_item.name == s for meal in self._start_items for s in meal.needs] [start_item.name == s for meal in self._start_items for s in meal.needs]
) )
......
...@@ -4,7 +4,6 @@ import logging ...@@ -4,7 +4,6 @@ import logging
import random import random
from pathlib import Path from pathlib import Path
from threading import Lock from threading import Lock
from typing import Optional
import numpy as np import numpy as np
import numpy.typing as npt import numpy.typing as npt
...@@ -58,18 +57,6 @@ class GameScore: ...@@ -58,18 +57,6 @@ class GameScore:
return self.score return self.score
class SinkManager:
def __init__(self):
self.sink: Optional[Sink] = None
self.sink_addon: Optional[SinkAddon] = None
def register_sink_addon(self, sink_addon: SinkAddon):
self.sink_addon = sink_addon
def update_move_plate(self):
self.sink_addon.add_clean_plate()
class Environment: class Environment:
"""Environment class which handles the game logic for the overcooked-inspired environment. """Environment class which handles the game logic for the overcooked-inspired environment.
...@@ -90,7 +77,6 @@ class Environment: ...@@ -90,7 +77,6 @@ class Environment:
self.item_info = self.load_item_info() self.item_info = self.load_item_info()
self.game_score = GameScore() self.game_score = GameScore()
self.sink_manager = SinkManager()
self.SYMBOL_TO_CHARACTER_MAP = { self.SYMBOL_TO_CHARACTER_MAP = {
"#": Counter, # because # looks a bit like a counter "#": Counter, # because # looks a bit like a counter
...@@ -112,7 +98,7 @@ class Environment: ...@@ -112,7 +98,7 @@ class Environment:
self.item_info["Pot"].create_item(), self.item_info["Pot"].create_item(),
), # Stove with pot: U because it looks like a pot ), # Stove with pot: U because it looks like a pot
"S": lambda pos: Sink(pos, self.sink_manager), "S": lambda pos: Sink(pos, self.sink_manager),
"+": lambda pos: SinkAddon(pos, self.item_info["Plate"]), "+": SinkAddon,
} }
( (
...@@ -452,17 +438,33 @@ class Environment: ...@@ -452,17 +438,33 @@ class Environment:
plate_dispenser = self.get_counter_of_type(PlateDispenser) plate_dispenser = self.get_counter_of_type(PlateDispenser)
assert len(plate_dispenser) > 0, "No Plate Return in the environment" assert len(plate_dispenser) > 0, "No Plate Return in the environment"
sink_addons = self.get_counter_of_type(SinkAddon)
for counter in self.counters: for counter in self.counters:
match counter: match counter:
case ServingWindow(): case ServingWindow():
counter.add_plate_dispenser(plate_dispenser[0]) counter.add_plate_dispenser(plate_dispenser[0])
case Sink(): case Sink(pos=pos):
... assert len(sink_addons) > 0, "No SinkAddon but normal Sink"
closest_addon = self.get_closest(pos, sink_addons)
print(
np.linalg.norm(closest_addon.pos - pos),
self.counter_side_length,
)
assert self.counter_side_length - (
self.counter_side_length * 0.05
) <= np.linalg.norm(
closest_addon.pos - pos
), f"No SinkAddon connected to Sink at pos {pos}"
counter.set_addon(closest_addon)
case SinkAddon(): case SinkAddon():
... ...
pass pass
def get_closest(self, pos: npt.NDArray[float], counter: list[Counter]):
return min(counter, key=lambda c: np.linalg.norm(c.pos - pos))
def get_counter_of_type(self, counter_type) -> list[Counter]: def get_counter_of_type(self, counter_type) -> list[Counter]:
return list( return list(
filter(lambda counter: isinstance(counter, counter_type), self.counters) filter(lambda counter: isinstance(counter, counter_type), self.counters)
......
...@@ -84,7 +84,7 @@ Sink: ...@@ -84,7 +84,7 @@ Sink:
width: 0.625 width: 0.625
- color: darkslategray1 - color: darkslategray1
type: circle type: circle
radius: 0.4 radius: 0.45
SinkAddon: SinkAddon:
parts: parts:
...@@ -92,10 +92,21 @@ SinkAddon: ...@@ -92,10 +92,21 @@ SinkAddon:
type: rect type: rect
height: 0.875 height: 0.875
width: 0.625 width: 0.625
- color: darkslategray1 - type: rect
type: circle color: gray83
radius: 0.4 height: 0.8
width: 0.1
center_offset: [ -0.4, 0.1 ]
- type: rect
color: gray83
height: 0.8
width: 0.1
center_offset: [ -0.4, -0.1 ]
- type: rect
color: gray83
height: 0.8
width: 0.1
center_offset: [ -0.4, -0.3 ]
# Items # Items
Tomato: Tomato:
parts: parts:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment