22 #ifndef QDENGINE_MINIGAMES_PUZZLE_ALL_H 23 #define QDENGINE_MINIGAMES_PUZZLE_ALL_H 25 #include "common/debug.h" 27 #include "qdengine/qd_fwd.h" 28 #include "qdengine/qdcore/qd_minigame_interface.h" 32 const int puzzle_ep01[] = {
33 220, 193, 340, 186, 464, 193, 577, 186, 227, 306,
34 340, 306, 465, 305, 585, 306, 220, 419, 340, 426,
38 const int puzzle_ep02[] = {
39 218, 197, 335, 194, 465, 178, 579, 181, 220, 305,
40 347, 304, 473, 300, 582, 298, 222, 410, 342, 416,
44 const int puzzle_ep04[] = {
45 205, 224, 298, 224, 404, 195, 503, 189, 601, 204,
46 218, 319, 306, 308, 416, 287, 504, 263, 587, 285,
47 218, 400, 313, 408, 418, 386, 504, 387, 588, 384
50 const int puzzle_ep05[] = {
51 205, 223, 297, 223, 404, 194, 503, 189, 601, 203,
52 217, 316, 305, 306, 415, 287, 503, 262, 586, 284,
53 217, 397, 312, 405, 417, 384, 503, 384, 587, 382
56 const int puzzle_ep07[] = {
57 199, 188, 276, 185, 362, 177, 444, 172, 531, 185,
58 601, 183, 202, 263, 282, 258, 362, 245, 440, 248,
59 524, 254, 598, 265, 200, 342, 282, 341, 357, 342,
60 439, 341, 519, 344, 595, 340, 203, 423, 276, 420,
61 359, 425, 441, 421, 525, 419, 602, 414
64 const int puzzle_ep08[] = {
65 217, 188, 337, 181, 462, 188, 575, 181, 224, 302,
66 338, 301, 462, 301, 582, 301, 217, 415, 337, 422,
70 const int puzzle_ep13[] = {
71 196, 194, 273, 194, 362, 169, 445, 164, 538, 188,
72 606, 188, 197, 266, 283, 255, 365, 231, 438, 235,
73 533, 246, 593, 271, 197, 345, 283, 341, 354, 344,
74 437, 341, 516, 348, 592, 340, 197, 425, 270, 424,
75 357, 430, 440, 427, 526, 416, 601, 412
81 for (uint i = 0; i <
ARRAYSIZE(_pieces); i++)
87 debugC(1, kDebugMinigames,
"PuzzleAll::init(), dll: %s lang: %d", _dll.c_str(), _language);
89 _engine = engine_interface;
90 _scene = _engine->current_scene_interface();
94 if (_dll ==
"DLL\\Puzzle_ep01.dll") {
96 _pieceCoords = puzzle_ep01;
97 }
else if (_dll ==
"DLL\\Puzzle_ep02.dll") {
99 _pieceCoords = puzzle_ep02;
100 }
else if (_dll ==
"DLL\\Puzzle_ep04.dll") {
102 _pieceCoords = puzzle_ep04;
103 }
else if (_dll ==
"DLL\\Puzzle_ep05.dll") {
105 _pieceCoords = puzzle_ep05;
106 }
else if (_dll ==
"DLL\\Puzzle_ep07.dll") {
108 _pieceCoords = puzzle_ep07;
109 }
else if (_dll ==
"DLL\\Puzzle_ep08.dll") {
111 _pieceCoords = puzzle_ep08;
112 }
else if (_dll ==
"DLL\\Puzzle_ep13.dll") {
114 _pieceCoords = puzzle_ep13;
117 for (
int i = 0; i < _numPieces; i++)
121 _objRan = _scene->
object_interface(
"$\xe7\xe0\xef\xf3\xf1\xf2\xe8\xeb\xe8");
127 _minDepthPiece = findMinDepthPiece();
133 _minDepthPiece = findMinDepthPiece();
141 debugC(3, kDebugMinigames,
"PuzzleAll::quant(%f)", dt);
145 _currentPieceState = -1;
159 for (
int i = 0; i < _numPieces; i++) {
160 if (_pieces[i]->is_state_active(
"to_inv_flag_0")
161 || _pieces[i]->is_state_active(
"to_inv_flag_90")
162 || _pieces[i]->is_state_active(
"to_inv_flag_180")
163 || _pieces[i]->is_state_active(
"to_inv_flag_270")) {
165 if (_pieces[i]->is_state_active(
"to_inv_flag_0"))
166 _currentPieceState = _pieces[i]->
state_index(
"inv_0");
167 else if (_pieces[i]->is_state_active(
"to_inv_flag_90"))
168 _currentPieceState = _pieces[i]->
state_index(
"inv_90");
169 else if (_pieces[i]->is_state_active(
"to_inv_flag_180"))
170 _currentPieceState = _pieces[i]->
state_index(
"inv_180");
171 else if (_pieces[i]->is_state_active(
"to_inv_flag_270"))
172 _currentPieceState = _pieces[i]->
state_index(
"inv_270");
182 if (_rotatingPiece != -1) {
183 _pieces[_rotatingPiece]->
set_state(_currentPieceState);
184 _currentPieceState = -1;
203 _minDepthPiece -= 250.0;
233 bool checkSolution() {
237 for (
int i = 0; i < _numPieces; i++)
238 if (!_pieces[0]->is_state_active(
"0"))
243 for (
int i = 0; i < _numPieces; i++) {
246 if (
ABS(_pieceCoords[i * 2 + 0] - piecePos.x) > 10 ||
247 ABS(_pieceCoords[i * 2 + 1] - piecePos.y) > 10)
254 _minDepthPiece -= 250.0;
257 _objFinal->
set_R(coords);
266 for (
int i = 0; i < _numPieces; i++) {
270 if (_pieces[i]->is_state_active(
"0")) {
271 if (
ABS(_pieceCoords[i * 2 + 0] - piecePos.x) <= 10 &&
272 ABS(_pieceCoords[i * 2 + 1] - piecePos.y) <= 10) {
273 piecePos.x = _pieceCoords[i * 2 + 0];
274 piecePos.y = _pieceCoords[i * 2 + 1];
277 _pieces[i]->
set_R(newPiecePos);
284 debugC(1, kDebugMinigames,
"PuzzleAll::finit()");
287 _engine->release_scene_interface(_scene);
306 enum { INTERFACE_VERSION = 112 };
307 int version()
const {
308 return INTERFACE_VERSION;
312 float findMinDepthPiece() {
313 float min = 100000.0;
315 for (
int i = 0; i < _numPieces; i++) {
330 const int *_pieceCoords =
nullptr;
335 bool _wasInited =
false;
336 bool _isFinal =
false;
338 float _minDepthPiece = 0.0;
339 int _rotatingPiece = -1;
340 bool _pieceIsPut =
true;
341 int _currentPieceState = 0;
351 #endif // QDENGINE_MINIGAMES_PUZZLE_ALL_H #define ARRAYSIZE(x)
Definition: util.h:91
int save_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, char *buffer, int buffer_size)
Сохранение данных, вызывается при сохранении сцены, на которую повешена миниигра. ...
Definition: puzzle_all.h:298
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
Возвращает координаты объекта в экранной системе координат.
virtual int state_index(const char *state_name) const =0
Возвращает номер состояния с именем state_name.
Нажатие левой кнопки.
Definition: qd_minigame_interface.h:372
Definition: qd_minigame_interface.h:78
bool init(const qdEngineInterface *engine_interface)
Инициализация игры.
Definition: puzzle_all.h:86
bool quant(float dt)
Обсчёт логики игры, параметр - время, которое должно пройти в игре (в секундах).
Definition: puzzle_all.h:140
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
virtual float screen_depth(const mgVect3f &pos) const =0
Возвращает "глубину" точки с координатами pos в мировой системе координат
Интерфейс к динамическому объекту.
Definition: qd_minigame_interface.h:230
Definition: puzzle_all.h:78
Интерфейс к сцене.
Definition: qd_minigame_interface.h:315
virtual bool set_state(const char *state_name)=0
Включает состояние с именем state_name.
virtual void set_R(const mgVect3f &r)=0
Устанавливает координаты объекта в мировой системе координат.
virtual qdMinigameObjectInterface * object_interface(const char *object_name)=0
Создаёт интерфейс к объекту с именем object_name.
bool new_game(const qdEngineInterface *engine_interface)
Инициализация миниигры, вызывается при старте и перезапуске игры.
Definition: puzzle_all.h:294
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
int load_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, const char *buffer, int buffer_size)
Загрузка данных, вызывается при загрузке сцены, на которую повешена миниигра.
Definition: puzzle_all.h:302
bool finit()
Деинициализация игры.
Definition: puzzle_all.h:283
Language
Definition: language.h:45
virtual qdMinigameObjectInterface * mouse_object_interface() const =0
Создаёт интерфейс к объекту, который взят мышью в данный момент.