diff --git a/overcooked_simulator/game_content/layouts_backup/basic.layout b/overcooked_simulator/game_content/layouts/basic.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/basic.layout rename to overcooked_simulator/game_content/layouts/basic.layout diff --git a/overcooked_simulator/game_content/layouts_backup/empty.layout b/overcooked_simulator/game_content/layouts/empty.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/empty.layout rename to overcooked_simulator/game_content/layouts/empty.layout diff --git a/overcooked_simulator/game_content/layouts_backup/large.layout b/overcooked_simulator/game_content/layouts/large.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/large.layout rename to overcooked_simulator/game_content/layouts/large.layout diff --git a/overcooked_simulator/game_content/layouts_backup/large_t.layout b/overcooked_simulator/game_content/layouts/large_t.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/large_t.layout rename to overcooked_simulator/game_content/layouts/large_t.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-1-far-apart.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-1-far-apart.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-1-far-apart.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/1-1-far-apart.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-2-pedestrians.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-2-pedestrians.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-2-pedestrians.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/1-2-pedestrians.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-3-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-3-moving-counters.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-3-moving-counters.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/1-3-moving-counters.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-4-bottleneck.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-4-bottleneck.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-4-bottleneck.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/1-4-bottleneck.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-5-circle.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-5-circle.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-5-circle.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/1-5-circle.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-6-raising-platforms.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-6-raising-platforms.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-6-raising-platforms.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/1-6-raising-platforms.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/2-1-moving-trucks.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-1-moving-trucks.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/2-1-moving-trucks.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/2-1-moving-trucks.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/2-2-rats.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-2-rats.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/2-2-rats.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/2-2-rats.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/2-3-separated-conveyors.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-3-separated-conveyors.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/2-3-separated-conveyors.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/2-3-separated-conveyors.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/2-4-separated-2.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-4-separated-2.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/2-4-separated-2.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/2-4-separated-2.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/3-1-ice.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-1-ice.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/3-1-ice.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/3-1-ice.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/3-2-separated-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-2-separated-moving-counters.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/3-2-separated-moving-counters.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/3-2-separated-moving-counters.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/3-3-moving-trucks-2.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-3-moving-trucks-2.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/3-3-moving-trucks-2.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/3-3-moving-trucks-2.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/3-4-ice-moving-platforms.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-4-ice-moving-platforms.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/3-4-ice-moving-platforms.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/3-4-ice-moving-platforms.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/4-1-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-1-moving-counters.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/4-1-moving-counters.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/4-1-moving-counters.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/4-2-dark.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-2-dark.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/4-2-dark.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/4-2-dark.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/4-3-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-3-moving-counters.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/4-3-moving-counters.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/4-3-moving-counters.layout diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/4-4-moving-counters-separated.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-4-moving-counters-separated.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/4-4-moving-counters-separated.layout rename to overcooked_simulator/game_content/layouts/overcooked-1/4-4-moving-counters-separated.layout diff --git a/overcooked_simulator/game_content/layouts_backup/rot_test.layout b/overcooked_simulator/game_content/layouts/rot_test.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/rot_test.layout rename to overcooked_simulator/game_content/layouts/rot_test.layout diff --git a/overcooked_simulator/game_content/layouts_backup/split.layout b/overcooked_simulator/game_content/layouts/split.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/split.layout rename to overcooked_simulator/game_content/layouts/split.layout diff --git a/overcooked_simulator/game_content/layouts_backup/godot_test_layout.layout b/overcooked_simulator/game_content/layouts/test_layouts/godot_test_layout.layout similarity index 100% rename from overcooked_simulator/game_content/layouts_backup/godot_test_layout.layout rename to overcooked_simulator/game_content/layouts/test_layouts/godot_test_layout.layout diff --git a/overcooked_simulator/game_content/layouts/test1.layout b/overcooked_simulator/game_content/layouts/test_layouts/test1.layout similarity index 100% rename from overcooked_simulator/game_content/layouts/test1.layout rename to overcooked_simulator/game_content/layouts/test_layouts/test1.layout diff --git a/overcooked_simulator/game_content/layouts/test2.layout b/overcooked_simulator/game_content/layouts/test_layouts/test2.layout similarity index 100% rename from overcooked_simulator/game_content/layouts/test2.layout rename to overcooked_simulator/game_content/layouts/test_layouts/test2.layout diff --git a/overcooked_simulator/game_content/layouts/test3.layout b/overcooked_simulator/game_content/layouts/test_layouts/test3.layout similarity index 100% rename from overcooked_simulator/game_content/layouts/test3.layout rename to overcooked_simulator/game_content/layouts/test_layouts/test3.layout diff --git a/overcooked_simulator/game_content/layouts/test4.layout b/overcooked_simulator/game_content/layouts/test_layouts/test4.layout similarity index 100% rename from overcooked_simulator/game_content/layouts/test4.layout rename to overcooked_simulator/game_content/layouts/test_layouts/test4.layout diff --git a/overcooked_simulator/game_content/layouts/tutorial.layout b/overcooked_simulator/game_content/layouts/tutorial.layout new file mode 100644 index 0000000000000000000000000000000000000000..9e80a7e4ffd96d1f2fe76aab7f9a556c6bcea21a --- /dev/null +++ b/overcooked_simulator/game_content/layouts/tutorial.layout @@ -0,0 +1,4 @@ +#C## +T__$ +L__# +#P## diff --git a/overcooked_simulator/gui_2d_vis/controller_tutorial.png b/overcooked_simulator/gui_2d_vis/controller_tutorial.png index ff48c2ca5ac859a3156bfe5e0befac3ba5e3cd31..5b36df266fc541df523916dbe3e436d6650f05d4 100644 Binary files a/overcooked_simulator/gui_2d_vis/controller_tutorial.png and b/overcooked_simulator/gui_2d_vis/controller_tutorial.png differ diff --git a/overcooked_simulator/gui_2d_vis/overcooked_gui.py b/overcooked_simulator/gui_2d_vis/overcooked_gui.py index a119283fcf8792851ab79c214c28c1fa710d11bf..f11cdd346d0746d420b1487b77d021e8448cd0f1 100644 --- a/overcooked_simulator/gui_2d_vis/overcooked_gui.py +++ b/overcooked_simulator/gui_2d_vis/overcooked_gui.py @@ -37,6 +37,7 @@ from overcooked_simulator.utils import ( CONNECT_WITH_STUDY_SERVER = False USE_AAAMBOS_AGENT = False +SHOW_TUTORIAL_GAME = True class MenuStates(Enum): @@ -252,9 +253,11 @@ class PyGameGUI: if event.type == pygame.KEYDOWN: key_set.next_player() - def set_game_size(self): - max_width = self.window_width - (2 * self.screen_margin) - max_height = self.window_height - (2 * self.screen_margin) + def set_game_size(self, max_width=None, max_height=None): + if max_width is None: + max_width = self.window_width - (2 * self.screen_margin) + if max_height is None: + max_height = self.window_height - (2 * self.screen_margin) self.kitchen_aspect_ratio = self.kitchen_height / self.kitchen_width if self.kitchen_width > self.kitchen_height: @@ -467,14 +470,14 @@ class PyGameGUI: ROOT_DIR / "gui_2d_vis" / "controller_tutorial.png" ).convert_alpha() image_rect = image.get_rect() - image_rect.top = 40 + image_rect.topleft = (40, 40) self.tutorial_image = pygame_gui.elements.UIImage( image_rect, image, manager=self.manager, - anchors={"centerx": "centerx", "top": "top"}, + anchors={"top": "top", "left": "left"}, ) - img_height = self.window_height * 0.85 + img_height = self.window_height * 0.8 img_width = img_height * (image_rect.width / image_rect.height) new_dims = (img_width, img_height) self.tutorial_image.set_dimensions(new_dims) @@ -500,6 +503,24 @@ class PyGameGUI: anchors={"right": "right", "top": "top"}, ) + if SHOW_TUTORIAL_GAME: + self.setup_environment(tutorial=True) + + self.key_sets = self.setup_player_keys( + min(self.number_humans_to_be_added, 1), disjunct=False + ) + + self.vis.create_player_colors(self.number_players) + self.reset_gui_values() + self.set_game_size( + max_height=self.window_height * 0.4, max_width=self.window_width * 0.4 + ) + self.set_window_size() + self.game_center = ( + self.window_width - self.game_width // 2 - 20, + self.window_height / 2 + 100, + ) + def show_pre_game_screen(self): self.manager = pygame_gui.UIManager((self.window_width, self.window_height)) self.manager.get_theme().load_theme(ROOT_DIR / "gui_2d_vis" / "gui_theme.json") @@ -610,7 +631,7 @@ class PyGameGUI: ) next_game_button_rect = pygame.Rect((0, 0), (190, 50)) - next_game_button_rect.center = (self.buttons_width // 2 - 200, 200) + next_game_button_rect.center = (self.buttons_width // 2, 200) self.next_game_button = pygame_gui.elements.UIButton( relative_rect=next_game_button_rect, manager=self.manager, @@ -620,7 +641,7 @@ class PyGameGUI: ) retry_button_rect = pygame.Rect((0, 0), (190, 50)) - retry_button_rect.center = (self.buttons_width // 2 + 0, 200) + retry_button_rect.center = (self.buttons_width // 2 - 200, 200) self.retry_button = pygame_gui.elements.UIButton( relative_rect=retry_button_rect, manager=self.manager, @@ -659,6 +680,17 @@ class PyGameGUI: anchors={"right": "right", "top": "top"}, ) + conclusion_rect = pygame.Rect( + 0, 0, self.window_width * 0.6, self.window_height * 0.4 + ) + self.conclusion_label = pygame_gui.elements.UILabel( + text="Thank you!", + relative_rect=conclusion_rect, + manager=self.manager, + object_id="#score_label", + anchors={"center": "center"}, + ) + def update_screen(self): match self.menu_state: case MenuStates.Start: @@ -683,16 +715,33 @@ class PyGameGUI: match self.menu_state: case MenuStates.Start: pass - + case MenuStates.ControllerTutorial: + if SHOW_TUTORIAL_GAME: + self.draw_tutorial_screen_frame() case MenuStates.Game: self.draw_game_screen_frame() - case MenuStates.End: + case MenuStates.PostGame: self.update_conclusion_label(self.last_state) self.manager.update(self.time_delta) pygame.display.flip() + def draw_tutorial_screen_frame(self): + self.handle_keys() + + state = self.request_state() + self.vis.draw_gamescreen( + self.game_screen, + state, + self.grid_size, + [k.current_player for k in self.key_sets], + ) + + game_screen_rect = self.game_screen.get_rect() + game_screen_rect.center = self.game_center + self.main_window.blit(self.game_screen, game_screen_rect) + def draw_game_screen_frame(self): self.last_state = self.request_state() @@ -814,7 +863,7 @@ class PyGameGUI: display_time = f"{minutes}:{'%02d' % seconds}" self.timer_label.set_text(f"Time remaining: {display_time}") - def setup_environment(self): + def setup_environment(self, tutorial=False): if CONNECT_WITH_STUDY_SERVER: self.player_info = requests.post( f"http://localhost:8080/connect_to_game/{uuid.uuid4().hex}" @@ -825,7 +874,12 @@ class PyGameGUI: environment_config_path = ( ROOT_DIR / "game_content" / "environment_config.yaml" ) - layout_path = self.layout_file_paths[self.current_layout_idx] + + if tutorial: + layout_path = ROOT_DIR / "game_content" / "layouts" / "tutorial.layout" + else: + layout_path = self.layout_file_paths[self.current_layout_idx] + item_info_path = ROOT_DIR / "game_content" / "item_info.yaml" with open(item_info_path, "r") as file: item_info = file.read() @@ -988,7 +1042,6 @@ class PyGameGUI: log.debug("Pressed quit button") def reset_button_press(self): - # self.reset_gui_values() if not CONNECT_WITH_STUDY_SERVER: requests.post( f"{self.request_url}/manage/stop_env", @@ -1025,6 +1078,9 @@ class PyGameGUI: self.currently_controlled_player_idx = 0 self.number_humans_to_be_added = 1 self.number_bots_to_be_added = 0 + self.number_players = ( + self.number_humans_to_be_added + self.number_bots_to_be_added + ) self.split_players = False self.multiple_keysets = False self.player_minimum = 1 @@ -1041,7 +1097,6 @@ class PyGameGUI: text = "WASD+ARROW" if self.multiple_keysets else "WASD" self.multiple_keysets_button.set_text(text) - # self.split_players_button self.added_players_label.set_text( f"Humans to be added: {self.number_humans_to_be_added}" ) @@ -1162,6 +1217,7 @@ class PyGameGUI: match event.ui_element: case self.continue_button: self.menu_state = MenuStates.PreGame + self.disconnect_websockets() case self.fullscreen_button: self.fullscreen_button_press() @@ -1242,10 +1298,13 @@ class PyGameGUI: self.update_screen() self.update_selection_elements() - if ( - event.type in [pygame.KEYDOWN, pygame.KEYUP] - and self.menu_state == MenuStates.Game - ): + if event.type in [ + pygame.KEYDOWN, + pygame.KEYUP, + ] and self.menu_state in [ + MenuStates.Game, + MenuStates.ControllerTutorial, + ]: self.handle_key_event(event) self.manager.process_events(event)