bug(goap): fixed unexpected AI behaviour

- Death now removes entity from awareness
- State failure now causes replan or goal reevaluation
This commit is contained in:
Sara 2024-08-01 14:40:20 +02:00
parent a2240797b8
commit 111485437c
36 changed files with 845 additions and 88 deletions

View file

@ -4,6 +4,11 @@ namespace goap {
Action::~Action() {}
bool Action::is_possible(ActorWorldState *context) const {
for(WorldProperty const &prop : this->required) {
if(!context->check_property_match(prop)) {
return false;
}
}
return this->procedural_is_possible(context);
}
@ -17,6 +22,14 @@ bool Action::is_completed(ActorWorldState *context) const {
return this->procedural_is_completed(context);
}
bool Action::procedural_is_possible(ActorWorldState *context) const {
return true;
}
bool Action::procedural_is_completed(ActorWorldState *context) const {
return true;
}
WorldState const &Action::get_required() const {
return this->required;
}
@ -32,12 +45,4 @@ ActionID Action::get_id() const {
bool Action::get_require_state_complete() const {
return this->require_state_complete;
}
bool Action::procedural_is_possible(ActorWorldState *context) const {
return true;
}
bool Action::procedural_is_completed(ActorWorldState *context) const {
return true;
}
}

View file

@ -38,6 +38,8 @@ public:
bool is_completed(ActorWorldState *context) const;
bool is_possible(ActorWorldState *context) const;
virtual bool procedural_is_possible(ActorWorldState *context) const;
virtual bool procedural_is_completed(ActorWorldState *context) const;
WorldState const &get_required() const;
WorldState const &get_effects() const;
@ -48,8 +50,6 @@ protected:
Action() = default;
template<class TState>
TState *create_state() const;
virtual bool procedural_is_possible(ActorWorldState *context) const;
virtual bool procedural_is_completed(ActorWorldState *context) const;
protected:
WorldState blocking_required{};
WorldState required{};

View file

@ -171,7 +171,7 @@ gd::Vector<Action const *> &Planner::get_actions() {
gd::Vector<Action const *> Planner::get_neighbours(WorldStateNode const &from) const {
gd::Vector<Action const *> retval{};
for(Action const *action : this->actions) {
if(!action->is_possible(from.context) || !this->does_action_contribute(action, from))
if(!action->procedural_is_possible(from.context) || !this->does_action_contribute(action, from))
continue;
retval.push_back(action);
}