ScummVM API documentation
arkada_avtomat.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_ARKADA_AVTOMAT_H
23 #define QDENGINE_MINIGAMES_ARKADA_AVTOMAT_H
24 
25 #include "common/debug.h"
26 
27 #include "qdengine/qd_fwd.h"
28 #include "qdengine/qdcore/qd_minigame_interface.h"
29 
30 namespace QDEngine {
31 
33 public:
36 
37  bool init(const qdEngineInterface *engine_interface) {
38  debugC(1, kDebugMinigames, "ArkadaAvtomat::init()");
39 
40  _engine = engine_interface;
41  _scene = engine_interface->current_scene_interface();
42  if (!_scene)
43  return false;
44 
45  _patronMouseObj = _scene->object_interface(_scene->minigame_parameter("patron_mouse"));
46  _patronTomatoObj = _scene->object_interface(_scene->minigame_parameter("patron_tomato"));
47  _killObj = _scene->object_interface(_scene->minigame_parameter("kill"));
48  _fazaObj = _scene->object_interface(_scene->minigame_parameter("faza"));
49  _menObj = _scene->object_interface(_scene->minigame_parameter("men"));
50  _bloodObj = _scene->object_interface(_scene->minigame_parameter("blood"));
51  _shotsEggObj = _scene->object_interface(_scene->minigame_parameter("shots_egg"));
52  _shotsTomatoObj = _scene->object_interface(_scene->minigame_parameter("shots_tomato"));
53  _shotsBananObj = _scene->object_interface(_scene->minigame_parameter("shots_banan"));
54  _doneObj = _scene->object_interface(_scene->minigame_parameter("done"));
55  _livesObj = _scene->object_interface(_scene->minigame_parameter("lives"));
56  _bublObj = _scene->object_interface(_scene->minigame_parameter("bubl"));
57  _walkFlagObj = _scene->object_interface(_scene->minigame_parameter("walk_flag"));
58  _jumpFlagObj = _scene->object_interface(_scene->minigame_parameter("jump_flag"));
59 
60  _goingLeft = false;
61  _goingRight = false;
62  _manSpeed = 2;
63  _doingJump = false;
64  _stepsToJump = -1;
65 
66  // stand(time(0));
67 
68  _jumpNextPhase = -1;
69  _shotsTomatoCounter = 9;
70  _shotsBananaCounter = 10;
71  _shoteEggCounter = 10;
72  _livesCounter = 5;
73  _isFinal = false;
74  _jumpPhase = 2;
75  _doingWalk = false;
76  _jumpFlag = false;
77 
78  return true;
79  }
80 
81  bool quant(float dt) {
82  debugC(3, kDebugMinigames, "ArkadaAvtomat::quant(%f)", dt);
83 
84  mgVect2i menCoords;
85  int randomCond = 0;
86 
87  menCoords = _scene->world2screen_coords(_menObj->R());
88  _bublObj->set_R(_scene->screen2world_coords(menCoords, -5000.0));
89 
90  if (_isFinal) {
91  updateWalkState();
92  return true;
93  }
94 
95  if (!_shotsTomatoCounter && !_shotsBananaCounter && !_shoteEggCounter) {
96  _shotsTomatoCounter = 9;
97  _shotsBananaCounter = 10;
98  _shoteEggCounter = 10;
99  _livesCounter = 5;
100 
101  _patronMouseObj->set_state("\xef\xee\xec\xe8\xe4\xee\xf0"); // "помидор"
102 
103  updateStats();
104 
105  _manSpeed = 2;
106  }
107 
108  if (!_doingJump) {
109  if (_scene->world2screen_coords(_menObj->R()).x < _jumpingPhase3Y
110  && _menObj->is_state_active("\xf1\xf2\xee\xe8\xf2")) { // "стоит"
111  _menObj->set_R(_menCoords);
112 
113  _bloodObj->set_R(_scene->screen2world_coords(_scene->world2screen_coords(_menCoords), 0.0)); // check 0.0 v96
114  _stepsToJump = -1;
115  }
116  }
117 
118  if (_menObj->is_state_active("\xf1\xf2\xee\xe8\xf2")) { // "стоит"
119  _goingLeft = false;
120  _goingRight = false;
121  _doingJump = false;
122  }
123 
124  if (!_goingRight) {
125  if (_goingLeft || _doingJump || _menObj->is_state_active("\xf1\xf2\xee\xe8\xf2")) { // "стоит"
126 LABEL_44:
127  if (!_goingRight)
128  goto LABEL_47;
129  goto LABEL_45;
130  }
131  _stepsToLeft = -1;
132  _stepsToRight = -1;
133 
134  switch (qd_rnd(5)) {
135  case 0:
136  case 3: {
137  _goingRight = true;
138  int maxSteps = (500 - _menObj->screen_R().x) / _manSpeed;
139 
140  if (maxSteps < 10)
141  maxSteps = 10;
142 
143  _stepsToRight = qd_rnd(maxSteps);
144  _menObj->set_state("\xe8\xe4\xe5\xf2 \xe2\xef\xf0\xe0\xe2\xee"); // "идет вправо"
145  goto LABEL_44;
146  }
147  case 1:
148  case 4: {
149  _goingLeft = true;
150  int maxSteps = (_menObj->screen_R().x - 300) / _manSpeed;
151  if (maxSteps < 10)
152  maxSteps = 10;
153 
154  _stepsToLeft = qd_rnd(maxSteps);
155  _menObj->set_state("\xe8\xe4\xe5\xf2 \xe2\xeb\xe5\xe2\xee"); // "идет влево"
156  goto LABEL_44;
157  }
158  case 2:
159  _doingJump = true;
160  _stepsToJump = 30;
161  _menCoords = _menObj->R();
162  {
163  int y = _scene->world2screen_coords(_menObj->R()).y;
164 
165  _manOrigPosY = y;
166  _jumpingPhase3Y = y;
167  _jumpHeight = y - 60;
168  }
169 
170  randomCond = qd_rnd(3);
171 
172  switch (_jumpPhase) {
173  case 1:
174  if (!randomCond) {
175  _jumpingPhase3Y = _manOrigPosY;
176  goto LABEL_43;
177  }
178  if (randomCond == 1)
179  goto LABEL_29;
180  if (randomCond != 2)
181  goto LABEL_43;
182  break;
183  case 2:
184  if (!randomCond) {
185  _jumpingPhase3Y = _manOrigPosY;
186  goto LABEL_43;
187  }
188  if (randomCond == 1) {
189  _jumpingPhase3Y = 307;
190  _jumpNextPhase = 1;
191  goto LABEL_43;
192  }
193  if (randomCond != 2)
194  goto LABEL_43;
195  break;
196  case 3:
197  if (!randomCond) {
198  _jumpingPhase3Y = _manOrigPosY;
199  goto LABEL_43;
200  }
201  if (randomCond != 1) {
202  if (randomCond == 2) {
203  _jumpingPhase3Y = 307;
204  _jumpNextPhase = 1;
205  }
206  goto LABEL_43;
207  }
208  LABEL_29:
209  _jumpingPhase3Y = 332;
210  _jumpNextPhase = 2;
211  goto LABEL_43;
212  default:
213  LABEL_43:
214  _jumpPhaseIsGoingDown = false;
215  goto LABEL_44;
216  }
217 
218  _jumpingPhase3Y = 357;
219  _jumpNextPhase = 3;
220  goto LABEL_43;
221  default:
222  goto LABEL_44;
223  }
224  }
225 
226 LABEL_45:
227  {
228  mgVect2i pos = _scene->world2screen_coords(_menObj->R());
229  pos.x += _manSpeed;
230  _menObj->set_R(_scene->screen2world_coords(pos, 0.0));
231  }
232  _stepsToRight--;
233 
234  if (_stepsToRight <= 0)
235  _goingRight = false;
236 
237 LABEL_47:
238  if (_goingLeft) {
239  mgVect2i pos = _scene->world2screen_coords(_menObj->R());
240  pos.x -= _manSpeed;
241  _menObj->set_R(_scene->screen2world_coords(pos, 0.0));
242  _stepsToLeft--;
243 
244  if (_stepsToLeft <= 0)
245  _goingLeft = false;
246  }
247 
248  if (_doingJump) {
249  mgVect2i pos = _scene->world2screen_coords(_menObj->R());
250 
251  if (pos.y >= _manOrigPosY - 10) {
252  if (!_menObj->is_state_active("\xef\xf0\xfb\xe3\xe0\xe5\xf2\x31") && !_jumpPhaseIsGoingDown) // "прыгает1"
253  _menObj->set_state("\xef\xf0\xfb\xe3\xe0\xe5\xf2\x31"); // "прыгает1"
254  }
255 
256  if (pos.y <= _manOrigPosY - 10) {
257  if (_menObj->is_state_active("\xef\xf0\xfb\xe3\xe0\xe5\xf2\x31") && !_jumpPhaseIsGoingDown) // "прыгает1"
258  _menObj->set_state("\xef\xf0\xfb\xe3\xe0\xe5\xf2\x32"); // "прыгает2"
259  }
260 
261  if (pos.y >= _jumpingPhase3Y - 10) {
262  if (_menObj->is_state_active("\xef\xf0\xfb\xe3\xe0\xe5\xf2\x32") && _jumpPhaseIsGoingDown) // "прыгает2"
263  _menObj->set_state("\xef\xf0\xfb\xe3\xe0\xe5\xf2\x33"); // "прыгает3"
264  }
265 
266  if (pos.y <= _jumpHeight)
267  goto LABEL_176;
268 
269  if (!_jumpPhaseIsGoingDown) {
270  pos.y -= 4;
271 LABEL_75:
272 LABEL_76:
273  if (pos.y < _jumpingPhase3Y) {
274 LABEL_79:
275  _menObj->set_R(_scene->screen2world_coords(pos, 0.0));
276  goto LABEL_80;
277  }
278 LABEL_77:
279  if (_jumpPhaseIsGoingDown) {
280  _doingJump = false;
281  _jumpPhase = _jumpNextPhase;
282  }
283  goto LABEL_79;
284  }
285  if (pos.y > _jumpHeight) {
286  if (!_jumpPhaseIsGoingDown)
287  goto LABEL_76;
288  } else {
289 LABEL_176:
290  if (!_jumpPhaseIsGoingDown) {
291  _jumpPhaseIsGoingDown = true;
292  goto LABEL_76;
293  }
294  }
295  if (pos.y > _jumpingPhase3Y)
296  goto LABEL_77;
297 
298  pos.y += 4;
299  goto LABEL_75;
300  }
301 LABEL_80:
302 
303  _patronMouseObj->set_R(_scene->screen2world_coords(_engine->mouse_cursor_position(), -5000.0));
304 
306  if (_patronMouseObj->is_state_active("\xef\xee\xec\xe8\xe4\xee\xf0")) { // "помидор"
307  if (_shoteEggCounter <= 0) {
308  if (_shotsBananaCounter > 0) {
309  _patronMouseObj->set_state("\xe1\xe0\xed\xe0\xed"); // "банан"
310 
311  if (_shotsTomatoCounter > 0)
312  _shotsTomatoCounter++;
313 
314  --_shotsBananaCounter;
315  }
316  goto LABEL_107;
317  }
318  _patronMouseObj->set_state("\xff\xe9\xf6\xee"); // "яйцо"
319 
320  if (_shotsTomatoCounter > 0)
321  _shotsTomatoCounter++;
322  } else {
323  if (_patronMouseObj->is_state_active("\xff\xe9\xf6\xee")) { // "яйцо"
324  if (_shotsBananaCounter <= 0) {
325  if (_shotsTomatoCounter > 0) {
326  _patronMouseObj->set_state("\xef\xee\xec\xe8\xe4\xee\xf0"); // "помидор"
327 
328  if (_shoteEggCounter > 0)
329  _shoteEggCounter++;
330 
331  --_shotsTomatoCounter;
332  }
333  } else {
334  _patronMouseObj->set_state("\xe1\xe0\xed\xe0\xed"); // "банан"
335 
336  if (_shoteEggCounter > 0)
337  _shoteEggCounter++;
338 
339  --_shotsBananaCounter;
340  }
341  goto LABEL_107;
342  }
343 
344  if (!_patronMouseObj->is_state_active("\xe1\xe0\xed\xe0\xed")) // "банан"
345  goto LABEL_107;
346 
347  if (_shotsTomatoCounter > 0) {
348  _patronMouseObj->set_state("\xef\xee\xec\xe8\xe4\xee\xf0"); // "помидор"
349 
350  if (_shotsBananaCounter > 0)
351  _shotsBananaCounter++;
352 
353  --_shotsTomatoCounter;
354  goto LABEL_107;
355  }
356  if (_shoteEggCounter <= 0) {
357 LABEL_107:
358  updateStats();
359  goto LABEL_108;
360  }
361  _patronMouseObj->set_state("\xff\xe9\xf6\xee"); // "яйцо"
362 
363  if (_shotsBananaCounter > 0)
364  _shotsBananaCounter = _shotsBananaCounter + 1;
365  }
366  --_shoteEggCounter;
367  goto LABEL_107;
368  }
369 LABEL_108:
371  && !_bloodObj->is_state_active("\xe5\xf1\xf2\xfc") // "есть"
372  && !_patronTomatoObj->is_state_active("\xef\xee\xec\xe8\xe4\xee\xf0") // "помидор"
373  && !_patronTomatoObj->is_state_active("\xff\xe9\xf6\xee") // "яйцо"
374  && !_patronTomatoObj->is_state_active("\xe1\xe0\xed\xe0\xed")) { // "банан"
375  _cursorPos = _engine->mouse_cursor_position();
376 
377  _patronTomatoObj->set_R(_patronMouseObj->R());
378 
379  if (_patronMouseObj->is_state_active("\xef\xee\xec\xe8\xe4\xee\xf0")) { // "помидор"
380  _patronTomatoObj->set_state("\xef\xee\xec\xe8\xe4\xee\xf0"); // "помидор"
381  --_shotsTomatoCounter;
382  } else if (_patronMouseObj->is_state_active("\xff\xe9\xf6\xee")) { // "яйцо"
383  _patronTomatoObj->set_state("\xff\xe9\xf6\xee"); // "яйцо"
384  --_shoteEggCounter;
385  } else if (_patronMouseObj->is_state_active("\xe1\xe0\xed\xe0\xed")) { // "банан"
386  _patronTomatoObj->set_state("\xe1\xe0\xed\xe0\xed"); // "банан"
387  --_shotsBananaCounter;
388  }
389 
390  _bloodObj->set_R(_patronMouseObj->R());
391  updateStats();
392 
393  if (_shotsTomatoCounter <= 0
394  && _patronTomatoObj->is_state_active("\xef\xee\xec\xe8\xe4\xee\xf0")) { // "помидор"
395  if (_shoteEggCounter <= 0) {
396  if (_shotsBananaCounter <= 0)
397  _patronMouseObj->set_state("\xed\xe8\xf7\xe5\xe3\xee"); // "ничего"
398  else
399  _patronMouseObj->set_state("\xe1\xe0\xed\xe0\xed"); // "банан"
400  } else {
401  _patronMouseObj->set_state("\xff\xe9\xf6\xee"); // "яйцо"
402  }
403  }
404  if (_shoteEggCounter <= 0 && _patronTomatoObj->is_state_active("\xff\xe9\xf6\xee")) { // "яйцо"
405  if (_shotsBananaCounter <= 0) {
406  if (_shotsTomatoCounter <= 0)
407  _patronMouseObj->set_state("\xed\xe8\xf7\xe5\xe3\xee"); // "ничего"
408  else
409  _patronMouseObj->set_state("\xef\xee\xec\xe8\xe4\xee\xf0"); // "помидор"
410  } else {
411  _patronMouseObj->set_state("\xe1\xe0\xed\xe0\xed"); // "банан"
412  }
413  }
414  if (_shotsBananaCounter <= 0 && _patronTomatoObj->is_state_active("\xe1\xe0\xed\xe0\xed")) { // "банан"
415  if (_shotsTomatoCounter <= 0) {
416  if (_shoteEggCounter <= 0)
417  _patronMouseObj->set_state("\xed\xe8\xf7\xe5\xe3\xee"); // "ничего"
418  else
419  _patronMouseObj->set_state("\xff\xe9\xf6\xee"); // "яйцо"
420  } else {
421  _patronMouseObj->set_state("\xef\xee\xec\xe8\xe4\xee\xf0"); // "помидор"
422  }
423  }
424  }
425 
426  // Hit check
427  if (_fazaObj->is_state_active("\xe4\xe0") // "да"
428  && !_bloodObj->is_state_active("\xe5\xf1\xf2\xfc")) { // "есть"
429  mgVect2i pos = _menObj->screen_R();
430 
431  if (ABS(pos.x - _cursorPos.x) <= 15 && ABS(pos.y - _cursorPos.y) <= 35) {
432  _killObj->set_state("\xe4\xe0"); // "да"
433  --_livesCounter;
434 
435  updateStats();
436 
437  _doingJump = false;
438  _manSpeed = 7 - _livesCounter;
439 
440  if (_manSpeed > 4)
441  _manSpeed = 4;
442  }
443  }
444 
445  if (!_livesCounter) {
446  _isFinal = true;
447  _doneObj->set_state("\xe4\xe0"); // "да"
448  _goingLeft = false;
449  _goingRight = false;
450  _doingJump = false;
451  }
452 
453  updateWalkState();
454 
455  return true;
456  }
457 
458  void updateWalkState() {
459  if ((_goingLeft || _goingRight) && !_doingWalk) {
460  _doingWalk = true;
461  _walkFlagObj->set_state("\xe4\xe0"); // "да"
462 
463  _jumpFlag = false;
464  _jumpFlagObj->set_state("\xed\xe5\xf2"); // "нет"
465 
466  return;
467  }
468 
469  if (_doingJump) {
470  _doingWalk = false;
471  _walkFlagObj->set_state("\xed\xe5\xf2"); // "нет"
472 
473  _jumpFlag = true;
474  _jumpFlagObj->set_state("\xe4\xe0"); // "да"
475 
476  return;
477  }
478 
479 
480  _doingWalk = false;
481  _walkFlagObj->set_state("\xed\xe5\xf2"); // "нет"
482 
483  _jumpFlag = false;
484  _jumpFlagObj->set_state("\xed\xe5\xf2"); // "нет"
485  }
486 
487  bool finit() {
488  debugC(1, kDebugMinigames, "ArkadaAvtomat::finit()");
489 
490  if (_scene) {
491  _engine->release_scene_interface(_scene);
492  _scene = 0;
493  }
494 
495  return true;
496  }
497 
498  bool new_game(const qdEngineInterface *engine_interface) {
499  return true;
500  }
501 
502  int save_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, char *buffer, int buffer_size) {
503  return 0;
504  }
505 
506  int load_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, const char *buffer, int buffer_size) {
507  return 0;
508  }
509 
510  enum { INTERFACE_VERSION = 99 };
511  int version() const {
512  return INTERFACE_VERSION;
513  }
514 
515 private:
516  void updateStats() {
517  _shotsEggObj->set_state(Common::String::format("%i", _shoteEggCounter).c_str());
518  _shotsBananObj->set_state(Common::String::format("%i", _shotsBananaCounter).c_str());
519  _shotsTomatoObj->set_state(Common::String::format("%d", _shotsTomatoCounter).c_str());
520  _livesObj->set_state(Common::String::format("%d", _livesCounter).c_str());
521  }
522 
523 private:
524  const qdEngineInterface *_engine = nullptr;
525  qdMinigameSceneInterface *_scene = nullptr;
526 
527  qdMinigameObjectInterface *_patronMouseObj = nullptr;
528  qdMinigameObjectInterface *_patronTomatoObj = nullptr;
529  qdMinigameObjectInterface *_killObj = nullptr;
530  qdMinigameObjectInterface *_fazaObj = nullptr;
531  qdMinigameObjectInterface *_menObj = nullptr;
532  qdMinigameObjectInterface *_bloodObj = nullptr;
533  qdMinigameObjectInterface *_shotsEggObj = nullptr;
534  qdMinigameObjectInterface *_shotsTomatoObj = nullptr;
535  qdMinigameObjectInterface *_shotsBananObj = nullptr;
536  qdMinigameObjectInterface *_doneObj = nullptr;
537  qdMinigameObjectInterface *_livesObj = nullptr;
538  qdMinigameObjectInterface *_bublObj = nullptr;
539  qdMinigameObjectInterface *_walkFlagObj = nullptr;
540  qdMinigameObjectInterface *_jumpFlagObj = nullptr;
541 
542  bool _goingLeft = false;
543  bool _goingRight = false;
544  bool _doingJump = false;
545  bool _doingWalk = false;
546  bool _jumpFlag = false;
547 
548  int _stepsToLeft = 0;
549  int _stepsToRight = 0;
550  int _stepsToJump = -1;
551 
552  mgVect3f _menCoords;
553  int _manSpeed = 2;
554 
555  int _shotsTomatoCounter = 9;
556  int _shotsBananaCounter = 10;
557  int _shoteEggCounter = 10;
558  int _livesCounter = 5;
559 
560  bool _isFinal = false;
561 
562  mgVect2i _cursorPos;
563 
564  int _manOrigPosY = 0;
565  int _jumpHeight = 0;
566  int _jumpingPhase3Y = 0;
567 
568  bool _jumpPhaseIsGoingDown = false;
569 
570  int _jumpPhase = 2;
571  int _jumpNextPhase = -1;
572 };
573 
574 } // namespace QDEngine
575 
576 #endif // QDENGINE_MINIGAMES_ARKADA_AVTOMAT_H
virtual mgVect3f R() const =0
Возвращает координаты объекта в мировой системе координат.
virtual mgVect3f screen2world_coords(const mgVect2i &screen_pos, float screen_depth=0) const =0
Преобразование из экранных координат в мировые.
static String format(MSVC_PRINTF const char *fmt,...) GCC_PRINTF(1
virtual mgVect2i screen_R() const =0
Возвращает координаты объекта в экранной системе координат.
int save_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, char *buffer, int buffer_size)
Сохранение данных, вызывается при сохранении сцены, на которую повешена миниигра. ...
Definition: arkada_avtomat.h:502
Нажатие левой кнопки.
Definition: qd_minigame_interface.h:372
Definition: qd_minigame_interface.h:78
virtual mgVect2i mouse_cursor_position() const =0
Возвращает текущие координаты мышиного курсора.
Definition: qd_minigame_interface.h:365
virtual bool is_state_active(const char *state_name) const =0
Возвращает true, если состояние с именем state_name включено в данный момент.
Базовый класс для игровых ресурсов.
Definition: console.h:28
Нажатие правой кнопки.
Definition: qd_minigame_interface.h:374
bool init(const qdEngineInterface *engine_interface)
Инициализация игры.
Definition: arkada_avtomat.h:37
Интерфейс к динамическому объекту.
Definition: qd_minigame_interface.h:230
int load_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, const char *buffer, int buffer_size)
Загрузка данных, вызывается при загрузке сцены, на которую повешена миниигра.
Definition: arkada_avtomat.h:506
Интерфейс к сцене.
Definition: qd_minigame_interface.h:315
bool new_game(const qdEngineInterface *engine_interface)
Инициализация миниигры, вызывается при старте и перезапуске игры.
Definition: arkada_avtomat.h:498
virtual bool set_state(const char *state_name)=0
Включает состояние с именем state_name.
virtual void set_R(const mgVect3f &r)=0
Устанавливает координаты объекта в мировой системе координат.
Definition: arkada_avtomat.h:32
virtual qdMinigameObjectInterface * object_interface(const char *object_name)=0
Создаёт интерфейс к объекту с именем object_name.
bool quant(float dt)
Обсчёт логики игры, параметр - время, которое должно пройти в игре (в секундах).
Definition: arkada_avtomat.h:81
bool finit()
Деинициализация игры.
Definition: arkada_avtomat.h:487
virtual bool is_mouse_event_active(qdMinigameMouseEvent event_id) const =0
Возвращает true, если в данный момент произошло событие event_id.
void void void void void debugC(int level, uint32 debugChannels, MSVC_PRINTF const char *s,...) GCC_PRINTF(3
T ABS(T x)
Definition: util.h:56
uint32 qd_rnd(uint32 m)
Возвращает случайное значение в интервале [0, m-1].
Definition: qd_rnd.h:30
virtual mgVect2i world2screen_coords(const mgVect3f &world_pos) const =0
Преобразование из мировых координат в экранные.