Grail (C++)  1.3.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
FiniteStateMachine.hh
1 // Copyright QED Software 2023.
2 
3 #ifndef GRAIL_FINITE_STATE_MACHINE_H
4 #define GRAIL_FINITE_STATE_MACHINE_H
5 
6 #include "State.hh"
7 #include "../GrailLogger/LoggerManager.hh"
8 
9 #include <map>
10 #include <functional>
11 #include <string>
12 #include <memory>
13 
14 #include <unordered_set>
15 
16 namespace grail
17 {
18 namespace fsm
19 {
23  class FiniteStateMachine : public State
24  {
25  public:
26  struct Transition
27  {
28  std::shared_ptr<State> sourceState;
29  std::shared_ptr<State> destinationState;
30  std::function<bool()> condition;
31  };
32 
39  FiniteStateMachine(const std::map<std::shared_ptr<State>, std::function<std::shared_ptr<State>()>>& transitionFunctions,
40  std::shared_ptr<State> initialState,
41  const std::string& stateMachineName = "state machine");
42 
49  FiniteStateMachine(const std::vector<Transition>& transitions,
50  std::shared_ptr<State> initialState,
51  const std::string& stateMachineName = "state machine");
52 
53  FiniteStateMachine(const FiniteStateMachine& other) = delete;
54  FiniteStateMachine(FiniteStateMachine&& other) = default;
55 
56  FiniteStateMachine& operator = (const FiniteStateMachine& other) = delete;
57  FiniteStateMachine& operator = (FiniteStateMachine&& other) = default;
58 
59  virtual ~FiniteStateMachine() override = default;
60 
61  virtual void Enter() override;
62 
66  virtual void Update(float deltaTime) override;
67 
72  std::shared_ptr<State> GetCurrentState() const;
73 
74  virtual const std::string& GetName() const override;
75 
76  private:
77  std::map<std::shared_ptr<State>, std::function<std::shared_ptr<State>()>> transitionFunctions{};
78  std::shared_ptr<State> currentState{nullptr};
79  std::string stateMachineName{};
80  };
81 }
82 }
83 
84 #endif //GRAIL_FINITE_STATE_MACHINE_H
grail::fsm::FiniteStateMachine::FiniteStateMachine
FiniteStateMachine(const std::map< std::shared_ptr< State >, std::function< std::shared_ptr< State >()>> &transitionFunctions, std::shared_ptr< State > initialState, const std::string &stateMachineName="state machine")
FiniteStateMachine - Constructor.
Definition: FiniteStateMachine.cpp:9
grail::fsm::FiniteStateMachine
The FiniteStateMachine class - Class representing basic Finite State Machine.
Definition: FiniteStateMachine.hh:23
grail::fsm::FiniteStateMachine::Enter
virtual void Enter() override
Enter - Called once after machine enters this state.
Definition: FiniteStateMachine.cpp:52
grail::fsm::State
The FiniteStateMachineState class - Class representing state of finite state machine.
Definition: State.hh:15
grail::fsm::FiniteStateMachine::GetCurrentState
std::shared_ptr< State > GetCurrentState() const
GetCurrentStateName.
Definition: FiniteStateMachine.cpp:78
grail::fsm::FiniteStateMachine::Transition
Definition: FiniteStateMachine.hh:26
grail::fsm::FiniteStateMachine::GetName
virtual const std::string & GetName() const override
GetName.
Definition: FiniteStateMachine.cpp:79
grail::fsm::FiniteStateMachine::Update
virtual void Update(float deltaTime) override
Update - Performs state transition, if one is required, and runs update for resulting state.
Definition: FiniteStateMachine.cpp:57