22 #ifndef QDENGINE_MINIGAMES_SHVEIK_PORTRET_H 23 #define QDENGINE_MINIGAMES_SHVEIK_PORTRET_H 25 #include "common/debug.h" 27 #include "qdengine/qd_fwd.h" 28 #include "qdengine/qdcore/qd_minigame_interface.h" 38 debugC(1, kDebugMinigames,
"ShveikPortret::init()");
40 _engine = engine_interface;
41 _scene = engine_interface->current_scene_interface();
72 _objArray[10].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x31\x30");
75 _objArray[11].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x31\x31");
78 _objArray[12].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x31\x32");
81 _objArray[13].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x31\x33");
84 _objArray[14].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x31\x34");
87 _objArray[15].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x31\x35");
90 _objArray[16].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x31\x36");
93 _objArray[17].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x31\x37");
96 _objArray[18].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x31\x38");
99 _objArray[19].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x31\x39");
100 _objArray[19].x = -1;
101 _objArray[19].y = -1;
102 _objArray[20].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x32\x30");
103 _objArray[20].x = -1;
104 _objArray[20].y = -1;
105 _objArray[21].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x32\x31");
106 _objArray[21].x = -1;
107 _objArray[21].y = -1;
108 _objArray[22].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x32\x32");
109 _objArray[22].x = -1;
110 _objArray[22].y = -1;
111 _objArray[23].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x32\x33");
112 _objArray[23].x = -1;
113 _objArray[23].y = -1;
114 _objArray[24].obj = _scene->
object_interface(
"\xee\xe1\xfa\xe5\xea\xf2\x32\x34");
115 _objArray[24].x = -1;
116 _objArray[24].y = -1;
118 _clickObj = _scene->
object_interface(
"\x24\xea\xeb\xe8\xea\xe8\x20\xee\xe1\xfa\xe5\xea\xf2\xee\xec");
119 _maskOutsideObj = _scene->
object_interface(
"\x5f\xcc\xc0\xd1\xca\xc0\x20\xec\xe5\xf1\xf2\xee\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec");
120 _objectClickObj = _scene->
object_interface(
"\x24\xea\xeb\xe8\xea\xe8\x20\xef\xee\x20\xee\xe1\xfa\xe5\xea\xf2\xf3");
122 _wasStartedObj = _scene->
object_interface(
"\x24\xe7\xe0\xef\xf3\xf1\xea\x5f\xe1\xfb\xeb");
124 _exitClickObj = _scene->
object_interface(
"\x24\xea\xeb\xe8\xea\x20\xef\xee\x20\xe2\xfb\xf5\xee\xe4\xf3");
125 _completePicObj = _scene->
object_interface(
"\xe3\xee\xf2\xee\xe2\xe0\xff\x20\xea\xe0\xf0\xf2\xe8\xed\xea\xe0");
127 _currentPieceRow = -1;
128 _currentPieceCol = -1;
133 for (
int i = 1; i <= 24; i++) {
136 _objArray[i].obj->set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec 0");
139 _objArray[i].obj->set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec 90");
142 _objArray[i].obj->set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec 180");
145 _objArray[i].obj->set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec 270");
154 for (
int i = 0; i < 7; i++)
155 for (
int j = 0; j < 6; j++) {
156 _fieldState[i][j].angle = -1;
157 _fieldState[i][j].pieceNum = -1;
161 for (
int i = 0; i < 7; i++)
162 for (
int j = 0; j < 6; j++) {
163 _fieldState[i][j].angle = -1;
164 _fieldState[i][j].pieceNum = -1;
171 _exitClickObj->
set_state(
"\xed\xe5\xf2");
172 _draggedInvObjectState = 0;
173 _draggedObjectState = 0;
180 _oneAbsentObj->
set_state(
"\xf4\xeb\xe0\xe3\x20\xee\xf2\xf0\xe0\xe1\xee\xf2\xe0\xed");
187 debugC(3, kDebugMinigames,
"ShveikPortret::quant(%f)", dt);
190 for (
int j = 0; j < 7; j++) {
191 for (
int i = 0; i < 6; i++) {
192 debugN(
"%02d ", _fieldState[j][i].pieceNum);
197 for (
int i = 0; i < 6; i++) {
198 debugN(
"%3d ", _fieldState[j][i].angle);
208 if (checkSolution()) {
210 _completePicObj->
set_state(
"\xeb\xe8\xf6\xe5\xe2\xe0\xff\x20\xf1\xf2\xee\xf0\xee\xed\xe0");
212 for (
int i = 1; i <= 24; i++)
213 _objArray[i].obj->set_R(
mgVect3f(-1000.0, -1000.0, -100.0));
222 _exitClickObj->
set_state(
"\xe2\xfb\xf5\xee\xe4\x20\xf0\xe0\xe7\xf0\xe5\xf8\xe5\xed");
227 if (_draggedObjectState) {
228 _objArray[_draggedObjectState].obj->set_state(_draggedInvObjectState);
229 _draggedInvObjectState = 0;
230 _draggedObjectState = 0;
238 obj = _objArray[state - 24].obj;
241 obj->
set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec 0");
242 }
else if (obj->
is_state_active(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 90")) {
243 obj->
set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec 90");
244 }
else if (obj->
is_state_active(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 180")) {
245 obj->
set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec 180");
246 }
else if (obj->
is_state_active(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 270")) {
247 obj->
set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec 270");
267 _objArray[state - 24].depth = 25.0f;
272 _maskOutsideObj->
set_state(
"\x21\xec\xe0\xf1\xea\xe0");
273 }
else if (state > 0) {
274 _currentPieceRow = getPieceNumber(curPos.x, 204, 4, 99);
275 _currentPieceCol = getPieceNumber(curPos.y, 4, 6, 99);
277 obj = _objArray[state].obj;
279 if (_fieldState[_currentPieceRow][_currentPieceCol].pieceNum == -1) {
281 obj->
set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 0");
282 _fieldState[_currentPieceRow][_currentPieceCol].angle = 0;
283 }
else if (obj->
is_state_active(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 90")) {
284 obj->
set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 90");
285 _fieldState[_currentPieceRow][_currentPieceCol].angle = 90;
286 }
else if (obj->
is_state_active(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 180")) {
287 obj->
set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 180");
288 _fieldState[_currentPieceRow][_currentPieceCol].angle = 180;
289 }
else if (obj->
is_state_active(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 270")) {
290 obj->
set_state(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 270");
291 _fieldState[_currentPieceRow][_currentPieceCol].angle = 270;
296 pos.x = 99 * _currentPieceRow + 154;
297 pos.y = 99 * _currentPieceCol - 46;
301 _objArray[state].x = _currentPieceRow;
302 _objArray[state].y = _currentPieceCol;
303 _fieldState[_currentPieceRow][_currentPieceCol].pieceNum = state;
307 _maskOutsideObj->
set_state(
"\x21\xec\xe0\xf1\xea\xe0");
313 obj = _objArray[state].obj;
315 if (obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 0")
316 || obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 90")
317 || obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 180")
318 || obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 270")) {
319 _fieldState[_objArray[state].x][_objArray[state].y].pieceNum = -1;
320 _fieldState[_objArray[state].x][_objArray[state].y].angle = -1;
322 _objArray[state].x = -1;
323 _objArray[state].y = -1;
326 if (obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 0")
327 || obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec\x20\x30")) {
328 _draggedInvObjectState = obj->
state_index(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 0");
330 if (obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 90")
331 || obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec\x20\x39\x30")) {
332 _draggedInvObjectState = obj->
state_index(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 90");
334 if (obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 180")
335 || obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec\x20\x31\x38\x30")) {
336 _draggedInvObjectState = obj->
state_index(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 180");
338 if (obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5 270")
339 || obj->
is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xe7\xe0\x20\xef\xee\xeb\xe5\xec\x20\x32\x37\x30")) {
340 _draggedInvObjectState = obj->
state_index(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 270");
343 _draggedObjectState = state;
347 _objectClickObj->
set_state(
"\xed\xe5\xf2");
348 _maskOutsideObj->
set_state(
"\xd4\xee\xed\x20\x2d\x20\xec\xe0\xf1\xea\xe0");
356 if (obj->
has_state(
"\xf3\xe4\xe0\xeb\xe8\xf2\xfc")) {
358 obj->
set_state(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 90");
362 obj->
set_state(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 180");
366 obj->
set_state(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 270");
370 obj->
set_state(
"inv \xed\xe0\x20\xec\xfb\xf8\xe8 0");
381 debugC(1, kDebugMinigames,
"ShveikPortret::finit()");
384 _engine->release_scene_interface(_scene);
403 enum { INTERFACE_VERSION = 112 };
404 int version()
const {
405 return INTERFACE_VERSION;
409 void processState() {
410 for (
int i = 1; i <= 24; i++) {
411 if (_objArray[i].obj->is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5\x20\x30")
412 || _objArray[i].obj->is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5\x20\x39\x30")
413 || _objArray[i].obj->is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5\x20\x31\x38\x30")
414 || _objArray[i].obj->is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5\x20\x32\x37\x30")) {
415 mgVect2i pos = _objArray[i].obj->screen_R();
417 _objArray[i].x = (pos.x - 204) / 99 + 1;
418 _objArray[i].y = (pos.y - 4) / 99 + 1;
419 _fieldState[_objArray[i].x][_objArray[i].y].pieceNum = i;
421 if (_objArray[i].obj->is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5\x20\x30")) {
422 _fieldState[_objArray[i].x][_objArray[i].y].angle = 0;
423 }
else if (_objArray[i].obj->is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5\x20\x39\x30")) {
424 _fieldState[_objArray[i].x][_objArray[i].y].angle = 90;
425 }
else if (_objArray[i].obj->is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5\x20\x31\x38\x30")) {
426 _fieldState[_objArray[i].x][_objArray[i].y].angle = 180;
427 }
else if (_objArray[i].obj->is_state_active(
"\xeb\xe5\xe6\xe8\xf2\x20\xed\xe0\x20\xef\xee\xeb\xe5\x20\x32\x37\x30")) {
428 _fieldState[_objArray[i].x][_objArray[i].y].angle = 270;
437 void setPiecesDepth() {
438 for (
int i = 1; i <= 24; i++) {
439 _objArray[i].depth = i;
444 void setPiecesPos() {
447 for (
int j = 1; j <= 24; j++) {
449 for (i = 1; i <= 24; ++i) {
450 if (j == _objArray[i].depth)
461 for (
int i = 1; i <= 24; i++) {
462 if (target < _objArray[i].depth)
463 _objArray[i].depth -= 1.0;
466 for (
int i = 1; i <= 24; i++) {
467 _objArray[i].obj->set_R(_scene->
screen2world_coords(_objArray[i].obj->screen_R(), 100.0 - _objArray[i].depth * 100.0));
472 bool checkSolution() {
476 for (
int j = 1; j < 6; j++)
477 for (
int i = 0; i < 6; i++) {
478 if ((j == 1 && i == 0) || (j == 5 && i > 0))
481 if (_fieldState[j][i].pieceNum != n || _fieldState[j][i].angle != 0)
490 int getPieceNumber(
int left,
int right,
int dimSize,
int step) {
495 int curPos = step + 204;
497 for (
int i = 1; i <= dimSize; i++) {
498 if (right <= left && curPos > left)
517 struct ObjectStruct {
524 ObjectStruct _objArray[25];
526 int _draggedObjectState = 0;
527 int _draggedInvObjectState = 0;
538 int _currentPieceRow = 0;
539 int _currentPieceCol = 0;
541 PieceState _fieldState[7][6];
546 #endif // QDENGINE_MINIGAMES_SHVEIK_PORTRET_H virtual mgVect3f screen2world_coords(const mgVect2i &screen_pos, float screen_depth=0) const =0
Преобразование из экранных координат в мировые.
void void void debugN(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
bool quant(float dt)
Обсчёт логики игры, параметр - время, которое должно пройти в игре (в секундах).
Definition: shveik_portret.h:186
int load_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, const char *buffer, int buffer_size)
Загрузка данных, вызывается при загрузке сцены, на которую повешена миниигра.
Definition: shveik_portret.h:399
virtual bool update_screen_R()=0
Обновляет координаты объекта в экранной системе координат.
virtual int state_index(const char *state_name) const =0
Возвращает номер состояния с именем state_name.
virtual bool is_key_pressed(int vkey) const =0
Возвращает true, если на клавиатуре нажата кнопка vkey.
Definition: qd_minigame_interface.h:78
int save_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, char *buffer, int buffer_size)
Сохранение данных, вызывается при сохранении сцены, на которую повешена миниигра. ...
Definition: shveik_portret.h:395
virtual mgVect2i mouse_cursor_position() const =0
Возвращает текущие координаты мышиного курсора.
void debug(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
Definition: qd_minigame_interface.h:365
bool init(const qdEngineInterface *engine_interface)
Инициализация игры.
Definition: shveik_portret.h:37
virtual bool is_state_active(const char *state_name) const =0
Возвращает true, если состояние с именем state_name включено в данный момент.
Базовый класс для игровых ресурсов.
Definition: console.h:28
bool finit()
Деинициализация игры.
Definition: shveik_portret.h:380
Нажатие правой кнопки.
Definition: qd_minigame_interface.h:374
Двойное нажатие правой кнопки.
Definition: qd_minigame_interface.h:378
bool new_game(const qdEngineInterface *engine_interface)
Инициализация миниигры, вызывается при старте и перезапуске игры.
Definition: shveik_portret.h:391
virtual bool has_state(const char *state_name) const =0
Возвращает true, если у объекта есть состояние с именем state_name.
Интерфейс к динамическому объекту.
Definition: qd_minigame_interface.h:230
Интерфейс к сцене.
Definition: qd_minigame_interface.h:315
virtual bool set_state(const char *state_name)=0
Включает состояние с именем state_name.
Definition: shveik_portret.h:32
virtual void set_R(const mgVect3f &r)=0
Устанавливает координаты объекта в мировой системе координат.
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
uint32 qd_rnd(uint32 m)
Возвращает случайное значение в интервале [0, m-1].
Definition: qd_rnd.h:30
virtual bool activate_personage(const char *personage_name)=0
Активация персонажа с именем personage_name.
virtual int current_state_index() const =0
Возвращает номер включенного в данный момент состояния.
virtual qdMinigameObjectInterface * mouse_object_interface() const =0
Создаёт интерфейс к объекту, который взят мышью в данный момент.