From e0261a033e797b448895f42f9590450482a6e6e3 Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 25 Mar 2024 21:58:20 +0100 Subject: [PATCH] feat: defined action with prereqs and effects --- src/action.cpp | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/action.hpp | 36 ++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 src/action.cpp create mode 100644 src/action.hpp diff --git a/src/action.cpp b/src/action.cpp new file mode 100644 index 0000000..b99c5dd --- /dev/null +++ b/src/action.cpp @@ -0,0 +1,53 @@ +#include "action.hpp" +#include "utils/godot_macros.h" + +namespace godot::goap { +void Action::_bind_methods() { +#define CLASSNAME Action + GDPROPERTY(context_prerequisites, Variant::DICTIONARY); + GDPROPERTY(prerequisites, Variant::DICTIONARY); + GDPROPERTY(effects, Variant::DICTIONARY); +} + +void Action::set_context_prerequisites(Dictionary dict) { + Action::dict_to_property_map(dict, this->context_prerequisites); +} + +Dictionary Action::get_context_prerequisites() const { + return Action::property_map_to_dict(this->context_prerequisites); +} + +void Action::set_prerequisites(Dictionary dict) { + Action::dict_to_property_map(dict, this->prerequisites); +} + +Dictionary Action::get_prerequisites() const { + return Action::property_map_to_dict(this->prerequisites); +} + +void Action::set_effects(Dictionary dict) { + Action::dict_to_property_map(dict, this->effects); +} + +Dictionary Action::get_effects() const { + return Action::property_map_to_dict(this->effects); +} + +Dictionary Action::property_map_to_dict(WorldState const &props) { + Dictionary out{}; + for(KeyValue const &prop : props) { + out[prop.key] = prop.value; + } + return out; +} + +void Action::dict_to_property_map(Dictionary const &dict, WorldState &out) { + out.clear(); + Array keys = dict.keys(); + Array vals = dict.values(); + for(size_t i{0}; i < keys.size(); ++i) { + if(keys[i].get_type() == Variant::STRING_NAME) + out.insert(keys[i], vals[i]); + } +} +} diff --git a/src/action.hpp b/src/action.hpp new file mode 100644 index 0000000..1a1b2e2 --- /dev/null +++ b/src/action.hpp @@ -0,0 +1,36 @@ +#ifndef GOAP_ACTION_HPP +#define GOAP_ACTION_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace godot::goap { +typedef HashMap WorldState; +typedef KeyValue WorldProperty; + +class Action : public Resource { + GDCLASS(Action, Resource); + static void _bind_methods(); +public: + void set_context_prerequisites(Dictionary dict); + Dictionary get_context_prerequisites() const; + void set_prerequisites(Dictionary dict); + Dictionary get_prerequisites() const; + void set_effects(Dictionary dict); + Dictionary get_effects() const; +protected: + static Dictionary property_map_to_dict(WorldState const &props); + static void dict_to_property_map(Dictionary const &dict, WorldState &out); +public: + WorldState context_prerequisites{}; + WorldState prerequisites{}; + WorldState effects{}; +}; +} + +#endif //!GOAP_ACTION_HPP