From 8d3484163c6946cca5e8638dc38a674558928702 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 2 Apr 2024 22:25:06 +0200 Subject: [PATCH] feat: fixed global fetching, added get_player_character/position to global world state --- src/global_world_state.cpp | 28 +++++++++++++++++----------- src/global_world_state.hpp | 5 ++--- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/global_world_state.cpp b/src/global_world_state.cpp index 3152b07..3a29828 100644 --- a/src/global_world_state.cpp +++ b/src/global_world_state.cpp @@ -1,10 +1,13 @@ #include "global_world_state.hpp" #include "character_actor.hpp" #include "utils/game_root.hpp" +#include "utils/godot_macros.h" +#include namespace godot::goap { void GlobalWorldState::_bind_methods() { #define CLASSNAME GlobalWorldState + GDFUNCTION(get_player_character); } bool GlobalWorldState::has_singleton() { @@ -15,29 +18,31 @@ GlobalWorldState *GlobalWorldState::get_singleton() { return GlobalWorldState::singleton_instance; } -void GlobalWorldState::_enter_tree() { - if(GlobalWorldState::singleton_instance == nullptr) +void GlobalWorldState::_enter_tree() { GDGAMEONLY(); + if(GlobalWorldState::singleton_instance == nullptr) { GlobalWorldState::singleton_instance = this; + } } -void GlobalWorldState::_ready() { - this->game_mode = GameRoot::get_singleton()->get_game_mode(); -} - -void GlobalWorldState::_exit_tree() { +void GlobalWorldState::_exit_tree() { GDGAMEONLY(); if(GlobalWorldState::singleton_instance == this) GlobalWorldState::singleton_instance = nullptr; } -void GlobalWorldState::_process(double delta_time) { +void GlobalWorldState::_process(double delta_time) { GDGAMEONLY(); global_state_cache.clear(); // invalidate cache } -Vector3 GlobalWorldState::get_player_position() { - return this->game_mode->get_player_instance()->get_character()->get_global_position(); +Vector3 GlobalWorldState::get_player_position() const { + return this->get_player_character()->get_global_position(); +} + +CharacterActor *GlobalWorldState::get_player_character() const { + return Ref(GameRoot::get_singleton()->get_game_mode())->get_player_instance()->get_character(); } Variant GlobalWorldState::get_world_property(StringName prop_key) { + UtilityFunctions::print("fetching: ", prop_key); // check if prop key corresponds to a global key if(!prop_key.begins_with("g_")) return nullptr; @@ -45,13 +50,14 @@ Variant GlobalWorldState::get_world_property(StringName prop_key) { else if(global_state_cache.has(prop_key)) return global_state_cache.get(prop_key); // fetch by function name - StringName const fn = "get_" + prop_key.right(prop_key.length() - 2); + StringName const fn = "get_" + prop_key.erase(0, 2); if(this->has_method(fn)) { Variant result = this->call(fn); // cache and return this->global_state_cache.insert(prop_key, result); return result; } + abort(); return nullptr; } diff --git a/src/global_world_state.hpp b/src/global_world_state.hpp index a8f1eed..834f665 100644 --- a/src/global_world_state.hpp +++ b/src/global_world_state.hpp @@ -14,16 +14,15 @@ public: static GlobalWorldState *get_singleton(); virtual void _enter_tree() override; - virtual void _ready() override; virtual void _exit_tree() override; virtual void _process(double delta_time) override; - Vector3 get_player_position(); + Vector3 get_player_position() const; + CharacterActor *get_player_character() const; Variant get_world_property(StringName prop_key); private: WorldState global_state_cache{}; - Ref game_mode{}; static GlobalWorldState *singleton_instance; }; }