Grail (C++)  1.1.1
A multi-platform, modular, universal engine for embedding advanced AI in games.
AIEntity.hh
1 #ifndef GRAIL_AI_ENTITY_H
2 #define GRAIL_AI_ENTITY_H
3 
4 #include "Behavior.hh"
5 #include "Blackboard.hh"
6 
7 #include <atomic>
8 #include <map>
9 #include <memory>
10 #include <mutex>
11 #include <random>
12 #include <string>
13 #include <vector>
14 
15 namespace grail
16 {
17  enum class Status
18  {
19  FREE = 0,
20  RUNNING,
21  DONE,
22  };
23 
24  class AIEntity;
25  class Reasoner;
26 
28  {
29  public:
30  virtual ~IReasonerChangeObserver() = default;
31  virtual void OnReasonerSet(AIEntity& entity, Reasoner* newReasoner) = 0;
32  };
33 
34  class AIManager;
35 
39  class AIEntity
40  {
41  friend class AIManager;
42  friend class SynchronizedEntityContainer;
43 
44  public:
45  AIEntity(const std::string& name = "");
46  AIEntity(const AIEntity&) = delete;
47  AIEntity(AIEntity&&) = delete;
48 
49  virtual ~AIEntity();
50 
51  AIEntity& operator =(const AIEntity&) = delete;
52  AIEntity& operator =(AIEntity&&) = delete;
53 
58  void SetReasoner(std::unique_ptr<Reasoner> newReasoner);
59 
64  const Behavior* GetCurrentBehavior() const;
65 
71 
76  std::unique_ptr<Behavior> GetUniqueCurrentBehavior();
77 
82  std::unique_ptr<Behavior> MoveSuspendedBehavior();
83 
88  std::unique_ptr<Reasoner>& GetCurrentReasoner();
89 
94  void StageBehavior(std::unique_ptr<Behavior> behavior);
95 
100  bool HasStagedBehavior() const;
101 
106  bool HasActiveBehavior() const;
107 
113  void AddSharedBlackboard(const std::string& name, std::shared_ptr<Blackboard>& sharedBlackboard);
114 
119  void RemoveSharedBlackboard(const std::string& name);
120 
126  std::shared_ptr<Blackboard> GetSharedBlackboard(const std::string& name) const;
127 
133 
138  const Blackboard& GetBlackboard() const;
139 
140  //TODO: after UE4 plugin is ready, verify if these methods' arguments can be changed to shared_ptr
141  //REVIEW: resolve todo
142  void AddReasonerChangeObserver(IReasonerChangeObserver* observer);
143  void RemoveReasonerChangeObserver(IReasonerChangeObserver* observer);
144  void SetId(size_t id);
145  size_t GetId() const;
146  const std::string& GetName() const;
147  std::string GetCurrentBehaviorName() const;
148 
149  protected:
154  virtual void Update(float deltaTime);
155 
156  std::unique_ptr<Reasoner> reasoner;
157  std::map<std::string, std::shared_ptr<Blackboard>> sharedBlackboards{};
158 
159  private:
160  void SelectBehavior();
161  void ExecuteBehavior(float deltaTime);
162  void SuspendPreviousBehavior();
163  void SetupNextBehavior(std::unique_ptr<Behavior> behavior);
164 
165  void ChangeStatus(Status newStatus);
166  bool ChangeStatusNonBlocking(Status newStatus);
167 
168  Status GetStatus();
169  Status GetStatusNonBlocking();
170 
171  std::unique_ptr<Behavior> stagedBehavior = nullptr;
172  std::unique_ptr<Behavior> currentBehavior = nullptr;
173  std::unique_ptr<Behavior> suspendedBehavior = nullptr;
174  Blackboard blackboard{};
175  std::mutex entityMutex{};
176  std::mutex statusMutex{};
177  mutable std::mutex behaviorMutex{};
178  mutable std::mutex stagingMutex{};
179  std::vector<IReasonerChangeObserver*> reasonerChangeObservers{};
180 
181  Status status = Status::FREE;
182  size_t id;
183  std::string name;
184  };
185 }
186 #endif //GRAIL_AI_ENTITY_H
grail::AIEntity::GetBlackboard
Blackboard & GetBlackboard()
GetBlackboard.
Definition: AIEntity.cpp:231
grail::AIEntity
The AIEntity class - Defines a basic object which can execute behaviors.
Definition: AIEntity.hh:39
grail::AIManager
The AIManager class - Manages registered entities and shared blackboards.
Definition: AIManager.hh:33
grail::AIEntity::SetReasoner
void SetReasoner(std::unique_ptr< Reasoner > newReasoner)
SetReasoner.
Definition: AIEntity.cpp:21
grail::Reasoner
The Reasoner class - Entity's "brain", assigns them behaviors chosen by user-defined algorithms.
Definition: Reasoner.hh:19
grail::AIEntity::Update
virtual void Update(float deltaTime)
Update - User defined method. Should in some way update entity's state.
Definition: AIEntity.cpp:118
grail::AIEntity::MoveSuspendedBehavior
std::unique_ptr< Behavior > MoveSuspendedBehavior()
GetPreviousBehavior.
Definition: AIEntity.cpp:41
grail::Blackboard
The Blackboard class - grail's universal data container.
Definition: Blackboard.hh:20
grail::AIEntity::AddSharedBlackboard
void AddSharedBlackboard(const std::string &name, std::shared_ptr< Blackboard > &sharedBlackboard)
AddSharedBlackboard - Inserts pair of key and blackboard into container of shared blackboards.
Definition: AIEntity.cpp:94
grail::AIEntity::GetCurrentBehavior
const Behavior * GetCurrentBehavior() const
GetCurrentBehavior.
Definition: AIEntity.cpp:26
grail::AIEntity::HasStagedBehavior
bool HasStagedBehavior() const
HasStagedBehavior - checks whether this entity has behavior awaiting its execution.
Definition: AIEntity.cpp:83
grail::IReasonerChangeObserver
Definition: AIEntity.hh:27
grail::Behavior
A high-level abstraction of actions in the game.
Definition: Behavior.hh:19
grail::AIEntity::GetUniqueCurrentBehavior
std::unique_ptr< Behavior > GetUniqueCurrentBehavior()
GetUniqueCurrentBehavior.
Definition: AIEntity.cpp:36
grail::AIEntity::StageBehavior
void StageBehavior(std::unique_ptr< Behavior > behavior)
SetNewBehavior - Finishes current behavior and starts new one.
Definition: AIEntity.cpp:51
grail::AIEntity::RemoveSharedBlackboard
void RemoveSharedBlackboard(const std::string &name)
RemoveSharedBlackboard - Removes shared blackboard entry.
Definition: AIEntity.cpp:99
grail::AIEntity::GetSharedBlackboard
std::shared_ptr< Blackboard > GetSharedBlackboard(const std::string &name) const
GetSharedBlackboard - Gets shared blackboard identified by given key.
Definition: AIEntity.cpp:108
grail::SynchronizedEntityContainer
Definition: SynchronizedEntityContainer.h:12
grail::AIEntity::GetCurrentReasoner
std::unique_ptr< Reasoner > & GetCurrentReasoner()
GetCurrentReasoner.
Definition: AIEntity.cpp:46
grail::AIEntity::HasActiveBehavior
bool HasActiveBehavior() const
HasActiveBehavior - Checks whether current behavior is not nullptr.
Definition: AIEntity.cpp:89