22 #ifndef QDENGINE_MINIGAMES_ARKADA_AVTOMAT_H 23 #define QDENGINE_MINIGAMES_ARKADA_AVTOMAT_H 25 #include "common/debug.h" 27 #include "qdengine/qd_fwd.h" 28 #include "qdengine/qdcore/qd_minigame_interface.h" 38 debugC(1, kDebugMinigames,
"ArkadaAvtomat::init()");
40 _engine = engine_interface;
41 _scene = engine_interface->current_scene_interface();
45 _patronMouseObj = _scene->
object_interface(_scene->minigame_parameter(
"patron_mouse"));
46 _patronTomatoObj = _scene->
object_interface(_scene->minigame_parameter(
"patron_tomato"));
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"));
57 _walkFlagObj = _scene->
object_interface(_scene->minigame_parameter(
"walk_flag"));
58 _jumpFlagObj = _scene->
object_interface(_scene->minigame_parameter(
"jump_flag"));
69 _shotsTomatoCounter = 9;
70 _shotsBananaCounter = 10;
71 _shoteEggCounter = 10;
82 debugC(3, kDebugMinigames,
"ArkadaAvtomat::quant(%f)", dt);
95 if (!_shotsTomatoCounter && !_shotsBananaCounter && !_shoteEggCounter) {
96 _shotsTomatoCounter = 9;
97 _shotsBananaCounter = 10;
98 _shoteEggCounter = 10;
101 _patronMouseObj->
set_state(
"\xef\xee\xec\xe8\xe4\xee\xf0");
111 _menObj->
set_R(_menCoords);
125 if (_goingLeft || _doingJump || _menObj->
is_state_active(
"\xf1\xf2\xee\xe8\xf2")) {
138 int maxSteps = (500 - _menObj->
screen_R().x) / _manSpeed;
143 _stepsToRight =
qd_rnd(maxSteps);
144 _menObj->
set_state(
"\xe8\xe4\xe5\xf2 \xe2\xef\xf0\xe0\xe2\xee");
150 int maxSteps = (_menObj->
screen_R().x - 300) / _manSpeed;
154 _stepsToLeft =
qd_rnd(maxSteps);
155 _menObj->
set_state(
"\xe8\xe4\xe5\xf2 \xe2\xeb\xe5\xe2\xee");
161 _menCoords = _menObj->
R();
167 _jumpHeight = y - 60;
172 switch (_jumpPhase) {
175 _jumpingPhase3Y = _manOrigPosY;
185 _jumpingPhase3Y = _manOrigPosY;
188 if (randomCond == 1) {
189 _jumpingPhase3Y = 307;
198 _jumpingPhase3Y = _manOrigPosY;
201 if (randomCond != 1) {
202 if (randomCond == 2) {
203 _jumpingPhase3Y = 307;
209 _jumpingPhase3Y = 332;
214 _jumpPhaseIsGoingDown =
false;
218 _jumpingPhase3Y = 357;
234 if (_stepsToRight <= 0)
244 if (_stepsToLeft <= 0)
251 if (pos.y >= _manOrigPosY - 10) {
252 if (!_menObj->
is_state_active(
"\xef\xf0\xfb\xe3\xe0\xe5\xf2\x31") && !_jumpPhaseIsGoingDown)
253 _menObj->
set_state(
"\xef\xf0\xfb\xe3\xe0\xe5\xf2\x31");
256 if (pos.y <= _manOrigPosY - 10) {
257 if (_menObj->
is_state_active(
"\xef\xf0\xfb\xe3\xe0\xe5\xf2\x31") && !_jumpPhaseIsGoingDown)
258 _menObj->
set_state(
"\xef\xf0\xfb\xe3\xe0\xe5\xf2\x32");
261 if (pos.y >= _jumpingPhase3Y - 10) {
262 if (_menObj->
is_state_active(
"\xef\xf0\xfb\xe3\xe0\xe5\xf2\x32") && _jumpPhaseIsGoingDown)
263 _menObj->
set_state(
"\xef\xf0\xfb\xe3\xe0\xe5\xf2\x33");
266 if (pos.y <= _jumpHeight)
269 if (!_jumpPhaseIsGoingDown) {
273 if (pos.y < _jumpingPhase3Y) {
279 if (_jumpPhaseIsGoingDown) {
281 _jumpPhase = _jumpNextPhase;
285 if (pos.y > _jumpHeight) {
286 if (!_jumpPhaseIsGoingDown)
290 if (!_jumpPhaseIsGoingDown) {
291 _jumpPhaseIsGoingDown =
true;
295 if (pos.y > _jumpingPhase3Y)
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");
311 if (_shotsTomatoCounter > 0)
312 _shotsTomatoCounter++;
314 --_shotsBananaCounter;
318 _patronMouseObj->
set_state(
"\xff\xe9\xf6\xee");
320 if (_shotsTomatoCounter > 0)
321 _shotsTomatoCounter++;
324 if (_shotsBananaCounter <= 0) {
325 if (_shotsTomatoCounter > 0) {
326 _patronMouseObj->
set_state(
"\xef\xee\xec\xe8\xe4\xee\xf0");
328 if (_shoteEggCounter > 0)
331 --_shotsTomatoCounter;
334 _patronMouseObj->
set_state(
"\xe1\xe0\xed\xe0\xed");
336 if (_shoteEggCounter > 0)
339 --_shotsBananaCounter;
347 if (_shotsTomatoCounter > 0) {
348 _patronMouseObj->
set_state(
"\xef\xee\xec\xe8\xe4\xee\xf0");
350 if (_shotsBananaCounter > 0)
351 _shotsBananaCounter++;
353 --_shotsTomatoCounter;
356 if (_shoteEggCounter <= 0) {
361 _patronMouseObj->
set_state(
"\xff\xe9\xf6\xee");
363 if (_shotsBananaCounter > 0)
364 _shotsBananaCounter = _shotsBananaCounter + 1;
377 _patronTomatoObj->
set_R(_patronMouseObj->
R());
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;
383 _patronTomatoObj->
set_state(
"\xff\xe9\xf6\xee");
386 _patronTomatoObj->
set_state(
"\xe1\xe0\xed\xe0\xed");
387 --_shotsBananaCounter;
390 _bloodObj->
set_R(_patronMouseObj->
R());
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");
399 _patronMouseObj->
set_state(
"\xe1\xe0\xed\xe0\xed");
401 _patronMouseObj->
set_state(
"\xff\xe9\xf6\xee");
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");
409 _patronMouseObj->
set_state(
"\xef\xee\xec\xe8\xe4\xee\xf0");
411 _patronMouseObj->
set_state(
"\xe1\xe0\xed\xe0\xed");
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");
419 _patronMouseObj->
set_state(
"\xff\xe9\xf6\xee");
421 _patronMouseObj->
set_state(
"\xef\xee\xec\xe8\xe4\xee\xf0");
431 if (
ABS(pos.x - _cursorPos.x) <= 15 &&
ABS(pos.y - _cursorPos.y) <= 35) {
438 _manSpeed = 7 - _livesCounter;
445 if (!_livesCounter) {
458 void updateWalkState() {
459 if ((_goingLeft || _goingRight) && !_doingWalk) {
488 debugC(1, kDebugMinigames,
"ArkadaAvtomat::finit()");
491 _engine->release_scene_interface(_scene);
510 enum { INTERFACE_VERSION = 99 };
511 int version()
const {
512 return INTERFACE_VERSION;
542 bool _goingLeft =
false;
543 bool _goingRight =
false;
544 bool _doingJump =
false;
545 bool _doingWalk =
false;
546 bool _jumpFlag =
false;
548 int _stepsToLeft = 0;
549 int _stepsToRight = 0;
550 int _stepsToJump = -1;
555 int _shotsTomatoCounter = 9;
556 int _shotsBananaCounter = 10;
557 int _shoteEggCounter = 10;
558 int _livesCounter = 5;
560 bool _isFinal =
false;
564 int _manOrigPosY = 0;
566 int _jumpingPhase3Y = 0;
568 bool _jumpPhaseIsGoingDown =
false;
571 int _jumpNextPhase = -1;
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
Преобразование из мировых координат в экранные.