22 #ifndef QDENGINE_MINIGAMES_MASKY_ORDER_H 23 #define QDENGINE_MINIGAMES_MASKY_ORDER_H 25 #include "common/debug.h" 27 #include "qdengine/qd_fwd.h" 28 #include "qdengine/qdcore/qd_minigame_interface.h" 32 const int pieceCoordsFront[24] = {
33 280, 93, 284, 163, 394, 140, 505, 120, 511, 225,
34 392, 255, 296, 288, 444, 369, 309, 406, 446, 479,
38 const int pieceCoordsBack[24] = {
39 516, 94, 511, 162, 398, 139, 293, 120, 286, 227,
40 404, 247, 500, 287, 353, 363, 488, 407, 354, 476,
48 for (uint i = 0; i <
ARRAYSIZE(_pieces); i++)
54 debugC(1, kDebugMinigames,
"MaskyOrder::init()");
56 _engine = engine_interface;
57 _scene = _engine->current_scene_interface();
61 for (
int i = 0; i < 12; i++)
65 _doneObj = _scene->
object_interface(_scene->minigame_parameter(
"done_object"));
66 _object3Flag = _scene->
object_interface(_scene->minigame_parameter(
"object_3_flag"));
67 _loadGameObj = _scene->
object_interface(_scene->minigame_parameter(
"loadgame"));
72 _minDepthPiece = findMinDepthPiece();
78 debugC(3, kDebugMinigames,
"MaskyOrder::quant(%f)", dt);
82 _currentPieceState = -1;
95 _minDepthPiece = findMinDepthPiece();
98 _pieces[2]->
set_R(coords);
108 for (
int i = 0; i < 12; i++) {
109 if (_pieces[i]->is_state_active(
"to_inv_flag_back")
110 || _pieces[i]->is_state_active(
"to_inv_flag_front")) {
112 if (_pieces[i]->is_state_active(
"to_inv_flag_back"))
113 _currentPieceState = _pieces[i]->
state_index(
"inv_back");
114 else if (_pieces[i]->is_state_active(
"to_inv_flag_front"))
115 _currentPieceState = _pieces[i]->
state_index(
"inv_front");
125 if (_rotatingPiece != -1) {
126 _pieces[_rotatingPiece]->
set_state(_currentPieceState);
127 _currentPieceState = -1;
142 _minDepthPiece -= 60.0;
168 bool checkSolution() {
172 if (_pieces[0]->is_state_active(
"front")) {
173 for (
int i = 0; i < 12; i++)
174 if (!_pieces[0]->is_state_active(
"front"))
176 }
else if (_pieces[0]->is_state_active(
"back")) {
177 for (
int i = 0; i < 12; i++)
178 if (!_pieces[0]->is_state_active(
"back"))
186 if (_pieces[0]->is_state_active(
"front"))
187 for (
int i = 0; i < 12; i++) {
190 if (
ABS(pieceCoordsFront[i * 2 + 0] - piecePos.x) > 10 ||
191 ABS(pieceCoordsFront[i * 2 + 1] - piecePos.y) > 10)
195 if (_pieces[0]->is_state_active(
"back"))
196 for (
int i = 0; i < 12; i++) {
199 if (
ABS(pieceCoordsBack[i * 2 + 0] - piecePos.x) > 10 ||
200 ABS(pieceCoordsBack[i * 2 + 1] - piecePos.y) > 10)
216 for (
int i = 0; i < 12; i++) {
219 bool modified =
false;
221 if (_pieces[i]->is_state_active(
"front")) {
222 if (
ABS(pieceCoordsFront[i * 2 + 0] - piecePos.x) <= 10 &&
223 ABS(pieceCoordsFront[i * 2 + 1] - piecePos.y) <= 10) {
224 piecePos.x = pieceCoordsFront[i * 2 + 0];
225 piecePos.y = pieceCoordsFront[i * 2 + 1];
231 if (_pieces[i]->is_state_active(
"back")) {
232 if (
ABS(pieceCoordsBack[i * 2 + 0] - piecePos.x) <= 10 &&
233 ABS(pieceCoordsBack[i * 2 + 1] - piecePos.y) <= 10) {
234 piecePos.x = pieceCoordsBack[i * 2 + 0];
235 piecePos.y = pieceCoordsBack[i * 2 + 1];
243 _pieces[i]->
set_R(newPiecePos);
249 debugC(1, kDebugMinigames,
"MaskyOrder::finit()");
252 _engine->release_scene_interface(_scene);
271 enum { INTERFACE_VERSION = 112 };
272 int version()
const {
273 return INTERFACE_VERSION;
277 float findMinDepthPiece() {
278 float min = 100000.0;
280 for (
int i = 0; i < 12; i++) {
290 void setPiecePositions() {
291 mgVect3f coords(1000.0, 1000.0, 0.0);
293 for (
int i = 0; i < 12; i++) {
294 _pieces[i]->
set_R(coords);
297 if (_pieces[0]->is_state_active(
"back"))
314 bool _wasInited =
false;
315 bool _isFinal =
false;
316 bool _flipped =
false;
318 float _minDepthPiece = 0.0;
319 int _rotatingPiece = -1;
320 bool _pieceIsPut =
true;
321 int _currentPieceState = 0;
326 #endif // QDENGINE_MINIGAMES_MASKY_ORDER_H #define ARRAYSIZE(x)
Definition: util.h:91
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
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
bool new_game(const qdEngineInterface *engine_interface)
Инициализация миниигры, вызывается при старте и перезапуске игры.
Definition: masky_order.h:259
Нажатие правой кнопки.
Definition: qd_minigame_interface.h:374
bool init(const qdEngineInterface *engine_interface)
Инициализация игры.
Definition: masky_order.h:53
virtual float screen_depth(const mgVect3f &pos) const =0
Возвращает "глубину" точки с координатами pos в мировой системе координат
Интерфейс к динамическому объекту.
Definition: qd_minigame_interface.h:230
Интерфейс к сцене.
Definition: qd_minigame_interface.h:315
virtual bool set_state(const char *state_name)=0
Включает состояние с именем state_name.
Definition: masky_order.h:45
virtual void set_R(const mgVect3f &r)=0
Устанавливает координаты объекта в мировой системе координат.
bool finit()
Деинициализация игры.
Definition: masky_order.h:248
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
int load_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, const char *buffer, int buffer_size)
Загрузка данных, вызывается при загрузке сцены, на которую повешена миниигра.
Definition: masky_order.h:267
bool quant(float dt)
Обсчёт логики игры, параметр - время, которое должно пройти в игре (в секундах).
Definition: masky_order.h:77
int save_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, char *buffer, int buffer_size)
Сохранение данных, вызывается при сохранении сцены, на которую повешена миниигра. ...
Definition: masky_order.h:263
virtual qdMinigameObjectInterface * mouse_object_interface() const =0
Создаёт интерфейс к объекту, который взят мышью в данный момент.