1 // This file is part of Dust Racing 2D.
2 // Copyright (C) 2015 Jussi Lind <jussi.lind@iki.fi>
3 //
4 // Dust Racing 2D is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 // Dust Racing 2D is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Dust Racing 2D. If not, see <http://www.gnu.org/licenses/>.
15 
16 #ifndef STATEMACHINE_HPP
17 #define STATEMACHINE_HPP
18 
19 #include "renderer.hpp"
20 #include "updateableif.hpp"
21 
22 #include <QObject>
23 #include <QTimer>
24 
25 #include <functional>
26 #include <map>
27 
28 class InputHandler;
29 
30 //! The main state machine of the game.
31 class StateMachine : public QObject, public UpdateableIf
32 {
33     Q_OBJECT
34 
35 public:
36     enum class State
37     {
38         Init,
39         DoIntro,
40         Menu,
41         MenuTransitionIn,
42         MenuTransitionOut,
43         GameTransitionIn, // Active when a race starts
44         GameTransitionOut, // Active when a race is over
45         DoStartlights,
46         Play
47     };
48 
49     //! Constructor.
50     StateMachine(InputHandler & inputHandler);
51 
52     //! Destructor.
53     virtual ~StateMachine();
54 
55     //! Return the singleton instance.
56     static StateMachine & instance();
57 
58     void quit();
59 
60     StateMachine::State state() const;
61 
62     //! \reimp
63     virtual bool update() override;
64 
65     //! \reimp
66     virtual void reset() override;
67 
68 public slots:
69 
70     void endFadeIn();
71 
72     void endFadeOut();
73 
74     void endStartlightAnimation();
75 
76     void finishRace();
77 
78 signals:
79 
80     void fadeInRequested(int, int, int);
81 
82     void fadeOutRequested(int, int, int);
83 
84     void fadeOutFlashRequested(int, int, int);
85 
86     void soundsStopped();
87 
88     void startlightAnimationRequested();
89 
90     void renderingEnabled(bool);
91 
92     void exitGameRequested();
93 
94 private:
95     void stateInit();
96 
97     void stateDoIntro();
98 
99     void stateMenu();
100 
101     void stateMenuTransitionIn();
102 
103     void stateMenuTransitionOut();
104 
105     void stateGameTransitionIn();
106 
107     void stateGameTransitionOut();
108 
109     void stateDoStartlights();
110 
111     void statePlay();
112 
113     static StateMachine * m_instance;
114 
115     typedef std::map<State, std::function<void()>> StateToFunctionMap;
116 
117     StateToFunctionMap m_stateToFunctionMap;
118 
119     State m_state;
120 
121     State m_oldState;
122 
123     bool m_raceFinished;
124 
125     InputHandler & m_inputHandler;
126 
127     QTimer m_timer;
128 };
129 
130 #endif // STATEMACHINE_HPP
131