[Scummvm-git-logs] scummvm master -> 8a5adecce19e04e7466aee0a4fd3dc60c279d917

sev- noreply at scummvm.org
Tue Aug 27 10:15:44 UTC 2024


This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
cc5cbe47bc QDENGINE: Initial code for kartiny.dll used in maski
a9dcaa48bd QDENGINE: Documented minigame_interface_version
8f9637b368 QDENGINE: More work on kartiny.dll
b4aa12bbaf QDENGINE: Implemented qdKartinyMiniGameInterface::quant()
8a5adecce1 QDENGINE: Implemented rest of kartiny.dll


Commit: cc5cbe47bcef8d22557b6f3f45b751007a3b762c
    https://github.com/scummvm/scummvm/commit/cc5cbe47bcef8d22557b6f3f45b751007a3b762c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-27T12:15:28+02:00

Commit Message:
QDENGINE: Initial code for kartiny.dll used in maski

Changed paths:
  A engines/qdengine/minigames/kartiny.h
    engines/qdengine/qdcore/qd_minigame.cpp


diff --git a/engines/qdengine/minigames/kartiny.h b/engines/qdengine/minigames/kartiny.h
new file mode 100644
index 00000000000..7d6436d9a91
--- /dev/null
+++ b/engines/qdengine/minigames/kartiny.h
@@ -0,0 +1,121 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef QDENGINE_MINIGAMES_KARTINY_H
+#define QDENGINE_MINIGAMES_KARTINY_H
+
+#include "common/debug.h"
+
+#include "qdengine/qd_fwd.h"
+#include "qdengine/qdcore/qd_minigame_interface.h"
+
+namespace QDEngine {
+
+class qdKartinyMiniGameInterface : public qdMiniGameInterface {
+public:
+	qdKartinyMiniGameInterface() {}
+	~qdKartinyMiniGameInterface() {}
+
+	//! Инициализация игры.
+	bool init(const qdEngineInterface *engine_interface) {
+		debugC(1, kDebugMinigames, "Kartiny::init()");
+
+		_engine = engine_interface;
+		_scene = engine_interface->current_scene_interface();
+		if (!_scene)
+			return 0;
+
+		_bg_clickObj = _scene->object_interface(_scene->minigame_parameter("zad_click_flag_name"));
+		_bg1_l2Obj   = _scene->object_interface(_scene->minigame_parameter("zad1_l2_object_name"));
+		_bg2_l2Obj   = _scene->object_interface(_scene->minigame_parameter("zad2_l2_object_name"));
+		_bg3_l2Obj   = _scene->object_interface(_scene->minigame_parameter("zad3_l2_object_name"));
+		_bg4_l2Obj   = _scene->object_interface(_scene->minigame_parameter("zad4_l2_object_name"));
+		_doneObj     = _scene->object_interface(_scene->minigame_parameter("done"));
+		_startObj    = _scene->object_interface(_scene->minigame_parameter("start"));
+		_activateObj = _scene->object_interface(_scene->minigame_parameter("activate"));
+		_zFlagObj    = _scene->object_interface(_scene->minigame_parameter("z_flag"));
+		_startObj2   = _scene->object_interface(_scene->minigame_parameter("start"));
+
+		_wasInited = 0;
+		_artDepth = -1.0;
+		return true;
+	}
+
+	//! Обсчёт логики игры, параметр - время, которое должно пройти в игре (в секундах).
+	bool quant(float dt) {
+		debugC(3, kDebugMinigames, "Kartiny::quant(%f)", dt);
+
+		return true;
+	}
+
+	//! Деинициализация игры.
+	bool finit() {
+		debugC(1, kDebugMinigames, "Kartiny::finit()");
+
+		if (_scene)  {
+			_engine->release_scene_interface(_scene);
+			_scene = 0;
+		}
+
+ 		return true;
+	}
+
+	/// Инициализация миниигры, вызывается при старте и перезапуске игры.
+	bool new_game(const qdEngineInterface *engine_interface) {
+		return true;
+	}
+	/// Сохранение данных, вызывается при сохранении сцены, на которую повешена миниигра.
+	int save_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, char *buffer, int buffer_size) {
+		return 0;
+	}
+	/// Загрузка данных, вызывается при загрузке сцены, на которую повешена миниигра.
+	int load_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, const char *buffer, int buffer_size) {
+		return 0;
+	}
+
+	/// Версия интерфейса игры, трогать не надо.
+	enum { INTERFACE_VERSION = 112 };
+	int version() const {
+		return INTERFACE_VERSION;
+	}
+
+private:
+	const qdEngineInterface *_engine = nullptr;
+	qdMinigameSceneInterface *_scene = nullptr;
+
+	qdMinigameObjectInterface *_bg_clickObj = nullptr;
+	qdMinigameObjectInterface *_bg1_l2Obj = nullptr;
+	qdMinigameObjectInterface *_bg2_l2Obj = nullptr;
+	qdMinigameObjectInterface *_bg3_l2Obj = nullptr;
+	qdMinigameObjectInterface *_bg4_l2Obj = nullptr;
+	qdMinigameObjectInterface *_doneObj = nullptr;
+	qdMinigameObjectInterface *_startObj = nullptr;
+	qdMinigameObjectInterface *_activateObj = nullptr;
+	qdMinigameObjectInterface *_zFlagObj = nullptr;
+	qdMinigameObjectInterface *_startObj2 = nullptr;
+
+	bool _wasInited = false;
+	float _artDepth = -1.0;
+};
+
+} // namespace QDEngine
+
+#endif // QDENGINE_MINIGAMES_KARTINY_H
diff --git a/engines/qdengine/qdcore/qd_minigame.cpp b/engines/qdengine/qdcore/qd_minigame.cpp
index afaeef6d09e..b3473d650f4 100644
--- a/engines/qdengine/qdcore/qd_minigame.cpp
+++ b/engines/qdengine/qdcore/qd_minigame.cpp
@@ -32,6 +32,11 @@
 #include "qdengine/qdcore/qd_engine_interface.h"
 
 #include "qdengine/minigames/qd_empty_minigame_interface.h"
+
+// maski
+#include "qdengine/minigames/kartiny.h"
+
+// 2mice1
 #include "qdengine/minigames/book_all.h"
 #include "qdengine/minigames/puzzle_all.h"
 


Commit: a9dcaa48bdf4f7029d879e50a83e57eb748c6b3b
    https://github.com/scummvm/scummvm/commit/a9dcaa48bdf4f7029d879e50a83e57eb748c6b3b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-27T12:15:31+02:00

Commit Message:
QDENGINE: Documented minigame_interface_version

Changed paths:
    engines/qdengine/qd_runtime.cpp
    engines/qdengine/qdcore/qd_minigame_interface.h


diff --git a/engines/qdengine/qd_runtime.cpp b/engines/qdengine/qd_runtime.cpp
index 0ba801b200d..f53c8a02723 100644
--- a/engines/qdengine/qd_runtime.cpp
+++ b/engines/qdengine/qd_runtime.cpp
@@ -112,9 +112,9 @@ void searchTagMap(int id, int targetVal) {
 
 static int detectVersion(Common::String gameID) {
 	if (gameID == "karliknos") {
-		return 20030919;		// QDSCR_GAME_TITLE = 182, 06b1cf45d
+		return 20030919;		// QDSCR_GAME_TITLE = 182, 06b1cf45d (repo-vss)
 	} else if (gameID == "nupogodi3" && g_engine->getLanguage() == Common::RU_RUS) {
-		return 20031014;		// QDSCR_TEXT_DB = 184, d864cc279
+		return 20031014;		// QDSCR_TEXT_DB = 184, d864cc279 (repo-vss)
 	} else if (gameID == "nupogodi3" && g_engine->getLanguage() == Common::LT_LTU) {
 		return 20031206;		// QDSCR_TEXT_DB = 185
 	} else if (gameID == "pilots3") {
@@ -128,7 +128,7 @@ static int detectVersion(Common::String gameID) {
 	} else if (gameID == "mng") {
 		return 20050101;		// QDSCR_GLOBAL_DEPEND = 214
 	} else if (gameID == "maski") {
-		return 20060129;		// QDSCR_GAME_TITLE = 214
+		return 20060129;		// QDSCR_GAME_TITLE = 214, 54bcf92 (repo-git)
 	} else if (gameID == "3mice1") {
 		return 20060715;		// QDSCR_SCREEN_TRANSFORM = 232
 	} else if (gameID == "shveik") {
diff --git a/engines/qdengine/qdcore/qd_minigame_interface.h b/engines/qdengine/qdcore/qd_minigame_interface.h
index 2b51b309821..ebaa157aef8 100644
--- a/engines/qdengine/qdcore/qd_minigame_interface.h
+++ b/engines/qdengine/qdcore/qd_minigame_interface.h
@@ -102,7 +102,20 @@ public:
 		return 0;
 	}
 
-	/// Версия интерфейса игры, трогать не надо.
+	// maski, 20060129, no version yet
+	// version 100, 20060414, qdMinigameCounterInterface added, version added, no other changes
+	// version 101, 20060607
+	// version 102, 20060629
+	// version 103, 20060715
+	// version 104, never released
+	// version 105, 20061026
+	// version 106, 20070214
+	// version 107, 20070404 09:13
+	// version 108, 20070404 10:12
+	// version 109, 20070416
+	// version 110, 20070419
+	// version 111, 20070420
+	// version 112, 20070507
 	enum { INTERFACE_VERSION = 112 };
 	virtual int version() const {
 		return INTERFACE_VERSION;


Commit: 8f9637b36823843044a5e7bd07a716a159e0b170
    https://github.com/scummvm/scummvm/commit/8f9637b36823843044a5e7bd07a716a159e0b170
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-27T12:15:31+02:00

Commit Message:
QDENGINE: More work on kartiny.dll

Changed paths:
    engines/qdengine/minigames/kartiny.h


diff --git a/engines/qdengine/minigames/kartiny.h b/engines/qdengine/minigames/kartiny.h
index 7d6436d9a91..fbe9b5ff2ed 100644
--- a/engines/qdengine/minigames/kartiny.h
+++ b/engines/qdengine/minigames/kartiny.h
@@ -92,11 +92,102 @@ public:
 	}
 
 	/// Версия интерфейса игры, трогать не надо.
-	enum { INTERFACE_VERSION = 112 };
+	enum { INTERFACE_VERSION = 99 };
 	int version() const {
 		return INTERFACE_VERSION;
 	}
 
+private:
+	void snapPieces() {
+		mgVect2i piecePos;
+		mgVect3f newPiecePos;
+		float depth;
+
+		piecePos = _bg1_l2Obj->screen_R();
+		depth = _scene->screen_depth(_bg1_l2Obj->R());
+
+		if (ABS(399 - ABS(piecePos.x)) <= 10 && ABS(278 - ABS(piecePos.y)) <= 10) {
+			piecePos.x = 399;
+			piecePos.y = 278;
+
+			newPiecePos = _scene->screen2world_coords(piecePos, depth);
+			_bg1_l2Obj->set_R(newPiecePos);
+		}
+
+		piecePos = _bg2_l2Obj->screen_R();
+		depth = _scene->screen_depth(_bg2_l2Obj->R());
+
+		if (piecePos.x >= 387 && piecePos.x <= 440 && ABS(267 - ABS(piecePos.y)) <= 20) {
+			piecePos.x = 408;
+			piecePos.y = 267;
+
+			newPiecePos = _scene->screen2world_coords(piecePos, depth);
+			_bg2_l2Obj->set_R(newPiecePos);
+		}
+
+		piecePos = _bg3_l2Obj->screen_R();
+		depth = _scene->screen_depth(_bg3_l2Obj->R());
+
+		if (ABS(ABS(piecePos.x) - 413) < 25 && ABS(ABS(piecePos.y) - 43) < 40) {
+			piecePos.x = 406;
+			piecePos.y = -43;
+
+			newPiecePos = _scene->screen2world_coords(piecePos, depth);
+			_bg3_l2Obj->set_R(newPiecePos);
+		}
+	}
+
+	void moveDown(qdMinigameObjectInterface *obj) {
+		int speed = MAX(10, _keyDownCounter / 10 + 1);
+		int maxCoords;
+
+		if (obj == _bg1_l2Obj)
+			maxCoords = 279;
+		else if (obj == _bg2_l2Obj)
+			maxCoords = 267;
+		else if (obj == _bg3_l2Obj)
+			maxCoords = 258;
+		else
+			maxCoords = 258;
+
+		mgVect2i objPos = obj->screen_R();
+
+		if (objPos.y + speed < maxCoords)
+			objPos.y += speed;
+
+		obj->set_R(_scene->screen2world_coords(objPos, _artDepth));
+	}
+
+	void moveUp(qdMinigameObjectInterface *obj) {
+		int speed = MAX(10, _keyDownCounter / 10 + 1);
+		mgVect2i objPos = obj->screen_R();
+
+		if (objPos.y > -100)
+			objPos.y -= speed;
+
+		obj->set_R(_scene->screen2world_coords(objPos, _artDepth));
+	}
+
+	void moveRight(qdMinigameObjectInterface *obj) {
+		int speed = MAX(10, _keyDownCounter / 10 + 1);
+		mgVect2i objPos = obj->screen_R();
+
+		if (objPos.x < 900)
+			objPos.x += speed;
+
+		obj->set_R(_scene->screen2world_coords(objPos, _artDepth));
+	}
+
+	void moveLeft(qdMinigameObjectInterface *obj) {
+		int speed = MAX(10, _keyDownCounter / 10 + 1);
+		mgVect2i objPos = obj->screen_R();
+
+		if (objPos.x > -100)
+			objPos.x -= speed;
+
+		obj->set_R(_scene->screen2world_coords(objPos, _artDepth));
+	}
+
 private:
 	const qdEngineInterface *_engine = nullptr;
 	qdMinigameSceneInterface *_scene = nullptr;
@@ -114,6 +205,7 @@ private:
 
 	bool _wasInited = false;
 	float _artDepth = -1.0;
+	int _keyDownCounter = 0;
 };
 
 } // namespace QDEngine


Commit: b4aa12bbaf9bea1a49e969f14ca5216d6ca5a7eb
    https://github.com/scummvm/scummvm/commit/b4aa12bbaf9bea1a49e969f14ca5216d6ca5a7eb
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-27T12:15:31+02:00

Commit Message:
QDENGINE: Implemented qdKartinyMiniGameInterface::quant()

Changed paths:
    engines/qdengine/minigames/kartiny.h


diff --git a/engines/qdengine/minigames/kartiny.h b/engines/qdengine/minigames/kartiny.h
index fbe9b5ff2ed..176e3439faa 100644
--- a/engines/qdengine/minigames/kartiny.h
+++ b/engines/qdengine/minigames/kartiny.h
@@ -34,7 +34,6 @@ public:
 	qdKartinyMiniGameInterface() {}
 	~qdKartinyMiniGameInterface() {}
 
-	//! Инициализация игры.
 	bool init(const qdEngineInterface *engine_interface) {
 		debugC(1, kDebugMinigames, "Kartiny::init()");
 
@@ -59,14 +58,251 @@ public:
 		return true;
 	}
 
-	//! Обсчёт логики игры, параметр - время, которое должно пройти в игре (в секундах).
 	bool quant(float dt) {
 		debugC(3, kDebugMinigames, "Kartiny::quant(%f)", dt);
 
+		mgVect3f newPiecePos;
+		mgVect2i piecePos;
+
+		float depth1 = _scene->screen_depth(_bg1_l2Obj->R());
+		float depth2 = _scene->screen_depth(_bg2_l2Obj->R());
+		float depth3 = _scene->screen_depth(_bg3_l2Obj->R());
+		float depth4 = _scene->screen_depth(_bg4_l2Obj->R());
+
+		if (depth4 >= depth3 || depth3 >= depth2 || depth2 >= depth1)
+			_zFlagObj->set_state("\xed\xe5\xf2");	// "нет"
+		else
+			_zFlagObj->set_state("\xe4\xe0");		// "да"
+
+		if (!_wasInited) {
+			if (_startObj->is_state_active("\xe7\xe0\xe4\xed\xeb\xea\xeb \xee\xef\xf3\xf9\xe5\xed\xfb"))	// "задники опущены"
+				_wasInited = 1;
+
+			if (!_wasInited) {
+				if (_startObj->is_state_active("\xed\xe5\xf2")) { // "нет"
+					piecePos.x = 400;
+					piecePos.y = -300;
+					_bg1_l2Obj->set_R(_scene->screen2world_coords(piecePos, 600.0));
+
+					piecePos.x = 200;
+					piecePos.y = -300;
+					_bg2_l2Obj->set_R(_scene->screen2world_coords(piecePos, 400.0));
+
+					piecePos.x = 400;
+					piecePos.y = -300;
+					_bg3_l2Obj->set_R(_scene->screen2world_coords(piecePos, 200.0));
+
+					piecePos.x = 600;
+					piecePos.y = -300;
+					_bg3_l2Obj->set_R(_scene->screen2world_coords(piecePos, 0.0));
+
+					_stage = 4;
+					_artDepth = -50.0;
+
+					_activateObj->set_state("\xe7\xe0\xe4\xed\xe8\xea\x34"); // "задник4"
+					_startObj->set_state("\xe4\xe0");	// "да"
+				} else {
+					if (_startObj->is_state_active("\xe4\xe0")) { // "да"
+						if (_bg1_l2Obj->screen_R().y < 100) {
+							piecePos.x = 400;
+							piecePos.y = _bg1_l2Obj->screen_R().y + 3;
+							_bg1_l2Obj->set_R(_scene->screen2world_coords(piecePos, 600.0));
+						}
+
+						if (_bg2_l2Obj->screen_R().y < 50) {
+							piecePos.x = 200;
+							piecePos.y = _bg2_l2Obj->screen_R().y + 2;
+							_bg2_l2Obj->set_R(_scene->screen2world_coords(piecePos, 400.0));
+						}
+
+						if (_bg3_l2Obj->screen_R().y < 85) {
+							piecePos.x = 400;
+							piecePos.y = _bg3_l2Obj->screen_R().y + 2;
+							_bg3_l2Obj->set_R(_scene->screen2world_coords(piecePos, 200.0));
+						}
+
+						if (_bg4_l2Obj->screen_R().y < 0) {
+							piecePos.x = 600;
+							piecePos.y = _bg4_l2Obj->screen_R().y + 2;
+							_bg4_l2Obj->set_R(_scene->screen2world_coords(piecePos, 0.0));
+						}
+
+						if (_bg1_l2Obj->screen_R().y >= 100
+								&& _bg2_l2Obj->screen_R().y >= 50
+								&& _bg3_l2Obj->screen_R().y >= 85
+								&& _bg4_l2Obj->screen_R().y >= 0) {
+							_wasInited = 1;
+							_startObj->set_state("\xe7\xe0\xe4\xed\xeb\xea\xeb \xee\xef\xf3\xf9\xe5\xed\xfb");	// "задники опущены"
+						}
+					}
+
+					if (_startObj->is_state_active("\xe7\xe0\xe4\xed\xeb\xea\xeb \xee\xef\xf3\xf9\xe5\xed\xfb")	// "задники опущены"
+							&& _artDepth == -1.0) {
+						_artState[0].depth = _scene->screen_depth(_bg1_l2Obj->R());
+						_artState[0].num = 1;
+						_artState[1].depth = _scene->screen_depth(_bg2_l2Obj->R());
+						_artState[1].num = 2;
+						_artState[2].depth = _scene->screen_depth(_bg3_l2Obj->R());
+						_artState[2].num = 3;
+						_artState[3].depth = _scene->screen_depth(_bg4_l2Obj->R());
+						_artState[3].num = 4;
+
+						// Sort
+						for (int i = 0; i < 3; i++) {
+							while (_artState[i + 1].depth < _artState[i].depth) {
+								int num = _artState[i].num;
+								float depth = _artState[i].depth;
+
+								_artState[i].depth = _artState[i + 1].depth;
+								_artState[i].num = _artState[i + 1].num;
+								_artState[i + 1].depth = depth;
+								_artState[i + 1].num = num;
+
+								i = 0;
+							}
+						}
+
+						_wasInited = 1;
+
+						_stage = _artState[0].num;
+						_artDepth = _artState[0].depth;
+					}
+				}
+			}
+		}
+
+		if (!checkSolution() && _wasInited) {
+			_doneObj->set_state("false");
+
+			if (_engine->is_key_pressed(Common::KEYCODE_LEFT)
+					|| _engine->is_key_pressed(Common::KEYCODE_RIGHT)
+					|| _engine->is_key_pressed(Common::KEYCODE_UP)
+					|| _engine->is_key_pressed(Common::KEYCODE_DOWN)) {
+				++_keyDownCounter;
+			} else {
+				_keyDownCounter = 0;
+			}
+
+			if (_engine->is_key_pressed(Common::KEYCODE_LEFT)) {
+				switch (_stage) {
+				case 1:
+					moveLeft(_bg1_l2Obj);
+					break;
+				case 2:
+					moveLeft(_bg2_l2Obj);
+					break;
+				case 3:
+					moveLeft(_bg3_l2Obj);
+					break;
+				case 4:
+					moveLeft(_bg4_l2Obj);
+					break;
+				default:
+					break;
+				}
+			}
+
+			if (_engine->is_key_pressed(Common::KEYCODE_RIGHT)) {
+				switch (_stage) {
+				case 1:
+					moveRight(_bg1_l2Obj);
+					break;
+				case 2:
+					moveRight(_bg2_l2Obj);
+					break;
+				case 3:
+					moveRight(_bg3_l2Obj);
+					break;
+				case 4:
+					moveRight(_bg4_l2Obj);
+					break;
+				default:
+					break;
+				}
+			}
+
+			if (_engine->is_key_pressed(Common::KEYCODE_UP)) {
+				switch (_stage) {
+				case 1:
+					moveUp(_bg1_l2Obj);
+					break;
+				case 2:
+					moveUp(_bg2_l2Obj);
+					break;
+				case 3:
+					moveUp(_bg3_l2Obj);
+					break;
+				case 4:
+					moveUp(_bg4_l2Obj);
+					break;
+				default:
+					break;
+				}
+			}
+
+			if (_engine->is_key_pressed(Common::KEYCODE_DOWN)) {
+				switch (_stage) {
+				case 1:
+					moveDown(_bg1_l2Obj);
+					break;
+				case 2:
+					moveDown(_bg2_l2Obj);
+					break;
+				case 3:
+					moveDown(_bg3_l2Obj);
+					break;
+				case 4:
+					moveDown(_bg4_l2Obj);
+					break;
+				default:
+					break;
+				}
+			}
+
+			if ((_bg_clickObj->is_state_active("zad1_level2")
+					|| _activateObj->is_state_active("\xe7\xe0\xe4\xed\xe8\xea\x31")) && _stage != 1) { // "задник1"
+				_stage = 1;
+				_activateObj->set_state("\xe7\xe0\xe4\xed\xe8\xea\x31"); // "задник1"
+				_artDepth -= 200.0;
+				_bg1_l2Obj->set_R(_scene->screen2world_coords(_bg1_l2Obj->screen_R(), _artDepth));
+
+				snapPieces();
+			}
+
+			if ((_bg_clickObj->is_state_active("zad2_level2")
+					|| _activateObj->is_state_active("\xe7\xe0\xe4\xed\xe8\xea\x32")) && _stage != 2) { // "задник2"
+				_stage = 2;
+				_activateObj->set_state("\xe7\xe0\xe4\xed\xe8\xea\x32"); // "задник2"
+				_artDepth -= 200.0;
+				_bg2_l2Obj->set_R(_scene->screen2world_coords(_bg2_l2Obj->screen_R(), _artDepth));
+
+				snapPieces();
+			}
+
+			if ((_bg_clickObj->is_state_active("zad3_level2")
+					|| _activateObj->is_state_active("\xe7\xe0\xe4\xed\xe8\xea\x33")) && _stage != 3) { // "задник3"
+				_stage = 3;
+				_activateObj->set_state("\xe7\xe0\xe4\xed\xe8\xea\x33"); // "задник3"
+				_artDepth -= 200.0;
+				_bg3_l2Obj->set_R(_scene->screen2world_coords(_bg3_l2Obj->screen_R(), _artDepth));
+
+				snapPieces();
+			}
+
+			if ((_bg_clickObj->is_state_active("zad4_level2")
+					|| _activateObj->is_state_active("\xe7\xe0\xe4\xed\xe8\xea\x34")) && _stage != 4) { // "задник4"
+				_stage = 4;
+				_activateObj->set_state("\xe7\xe0\xe4\xed\xe8\xea\x34"); // "задник4"
+				_artDepth -= 200.0;
+				_bg4_l2Obj->set_R(_scene->screen2world_coords(_bg4_l2Obj->screen_R(), _artDepth));
+
+				snapPieces();
+			}
+		}
+
 		return true;
 	}
 
-	//! Деинициализация игры.
 	bool finit() {
 		debugC(1, kDebugMinigames, "Kartiny::finit()");
 
@@ -78,20 +314,18 @@ public:
  		return true;
 	}
 
-	/// Инициализация миниигры, вызывается при старте и перезапуске игры.
 	bool new_game(const qdEngineInterface *engine_interface) {
 		return true;
 	}
-	/// Сохранение данных, вызывается при сохранении сцены, на которую повешена миниигра.
+
 	int save_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, char *buffer, int buffer_size) {
 		return 0;
 	}
-	/// Загрузка данных, вызывается при загрузке сцены, на которую повешена миниигра.
+
 	int load_game(const qdEngineInterface *engine_interface, const qdMinigameSceneInterface *scene_interface, const char *buffer, int buffer_size) {
 		return 0;
 	}
 
-	/// Версия интерфейса игры, трогать не надо.
 	enum { INTERFACE_VERSION = 99 };
 	int version() const {
 		return INTERFACE_VERSION;
@@ -188,6 +422,10 @@ private:
 		obj->set_R(_scene->screen2world_coords(objPos, _artDepth));
 	}
 
+	bool checkSolution() {
+		return false;
+	}
+
 private:
 	const qdEngineInterface *_engine = nullptr;
 	qdMinigameSceneInterface *_scene = nullptr;
@@ -206,6 +444,13 @@ private:
 	bool _wasInited = false;
 	float _artDepth = -1.0;
 	int _keyDownCounter = 0;
+
+	int _stage = 0;
+
+	struct {
+		float depth;
+		int num;
+	} _artState[4];
 };
 
 } // namespace QDEngine


Commit: 8a5adecce19e04e7466aee0a4fd3dc60c279d917
    https://github.com/scummvm/scummvm/commit/8a5adecce19e04e7466aee0a4fd3dc60c279d917
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-27T12:15:31+02:00

Commit Message:
QDENGINE: Implemented rest of kartiny.dll

Changed paths:
    engines/qdengine/minigames/kartiny.h


diff --git a/engines/qdengine/minigames/kartiny.h b/engines/qdengine/minigames/kartiny.h
index 176e3439faa..d2eb1dbfb7b 100644
--- a/engines/qdengine/minigames/kartiny.h
+++ b/engines/qdengine/minigames/kartiny.h
@@ -423,7 +423,49 @@ private:
 	}
 
 	bool checkSolution() {
-		return false;
+		if (_scene->screen_depth(_bg1_l2Obj->R()) < _scene->screen_depth(_bg2_l2Obj->R()))
+			return false;
+
+		if (_scene->screen_depth(_bg2_l2Obj->R()) < _scene->screen_depth(_bg3_l2Obj->R()))
+			return false;
+
+		if (_scene->screen_depth(_bg3_l2Obj->R()) < _scene->screen_depth(_bg4_l2Obj->R()))
+			return false;
+
+		if (ABS(_bg1_l2Obj->screen_R().x - 399) > 5
+				|| ABS(_bg1_l2Obj->screen_R().y - 278) > 5
+				|| (ABS(_bg2_l2Obj->screen_R().x - 407) > 10
+				&& ABS(_bg2_l2Obj->screen_R().x - 420) > 10)) // copy/paste error in the originaL?
+			return false;
+
+		if (ABS(_bg2_l2Obj->screen_R().y - 267) > 10)
+			return false;
+
+		if (_bg2_l2Obj->screen_R().x - _bg3_l2Obj->screen_R().x > 6)
+			return false;
+
+		if (_bg3_l2Obj->screen_R().x - _bg2_l2Obj->screen_R().x > 5)
+			return false;
+
+		if (ABS(_bg3_l2Obj->screen_R().y + 43) > 10)
+			return false;
+
+		if (_bg4_l2Obj->screen_R().x - _bg3_l2Obj->screen_R().x > 5)
+			return false;
+
+		if (_bg3_l2Obj->screen_R().x - _bg4_l2Obj->screen_R().x > 3)
+			return false;
+
+		if (ABS(_bg4_l2Obj->screen_R().y + 42) > 10)
+			return false;
+
+		if (ABS(_bg4_l2Obj->screen_R().y) - ABS(_bg3_l2Obj->screen_R().y) > 3)
+			return false;
+
+
+		_doneObj->set_state("true");
+
+		return true;
 	}
 
 private:




More information about the Scummvm-git-logs mailing list