22 #ifndef QDENGINE_MINIGAMES_SHVEIK_SHKATULKA_H 23 #define QDENGINE_MINIGAMES_SHVEIK_SHKATULKA_H 25 #include "common/debug.h" 27 #include "qdengine/qd_fwd.h" 28 #include "qdengine/qdcore/qd_minigame_interface.h" 38 debugC(1, kDebugMinigames,
"ShveikShkatulka::init()");
40 _engine = engine_interface;
41 _scene = engine_interface->current_scene_interface();
63 _jumpSoundObj = _scene->
object_interface(
"\xe7\xe2\xf3\xea\x20\xef\xe5\xf0\xe5\xf1\xea\xee\xea\xe0");
65 _direction = kDirNone;
87 debugC(3, kDebugMinigames,
"ShveikShkatulka::quant(%f)", dt);
89 if (checkSolution()) {
93 _direction = kDirNone;
105 if (state[0] ==
'1' || state[0] ==
'2') {
109 _cursorTakenFlag = 1;
111 }
else if (state[0] ==
'0') {
118 _cursorTakenFlag = 0;
121 _direction = kDirNone;
126 if (_cursorTakenFlag) {
128 _mouseDelta.x = curPos.x - _mousePos.x;
129 _mouseDelta.y = curPos.y - _mousePos.y;
131 if (
ABS(_mouseDelta.x) <=
ABS(_mouseDelta.y)) {
135 if (state[2] ==
'\0')
136 draggedStonePos = state[1] -
'0';
137 else if (state[2] ==
'0')
138 draggedStonePos = 10;
140 draggedStonePos = 11;
143 if (draggedStonePos == 3 || draggedStonePos == 8) {
146 if (curPos.y <= _mousePos.y) {
147 if (draggedStonePos == 3)
152 if (draggedStonePos == 8)
160 if (
ABS(_mouseDelta.y) > off) {
161 if (curPos.y <= _mousePos.y)
164 _direction = kDirDown;
168 }
else if (
ABS(_mouseDelta.x) > 60) {
169 if (curPos.x <= _mousePos.x)
170 _direction = kDirLeft;
172 _direction = kDirRight;
178 if (_cursorTakenFlag && _needSnap) {
182 if (state[2] ==
'\0')
183 draggedStonePos = state[1] -
'0';
184 else if (state[2] ==
'0')
185 draggedStonePos = 10;
187 draggedStonePos = 11;
189 int side = state[0] -
'0';
193 switch (_direction) {
195 if (draggedStonePos != 8 || checkStonePosition(3, 1) || checkStonePosition(8, 2))
201 if (draggedStonePos == 4
202 || draggedStonePos == 11
203 || checkStonePosition(draggedStonePos + 1, 1)
204 || checkStonePosition(draggedStonePos, 2))
207 pos = draggedStonePos + 1;
210 if (draggedStonePos != 3 || checkStonePosition(8, 1) || checkStonePosition(8, 2))
216 if (draggedStonePos == 1
217 || draggedStonePos == 5
218 || checkStonePosition(draggedStonePos - 1, 1)
219 || checkStonePosition(draggedStonePos - 1, 2))
222 pos = draggedStonePos - 1;
229 switch (_direction) {
231 if (draggedStonePos != 8 || checkStonePosition(3, 1) || checkStonePosition(3, 2))
238 if (draggedStonePos == 4
239 || draggedStonePos == 11
240 || checkStonePosition(draggedStonePos + 1, 1)
241 || checkStonePosition(draggedStonePos + 1, 2))
244 pos = draggedStonePos + 1;
248 if (draggedStonePos != 3 || checkStonePosition(8, 2) || checkStonePosition(3, 1))
255 if (draggedStonePos == 1
256 || draggedStonePos == 5
257 || checkStonePosition(draggedStonePos, 1)
258 || checkStonePosition(draggedStonePos - 1, 2))
261 pos = draggedStonePos - 1;
270 _cursorTakenFlag = 0;
278 _direction = kDirNone;
283 if (_cursorTakenFlag)
292 debugC(1, kDebugMinigames,
"ShveikShkatulka::finit()");
295 _engine->release_scene_interface(_scene);
314 enum { INTERFACE_VERSION = 112 };
315 int version()
const {
316 return INTERFACE_VERSION;
337 bool checkSolution() {
355 bool checkStonePosition(
int targetPos,
int leftStones) {
356 int n = leftStones == 1 ? 0 : 7;
358 for (
int i = 0; i < 7; i++) {
362 if (state[2] ==
'\0')
363 pos = state[1] -
'0';
364 else if (state[2] ==
'0')
369 if (pos == targetPos)
380 int _direction = kDirNone;
381 bool _cursorTakenFlag =
false;
386 bool _needSnap =
false;
398 #endif // QDENGINE_MINIGAMES_SHVEIK_SHKATULKA_H bool init(const qdEngineInterface *engine_interface)
Инициализация игры.
Definition: shveik_shkatulka.h:37
static String format(MSVC_PRINTF const char *fmt,...) GCC_PRINTF(1
Отжатие левой кнопки.
Definition: qd_minigame_interface.h:380
Нажатие левой кнопки.
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
int load_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, const char *buffer, int buffer_size)
Загрузка данных, вызывается при загрузке сцены, на которую повешена миниигра.
Definition: shveik_shkatulka.h:310
virtual qdMinigameObjectInterface * mouse_click_object_interface() const =0
Создаёт интерфейс к объекту, по которому кликнули мышью.
int save_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, char *buffer, int buffer_size)
Сохранение данных, вызывается при сохранении сцены, на которую повешена миниигра. ...
Definition: shveik_shkatulka.h:306
bool new_game(const qdEngineInterface *engine_interface)
Инициализация миниигры, вызывается при старте и перезапуске игры.
Definition: shveik_shkatulka.h:302
Интерфейс к динамическому объекту.
Definition: qd_minigame_interface.h:230
virtual const char * current_state_name() const =0
Интерфейс к сцене.
Definition: qd_minigame_interface.h:315
virtual bool set_state(const char *state_name)=0
Включает состояние с именем state_name.
bool quant(float dt)
Обсчёт логики игры, параметр - время, которое должно пройти в игре (в секундах).
Definition: shveik_shkatulka.h:86
Definition: shveik_shkatulka.h:32
virtual qdMinigameObjectInterface * object_interface(const char *object_name)=0
Создаёт интерфейс к объекту с именем object_name.
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
bool finit()
Деинициализация игры.
Definition: shveik_shkatulka.h:291