#ifndef CHARACTERAIMODULE_H #define CHARACTERAIMODULE_H #include #include #include #include "goap.h" namespace ECS { struct Blackboard { nlohmann::json stats; int object; int index; flecs::entity town; std::shared_ptr mutex; private: std::vector *> actionRef; int actionRefCount; int actionRefPtr; Ogre::Vector3 position; std::vector points; std::vector distances; void _actionRefResize(int count); void _actionRefAddActions( const std::vector *> &actions); public: Blackboard(); Blackboard(const nlohmann::json &stats); bool operator==(const Blackboard &other) const; bool operator!=(const Blackboard &other) const; void apply(const Blackboard &other); Ogre::String dumpActions(); void printActions(); void fixupBooleanKeys(); void actionRefResize(int count); void actionRefAddAction(goap::BaseAction *action); void actionRefAddActions( const std::vector *> &actions); void actionRefAddActions(goap::BaseAction **actions, int count); goap::BaseAction **getActionsData() { return actionRef.data(); } int getActionsCount() { return actionRefCount; } private: static bool is_satisfied_by(const nlohmann::json ¤t, const nlohmann::json &target, float epsilon = 1e-4); public: int distance_to(const Blackboard &goal) const; void setPosition(const Ogre::Vector3 &position); const Ogre::Vector3 &getPosition() const { return position; } void query_ai(); }; struct TownNPCs; struct ActionNodeList; struct TownAI { std::shared_ptr mutex; std::vector >::BaseGoal> goals; std::vector *> actions; std::shared_ptr< goap::BasePlanner > > planner; std::unordered_map blackboards; struct Plan { const goap::BasePlanner >::BaseGoal *goal; std::vector *> plan; }; std::unordered_map > plans; std::unordered_map *> > nodeActions; }; struct CharacterAIModule { CharacterAIModule(flecs::world &ecs); void createAI(flecs::entity town); void buildPlans(flecs::entity town, const TownNPCs &npcs, TownAI &ai); void createBlackboards(flecs::entity town, const TownNPCs &npcs, TownAI &ai); void updateBlackboardsBits(flecs::entity town, ActionNodeList &alist, const TownNPCs &npcs, TownAI &ai); void updateBlackboards(flecs::entity town, const ActionNodeList &alist, const TownNPCs &npcs, TownAI &ai); }; } #endif // CHARACTERAIMODULE_H