ScummVM API documentation
RunTime.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef QDENGINE_MINIGAMES_ADV_RUNTIME_H
23 #define QDENGINE_MINIGAMES_ADV_RUNTIME_H
24 
25 #include "common/hashmap.h"
26 
27 #include "qdengine/minigames/adv/common.h"
28 
29 namespace Common {
30 class SeekableReadStream;
31 class SeekableWriteStream;
32 }
33 
34 namespace QDEngine {
35 
36 class qdEngineInterface;
37 class qdMinigameSceneInterface;
38 
39 class MinigameInterface;
40 class TextManager;
41 class TimeManager;
42 class EventManager;
43 class EffectManager;
44 
46  mgVect3f crd;
47 };
48 
50  mgVect3f crd;
51 };
52 
53 struct MinigameData {
54  MinigameData();
55  int _sequenceIndex;
56  int _lastScore;
57  int _lastTime;
58  int _bestTime;
59  int _bestScore;
60 
61  void write(Common::WriteStream &out) const;
62  void read(Common::ReadStream &out);
63 };
64 
65 struct GameInfo {
66  GameInfo();
67  void persist(Common::SeekableReadStream &in);
68 
69  void write(Common::WriteStream &out) const;
70  void read(Common::ReadStream &in);
71 
72  void free();
73  static int version() {
74  return 9;
75  }
76  bool empty() const {
77  return _empty && _game._sequenceIndex < 0;
78  }
79 
80  MinigameData _game;
81  bool _empty;
82  TimeManagerData _timeManagerData;
83  EffectManagerData _effectManagerData;
84  uint _dataSize;
85  void *_gameData;
86 };
87 
88 typedef MinigameInterface *(*MinigameConsCallback)();
89 
90 qdMiniGameInterface *create_adv_minigame(const char *name, MinigameConsCallback callback);
91 
92 bool close_adv_minigame(qdMiniGameInterface *game);
93 
95  friend class TempValue;
96 public:
97  MinigameManager(MinigameConsCallback callback);
98  ~MinigameManager();
99 
100  // begin MiniGame virtual interface
101  bool init(const qdEngineInterface *engine_interface);
102  bool quant(float dt);
103  bool finit();
104 
105  bool new_game(const qdEngineInterface *engine);
106  int save_game(const qdEngineInterface *engine, const qdMinigameSceneInterface *scene, char *buffer, int buffer_size);
107  int load_game(const qdEngineInterface *engine, const qdMinigameSceneInterface *scene, const char *buffer, int buffer_size);
108  // finish MiniGame virtual interface
109 
110  // при необходимости заменяет на неизмененные предыдущим прохождением данные
111  bool processGameData(Common::SeekableReadStream &data);
112 
113  mgVect2f mousePosition() const {
114  return _mousePos;
115  }
116  bool mouseLeftPressed() const;
117  bool mouseRightPressed() const;
118  bool keyPressed(int vKey, bool once = false) const;
119 
120  mgVect2i screenSize() const {
121  return _screenSize;
122  }
123  float getTime() const {
124  return _gameTime;
125  }
126 
127  const MinigameData *getScore(int level, int game) const;
128 
129  bool debugMode() const {
130  return _debugMode;
131  }
132 
133  TextManager &textManager() const {
134  return *_textManager;
135  }
136 
137  void signal(SystemEvent id);
138  void event(int eventID, const mgVect2f& pos, int factor = 1);
139  void event(int eventID, const mgVect2i& pos, int factor = 1) {
140  event(eventID, mgVect2f(pos.x, pos.y), factor);
141  }
142 
143  // указывает вариант показа информации о победе (поворот собранной картинки и т.д.)
144  void setCompleteHelpVariant(int idx);
145  // указывает номер подсказки для показа, -1 - спрятать подсказку
146  void setGameHelpVariant(int idx);
147 
148  // Возвращает параметр из прикрепленного к игре ini файла
149  const char *parameter(const char *name, bool required = true) const;
150  const char *parameter(const char *name, const char *def) const;
151 
152  // Пересчитывает из экранных координат UI игры в 3D координаты R() объекта на мире
153  mgVect3f game2world(const mgVect3i &coord) const;
154  mgVect3f game2world(const mgVect3f &coord) const;
155  mgVect3f game2world(const mgVect2i &coord, int depth = 0) const;
156  mgVect3f game2world(const mgVect2f &coord, int depth = 0) const;
157  // Пересчитывает из мировых координат R() в 2D UI координаты и глубину
158  mgVect2f world2game(const mgVect3f& pos) const;
159  mgVect3f world2game(qdMinigameObjectInterface *obj) const;
160  // размер объекта
161  mgVect2f getSize(qdMinigameObjectInterface *obj) const;
162 
163  // Меняет глубину объекта, не меняя его 2D положения на экране
164  void setDepth(qdMinigameObjectInterface *obj, int depth) const;
165  // Получает глубину объекта, чем меньше, тем ближе к игроку
166  float getDepth(qdMinigameObjectInterface *obj) const;
167  // Получает глубину точки, чем меньше, тем ближе к игроку
168  float getDepth(const mgVect3f& pos) const;
169 
170  // получает интерфейс к динамическому игровому объекту по имени
171  QDObject getObject(const char *name) const;
172  // проверяет существование динамического объекта в сцене
173  bool testObject(const char *name) const;
174  // освобождает интерфейс
175  void release(QDObject& obj);
176 
177  // задать текст для контрола
178  void setText(const char *name, const char *text) const;
179  void setText(const char *name, int toText, const char *format = "%d") const;
180 
181  // спрятать объект за пределами экрана
182  void hide(qdMinigameObjectInterface *obj) const;
183 
184  // случайное значение в диапазоне [min, max]
185  float rnd(float min, float max) const;
186  int rnd(int min, int max) const;
187  // случайный диапазон, из набора вероятностей
188  int rnd(const Std::vector<float> &prob) const;
189 
190  // файл со списком игр по уровням
191  const char *gameListFileName() const {
192  return "resource/minigames.lst";
193  }
194 
195 private:
196  MinigameInterface *_game;
197 
198  // Вывод текста с помощью объектов
199  TextManager *_textManager;
200  // Подсчет и визуализация времени
201  TimeManager *_timeManager;
202  // Обработка событий игры
203  EventManager *_eventManager;
204  // выводимые эффекты
205  EffectManager *_effectManager;
206 
207  // Время в секундах с момента стара игры
208  float _gameTime;
209  // кеш проверенных на нажатие клавиш, для отслеживания непосредственно нажатия
210  mutable bool _lastKeyChecked[256];
211  // Размер играна
212  mgVect2i _screenSize;
213  // текущее положение мыши
214  mgVect2f _mousePos;
215  // подстройка мыши
216  mgVect2f _mouseAdjast;
217 
218  // объект для передачи сигнала об окончании игры в триггеры
219  qdMinigameObjectInterface *_state_flag;
220  // объект для получения сигнала о постановке на паузу
221  qdMinigameObjectInterface *_pause_flag;
222  // справка по победе
223  QDObject _complete_help;
224  QDObject _complete_help_miniature;
225  // текущее состояние для включения справки
226  Common::String _complete_help_state_name;
227  // справка по игре
228  QDObject _game_help;
229  QDObject _game_help_trigger;
230  bool _game_help_enabled;
231  // текущее состояние для включения справки
232  Common::String _game_help_state_name;
233 
234  // интерфейс к движку
235  const qdEngineInterface *_engine;
236  // интерфейс к текущей сцене
237  qdMinigameSceneInterface *_scene;
238 
239  // игра запущена для отладки
240  bool _debugMode;
241  // rnd seed
242  int _seed;
243 
244  // кнопки мыши инвертированы
245  bool _invertMouseButtons;
246 
247  // имя файла и информацией о минииграх
248  Common::String _state_container_name;
249  // количество пройденных игр на каждом уровне
251  Counters _completeCounters;
252 
253  struct GameInfoIndex {
254  GameInfoIndex(int idx, int level) : _gameNum(idx), _gameLevel(level) {}
255  int _gameNum;
256  int _gameLevel;
257 
258  void write(Common::WriteStream &out) const;
259  void read(Common::ReadStream &in);
260 
261  bool operator< (const GameInfoIndex& rs) const {
262  return _gameLevel == rs._gameLevel ? _gameNum < rs._gameNum : _gameLevel < rs._gameLevel;
263  }
264  };
265 
266  struct GameInfoIndex_Hash {
267  uint operator()(const GameInfoIndex& x) const {
268  return (x._gameNum << 16) + x._gameLevel;
269  }
270  };
271 
272  struct GameInfoIndex_EqualTo {
273  uint operator()(const GameInfoIndex& x, const GameInfoIndex& y) const {
274  return x._gameNum == y._gameNum && x._gameLevel == y._gameLevel;
275  }
276  };
277 
278  // информация о пройденных играх
280  GameInfoMap _gameInfos;
281  // Информация о текущей игре, при выходе запишется
282  GameInfoIndex _currentGameIndex;
283  GameInfo *_currentGameInfo;
284 
285  // проверить что все необходимые игры пройдены
286  bool testAllGamesWin();
287  // Непосредственно создает и инициализирует игру
288  bool createGame();
289  // обработка победы
290  void gameWin();
291  // обработка поражения
292  void gameLose();
293  // чтение данных об играх
294  bool loadState(bool current = true);
295  // сохранение данных в файл
296  void saveState(bool force = false);
297 
298  // Полуить объект-счетчик
299  QDCounter getCounter(const char *name);
300  // Освободить счетчик
301  void release(QDCounter& counter);
302 
303  MinigameConsCallback _callback = nullptr;
304 };
305 
306 } // namespace QDEngine
307 
308 #endif // QDENGINE_MINIGAMES_ADV_RUNTIME_H
Definition: str.h:59
Definition: RunTime.h:49
Definition: common.h:34
Definition: stream.h:77
Definition: MinigameInterface.h:27
Definition: stream.h:745
Definition: RunTime.h:53
Definition: qd_minigame_interface.h:78
Definition: RunTime.h:94
Definition: RunTime.h:45
Definition: qd_minigame_interface.h:365
Definition: RunTime.h:65
Базовый класс для игровых ресурсов.
Definition: console.h:28
Definition: algorithm.h:29
Definition: EventManager.h:27
Definition: EffectManager.h:35
Интерфейс к динамическому объекту.
Definition: qd_minigame_interface.h:230
Интерфейс к счётчику.
Definition: qd_minigame_interface.h:353
Интерфейс к сцене.
Definition: qd_minigame_interface.h:315
Definition: stream.h:385
Definition: TextManager.h:35