Optimize headers
[oweals/minetest.git] / src / game.h
1 /*
2 Minetest-c55
3 Copyright (C) 2011 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #ifndef GAME_HEADER
21 #define GAME_HEADER
22
23 #include "irrlichttypes_extrabloated.h"
24 #include <string>
25 #include "keycode.h"
26
27 class KeyList : protected core::list<KeyPress>
28 {
29         typedef core::list<KeyPress> super;
30         typedef super::Iterator Iterator;
31         typedef super::ConstIterator ConstIterator;
32
33         virtual ConstIterator find(const KeyPress &key) const
34         {
35                 ConstIterator f(begin());
36                 ConstIterator e(end());
37                 while (f!=e) {
38                         if (*f == key)
39                                 return f;
40                         ++f;
41                 }
42                 return e;
43         }
44
45         virtual Iterator find(const KeyPress &key)
46         {
47                 Iterator f(begin());
48                 Iterator e(end());
49                 while (f!=e) {
50                         if (*f == key)
51                                 return f;
52                         ++f;
53                 }
54                 return e;
55         }
56
57 public:
58         void clear() { super::clear(); }
59
60         void set(const KeyPress &key)
61         {
62                 if (find(key) == end())
63                         push_back(key);
64         }
65
66         void unset(const KeyPress &key)
67         {
68                 Iterator p(find(key));
69                 if (p != end())
70                         erase(p);
71         }
72
73         void toggle(const KeyPress &key)
74         {
75                 Iterator p(this->find(key));
76                 if (p != end())
77                         erase(p);
78                 else
79                         push_back(key);
80         }
81
82         bool operator[](const KeyPress &key) const
83         {
84                 return find(key) != end();
85         }
86 };
87
88 class InputHandler
89 {
90 public:
91         InputHandler()
92         {
93         }
94         virtual ~InputHandler()
95         {
96         }
97
98         virtual bool isKeyDown(const KeyPress &keyCode) = 0;
99         virtual bool wasKeyDown(const KeyPress &keyCode) = 0;
100         
101         virtual v2s32 getMousePos() = 0;
102         virtual void setMousePos(s32 x, s32 y) = 0;
103
104         virtual bool getLeftState() = 0;
105         virtual bool getRightState() = 0;
106
107         virtual bool getLeftClicked() = 0;
108         virtual bool getRightClicked() = 0;
109         virtual void resetLeftClicked() = 0;
110         virtual void resetRightClicked() = 0;
111
112         virtual bool getLeftReleased() = 0;
113         virtual bool getRightReleased() = 0;
114         virtual void resetLeftReleased() = 0;
115         virtual void resetRightReleased() = 0;
116         
117         virtual s32 getMouseWheel() = 0;
118
119         virtual void step(float dtime) {};
120
121         virtual void clear() {};
122 };
123
124 class ChatBackend;  /* to avoid having to include chat.h */
125 struct SubgameSpec;
126
127 void the_game(
128         bool &kill,
129         bool random_input,
130         InputHandler *input,
131         IrrlichtDevice *device,
132         gui::IGUIFont* font,
133         std::string map_dir,
134         std::string playername,
135         std::string password,
136         std::string address, // If "", local server is used
137         u16 port,
138         std::wstring &error_message,
139         std::string configpath,
140         ChatBackend &chat_backend,
141         const SubgameSpec &gamespec, // Used for local game
142         bool simple_singleplayer_mode
143 );
144
145 #endif
146