[Scummvm-git-logs] scummvm master -> e7cb21bc6c9cb7d343fb2d0770abdffe55d2e2d8

sev- noreply at scummvm.org
Wed Aug 28 03:14:16 UTC 2024


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

Summary:
0f4d038334 JANITORIAL: Fix indentation
19207e9e65 QDENGINE: Fixed loading minigame inis
b254e7a172 QDENGINE: Implement scroll.dll minigame for maski
031cf48eb9 QDENGINE: Initial code for MaskyOrder.dll from maski
c5f504ccbc QDENGINE: Fix MaskyOrder minigame
5e261f55ec QDENGINE: Added EN DASH to transCyrillic
e7cb21bc6c QDENGINE: Improved debug output


Commit: 0f4d038334ddc0223934e8a266001741dd1176ba
    https://github.com/scummvm/scummvm/commit/0f4d038334ddc0223934e8a266001741dd1176ba
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-28T05:13:46+02:00

Commit Message:
JANITORIAL: Fix indentation

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


diff --git a/engines/qdengine/minigames/tetris.h b/engines/qdengine/minigames/tetris.h
index 36c613fbe6a..b191be0d3cb 100644
--- a/engines/qdengine/minigames/tetris.h
+++ b/engines/qdengine/minigames/tetris.h
@@ -67,7 +67,7 @@ public:
 
 		_lastRowObj = _scene->object_interface(_scene->minigame_parameter("last_row"));
 
-  		return true;
+		return true;
 	}
 
 	bool quant(float dt) {
@@ -124,7 +124,7 @@ public:
 	}
 
 private:
-    int getActiveColumn() {
+	int getActiveColumn() {
 		if (_lastRowObj->is_state_active("0"))
 			return 0;
 		if (_lastRowObj->is_state_active("1"))
@@ -177,7 +177,7 @@ private:
 			return 24;
 
 		return 0;
-    }
+	}
 
 private:
 	const qdEngineInterface *_engine = nullptr;


Commit: 19207e9e65a7f15712a6fe6d61c7dcc9e615fcd8
    https://github.com/scummvm/scummvm/commit/19207e9e65a7f15712a6fe6d61c7dcc9e615fcd8
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-28T05:13:46+02:00

Commit Message:
QDENGINE: Fixed loading minigame inis

Changed paths:
    engines/qdengine/qdcore/qd_minigame.cpp
    engines/qdengine/qdcore/qd_minigame.h
    engines/qdengine/qdcore/qd_minigame_config.cpp
    engines/qdengine/qdcore/qd_minigame_config.h
    engines/qdengine/qdcore/qd_setup.cpp
    engines/qdengine/qdcore/qd_setup.h


diff --git a/engines/qdengine/qdcore/qd_minigame.cpp b/engines/qdengine/qdcore/qd_minigame.cpp
index 719f913cb84..fd12f5e05eb 100644
--- a/engines/qdengine/qdcore/qd_minigame.cpp
+++ b/engines/qdengine/qdcore/qd_minigame.cpp
@@ -140,7 +140,7 @@ bool qdMiniGame::load_script(const xml::tag *p) {
 			set_game_name(it->data());
 			break;
 		case QDSCR_MINIGAME_CONFIG_FILE:
-			set_config_file_name(it->data());
+			set_config_file_name(Common::Path(it->data(), '\\'));
 			load_config();
 			_config.reserve(_config.size() + config_size);
 			break;
@@ -179,7 +179,7 @@ bool qdMiniGame::save_script(Common::WriteStream &fh, int indent) const {
 	}
 
 	if (!_config_file_name.empty()) {
-		fh.writeString(Common::String::format(" config_file=\"%s\"", qdscr_XML_string(config_file_name())));
+		fh.writeString(Common::String::format(" config_file=\"%s\"", qdscr_XML_string(config_file_name().toString('\\'))));
 	}
 
 	if (!_dll_name.empty()) {
diff --git a/engines/qdengine/qdcore/qd_minigame.h b/engines/qdengine/qdcore/qd_minigame.h
index 7bcf73e8368..04170dd4b7a 100644
--- a/engines/qdengine/qdcore/qd_minigame.h
+++ b/engines/qdengine/qdcore/qd_minigame.h
@@ -47,10 +47,10 @@ public:
 	//! Инициализация данных, вызывается при старте и перезапуске основной игры.
 	bool init();
 
-	const char *config_file_name() const {
-		return _config_file_name.c_str();
+	const Common::Path config_file_name() const {
+		return _config_file_name;
 	}
-	void set_config_file_name(const char *file_name) {
+	void set_config_file_name(const Common::Path file_name) {
 		_config_file_name = file_name;
 	}
 	bool has_config_file() const {
@@ -115,7 +115,7 @@ private:
 	//! Имя подгружаемой для игры dll.
 	Common::String _dll_name;
 	//! .ini файл с настройками игры.
-	Common::String _config_file_name;
+	Common::Path _config_file_name;
 	//! Имя игры, по которому она ищется в dll.
 	Common::String _game_name;
 	//! Хэндл подгруженной dll.
diff --git a/engines/qdengine/qdcore/qd_minigame_config.cpp b/engines/qdengine/qdcore/qd_minigame_config.cpp
index 40ae9d5e8fb..94b47422b20 100644
--- a/engines/qdengine/qdcore/qd_minigame_config.cpp
+++ b/engines/qdengine/qdcore/qd_minigame_config.cpp
@@ -92,30 +92,30 @@ bool qdMinigameConfigParameter::validate_data() {
 	return true;
 }
 
-bool qdMinigameConfigParameter::load_ini(const char *ini_file, const char *ini_section) {
+bool qdMinigameConfigParameter::load_ini(const Common::Path ini_file, const char *ini_section) {
 	set_name(ini_section);
-	const char *str = getIniKey(ini_file, ini_section, "type");
-	if (strlen(str)) {
-		if (!scumm_stricmp(str, "string"))
+	Common::String str = getIniKey(ini_file, ini_section, "type");
+	if (!str.empty()) {
+		if (str.equalsIgnoreCase("string"))
 			set_data_type(PRM_DATA_STRING);
-		else if (!scumm_stricmp(str, "file"))
+		else if (str.equalsIgnoreCase("file"))
 			set_data_type(PRM_DATA_FILE);
-		else if (!scumm_stricmp(str, "object"))
+		else if (str.equalsIgnoreCase("object"))
 			set_data_type(PRM_DATA_OBJECT);
 	}
 
 	str = getIniKey(ini_file, ini_section, "count");
-	if (strlen(str))
-		set_data_count(atoi(str));
+	if (!str.empty())
+		set_data_count(atoi(str.c_str()));
 
 	str = getIniKey(ini_file, ini_section, "value");
-	if (strlen(str)) {
-		set_data_string(str);
+	if (!str.empty()) {
+		set_data_string(str.c_str());
 	}
 
 	str = getIniKey(ini_file, ini_section, "comment");
-	if (strlen(str))
-		set_comment(str);
+	if (!str.empty())
+		set_comment(str.c_str());
 
 	return true;
 }
diff --git a/engines/qdengine/qdcore/qd_minigame_config.h b/engines/qdengine/qdcore/qd_minigame_config.h
index 8542257e57d..9873be043f4 100644
--- a/engines/qdengine/qdcore/qd_minigame_config.h
+++ b/engines/qdengine/qdcore/qd_minigame_config.h
@@ -22,6 +22,8 @@
 #ifndef QDENGINE_QDCORE_QD_MINIGAME_CONFIG_H
 #define QDENGINE_QDCORE_QD_MINIGAME_CONFIG_H
 
+#include "common/path.h"
+
 namespace QDEngine {
 /// Конфигурационные данные для миниигры.
 /**
@@ -117,7 +119,7 @@ public:
 	bool save_script(Common::WriteStream &fh, int indent = 0) const;
 
 	//! Загрузка данных из .ini файла.
-	bool load_ini(const char *ini_file, const char *ini_section);
+	bool load_ini(const Common::Path ini_file, const char *ini_section);
 
 private:
 
diff --git a/engines/qdengine/qdcore/qd_setup.cpp b/engines/qdengine/qdcore/qd_setup.cpp
index 1d14807524f..8058754cdb0 100644
--- a/engines/qdengine/qdcore/qd_setup.cpp
+++ b/engines/qdengine/qdcore/qd_setup.cpp
@@ -26,10 +26,11 @@
 
 namespace QDEngine {
 
-bool enumerateIniSections(const char *fname, Common::INIFile::SectionList &sectionList) {
+bool enumerateIniSections(const Common::Path fname, Common::INIFile::SectionList &sectionList) {
 
 	Common::INIFile ini;
 	Common::Path iniFilePath(fname);
+	ini.allowNonEnglishCharacters();
 	ini.loadFromFile(iniFilePath);
 	sectionList = ini.getSections();
 	int size = sectionList.size();
@@ -41,10 +42,11 @@ bool enumerateIniSections(const char *fname, Common::INIFile::SectionList &secti
 	return true;
 }
 
-const char *getIniKey(const char *fname, const char *section, const char *key) {
+const Common::String getIniKey(const Common::Path fname, const char *section, const char *key) {
 	Common::INIFile ini;
 	Common::String buf;
 
+	ini.allowNonEnglishCharacters();
 	ini.loadFromFile(fname);
 	bool hasValue = ini.getKey(key, section, buf);
 
@@ -52,7 +54,7 @@ const char *getIniKey(const char *fname, const char *section, const char *key) {
 		return "";
 	}
 
-	return buf.c_str();
+	return buf;
 }
 
 } // namespace QDEngine
diff --git a/engines/qdengine/qdcore/qd_setup.h b/engines/qdengine/qdcore/qd_setup.h
index f3e15857542..bd947ccd66b 100644
--- a/engines/qdengine/qdcore/qd_setup.h
+++ b/engines/qdengine/qdcore/qd_setup.h
@@ -26,8 +26,8 @@
 
 namespace QDEngine {
 
-const char *getIniKey(const char *fname, const char *section, const char *key);
-bool enumerateIniSections(const char *fname, Common::INIFile::SectionList &section_list);
+const Common::String getIniKey(const Common::Path fname, const char *section, const char *key);
+bool enumerateIniSections(const Common::Path fname, Common::INIFile::SectionList &section_list);
 
 } // namespace QDEngine
 


Commit: b254e7a172bc0664c87642fbcd8e1dd1e9e04f4a
    https://github.com/scummvm/scummvm/commit/b254e7a172bc0664c87642fbcd8e1dd1e9e04f4a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-28T05:13:46+02:00

Commit Message:
QDENGINE: Implement scroll.dll minigame for maski

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


diff --git a/engines/qdengine/minigames/scroll.h b/engines/qdengine/minigames/scroll.h
new file mode 100644
index 00000000000..7eaa4e1fcc9
--- /dev/null
+++ b/engines/qdengine/minigames/scroll.h
@@ -0,0 +1,105 @@
+/* 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_SCROLL_H
+#define QDENGINE_MINIGAMES_SCROLL_H
+
+#include "common/debug.h"
+
+#include "qdengine/qd_fwd.h"
+#include "qdengine/qdcore/qd_minigame_interface.h"
+
+namespace QDEngine {
+
+class qdScrollMiniGame : public qdMiniGameInterface {
+public:
+	qdScrollMiniGame() {}
+	~qdScrollMiniGame() {}
+
+	bool init(const qdEngineInterface *engine_interface) {
+		debugC(1, kDebugMinigames, "Scroll::init()");
+
+		_engine = engine_interface;
+		_scene = engine_interface->current_scene_interface();
+		if (!_scene)
+			return false;
+
+		_commandObj = _scene->object_interface(_scene->minigame_parameter("command_object"));
+
+  		return true;
+	}
+
+	bool quant(float dt) {
+		debugC(3, kDebugMinigames, "Scroll::quant(%f)", dt);
+
+		mgVect2i pos = _engine->mouse_cursor_position();
+
+		if (pos.x < 25)
+			_commandObj->set_state("\xe2\xeb\xe5\xe2\xee");		// "влево"
+
+		if (pos.x > 775)
+			_commandObj->set_state("\xe2\xef\xf0\xe0\xe2\xee");	// "вправо"
+
+		if (pos.x > 25 && pos.x < 775)
+			_commandObj->set_state("\xed\xe5\xf2");				// "нет"
+
+		return true;
+	}
+
+	bool finit() {
+		debugC(1, kDebugMinigames, "Scroll::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 = 99 };
+	int version() const {
+		return INTERFACE_VERSION;
+	}
+
+private:
+	const qdEngineInterface *_engine = nullptr;
+	qdMinigameSceneInterface *_scene = nullptr;
+
+	qdMinigameObjectInterface *_commandObj  = nullptr;
+
+};
+
+} // namespace QDEngine
+
+#endif // QDENGINE_MINIGAMES_SCROLL_H
diff --git a/engines/qdengine/qdcore/qd_minigame.cpp b/engines/qdengine/qdcore/qd_minigame.cpp
index fd12f5e05eb..7f9e505ab7b 100644
--- a/engines/qdengine/qdcore/qd_minigame.cpp
+++ b/engines/qdengine/qdcore/qd_minigame.cpp
@@ -35,6 +35,7 @@
 
 // maski
 #include "qdengine/minigames/kartiny.h"
+#include "qdengine/minigames/scroll.h"
 #include "qdengine/minigames/tetris.h"
 
 // 2mice1
@@ -269,9 +270,12 @@ bool qdMiniGame::load_interface() {
 		// maski_21_random.dll
 		// orchestra.dll
 		// scroll.dll
-		if (_dll_name == "DLL\\tetris.dll") {
+		if (_dll_name == "Resource\\DLL\\tetris.dll") {
 			_interface = new qdTetrisMiniGame();
 			return true;
+		} else if (_dll_name == "Resource\\DLL\\scroll.dll") {
+			_interface = new qdScrollMiniGame();
+			return true;
 
 		// 3mice1
 		} else if (_dll_name == "DLL\\Book_gusenica.dll" || _dll_name == "DLL\\Book_les.dll"


Commit: 031cf48eb932d443a225f6fa7b54d622c63f6501
    https://github.com/scummvm/scummvm/commit/031cf48eb932d443a225f6fa7b54d622c63f6501
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-28T05:13:46+02:00

Commit Message:
QDENGINE: Initial code for MaskyOrder.dll from maski

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


diff --git a/engines/qdengine/minigames/masky_order.h b/engines/qdengine/minigames/masky_order.h
new file mode 100644
index 00000000000..9427b63f5fd
--- /dev/null
+++ b/engines/qdengine/minigames/masky_order.h
@@ -0,0 +1,334 @@
+/* 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_MASKY_ORDER_H
+#define QDENGINE_MINIGAMES_MASKY_ORDER_H
+
+#include "common/debug.h"
+
+#include "qdengine/qd_fwd.h"
+#include "qdengine/qdcore/qd_minigame_interface.h"
+
+namespace QDEngine {
+
+const int pieceCoordsFront[24] = {
+	280,  93, 284, 163, 394, 140, 505, 120, 511, 225,
+	392, 255, 296, 288, 444, 369, 309, 406, 446, 479,
+	289, 478, 548, 420,
+};
+
+const int pieceCoordsBack[24] = {
+	516,  94, 511, 162, 398, 139, 293, 120, 286, 227,
+	404, 247, 500, 287, 353, 363, 488, 407, 354, 476,
+	508, 478, 247, 420,
+};
+
+
+class qdMaskyOrderMiniGame : public qdMiniGameInterface {
+public:
+	qdMaskyOrderMiniGame() {
+		for (uint i = 0; i < ARRAYSIZE(_pieces); i++)
+			_pieces[i] = nullptr;
+	}
+	~qdMaskyOrderMiniGame() {};
+
+	//! Инициализация игры.
+	bool init(const qdEngineInterface *engine_interface) {
+		debugC(1, kDebugMinigames, "MaskyOrder::init(), dll: %s lang: %d", _dll.c_str(), _language);
+
+		_engine = engine_interface;
+		_scene = _engine->current_scene_interface();
+		if (!_scene)
+			return false;
+
+		for (int i = 0; i < _numPieces; i++)
+			_pieces[i] = _scene->object_interface(_scene->minigame_parameter(Common::String::format("object_%i", i + 1).c_str()));
+
+		_finalObj = _scene->object_interface(_scene->minigame_parameter("final"));
+		_doneObj = _scene->object_interface(_scene->minigame_parameter("done_object"));
+		_object3Flag = _scene->object_interface(_scene->minigame_parameter("object_3_flag"));
+		_loadGameObj = _scene->object_interface(_scene->minigame_parameter("loadgame"));
+
+		_wasInited = false;
+
+        _isFinal = false;
+        _minDepthPiece = findMinDepthPiece();
+
+		return true;
+	}
+
+	//! Обсчёт логики игры, параметр - время, которое должно пройти в игре (в секундах).
+	bool quant(float dt) {
+		debugC(3, kDebugMinigames, "MaskyOrder::quant(%f)", dt);
+
+		if (!_wasInited && _loadGameObj->is_state_active("\xed\xe5\xf2")) {	// "нет"
+			_rotatingPiece = -1;
+			_currentPieceState = -1;
+			_pieceIsPut = false;
+			_isFinal = false;
+			_flipped = false;
+			_wasInited = true;
+			_loadGameObj->set_state("\xe4\xe0");	// "да"
+		}
+
+		if ( _object3Flag->is_state_active("\xe4\xe0")) {	// "да"
+			_flipped = true;
+			_pieces[2]->set_state("back");
+			_object3Flag->set_state("\xed\xe5\xf2");	// "нет"
+
+			_minDepthPiece = findMinDepthPiece();
+
+			mgVect3f coords = _scene->screen2world_coords(_pieces[2]->screen_R(), _minDepthPiece);
+			_pieces[2]->set_R(coords);
+		}
+
+  		if (_isFinal)
+			return true;
+
+		if (!checkSolution() || _scene->mouse_object_interface()) {
+			qdMinigameObjectInterface *mouseObj = _scene->mouse_object_interface();
+
+			if (_pieceIsPut) {
+				for (int i = 0; i < 12; i++) {
+					if (_pieces[i]->is_state_active("to_inv_flag_back")
+							|| _pieces[i]->is_state_active("to_inv_flag_front")) {
+
+						if (_pieces[i]->is_state_active("to_inv_flag_back"))
+							_currentPieceState = _pieces[i]->state_index("inv_back");
+						else if (_pieces[i]->is_state_active("to_inv_flag_front"))
+							_currentPieceState = _pieces[i]->state_index("inv_front");
+
+						_rotatingPiece = i;
+						_pieces[i]->set_state("to_inv");
+						_pieceIsPut = false;
+					}
+				}
+			}
+
+			if (mouseObj) {
+				if (_rotatingPiece != -1) {
+					_pieces[_rotatingPiece]->set_state(_currentPieceState);
+					_currentPieceState = -1;
+					_rotatingPiece = -1;
+				}
+			}
+
+			if (_engine->is_mouse_event_active(qdmg::qdEngineInterfaceImpl::MOUSE_EV_LEFT_DOWN)) {
+				mgVect2i mousePos = _engine->mouse_cursor_position();
+				qdMinigameObjectInterface *obj = _scene->mouse_object_interface();
+
+				if (obj) {
+					if (obj->is_state_active("inv_back"))
+						obj->set_state("back");
+					else if (obj->is_state_active("inv_front"))
+						obj->set_state("front");
+
+					_minDepthPiece -= 60.0;
+
+					mgVect3f coords = _scene->screen2world_coords(mousePos, _minDepthPiece);
+					obj->set_R(coords);
+
+					snapPieces();
+				} else {
+					_pieceIsPut = true;
+				}
+			}
+		}
+
+		if (_engine->is_mouse_event_active(qdmg::qdEngineInterfaceImpl::MOUSE_EV_RIGHT_DOWN)) {
+			qdMinigameObjectInterface *obj = _scene->mouse_object_interface();
+
+			if (obj) {
+				if (obj->is_state_active("inv_back"))
+					obj->set_state("inv_front");
+				else if (obj->is_state_active("inv_front"))
+					obj->set_state("inv_back");
+			}
+		}
+
+		return true;
+	}
+
+	bool checkSolution() {
+		if (_scene->mouse_object_interface())
+			return false;
+
+		if (_pieces[0]->is_state_active("front"))
+			for (int i = 0; i < 12; i++)
+				if (!_pieces[0]->is_state_active("front"))
+					return false;
+
+		if (_pieces[0]->is_state_active("back"))
+			for (int i = 0; i < 12; i++)
+				if (!_pieces[0]->is_state_active("back"))
+					return false;
+
+		mgVect2i piecePos;
+
+		if (_pieces[0]->is_state_active("front"))
+			for (int i = 0; i < _numPieces; i++) {
+				piecePos = _pieces[i]->screen_R();
+
+				if (ABS(pieceCoordsFront[i * 2 + 0] - piecePos.x) > 10 ||
+					ABS(pieceCoordsFront[i * 2 + 1] - piecePos.y) > 10)
+					return false;
+			}
+
+		if (_pieces[0]->is_state_active("back"))
+			for (int i = 0; i < _numPieces; i++) {
+				piecePos = _pieces[i]->screen_R();
+
+				if (ABS(pieceCoordsBack[i * 2 + 0] - piecePos.x) > 10 ||
+					ABS(pieceCoordsBack[i * 2 + 1] - piecePos.y) > 10)
+					return false;
+			}
+
+		_isFinal = true;
+		_finalObj->set_state("\xe4\xe0");	// "да"
+
+		setPiecePositions();
+
+		return true;
+	}
+
+	void snapPieces() {
+		mgVect2i piecePos;
+		mgVect3f newPiecePos;
+
+		for (int i = 0; i < 12; i++) {
+			piecePos = _pieces[i]->screen_R();
+			float depth = _scene->screen_depth(_pieces[i]->R());
+			bool modified = false;
+
+			if (_pieces[i]->is_state_active("front")) {
+				if (ABS(pieceCoordsFront[i * 2 + 0] - piecePos.x) <= 10 &&
+						ABS(pieceCoordsFront[i * 2 + 1] - piecePos.y) <= 10) {
+					piecePos.x = pieceCoordsFront[i * 2 + 0];
+					piecePos.y = pieceCoordsFront[i * 2 + 1];
+
+					modified = true;
+				}
+			}
+
+			if (_pieces[i]->is_state_active("back")) {
+				if (ABS(pieceCoordsBack[i * 2 + 0] - piecePos.x) <= 10 &&
+						ABS(pieceCoordsBack[i * 2 + 1] - piecePos.y) <= 10) {
+					piecePos.x = pieceCoordsBack[i * 2 + 0];
+					piecePos.y = pieceCoordsBack[i * 2 + 1];
+
+					modified = true;
+				}
+			}
+
+			if (modified) {
+				newPiecePos = _scene->screen2world_coords(piecePos, depth);
+				_pieces[i]->set_R(newPiecePos);
+			}
+		}
+	}
+
+	//! Деинициализация игры.
+	bool finit() {
+		debugC(1, kDebugMinigames, "MaskyOrder::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:
+	float findMinDepthPiece() {
+		float min = 100000.0;
+
+		for (int i = 0; i < 12; i++) {
+			float depth = _scene->screen_depth(_pieces[i]->R());
+
+			if (min > depth)
+				min = depth;
+		}
+
+		return min;
+	}
+
+	void setPiecePositions() {
+		mgVect3f coords(1000.0, 1000.0, 0.0);
+
+		for (int i = 0; i < 12; i++) {
+			_pieces[i]->set_R(coords);
+		}
+
+		if (_pieces[0]->is_state_active("back"))
+			_doneObj->set_state("back");
+		else
+			_doneObj->set_state("front");
+	}
+
+private:
+	const qdEngineInterface *_engine = nullptr;
+	qdMinigameSceneInterface *_scene = nullptr;
+
+	qdMinigameObjectInterface *_pieces[12];
+
+	qdMinigameObjectInterface *_finalObj = nullptr;
+	qdMinigameObjectInterface *_doneObj = nullptr;
+	qdMinigameObjectInterface *_object3Flag = nullptr;
+	qdMinigameObjectInterface *_loadGameObj = nullptr;
+
+	bool _wasInited = false;
+	bool _isFinal = false;
+	bool _flipped = false;
+
+	float _minDepthPiece = 0.0;
+	int _rotatingPiece = -1;
+	bool _pieceIsPut = true;
+	int _currentPieceState = 0;
+
+	int _numPieces = 12;
+
+	Common::String _dll;
+	Common::Language _language;
+};
+
+} // namespace QDEngine
+
+#endif // QDENGINE_MINIGAMES_MASKY_ORDER_H
diff --git a/engines/qdengine/qdcore/qd_minigame.cpp b/engines/qdengine/qdcore/qd_minigame.cpp
index 7f9e505ab7b..31c9a62e33e 100644
--- a/engines/qdengine/qdcore/qd_minigame.cpp
+++ b/engines/qdengine/qdcore/qd_minigame.cpp
@@ -35,6 +35,7 @@
 
 // maski
 #include "qdengine/minigames/kartiny.h"
+#include "qdengine/minigames/masky_order.h"
 #include "qdengine/minigames/scroll.h"
 #include "qdengine/minigames/tetris.h"
 
@@ -276,6 +277,9 @@ bool qdMiniGame::load_interface() {
 		} else if (_dll_name == "Resource\\DLL\\scroll.dll") {
 			_interface = new qdScrollMiniGame();
 			return true;
+		} else if (_dll_name == "Resource\\DLL\\MaskyOrder.dll") {
+			_interface = new qdMaskyOrderMiniGame();
+			return true;
 
 		// 3mice1
 		} else if (_dll_name == "DLL\\Book_gusenica.dll" || _dll_name == "DLL\\Book_les.dll"


Commit: c5f504ccbc562b03f8f88d9af348d0d44fd8a55a
    https://github.com/scummvm/scummvm/commit/c5f504ccbc562b03f8f88d9af348d0d44fd8a55a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-28T05:13:46+02:00

Commit Message:
QDENGINE: Fix MaskyOrder minigame

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


diff --git a/engines/qdengine/minigames/masky_order.h b/engines/qdengine/minigames/masky_order.h
index 9427b63f5fd..14da589368c 100644
--- a/engines/qdengine/minigames/masky_order.h
+++ b/engines/qdengine/minigames/masky_order.h
@@ -59,7 +59,7 @@ public:
 		if (!_scene)
 			return false;
 
-		for (int i = 0; i < _numPieces; i++)
+		for (int i = 0; i < 12; i++)
 			_pieces[i] = _scene->object_interface(_scene->minigame_parameter(Common::String::format("object_%i", i + 1).c_str()));
 
 		_finalObj = _scene->object_interface(_scene->minigame_parameter("final"));
@@ -171,20 +171,22 @@ public:
 		if (_scene->mouse_object_interface())
 			return false;
 
-		if (_pieces[0]->is_state_active("front"))
+		if (_pieces[0]->is_state_active("front")) {
 			for (int i = 0; i < 12; i++)
 				if (!_pieces[0]->is_state_active("front"))
 					return false;
-
-		if (_pieces[0]->is_state_active("back"))
+		} else if (_pieces[0]->is_state_active("back")) {
 			for (int i = 0; i < 12; i++)
 				if (!_pieces[0]->is_state_active("back"))
 					return false;
+		} else {
+			return false;
+		}
 
 		mgVect2i piecePos;
 
 		if (_pieces[0]->is_state_active("front"))
-			for (int i = 0; i < _numPieces; i++) {
+			for (int i = 0; i < 12; i++) {
 				piecePos = _pieces[i]->screen_R();
 
 				if (ABS(pieceCoordsFront[i * 2 + 0] - piecePos.x) > 10 ||
@@ -193,7 +195,7 @@ public:
 			}
 
 		if (_pieces[0]->is_state_active("back"))
-			for (int i = 0; i < _numPieces; i++) {
+			for (int i = 0; i < 12; i++) {
 				piecePos = _pieces[i]->screen_R();
 
 				if (ABS(pieceCoordsBack[i * 2 + 0] - piecePos.x) > 10 ||
@@ -323,8 +325,6 @@ private:
 	bool _pieceIsPut = true;
 	int _currentPieceState = 0;
 
-	int _numPieces = 12;
-
 	Common::String _dll;
 	Common::Language _language;
 };


Commit: 5e261f55ec190e36b0aad62e7228c53242e1f740
    https://github.com/scummvm/scummvm/commit/5e261f55ec190e36b0aad62e7228c53242e1f740
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-28T05:13:46+02:00

Commit Message:
QDENGINE: Added EN DASH to transCyrillic

Used in maski in some messages

Changed paths:
    engines/qdengine/qdengine.cpp


diff --git a/engines/qdengine/qdengine.cpp b/engines/qdengine/qdengine.cpp
index 061611234ff..6c5874ace12 100644
--- a/engines/qdengine/qdengine.cpp
+++ b/engines/qdengine/qdengine.cpp
@@ -202,10 +202,16 @@ byte *transCyrillic(const Common::String &str) {
 				}
 			}
 
-			if (!trans[j]) {
-				warning("transCyrillic: no mapping for %d (0x%x)", *p, *p);
-				tmp[i++] = '?';
-				tmp[i++] = '?';
+			if (*p == 0x96) {  // "–" -- EN DASH
+				tmp[i++] = 0xE2;
+				tmp[i++] = 0x80;
+				tmp[i++] = 0x93;
+			} else {
+				if (!trans[j]) {
+					warning("transCyrillic: no mapping for %d (0x%x)", *p, *p);
+					tmp[i++] = '?';
+					tmp[i++] = '?';
+				}
 			}
 		}
 #endif


Commit: e7cb21bc6c9cb7d343fb2d0770abdffe55d2e2d8
    https://github.com/scummvm/scummvm/commit/e7cb21bc6c9cb7d343fb2d0770abdffe55d2e2d8
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-08-28T05:13:46+02:00

Commit Message:
QDENGINE: Improved debug output

Changed paths:
    engines/qdengine/qdcore/util/WinVideo.cpp


diff --git a/engines/qdengine/qdcore/util/WinVideo.cpp b/engines/qdengine/qdcore/util/WinVideo.cpp
index 8a1a57eb3f6..840ccd75a69 100644
--- a/engines/qdengine/qdcore/util/WinVideo.cpp
+++ b/engines/qdengine/qdcore/util/WinVideo.cpp
@@ -76,7 +76,7 @@ bool winVideo::open_file(const Common::Path fname) {
 	_videostream = new Common::File();
 
 	if (!_videostream->open(fname)) {
-		warning("WinVideo::open: Failed to open file %s", fname.toString().c_str());
+		warning("WinVideo::open: Failed to open file %s", transCyrillic(fname.toString()));
 		delete _videostream;
 		return false;
 	}




More information about the Scummvm-git-logs mailing list