/* * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it * and/or modify it under version 3 of the License, or (at your option), any later version. */ #pragma once #include "AiObject.h" #include "Common.h" #include "Event.h" #include "Value.h" class PlayerbotAI; class Unit; class NextAction { public: NextAction(std::string const name, float relevance = 0.0f) : relevance(relevance), name(name) {} // name after relevance - whipowill NextAction(NextAction const& o) : relevance(o.relevance), name(o.name) {} // name after relevance - whipowill std::string const getName() { return name; } float getRelevance() { return relevance; } static std::vector merge(std::vector const& what, std::vector const& with) { std::vector result = {}; for (NextAction const& action : what) { result.push_back(action); } for (NextAction const& action : with) { result.push_back(action); } return result; }; private: float relevance; std::string name; }; class Action : public AiNamedObject { public: enum class ActionThreatType { None = 0, Single = 1, Aoe = 2 }; Action(PlayerbotAI* botAI, std::string const name = "action") : AiNamedObject(botAI, name), verbose(false) {} // verbose after ainamedobject - whipowill virtual ~Action(void) {} virtual bool Execute([[maybe_unused]] Event event) { return true; } virtual bool isPossible() { return true; } virtual bool isUseful() { return true; } virtual std::vector getPrerequisites() { return {}; } virtual std::vector getAlternatives() { return {}; } virtual std::vector getContinuers() { return {}; } virtual ActionThreatType getThreatType() { return ActionThreatType::None; } void Update() {} void Reset() {} virtual Unit* GetTarget(); virtual Value* GetTargetValue(); virtual std::string const GetTargetName() { return "self target"; } void MakeVerbose() { verbose = true; } void setRelevance(uint32 relevance1) { relevance = relevance1; }; virtual float getRelevance() { return relevance; } protected: bool verbose; float relevance = 0; }; class ActionNode { public: ActionNode( std::string name, std::vector prerequisites = {}, std::vector alternatives = {}, std::vector continuers = {} ) : name(std::move(name)), action(nullptr), continuers(continuers), alternatives(alternatives), prerequisites(prerequisites) {} virtual ~ActionNode() = default; Action* getAction() { return action; } void setAction(Action* action) { this->action = action; } const std::string getName() { return name; } std::vector getContinuers() { return NextAction::merge(this->continuers, action->getContinuers()); } std::vector getAlternatives() { return NextAction::merge(this->alternatives, action->getAlternatives()); } std::vector getPrerequisites() { return NextAction::merge(this->prerequisites, action->getPrerequisites()); } private: const std::string name; Action* action; std::vector continuers; std::vector alternatives; std::vector prerequisites; }; class ActionBasket { public: ActionBasket(ActionNode* action, float relevance, bool skipPrerequisites, Event event); virtual ~ActionBasket(void) {} float getRelevance() { return relevance; } ActionNode* getAction() { return action; } Event getEvent() { return event; } bool isSkipPrerequisites() { return skipPrerequisites; } void AmendRelevance(float k) { relevance *= k; } void setRelevance(float relevance) { this->relevance = relevance; } bool isExpired(uint32_t msecs); private: ActionNode* action; float relevance; bool skipPrerequisites; Event event; uint32_t created; };