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)(MinigameManager *runtime);
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  int getParameter(const char* name, const int& defValue);
196  bool getParameter(const char* name, int& out, bool obligatory);
197  float getParameter(const char* name, const float &defValue);
198  bool getParameter(const char* name, float &out, bool obligatory);
199  mgVect2f getParameter(const char* name, const mgVect2f& defValue);
200  bool getParameter(const char* name, mgVect2f& out, bool obligatory);
201  mgVect2i getParameter(const char* name, const mgVect2i& defValue);
202  bool getParameter(const char* name, mgVect2i& out, bool obligatory);
203 
204 private:
205  MinigameInterface *_game;
206 
207  // Вывод текста с помощью объектов
208  TextManager *_textManager;
209  // Подсчет и визуализация времени
210  TimeManager *_timeManager;
211  // Обработка событий игры
212  EventManager *_eventManager;
213  // выводимые эффекты
214  EffectManager *_effectManager;
215 
216  // Время в секундах с момента стара игры
217  float _gameTime;
218  // кеш проверенных на нажатие клавиш, для отслеживания непосредственно нажатия
219  mutable bool _lastKeyChecked[256];
220  // Размер играна
221  mgVect2i _screenSize;
222  // текущее положение мыши
223  mgVect2f _mousePos;
224  // подстройка мыши
225  mgVect2f _mouseAdjast;
226 
227  // объект для передачи сигнала об окончании игры в триггеры
228  qdMinigameObjectInterface *_state_flag;
229  // объект для получения сигнала о постановке на паузу
230  qdMinigameObjectInterface *_pause_flag;
231  // справка по победе
232  QDObject _complete_help;
233  QDObject _complete_help_miniature;
234  // текущее состояние для включения справки
235  Common::String _complete_help_state_name;
236  // справка по игре
237  QDObject _game_help;
238  QDObject _game_help_trigger;
239  bool _game_help_enabled;
240  // текущее состояние для включения справки
241  Common::String _game_help_state_name;
242 
243  // интерфейс к движку
244  const qdEngineInterface *_engine;
245  // интерфейс к текущей сцене
246  qdMinigameSceneInterface *_scene;
247 
248  // игра запущена для отладки
249  bool _debugMode;
250  // rnd seed
251  int _seed;
252 
253  // кнопки мыши инвертированы
254  bool _invertMouseButtons;
255 
256  // имя файла и информацией о минииграх
257  Common::String _state_container_name;
258  // количество пройденных игр на каждом уровне
260  Counters _completeCounters;
261 
262  struct GameInfoIndex {
263  GameInfoIndex(int idx, int level) : _gameNum(idx), _gameLevel(level) {}
264  int _gameNum;
265  int _gameLevel;
266 
267  void write(Common::WriteStream &out) const;
268  void read(Common::ReadStream &in);
269 
270  bool operator< (const GameInfoIndex& rs) const {
271  return _gameLevel == rs._gameLevel ? _gameNum < rs._gameNum : _gameLevel < rs._gameLevel;
272  }
273  };
274 
275  struct GameInfoIndex_Hash {
276  uint operator()(const GameInfoIndex& x) const {
277  return (x._gameNum << 16) + x._gameLevel;
278  }
279  };
280 
281  struct GameInfoIndex_EqualTo {
282  uint operator()(const GameInfoIndex& x, const GameInfoIndex& y) const {
283  return x._gameNum == y._gameNum && x._gameLevel == y._gameLevel;
284  }
285  };
286 
287  // информация о пройденных играх
289  GameInfoMap _gameInfos;
290  // Информация о текущей игре, при выходе запишется
291  GameInfoIndex _currentGameIndex;
292  GameInfo *_currentGameInfo;
293 
294  // проверить что все необходимые игры пройдены
295  bool testAllGamesWin();
296  // Непосредственно создает и инициализирует игру
297  bool createGame();
298  // обработка победы
299  void gameWin();
300  // обработка поражения
301  void gameLose();
302  // чтение данных об играх
303  bool loadState(bool current = true);
304  // сохранение данных в файл
305  void saveState(bool force = false);
306 
307  // Полуить объект-счетчик
308  QDCounter getCounter(const char *name);
309  // Освободить счетчик
310  void release(QDCounter& counter);
311 
312  MinigameConsCallback _callback = nullptr;
313 };
314 
315 } // namespace QDEngine
316 
317 #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