22 #ifndef QDENGINE_MINIGAMES_3MICE2_SUDOKU_H 23 #define QDENGINE_MINIGAMES_3MICE2_SUDOKU_H 25 #include "common/debug.h" 27 #include "qdengine/qd_fwd.h" 28 #include "qdengine/qdcore/qd_minigame_interface.h" 38 debugC(1, kDebugMinigames,
"3mice2Sudoku::init()");
40 _engine = engine_interface;
41 _scene = engine_interface->current_scene_interface();
88 _objResult = _scene->
object_interface(
"$\xf0\xe5\xe7\xf3\xeb\xfc\xf2\xe0\xf2");
89 _objSettled = _scene->
object_interface(
"$\xf0\xe0\xe7\xeb\xee\xe6\xe5\xed\xee");
95 for (
int i = 0; i < 13; i++)
96 _pieceTargets[i] = -1;
103 for (
int i = 0; i < 13; i++) {
107 _pieceCoords[i] = _objTarget->
screen_R();
109 _pieceTargets[i] = -1;
112 for (
int j = 0; j < 13; j++) {
113 for (
int i = 0; i < 13; i++) {
114 if (_figures[i]->screen_R().x - _pieceCoords[j].x < 2 &&
115 _figures[i]->screen_R().y - _pieceCoords[j].y < 2)
116 _pieceTargets[i] = j;
126 debugC(3, kDebugMinigames,
"3mice2Sudoku::quant(%f)", dt);
129 for (
int i = 0; i < 13; i++) {
130 _pieceTargets[i] = -1;
137 if (checkSolution()) {
139 _objResult->
set_state(
"\xef\xf0\xe0\xe2\xe8\xeb\xfc\xed\xee");
142 _objResult->
set_state(
"\xed\xe5\x20\xef\xf0\xe0\xe2\xe8\xeb\xfc\xed\xee");
155 int num = getObjNum(mouseObj->
name());
160 if (strstr(hoverObj->
name(),
"zone@"))
161 num2 = getObjNum(hoverObj->
name());
163 if (num2 == -1 || posIsSet(num2 - 1))
164 _figures[num + 12]->set_state(
"inv");
166 _figures[num + 12]->
set_state(
"inv_active");
176 if (strstr(clickObj->
name(),
"figure")) {
177 num = getObjNum(clickObj->
name());
178 debugC(2, kDebugMinigames,
"clickObj: zone is: %d for name: '%s'", num, clickObj->
name());
186 resetFigure(num - 1);
192 strstr(mouseObj->
name(),
"figure") &&
193 strstr(mouseObj->
name(),
"inv") &&
194 strstr(clickObj->
name(),
"zone@")) {
196 int num = getObjNum(clickObj->
name());
197 int num2 =getObjNum(mouseObj->
name());
199 debugC(2, kDebugMinigames,
"clickObj: zone is: %d for name: '%s'", num, clickObj->
name());
200 debugC(2, kDebugMinigames,
"mouseObj: zone is: %d for name: '%s'", num2, mouseObj->
name());
202 if (num > 0 && num2 > 0 && !posIsSet(num - 1)) {
210 pos.y += _pos[num2 - 1];
214 _pieceTargets[num - 1] = num2 - 1;
219 int num = getObjNum(mouseObj->
name());
221 debugC(2, kDebugMinigames,
"mouseObj: zone is: %d for name: '%s'", num, mouseObj->
name());
231 debugC(1, kDebugMinigames,
"3mice2Sudoku::finit()");
234 _engine->release_scene_interface(_scene);
253 enum { INTERFACE_VERSION = 112 };
254 int version()
const {
255 return INTERFACE_VERSION;
259 bool checkSolution() {
260 for (
int i = 0; i < 13; i++)
261 if (_pieceTargets[i] != i)
267 bool checkInitPos() {
268 for (
int i = 0; i < 13; i++)
269 if (_pieceTargets[i] == -1)
275 void resetFigure(
int pos) {
276 for (
int i = 0; i < 13; i++)
277 if (_pieceTargets[i] == pos)
278 _pieceTargets[i] = -1;
281 bool posIsSet(
int pos) {
282 return _pieceTargets[pos] != -1;
285 int getObjNum(
const char *name) {
286 const char *from = strstr(name,
"@");
287 const char *to = strstr(name,
"#");
300 int _pos[13] = { 0 };
302 int _pieceTargets[13] = { 0 };
314 #endif // QDENGINE_MINIGAMES_3MICE2_SUDOKU_H bool finit()
Деинициализация игры.
Definition: 3mice2_sudoku.h:230
virtual mgVect3f screen2world_coords(const mgVect2i &screen_pos, float screen_depth=0) const =0
Преобразование из экранных координат в мировые.
bool init(const qdEngineInterface *engine_interface)
Инициализация игры.
Definition: 3mice2_sudoku.h:37
static String format(MSVC_PRINTF const char *fmt,...) GCC_PRINTF(1
virtual mgVect2i screen_R() const =0
Возвращает координаты объекта в экранной системе координат.
virtual bool update_screen_R()=0
Обновляет координаты объекта в экранной системе координат.
size_t strlcpy(char *dst, const char *src, size_t size)
virtual const char * name() const =0
Имя объекта.
Definition: 3mice2_sudoku.h:32
Нажатие левой кнопки.
Definition: qd_minigame_interface.h:372
Definition: qd_minigame_interface.h:78
Definition: qd_minigame_interface.h:365
virtual bool is_state_active(const char *state_name) const =0
Возвращает true, если состояние с именем state_name включено в данный момент.
Базовый класс для игровых ресурсов.
Definition: console.h:28
virtual qdMinigameObjectInterface * mouse_hover_object_interface() const =0
Создаёт интерфейс к объекту, над которым находится мышиный курсор.
Нажатие правой кнопки.
Definition: qd_minigame_interface.h:374
virtual qdMinigameObjectInterface * mouse_click_object_interface() const =0
Создаёт интерфейс к объекту, по которому кликнули мышью.
Интерфейс к динамическому объекту.
Definition: qd_minigame_interface.h:230
Интерфейс к сцене.
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.
int save_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, char *buffer, int buffer_size)
Сохранение данных, вызывается при сохранении сцены, на которую повешена миниигра. ...
Definition: 3mice2_sudoku.h:245
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
bool quant(float dt)
Обсчёт логики игры, параметр - время, которое должно пройти в игре (в секундах).
Definition: 3mice2_sudoku.h:125
int load_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, const char *buffer, int buffer_size)
Загрузка данных, вызывается при загрузке сцены, на которую повешена миниигра.
Definition: 3mice2_sudoku.h:249
bool new_game(const qdEngineInterface *engine_interface)
Инициализация миниигры, вызывается при старте и перезапуске игры.
Definition: 3mice2_sudoku.h:241
virtual qdMinigameObjectInterface * mouse_object_interface() const =0
Создаёт интерфейс к объекту, который взят мышью в данный момент.