From fb060696e8d81d5f12696b542c0fe4215ffc0efa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20Schr=C3=B6der?=
 <fschroeder@techfak.uni-bielefeld.de>
Date: Sat, 10 Feb 2024 13:19:08 +0100
Subject: [PATCH] Add Overcooked 1 layout files and minor code adjustments

Several Overcooked 1 layout files have been added along with changes in the counter mappings for the game simulator. This includes serving window character changes and addition of clean plate character mappings. Additionally, `overcooked_simulator/utils.py` has been modified to include a method that creates a basic layout grid. These changes help in enhancing and expanding the game simulator.
---
 overcooked_simulator/counter_factory.py       | 29 +++++++++++++++----
 .../game_content/environment_config.yaml      | 14 +++++++--
 .../game_content/layouts/basic.layout         |  2 +-
 .../game_content/layouts/large.layout         |  2 +-
 .../layouts/overcooked-1/1-1-far-apart.layout | 14 +++++++++
 .../overcooked-1/1-2-pedestrians.layout       | 12 ++++++++
 .../overcooked-1/1-3-moving-counters.layout   | 15 ++++++++++
 .../overcooked-1/1-4-bottleneck.layout        | 14 +++++++++
 .../layouts/overcooked-1/1-5-circle.layout    | 14 +++++++++
 .../overcooked-1/1-6-raising-platforms.layout | 14 +++++++++
 .../overcooked-1/2-1-moving-trucks.layout     | 17 +++++++++++
 .../layouts/overcooked-1/2-2-rats.layout      | 17 +++++++++++
 .../2-3-separated-conveyors.layout            | 15 ++++++++++
 .../overcooked-1/2-4-separated-2.layout       | 16 ++++++++++
 .../layouts/overcooked-1/3-1-ice.layout       | 19 ++++++++++++
 .../3-2-separated-moving-counters.layout      | 16 ++++++++++
 .../overcooked-1/3-3-moving-trucks-2.layout   | 15 ++++++++++
 .../3-4-ice-moving-platforms.layout           | 14 +++++++++
 .../overcooked-1/4-1-moving-counters.layout   | 17 +++++++++++
 .../layouts/overcooked-1/4-2-dark.layout      | 19 ++++++++++++
 .../overcooked-1/4-3-moving-counters.layout   | 18 ++++++++++++
 .../4-4-moving-counters-separated.layout      | 16 ++++++++++
 .../game_content/layouts/split.layout         |  2 +-
 .../gui_2d_vis/overcooked_gui.py              |  8 +++++
 .../overcooked_environment.py                 | 12 ++++----
 overcooked_simulator/utils.py                 | 10 +++++++
 26 files changed, 346 insertions(+), 15 deletions(-)
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/1-1-far-apart.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/1-2-pedestrians.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/1-3-moving-counters.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/1-4-bottleneck.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/1-5-circle.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/1-6-raising-platforms.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/2-1-moving-trucks.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/2-2-rats.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/2-3-separated-conveyors.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/2-4-separated-2.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/3-1-ice.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/3-2-separated-moving-counters.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/3-3-moving-trucks-2.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/3-4-ice-moving-platforms.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/4-1-moving-counters.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/4-2-dark.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/4-3-moving-counters.layout
 create mode 100644 overcooked_simulator/game_content/layouts/overcooked-1/4-4-moving-counters-separated.layout

diff --git a/overcooked_simulator/counter_factory.py b/overcooked_simulator/counter_factory.py
index 9b1487c3..639459a5 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 fdbe1db2..a81f9f98 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 94e5fb1d..5238c21f 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 69335678..460244ca 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 00000000..0fa1d52d
--- /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 00000000..e9ac2fb0
--- /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 00000000..3dfb4177
--- /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 00000000..1eac27c1
--- /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 00000000..a278d9ab
--- /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 00000000..5af323f1
--- /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 00000000..b7a4745a
--- /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 00000000..4543c03b
--- /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 00000000..6980844c
--- /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 00000000..d0416de5
--- /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 00000000..4d47b65b
--- /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 00000000..dc8aefbc
--- /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 00000000..f5385f60
--- /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 00000000..389caab9
--- /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 00000000..4b6fcaec
--- /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 00000000..a591aa97
--- /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 00000000..eb704056
--- /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 00000000..88bc660a
--- /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 39bace3e..3f29e313 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 8808d1db..2ab2e900 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 5302f55a..1ea734db 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 b78d44af..5859e5c1 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("")
-- 
GitLab