From 1508b42797e96103197acf5bec13ae2775122ceb Mon Sep 17 00:00:00 2001 From: Sofia Date: Thu, 23 Jul 2026 19:23:11 +0300 Subject: [PATCH] Go to main menu on disconnect --- godot/scenes/misc/game_manager.tscn | 2 ++ rust/src/game_manager.rs | 27 ++++++++++++++++++++++++--- rust/src/net/protocol.rs | 4 ++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/godot/scenes/misc/game_manager.tscn b/godot/scenes/misc/game_manager.tscn index 8d7b908..1a54b36 100644 --- a/godot/scenes/misc/game_manager.tscn +++ b/godot/scenes/misc/game_manager.tscn @@ -4,10 +4,12 @@ [ext_resource type="MapResource" uid="uid://c7n1tacc7a73t" path="res://maps/default_map.tres" id="1_glms7"] [ext_resource type="PackedScene" uid="uid://df84sctteh4kw" path="res://scenes/game_finished.tscn" id="1_qf2qp"] [ext_resource type="MapResource" uid="uid://sc3507f75002" path="res://maps/diner.tres" id="2_glms7"] +[ext_resource type="PackedScene" uid="uid://lahirbqfppvw" path="res://scenes/main.tscn" id="3_7ele1"] [ext_resource type="MapResource" uid="uid://bsjoandgu476y" path="res://maps/two_towers.tres" id="5_rotn8"] [node name="game_manager" type="GameManager" unique_id=1442044769] respawn_timer = 10.0 lobby_screen = ExtResource("1_3ama4") game_finished_screen = ExtResource("1_qf2qp") +main_menu = ExtResource("3_7ele1") maps = Array[MapResource]([ExtResource("1_glms7"), ExtResource("2_glms7"), ExtResource("5_rotn8")]) diff --git a/rust/src/game_manager.rs b/rust/src/game_manager.rs index 4a82021..39173f2 100644 --- a/rust/src/game_manager.rs +++ b/rust/src/game_manager.rs @@ -31,10 +31,14 @@ pub struct GameManager { pub lobby_screen: Option>, #[export] pub game_finished_screen: Option>, + #[export] + pub main_menu: Option>, pub game: Option>, base: Base, + exiting: bool, + #[export] pub maps: Array>, } @@ -77,9 +81,11 @@ impl GameManager { game.signals() .on_map_changed() .connect_other(s, |s, id| s.signals().on_map_changed().emit(id)); - game.signals() - .on_game_finished() - .connect_other(s, |s| s.go_to_finish_screen()); + game.signals().on_game_finished().connect_other(s, |s| { + if !s.exiting { + s.go_to_finish_screen() + } + }); } }); @@ -88,6 +94,15 @@ impl GameManager { self.game = Some(game); } + pub fn exit_game(&mut self) { + self.exiting = true; + if let Some(mut game) = self.game.take() { + game.bind_mut().finish_game(); + game.queue_free(); + } + self.go_to_main_menu(); + } + pub fn go_to_finish_screen(&self) { if let Some(scene) = &self.game_finished_screen { self.base().get_tree().change_scene_to_packed(scene); @@ -99,6 +114,12 @@ impl GameManager { self.base().get_tree().change_scene_to_packed(lobby); } } + + pub fn go_to_main_menu(&self) { + if let Some(scene) = &self.main_menu { + self.base().get_tree().change_scene_to_packed(scene); + } + } } pub struct GameOptions { diff --git a/rust/src/net/protocol.rs b/rust/src/net/protocol.rs index 0b16297..581adfc 100644 --- a/rust/src/net/protocol.rs +++ b/rust/src/net/protocol.rs @@ -37,7 +37,7 @@ impl NetworkManager { } teanet::PeerMessage::Closed => { self.peer = None; - GameManager::singleton().bind_mut().game = None; + GameManager::singleton().bind_mut().exit_game(); } teanet::PeerMessage::Message(_, msg) => match msg { Package::Hello => { @@ -244,7 +244,7 @@ impl NetworkManager { cli.bind_mut() .publish_message(format!("Server closed"), CliColor::Info); self.peer = None; - GameManager::singleton().bind_mut().game = None; + GameManager::singleton().bind_mut().exit_game(); } teanet::PeerMessage::Message(conn, msg) => match msg { Package::SetSelfNick(nick) => {