tunnel-strategy/src/state.cpp

82 lines
2.2 KiB
C++

#include "state.hpp"
#include "character_actor.hpp"
#include "planner.hpp"
#include "utils/godot_macros.h"
namespace godot::goap {
State::~State() {
if(unlikely(this->type == STATE_ANIMATE))
delete this->animate;
}
State State::new_move_to(Node3D *node) {
return {
.type = State::Type::STATE_MOVE_TO,
.move_to = node
};
}
State State::new_animate(StringName animation) {
return {
.type = State::Type::STATE_ANIMATE,
.animate = new StringName(animation)
};
}
State State::new_activate(Node *node) {
return {
.type = State::Type::STATE_ACTIVATE,
.activate = node
};
}
State State::new_invalid() {
return { .type = State::Type::STATE_TYPE_MAX };
}
bool State::is_complete(CharacterActor *context) const {
switch(this->type) {
default:
return true;
case STATE_MOVE_TO:
return context->get_global_position().is_equal_approx(this->move_to->get_global_position());
case STATE_ANIMATE:
return false; // TODO: replace this with checks for animation completion
case STATE_ACTIVATE:
return false; // TODO: replace this with checks for object activation
}
}
void StateArgs::_bind_methods() {
#define CLASSNAME StateArgs
GDPROPERTY(argument_property, Variant::STRING_NAME);
}
State StateArgs::construct(Planner *context) const {
return { .type = State::STATE_TYPE_MAX };
}
void StateArgs::set_argument_property(StringName var) { this->argument_property = var; }
StringName StateArgs::get_argument_property() const { return this->argument_property; }
void MoveStateArgs::_bind_methods() {}
State MoveStateArgs::construct(Planner *context) const {
Node3D *node = Object::cast_to<Node3D>(context->get_world_property(this->argument_property));
return State::new_move_to(node);
}
void AnimateStateArgs::_bind_methods() {}
State AnimateStateArgs::construct(Planner *context) const {
return State::new_animate(context->get_world_property(this->argument_property));
}
void ActivateStateArgs::_bind_methods() {}
State ActivateStateArgs::construct(Planner *context) const {
Node *node = Object::cast_to<Node>(context->get_world_property(this->argument_property));
return State::new_activate(node);
}
}