Grail (C++)  1.4.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
Consideration.hh
1 // Copyright QED Software 2023.
2 
3 #ifndef GRAIL_CONSIDERATION_H
4 #define GRAIL_CONSIDERATION_H
5 
6 #include "Evaluator.hh"
7 #include "../GrailCore/AIEntity.hh"
8 #include "../GrailCore/Blackboard.hh"
9 #include "../GrailCore/EntityBlackboardPair.hh"
10 
11 namespace grail
12 {
13 namespace evaluator
14 {
15  template <typename ContextType>
20  class Consideration : public Evaluator<ContextType>
21  {
22  template <typename FunctionContextType>
23  friend void CacheConsiderationEvaluations(std::shared_ptr<Evaluator<FunctionContextType>> evaluator, FunctionContextType context);
24  public:
25  Consideration() = default;
26 
27  Consideration(const Consideration<ContextType>&) = default;
29 
30  virtual ~Consideration() = default;
31 
32  Consideration& operator =(const Consideration<ContextType>&) = default;
33  Consideration& operator =(Consideration<ContextType>&&) = default;
34 
35  virtual data::EvaluatorType GetEvaluatorType() const override final { return data::EvaluatorType::CONSIDERATION; }
36 
37  virtual std::string GetDisplayName() const { return "unnamed_consideration"; }
38 
39  virtual void GetDependentConsiderations(std::vector<Consideration<ContextType>*>& considerations) override
40  {
41  if(std::find(considerations.begin(), considerations.end(), this) == considerations.end())
42  {
43  considerations.push_back(this);
44  }
45  }
46 
47  protected:
53  virtual float Evaluate(const ContextType& context) const = 0;
54 
55  virtual void DebugDump(const std::map<const void*, unsigned int>&,
56  data::EvaluationDebugData& debugData) const override final
57  {
58  debugData.SetMetadata(GetDisplayName());
59  }
60 
67  virtual float
68  Evaluate(const ContextType& context, data::UtilityEvaluatorSnapshot* const snapshot) const override final
69  {
70  return value;
71  }
72 
73  private:
74  void CacheEvaluation(const ContextType& context)
75  {
76  value = Evaluate(context);
77  }
78 
79  float value{};
80  };
81 
82  using DefaultConsideration = Consideration<const AIEntity*>;
83  using UtilityConsideration = Consideration<EntityBlackboardPair>;
84 
85  template <typename ContextType>
86  void CacheConsiderationEvaluations(std::shared_ptr<Evaluator<ContextType>> evaluator, ContextType context)
87  {
88  std::vector<Consideration<ContextType>*> considerations{};
89  evaluator->GetDependentConsiderations(considerations);
90  for(auto& consideration : considerations)
91  {
92  consideration->CacheEvaluation(context);
93  }
94  }
95 }
96 }
97 #endif //GRAIL_CONSIDERATION_H
grail::evaluator::Consideration::Evaluate
virtual float Evaluate(const ContextType &context) const =0
Evaluate - Abstract method, which should be overriden by the user to return proper value representing...
grail::data::EvaluationDebugData
The EvaluationDebugData class - debug data describing singular evaluator.
Definition: EvaluationDebugData.h:24
grail::evaluator::Consideration::DebugDump
virtual void DebugDump(const std::map< const void *, unsigned int > &, data::EvaluationDebugData &debugData) const override final
DebugDump - Called from EvaluateContext, which generates additional debug data for each evaluator....
Definition: Consideration.hh:55
grail::evaluator::Consideration::Evaluate
virtual float Evaluate(const ContextType &context, data::UtilityEvaluatorSnapshot *const snapshot) const override final
Evaluate - Called from EvaluateContext which also evaluates context, but without automatically fillin...
Definition: Consideration.hh:68
grail::evaluator::Evaluator
The Evaluator class - base class being able to evaluate given context and output the result.
Definition: Evaluator.hh:25
grail::evaluator::Consideration
The Consideration class - Abstract type of Evaluator representing a subset of game state.
Definition: Consideration.hh:20
grail::data::UtilityEvaluatorSnapshot
The UtilityEvaluatorSnapshot class - debug snapshot of whole evaluator tree assigned to evaluated obj...
Definition: UtilityEvaluatorSnapshot.h:26