From 7492d96cee7886cea2819e16a01c4d64f7286656 Mon Sep 17 00:00:00 2001 From: hheik <4469778+hheik@users.noreply.github.com> Date: Thu, 11 Sep 2025 21:47:23 +0300 Subject: [PATCH] Added GameManager to glue systems together --- godot/scenes/overworld.tscn | 8 ++- godot/tilesets/foreground_tileset.tres | 1 + rust/src/game_manager.rs | 67 ++++++++++++++++++++++++++ rust/src/lib.rs | 2 + rust/src/turn.rs | 14 ++---- 5 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 rust/src/game_manager.rs diff --git a/godot/scenes/overworld.tscn b/godot/scenes/overworld.tscn index 4486938..b43808e 100644 --- a/godot/scenes/overworld.tscn +++ b/godot/scenes/overworld.tscn @@ -5,7 +5,13 @@ [ext_resource type="PackedScene" uid="uid://drs6h7ks4r2ta" path="res://prefabs/player/player.tscn" id="3_u2ss0"] [ext_resource type="PackedScene" uid="uid://blutrglw7mycx" path="res://prefabs/ui/ui.tscn" id="4_356oe"] -[node name="TurnManager" type="TurnManager"] +[node name="GameManager" type="GameManager" node_paths=PackedStringArray("_time_manager", "_turn_manager")] +_time_manager = NodePath("TimeManager") +_turn_manager = NodePath("TurnManager") + +[node name="TimeManager" type="TimeManager" parent="."] + +[node name="TurnManager" type="TurnManager" parent="."] [node name="World" type="Level" parent="." node_paths=PackedStringArray("background", "foreground")] background = NodePath("Background") diff --git a/godot/tilesets/foreground_tileset.tres b/godot/tilesets/foreground_tileset.tres index 129dfc2..bc8f7c7 100644 --- a/godot/tilesets/foreground_tileset.tres +++ b/godot/tilesets/foreground_tileset.tres @@ -17,6 +17,7 @@ texture_region_size = Vector2i(32, 32) 2:3/0 = 0 2:3/0/custom_data_0 = true 0:3/0 = 0 +0:3/0/custom_data_0 = true [resource] tile_size = Vector2i(32, 32) diff --git a/rust/src/game_manager.rs b/rust/src/game_manager.rs new file mode 100644 index 0000000..7f78d0b --- /dev/null +++ b/rust/src/game_manager.rs @@ -0,0 +1,67 @@ +use godot::{classes::*, prelude::*}; + +use crate::prelude::*; + +#[derive(Debug, GodotClass)] +#[class(init, base=Node)] +pub struct GameManager { + #[export] + _time_manager: Option>, + #[export] + _turn_manager: Option>, + + base: Base, +} + +#[godot_api] +impl INode for GameManager {} + +#[godot_api] +impl GameManager { + pub fn get>(node: Gd) -> Gd { + find_in_parents(node).expect("Getting GameManager") + } + + #[func] + pub fn from_node(node: Gd) -> Gd { + find_in_parents(node).expect("Getting GameManager") + } + + #[func] + pub fn time(&self) -> Gd { + self._time_manager + .clone() + .expect("Getting TimeManager for GameManager") + } + + #[func] + pub fn turn(&self) -> Gd { + self._turn_manager + .clone() + .expect("Getting TurnManager for GameManager") + } +} + +#[derive(Debug, GodotClass)] +#[class(init, base=Node)] +pub struct TimeManager { + time_of_day: i32, + + base: Base, +} + +#[godot_api] +impl INode for TimeManager {} + +#[godot_api] +impl TimeManager { + #[func] + pub fn reset_time(&mut self) { + self.time_of_day = 0; + } + + #[func] + pub fn advance_time(&mut self, amount: i32) { + self.time_of_day += amount; + } +} diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 01caf22..27e5123 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -2,6 +2,7 @@ use godot::prelude::*; pub struct VelhoExtension; +mod game_manager; mod gathering; mod grid; mod inventory; @@ -9,6 +10,7 @@ mod turn; mod utils; pub mod prelude { + pub use super::game_manager::*; pub use super::gathering::*; pub use super::grid::*; pub use super::inventory::*; diff --git a/rust/src/turn.rs b/rust/src/turn.rs index 714de62..9eb876b 100644 --- a/rust/src/turn.rs +++ b/rust/src/turn.rs @@ -57,7 +57,7 @@ impl TurnManager { self.current_actor = None; self.round_queue = self.new_round(); if !self.round_queue.is_empty() { - self.base_mut().propagate_call_ex("on_round_start").done(); + GameManager::get(self.to_gd()).propagate_call("on_round_start"); self.start_next_turn(); } } @@ -81,10 +81,9 @@ impl TurnManager { } fn on_actor_turn_end(&mut self, action: GString) { - let actor = self.current_actor.clone(); - self.base_mut() + GameManager::get(self.to_gd()) .propagate_call_ex("on_turn_end") - .args(&varray![actor, action]) + .args(&varray![self.current_actor, action]) .done(); self.start_next_turn(); } @@ -127,11 +126,8 @@ impl INode2D for TurnActor { fn ready(&mut self) {} fn enter_tree(&mut self) { - let manager: Option> = find_in_parents(self.to_gd()); - match manager { - Some(mut manager) => manager.bind_mut().register(self.to_gd()), - None => godot_error!("No TurnManager found for TurnActor"), - } + let managers = GameManager::get(self.to_gd()); + managers.bind().turn().bind_mut().register(self.to_gd()) } }