feat: defined action with prereqs and effects

This commit is contained in:
Sara 2024-03-25 21:58:20 +01:00
parent 3b75b13a14
commit e0261a033e
2 changed files with 89 additions and 0 deletions

53
src/action.cpp Normal file
View file

@ -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<StringName, Variant> 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]);
}
}
}

36
src/action.hpp Normal file
View file

@ -0,0 +1,36 @@
#ifndef GOAP_ACTION_HPP
#define GOAP_ACTION_HPP
#include <cstddef>
#include <godot_cpp/classes/object.hpp>
#include <godot_cpp/classes/ref_counted.hpp>
#include <godot_cpp/classes/resource.hpp>
#include <godot_cpp/templates/hash_map.hpp>
#include <godot_cpp/templates/pair.hpp>
#include <godot_cpp/variant/variant.hpp>
namespace godot::goap {
typedef HashMap<StringName, Variant> WorldState;
typedef KeyValue<StringName, Variant> 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