diff --git a/overcooked_simulator/counter_factory.py b/overcooked_simulator/counter_factory.py index 9b1487c3706a70dde8b224283a1877c126c41b56..639459a56508c627eb5015aa5b3080bfcd2a1737 100644 --- a/overcooked_simulator/counter_factory.py +++ b/overcooked_simulator/counter_factory.py @@ -81,10 +81,10 @@ def convert_words_to_chars(layout_chars_config: dict[str, str]) -> dict[str, str """ word_refs = { "hash": "#", - "space": " ", + # "space": " ", "dot": ".", "comma": ",", - "semicolon": ";", + # "semicolon": ";", "colon": ":", "minus": "-", "exclamation": "!", @@ -98,6 +98,7 @@ def convert_words_to_chars(layout_chars_config: dict[str, str]) -> dict[str, str "left": "<", "pipe": "|", "at": "@", + "wave": "~", # ~ is None / null in yaml "ocurlybracket": "{", "ccurlybracket": "}", "osquarebracket": "[", @@ -163,8 +164,11 @@ class CounterFactory: """A set of characters that represent counters for agents or free spaces.""" self.counter_classes: dict[str, Type] = dict( - inspect.getmembers( - sys.modules["overcooked_simulator.counters"], inspect.isclass + filter( + lambda k: issubclass(k[1], Counter), + inspect.getmembers( + sys.modules["overcooked_simulator.counters"], inspect.isclass + ), ) ) """A dictionary of counter classes imported from the 'overcooked_simulator.counters' module.""" @@ -191,6 +195,8 @@ class CounterFactory: assert self.can_map(c), f"Can't map counter char {c}" counter_class = None + if c == "@": + print("-") if self.layout_chars_config[c] in self.item_info: item_info = self.item_info[self.layout_chars_config[c]] if item_info.type == ItemType.Equipment and item_info.equipment: @@ -221,7 +227,20 @@ class CounterFactory: ) if counter_class is None: - counter_class = self.counter_classes[self.layout_chars_config[c]] + if self.layout_chars_config[c] in self.counter_classes: + counter_class = self.counter_classes[self.layout_chars_config[c]] + elif self.layout_chars_config[c] == "Plate": + return Counter( + pos=pos, + hook=self.hook, + occupied_by=Plate( + transitions=self.filter_item_info( + by_item_type=ItemType.Meal, add_effects=True + ), + clean=True, + item_info=self.item_info[Plate.__name__], + ), + ) kwargs = { "pos": pos, "hook": self.hook, diff --git a/overcooked_simulator/game_content/environment_config.yaml b/overcooked_simulator/game_content/environment_config.yaml index fdbe1db23264984fa1521d2641c1b49dc2915b41..a81f9f981d22a8e6ad25056f7160ba26ae62e757 100644 --- a/overcooked_simulator/game_content/environment_config.yaml +++ b/overcooked_simulator/game_content/environment_config.yaml @@ -18,15 +18,16 @@ meals: layout_chars: _: Free - hash: Counter + hash: Counter # # A: Agent pipe: Extinguisher P: PlateDispenser C: CuttingBoard X: Trashcan - W: ServingWindow + $: ServingWindow S: Sink +: SinkAddon + at: Plate # @ just a clean plate on a counter U: Pot # with Stove Q: Pan # with Stove O: Peel # with Oven @@ -41,6 +42,15 @@ layout_chars: G: Sausage # sausaGe B: Bun M: Meat + question: Counter # ? mushroom + ↓: Counter + ^: Counter + right: Counter + left: Counter + wave: Free # ~ Water + minus: Free # - Ice + dquote: Counter # " wall/truck + p: Counter # second plate return ?? orders: diff --git a/overcooked_simulator/game_content/layouts/basic.layout b/overcooked_simulator/game_content/layouts/basic.layout index 94e5fb1dc055cefacfa6ef562ad1fe04424e726b..5238c21f86c487ed90ff8efc6a373c6213d1f6c9 100644 --- a/overcooked_simulator/game_content/layouts/basic.layout +++ b/overcooked_simulator/game_content/layouts/basic.layout @@ -1,7 +1,7 @@ #QU#FO#TNLB# #__________M |__________K -W__________I +$__________I #__A_____A_D C__________E C__________G diff --git a/overcooked_simulator/game_content/layouts/large.layout b/overcooked_simulator/game_content/layouts/large.layout index 6933567897246f90838b6a7efd8f15e48ca5b9bf..460244ca3fd685c71cdab3cc2bc6d5d4ae1c9092 100644 --- a/overcooked_simulator/game_content/layouts/large.layout +++ b/overcooked_simulator/game_content/layouts/large.layout @@ -4,7 +4,7 @@ #____________________________________# #____________________________________# #____________________________________K -W____________________________________I +$____________________________________I #____________________________________# #____________________________________# #__A_____A___________________________D diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/1-1-far-apart.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-1-far-apart.layout new file mode 100644 index 0000000000000000000000000000000000000000..0fa1d52d170632fb5996b5baf907f502d0b1cc06 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/1-1-far-apart.layout @@ -0,0 +1,14 @@ +###N####U#### +#___________| +#___A___A___# +#___________S +##########__+ +P___________# +$___________# +$___________X +###C#C###@@## + +; seconds=150 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/1-1_(Overcooked!) \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/1-2-pedestrians.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-2-pedestrians.layout new file mode 100644 index 0000000000000000000000000000000000000000..e9ac2fb08cd9d6437eac0d30da17d6a6114f037e --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/1-2-pedestrians.layout @@ -0,0 +1,12 @@ +_##U#U#__###|X_# +______#____A___$ ++_____@__@_____$ +S________#_____P +____A____#______ +_##C#C#__#T#N##_ + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/1-2_(Overcooked!) +; pedestrians: down the middle road diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/1-3-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-3-moving-counters.layout new file mode 100644 index 0000000000000000000000000000000000000000..3dfb4177c4332c3263818e86c6390d562f5bc1bb --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/1-3-moving-counters.layout @@ -0,0 +1,15 @@ +_____________ +___U#U##$$P|_ +_#____#______ +_@__A_#___A__ +_@____#______ +_@____#______ +_X____#______ +_#C#C##NT?___ +_____________ + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=false +; link: https://overcooked.fandom.com/wiki/1-3_(Overcooked!) +; moving counters \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/1-4-bottleneck.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-4-bottleneck.layout new file mode 100644 index 0000000000000000000000000000000000000000..1eac27c1c4852d05ecec30d6b9ddf1942fceecde --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/1-4-bottleneck.layout @@ -0,0 +1,14 @@ +##S+####QQQQ# +T____###____| +M_A__###__A_# +B___________# +L____###____$ +#____###____$ +#____###____P +X____###____@ +##C#C###@@@@# + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/1-4_(Overcooked!) \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/1-5-circle.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-5-circle.layout new file mode 100644 index 0000000000000000000000000000000000000000..a278d9ab1c5d4214d8194d0b2ef82822dff2ae32 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/1-5-circle.layout @@ -0,0 +1,14 @@ +#####P$$|##### +#?NT#A_A_#S+## +#____________X +#_##########_# +#_##########_# +#_##########_# +#_#######@@@_# +#____________# +#C#C####U#U#U# + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/1-5_(Overcooked!) \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/1-6-raising-platforms.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-6-raising-platforms.layout new file mode 100644 index 0000000000000000000000000000000000000000..5af323f1c86c874cb126fb25170fe46e67cf01e3 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/1-6-raising-platforms.layout @@ -0,0 +1,14 @@ +##S+###@Q@Q@# +M___________# +T___________| +L___________$ +#___________$ +#___________P +X___________# +##C#C##Q#Q#B# + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/1-6_(Overcooked!) +; raising platforms based on earthquakes \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/2-1-moving-trucks.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-1-moving-trucks.layout new file mode 100644 index 0000000000000000000000000000000000000000..b7a4745ab23db07ddaa344b83e36ffa2840a2a07 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/2-1-moving-trucks.layout @@ -0,0 +1,17 @@ +_______________ +__#QQQ#@@@#____ +__#_______$____ +__B_______$____ +__#_______P____ +_______________ +__M__A____X____ +__L_______#____ +__T__A____C____ +__#|###C###____ +_______________ + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=false +; link: https://overcooked.fandom.com/wiki/2-1_(Overcooked!) +; moving trucks: counters and ground are moving \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/2-2-rats.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-2-rats.layout new file mode 100644 index 0000000000000000000000000000000000000000..4543c03b09012c4d8f86a88d3eb688f7230ba0cf --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/2-2-rats.layout @@ -0,0 +1,17 @@ +#####P$$|##### +#####____##### +##S+#____#S+## +X____________X +#____________# +U___@__A_@___# +#___@____@___# +#___#_A__#___# +U___#____#___# +#___#____#___# +#?N##C##C##NT# + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/2-2_(Overcooked!) +; rats: steal ingredients + meals \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/2-3-separated-conveyors.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-3-separated-conveyors.layout new file mode 100644 index 0000000000000000000000000000000000000000..6980844cd618acaf578975d98b261d0b0c6d0147 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/2-3-separated-conveyors.layout @@ -0,0 +1,15 @@ +>>>>>>>>>>>>>>>↓ +^#_____##@____#↓ +^+A____|#@_A__#↓ +^S_____Q#C____$↓ +^M_____###____$↓ +^L_____Q#C____P↓ +^B_____###____#↓ +^T_____X#@____X↓ +^<<<<<<<<<<<<<<< + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/2-3_(Overcooked!) +; conveyors \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/2-4-separated-2.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-4-separated-2.layout new file mode 100644 index 0000000000000000000000000000000000000000..d0416de526c511526c42cf430b7ae40ead2ff46b --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/2-4-separated-2.layout @@ -0,0 +1,16 @@ +#@@@##C#C###### +#_____________$ +#___A_________$ +#_____________P +####____###___# +X<<<<<<X>>>>>>X +#___###____#### +Q_____________# +#________A____# +Q_____________# +##Q#+S#|##BTLM# + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/2-4_(Overcooked!) \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/3-1-ice.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-1-ice.layout new file mode 100644 index 0000000000000000000000000000000000000000..4d47b65b2cd83bf38a0bdf9c08c6d235c4074cc9 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/3-1-ice.layout @@ -0,0 +1,19 @@ +~~~~~~~~~~~~~~~~ +~~~~~~P$$~~~~~~~ +~~~---------~~~~ +~~~-----------~~ +~~--#C#C|##----~ +~---S#####IA---~ +~---+#####K---~~ +~---#FFF##F---~~ +~~-A----@@@--~~~ +~~-----------~~~ +~~~~--------~~~~ +~~~~~~~----~~~~~ +~~~~~~~~~~~~~~~~ + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/3-1_(Overcooked!) +; ice: accelerating \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/3-2-separated-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-2-separated-moving-counters.layout new file mode 100644 index 0000000000000000000000000000000000000000..dc8aefbc3a7c3e149bbff07a600bd452453edee9 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/3-2-separated-moving-counters.layout @@ -0,0 +1,16 @@ +##$$####$$### +####P##______ +______?______ +______N______ +U_____T_____U +X#####X______ +U_____#_____U +______#______ +__A___#__A___ +@@@C#C#______ + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=false +; link: https://overcooked.fandom.com/wiki/3-2_(Overcooked!) +; moving counters \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/3-3-moving-trucks-2.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-3-moving-trucks-2.layout new file mode 100644 index 0000000000000000000000000000000000000000..f5385f60d38a706c609fc6f199a323f1bfeb36d1 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/3-3-moving-trucks-2.layout @@ -0,0 +1,15 @@ +__________""#NIK?TX## +__________""#__A____$ +__________""#_______$ +__________""#__A____P +__________""_________ +C_________""________C +#_________""________# +C_________""________C +#|U#U#U@@####F@F@F|## + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=false +; link: https://overcooked.fandom.com/wiki/3-3_(Overcooked!) +; moving trucks: counters and ground are moving \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/3-4-ice-moving-platforms.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-4-ice-moving-platforms.layout new file mode 100644 index 0000000000000000000000000000000000000000..389caab9fc91d253aeba25b3c9129e416139b326 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/3-4-ice-moving-platforms.layout @@ -0,0 +1,14 @@ +##F#F#~~~~@@F## +X-----~~~-----# +#-A---~~~-----# +I-----~~~-----$ +#-----~~~-----$ +K-----~~~-----P +|--A----------- +#+S##~---#C#C## + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/3-4_(Overcooked!) +; ice, moving platforms, water \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/4-1-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-1-moving-counters.layout new file mode 100644 index 0000000000000000000000000000000000000000..4b6fcaec5c611c09428f82fd8d116c69bee5d47c --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/4-1-moving-counters.layout @@ -0,0 +1,17 @@ +"""""#|#O#O#O#X#""" +_____#_________#""" +__#____________#""" +__####____##@@@#### +__+_______#_______$ +__S___A___#___A___$ +__#_______#_______P +__#####C#C#____#### +__#____________#""" +____"#_________#""" +"""""###DTE?G###""" + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/4-1_(Overcooked!) +; moving counters \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/4-2-dark.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-2-dark.layout new file mode 100644 index 0000000000000000000000000000000000000000..a591aa97c088a0edaa01287038770ff4df30d579 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/4-2-dark.layout @@ -0,0 +1,19 @@ +#########|U#@@@# +##S+##C##______$ +#______________$ +C______________P +#______________# +#______###X##### +U______#######T# +#__A___________# +#___________A__# +N______________# +#########______? +################ + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/4-2_(Overcooked!) +; link: https://www.trueachievements.com/game/Overcooked/walkthrough/6 +; dark: only flashlight fov \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/4-3-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-3-moving-counters.layout new file mode 100644 index 0000000000000000000000000000000000000000..eb704056ac8135e4e8cc11ede3dbd135f4794340 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/4-3-moving-counters.layout @@ -0,0 +1,18 @@ +###S+#####P$$##X# +#_______|_______# +C_______________Q +#_______#_______# +#_______#_______# +###_######@@@_### +B_______#_______# +T__A____#___A___# +M_______________Q +L_______#_______# +#_______#_______# +################# + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/4-3_(Overcooked!) +; moving counters \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/overcooked-1/4-4-moving-counters-separated.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-4-moving-counters-separated.layout new file mode 100644 index 0000000000000000000000000000000000000000..88bc660ac2bc1ddcbd2600b715a38613dc4d16b7 --- /dev/null +++ b/overcooked_simulator/game_content/layouts/overcooked-1/4-4-moving-counters-separated.layout @@ -0,0 +1,16 @@ +#________↓C#O##O### ++________↓________S +S________↓________+ +#________↓________# +#________↓#MBLT#@@# +#|#Q##Q#C↓________p +P________↓________$ +$_____A__↓________$ +$________↓________# +#@@#G?DE#X_________ + +; seconds=240 +; plates={c:0, d:0} +; dirty_plates=true +; link: https://overcooked.fandom.com/wiki/4-4_(Overcooked!) +; moving counters \ No newline at end of file diff --git a/overcooked_simulator/game_content/layouts/split.layout b/overcooked_simulator/game_content/layouts/split.layout index 39bace3e0a94b0594d8ef9f294daeb40aae4492f..3f29e313f63f566ad9deb846f465412949d82e0c 100644 --- a/overcooked_simulator/game_content/layouts/split.layout +++ b/overcooked_simulator/game_content/layouts/split.layout @@ -1,7 +1,7 @@ #QU#T###NLB# #__________M #____A_____# -W__________# +$__________# ############ C__________# C_____A____# diff --git a/overcooked_simulator/gui_2d_vis/overcooked_gui.py b/overcooked_simulator/gui_2d_vis/overcooked_gui.py index 8808d1dbb0be8194625b0f1872298fc0b3a5a8de..2ab2e9001131b2587ae743fe3256a758f5509c22 100644 --- a/overcooked_simulator/gui_2d_vis/overcooked_gui.py +++ b/overcooked_simulator/gui_2d_vis/overcooked_gui.py @@ -359,6 +359,14 @@ class PyGameGUI: str(p.name): p for p in (ROOT_DIR / "game_content" / "layouts").glob("*.layout") } + self.layout_file_paths.update( + { + str(p.name): p + for p in (ROOT_DIR / "game_content" / "layouts" / "overcooked-1").glob( + "*.layout" + ) + } + ) assert len(self.layout_file_paths) != 0, "No layout files." dropdown_width, dropdown_height = 200, 40 self.layout_selection = pygame_gui.elements.UIDropDownMenu( diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py index 5302f55a72d1270649efbac5324a94db791c9f6a..1ea734dbd423189c4cd4d6ea39fabee2cee0106b 100644 --- a/overcooked_simulator/overcooked_environment.py +++ b/overcooked_simulator/overcooked_environment.py @@ -403,11 +403,13 @@ class Environment: lines = list(filter(lambda l: l != "", lines)) for line in lines: - line = line.replace("\n", "").replace(" ", "") # remove newline char + line = line.replace(" ", "") + if not line or line.startswith(";"): + break current_x: float = starting_at grid_line = [] for character in line: - character = character.capitalize() + # character = character.capitalize() pos = np.array([current_x, current_y]) assert self.counter_factory.can_map( @@ -432,7 +434,7 @@ class Environment: current_y += 1 self.kitchen_width: float = len(lines[0]) + starting_at - self.kitchen_height = len(lines) + starting_at + self.kitchen_height = current_y self.determine_counter_orientations( counters, grid, np.array([self.kitchen_width / 2, self.kitchen_height / 2]) @@ -478,7 +480,7 @@ class Environment: c.set_orientation(nearest_vec) elif grid_idx[0] == 0: - if grid_idx[1] == 0: + if grid_idx[1] == 0 or fst_counter_in_row is None: # counter top left c.set_orientation(np.array([1, 0])) else: @@ -663,8 +665,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. diff --git a/overcooked_simulator/utils.py b/overcooked_simulator/utils.py index b78d44af869d9a53ec17f5f2cd8eda191e0b4e17..5859e5c11d7828db0eadeff935900db822b83729 100644 --- a/overcooked_simulator/utils.py +++ b/overcooked_simulator/utils.py @@ -168,3 +168,13 @@ class NumpyAndDataclassEncoder(json.JSONEncoder): # return getattr(obj, "__name__", "Unknown") return json.JSONEncoder.default(self, obj) + + +def create_layout(w, h): + for y in range(h): + for x in range(w): + if x == 0 or y == 0 or x == w - 1 or y == h - 1: + print("#", end="") + else: + print("_", end="") + print("")