From 528b180266fcc100c88424bb63b3a2b9dfc4c4ba Mon Sep 17 00:00:00 2001
From: fheinrich <fheinrich@techfak.uni-bielefeld.de>
Date: Thu, 18 Jan 2024 14:26:46 +0100
Subject: [PATCH] Progress bars for orders, small fix

---
 .../game_content/environment_config.yaml      | 14 +++++++-------
 .../gui_2d_vis/overcooked_gui.py              | 19 +++++++++++++++----
 overcooked_simulator/order.py                 |  4 ++--
 .../overcooked_environment.py                 | 13 +++++++++----
 4 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/overcooked_simulator/game_content/environment_config.yaml b/overcooked_simulator/game_content/environment_config.yaml
index 957c8890..39f71ced 100644
--- a/overcooked_simulator/game_content/environment_config.yaml
+++ b/overcooked_simulator/game_content/environment_config.yaml
@@ -11,17 +11,17 @@ orders:
     duration_sample:
       func: uniform
       kwargs:
-        a: 30
-        b: 50
-    max_orders: 5
+        a: 10
+        b: 13
+    max_orders: 6
     num_start_meals: 3
-    sample_on_dur: false
+    sample_on_dur: true
     sample_on_dur_func:
       func: uniform
       kwargs:
-        a: 20
-        b: 30
-    sample_on_serving: true
+        a: 10
+        b: 13
+    sample_on_serving: false
     score_calc_gen_kwargs:
       other: 0
       scores:
diff --git a/overcooked_simulator/gui_2d_vis/overcooked_gui.py b/overcooked_simulator/gui_2d_vis/overcooked_gui.py
index dd4f46d1..d15a6c42 100644
--- a/overcooked_simulator/gui_2d_vis/overcooked_gui.py
+++ b/overcooked_simulator/gui_2d_vis/overcooked_gui.py
@@ -22,6 +22,7 @@ from overcooked_simulator.game_items import (
 )
 from overcooked_simulator.gui_2d_vis.game_colors import BLUE
 from overcooked_simulator.gui_2d_vis.game_colors import colors, Color
+from overcooked_simulator.order import Order
 from overcooked_simulator.overcooked_environment import Action
 from overcooked_simulator.simulation_runner import Simulator
 
@@ -498,7 +499,7 @@ class PyGameGUI:
         #             triangle_offsets = create_polygon(len(item.parts), length=10)
         #             self.draw_item(pos + triangle_offsets[idx], o, scale=0.6)
 
-    def draw_progress_bar(self, pos, percent):
+    def draw_progress_bar(self, pos, percent, screen=None):
         """Visualize progress of progressing item as a green bar under the item."""
         bar_height = self.grid_size * 0.2
         progress_width = percent * self.grid_size
@@ -508,7 +509,10 @@ class PyGameGUI:
             progress_width,
             bar_height,
         )
-        pygame.draw.rect(self.game_screen, colors["green1"], progress_bar)
+        if screen is None:
+            pygame.draw.rect(self.game_screen, colors["green1"], progress_bar)
+        else:
+            pygame.draw.rect(screen, colors["green1"], progress_bar)
 
     def draw_counter(self, counter):
         """Visualization of a counter at its position. If it is occupied by an item, it is also shown.
@@ -573,7 +577,8 @@ class PyGameGUI:
 
         order_rects_start = (orders_height // 2) - (self.grid_size // 2)
 
-        for idx, order in enumerate([o.meal for o in state["orders"]]):
+        for idx, order in enumerate(state["orders"]):
+            order: Order
             order_upper_left = [
                 order_rects_start + idx * self.grid_size * 1.5,
                 order_rects_start,
@@ -599,10 +604,16 @@ class PyGameGUI:
             )
             self.draw_item(
                 center,
-                order,
+                order.meal,
                 plate=True,
                 screen=order_screen,
             )
+            order_done_seconds = (
+                (order.start_time + order.max_duration) - state["env_time"]
+            ).total_seconds()
+
+            percentage = order_done_seconds / order.max_duration.total_seconds()
+            self.draw_progress_bar(center, percentage, screen=order_screen)
 
         orders_rect = order_screen.get_rect()
         orders_rect.center = [
diff --git a/overcooked_simulator/order.py b/overcooked_simulator/order.py
index c41e320a..3d18af97 100644
--- a/overcooked_simulator/order.py
+++ b/overcooked_simulator/order.py
@@ -270,11 +270,11 @@ class OrderAndScoreManager:
                         self.score -= penalty
                         remove_penalties.append(i)
 
-                for i in remove_penalties:
+                for i in reversed(remove_penalties):
                     # or del order.timed_penalties[index]
                     order.timed_penalties.pop(i)
 
-            for remove_order in remove_orders:
+            for remove_order in reversed(remove_orders):
                 del self.open_orders[remove_order]
 
             self.update_next_relevant_time()
diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py
index dfc9e9fd..7f612810 100644
--- a/overcooked_simulator/overcooked_environment.py
+++ b/overcooked_simulator/overcooked_environment.py
@@ -320,18 +320,19 @@ class Environment:
         Args:
             action: The action to be performed
         """
-
         assert action.player in self.players.keys(), "Unknown player."
         player = self.players[action.player]
 
         if action.act_type == "movement":
-            self.perform_movement(player, action.action)
+            with self.lock:
+                self.perform_movement(player, action.action)
 
         else:
             counter = self.get_facing_counter(player)
             if player.can_reach(counter):
                 if action.act_type == "pickup":
-                    player.pick_action(counter)
+                    with self.lock:
+                        player.pick_action(counter)
 
                 elif action.act_type == "interact":
                     if action.action == "keydown":
@@ -339,7 +340,10 @@ class Environment:
                         player.last_interacted_counter = counter
             if action.action == "keyup":
                 if player.last_interacted_counter:
-                    player.perform_interact_hold_stop(player.last_interacted_counter)
+                    with self.lock:
+                        player.perform_interact_hold_stop(
+                            player.last_interacted_counter
+                        )
 
     def get_closest_counter(self, point: np.ndarray):
         """Determines the closest counter for a given 2d-coordinate point in the env.
@@ -571,6 +575,7 @@ class Environment:
             "score": self.order_and_score.score,
             "orders": self.order_and_score.open_orders,
             "ended": self.game_ended,
+            "env_time": self.env_time,
             "remaining_time": max(self.env_time_end - self.env_time, timedelta(0)),
         }
 
-- 
GitLab