[Scummvm-git-logs] scummvm master -> 77a914c19a2c242b504773eeb2aabd133af6bc52
sev-
noreply at scummvm.org
Mon May 26 15:40:49 UTC 2025
This automated email contains information about 17 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
8a89c8d3cb QDENGINE: Add early EOS check in MinigameManager::loadState()
0f129acb58 QDENGINE: Ensure file pos is less than size in MinigameManager::loadState()
39e18a7ea3 QDENGINE: pos() -> size() in MinigameManager::processGameData()
20e808236d QDENGINE: Change logic and usage of MinigameManager::processGameData()
03f16e9e4b QDENGINE: Return the use close_adv_minigame()
a4e174d39e QDENGINE: Implement scores.dll minigame
829530f2d4 QDENGINE: Implement swap.dll minigame
6174696541 QDENGINE: Implement MinigameManager::testAllGamesWin()
ef2a199af1 QDENGINE: Fix unfinished games being displayed in scores.dll
0c9b2d89df QDENGINE: Add missing parameters in scores.dll minigame
f2dc7d4266 QDENGINE: Fix game border position in scores.dll
d5e9f90be1 QDENGINE: Fix how time is displayed in scores.dll
d2df53446b QDENGINE: Add missing parameter in triangles.dll minigame
364c812b58 QDENGINE: Implement puzzle.dll minigame
4332759d76 QDENGINE: Add stub warnings to triangles minigame
2028a53622 QDENGINE: Fix crash when translating long string in debug messages
77a914c19a QDENGINE: Call finit() before destroying qdMiniGameInterface
Commit: 8a89c8d3cb654a640740724d065225ac40ce32ba
https://github.com/scummvm/scummvm/commit/8a89c8d3cb654a640740724d065225ac40ce32ba
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Add early EOS check in MinigameManager::loadState()
Changed paths:
engines/qdengine/minigames/adv/RunTime.cpp
diff --git a/engines/qdengine/minigames/adv/RunTime.cpp b/engines/qdengine/minigames/adv/RunTime.cpp
index 45e8a21ee8c..0fad39bead0 100644
--- a/engines/qdengine/minigames/adv/RunTime.cpp
+++ b/engines/qdengine/minigames/adv/RunTime.cpp
@@ -452,6 +452,11 @@ bool MinigameManager::loadState(bool current) {
while (!file->eos()) {
index.read(*file);
+ if (file->eos()) {
+ delete file;
+ return false;
+ }
+
GameInfo data;
data.read(*file);
Commit: 0f129acb58dbf3357e1c5a108f51858409f21e61
https://github.com/scummvm/scummvm/commit/0f129acb58dbf3357e1c5a108f51858409f21e61
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Ensure file pos is less than size in MinigameManager::loadState()
Changed paths:
engines/qdengine/minigames/adv/RunTime.cpp
diff --git a/engines/qdengine/minigames/adv/RunTime.cpp b/engines/qdengine/minigames/adv/RunTime.cpp
index 0fad39bead0..e828a8fff2a 100644
--- a/engines/qdengine/minigames/adv/RunTime.cpp
+++ b/engines/qdengine/minigames/adv/RunTime.cpp
@@ -449,10 +449,10 @@ bool MinigameManager::loadState(bool current) {
GameInfoIndex index(0, 0);
- while (!file->eos()) {
+ while (!file->eos() && file->pos() < file->size()) {
index.read(*file);
- if (file->eos()) {
+ if (file->eos() || file->pos() >= file->size()) {
delete file;
return false;
}
Commit: 39e18a7ea3ab172162ff5b736e49fd55ae2f7472
https://github.com/scummvm/scummvm/commit/39e18a7ea3ab172162ff5b736e49fd55ae2f7472
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: pos() -> size() in MinigameManager::processGameData()
Changed paths:
engines/qdengine/minigames/adv/RunTime.cpp
diff --git a/engines/qdengine/minigames/adv/RunTime.cpp b/engines/qdengine/minigames/adv/RunTime.cpp
index e828a8fff2a..a7e9778b3c8 100644
--- a/engines/qdengine/minigames/adv/RunTime.cpp
+++ b/engines/qdengine/minigames/adv/RunTime.cpp
@@ -904,13 +904,13 @@ bool MinigameManager::processGameData(Common::SeekableReadStream &data) {
if (_currentGameInfo) {
if (_currentGameInfo->_empty) {
_currentGameInfo->_empty = false;
- assert(data.pos());
+ assert(data.size());
_currentGameInfo->persist(data);
} else {
- if (data.pos() != _currentGameInfo->_dataSize)
+ if (data.size() != _currentGameInfo->_dataSize)
warning("MinigameManager::processGameData(): Old minigame save detected. Remove '%s'", _state_container_name.c_str());
- if (data.pos() == _currentGameInfo->_dataSize) {
+ if (data.size() == _currentGameInfo->_dataSize) {
_currentGameInfo->persist(data);
} else {
data.seek(0);
Commit: 20e808236d72464fbbbb01a242f03871d8c63981
https://github.com/scummvm/scummvm/commit/20e808236d72464fbbbb01a242f03871d8c63981
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Change logic and usage of MinigameManager::processGameData()
Incorrect usage of _currentGameInfo->persist() was removed. When _currentGameInfo is not empty, the original was writing to data, instead of reading from it. To adapt for this change, MinigameManager::getCurrentGameInfo() was added. Inside minigame constructors, this must be used after processGameData().
Changed paths:
engines/qdengine/minigames/adv/RunTime.cpp
engines/qdengine/minigames/adv/RunTime.h
engines/qdengine/minigames/adv/m_triangles.cpp
diff --git a/engines/qdengine/minigames/adv/RunTime.cpp b/engines/qdengine/minigames/adv/RunTime.cpp
index a7e9778b3c8..b17dbf8adae 100644
--- a/engines/qdengine/minigames/adv/RunTime.cpp
+++ b/engines/qdengine/minigames/adv/RunTime.cpp
@@ -907,12 +907,8 @@ bool MinigameManager::processGameData(Common::SeekableReadStream &data) {
assert(data.size());
_currentGameInfo->persist(data);
} else {
- if (data.size() != _currentGameInfo->_dataSize)
+ if (data.size() != _currentGameInfo->_dataSize) {
warning("MinigameManager::processGameData(): Old minigame save detected. Remove '%s'", _state_container_name.c_str());
-
- if (data.size() == _currentGameInfo->_dataSize) {
- _currentGameInfo->persist(data);
- } else {
data.seek(0);
return false;
}
diff --git a/engines/qdengine/minigames/adv/RunTime.h b/engines/qdengine/minigames/adv/RunTime.h
index aff341c2fe9..69f649a86ac 100644
--- a/engines/qdengine/minigames/adv/RunTime.h
+++ b/engines/qdengine/minigames/adv/RunTime.h
@@ -124,6 +124,7 @@ public:
return _gameTime;
}
+ GameInfo *getCurrentGameInfo() const { return _currentGameInfo; };
const MinigameData *getScore(int level, int game) const;
bool debugMode() const {
diff --git a/engines/qdengine/minigames/adv/m_triangles.cpp b/engines/qdengine/minigames/adv/m_triangles.cpp
index d8767069be5..35c6376b79a 100644
--- a/engines/qdengine/minigames/adv/m_triangles.cpp
+++ b/engines/qdengine/minigames/adv/m_triangles.cpp
@@ -133,8 +133,15 @@ MinigameTriangle::MinigameTriangle(MinigameManager *runtime) {
if (!_runtime->processGameData(gameData))
return;
- for (auto &it : _positions)
- it.read(gameData);
+ GameInfo *gameInfo = _runtime->getCurrentGameInfo();
+ if (gameInfo) {
+ Common::MemoryReadStream buf((byte *)gameInfo->_gameData, gameInfo->_dataSize);
+ for (auto &it : _positions)
+ it.read(buf);
+ } else {
+ for (auto &it : _positions)
+ it.read(gameData);
+ }
for (int num = 1; num <= 2; ++num) {
for (int angle = 1; angle <= 3; ++angle) {
Commit: 03f16e9e4baffaf0fc63ba1f04272904f96bcfa2
https://github.com/scummvm/scummvm/commit/03f16e9e4baffaf0fc63ba1f04272904f96bcfa2
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Return the use close_adv_minigame()
Changed paths:
engines/qdengine/qdcore/qd_minigame.cpp
diff --git a/engines/qdengine/qdcore/qd_minigame.cpp b/engines/qdengine/qdcore/qd_minigame.cpp
index 05f27fa38e1..ad91e1c016a 100644
--- a/engines/qdengine/qdcore/qd_minigame.cpp
+++ b/engines/qdengine/qdcore/qd_minigame.cpp
@@ -395,7 +395,9 @@ bool qdMiniGame::load_interface() {
}
bool qdMiniGame::release_interface() {
- delete _interface;
+ if (_interface)
+ close_adv_minigame(_interface);
+
_interface = nullptr;
return true;
}
Commit: a4e174d39e44a6cb6756a1ccf4bfc343a2a539e3
https://github.com/scummvm/scummvm/commit/a4e174d39e44a6cb6756a1ccf4bfc343a2a539e3
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Implement scores.dll minigame
Changed paths:
engines/qdengine/minigames/adv/m_scores.cpp
engines/qdengine/minigames/adv/m_scores.h
engines/qdengine/qdcore/qd_minigame.cpp
diff --git a/engines/qdengine/minigames/adv/m_scores.cpp b/engines/qdengine/minigames/adv/m_scores.cpp
index 8ab9a894d51..f38043cd789 100644
--- a/engines/qdengine/minigames/adv/m_scores.cpp
+++ b/engines/qdengine/minigames/adv/m_scores.cpp
@@ -20,6 +20,8 @@
*/
#include "common/debug.h"
+#include "common/file.h"
+#include "common/memstream.h"
#include "qdengine/qdengine.h"
#include "qdengine/minigames/adv/common.h"
@@ -46,16 +48,14 @@ Scores::Scores(MinigameManager *runtime) {
if (!gameButtonName || !*gameButtonName)
return;
- warning("STUB: Scores::Scores()");
-#if 0
- XBuffer gameData;
+ Common::MemoryReadWriteStream gameData(DisposeAfterUse::YES);
char name[128];
name[127] = 0;
for (int num = 1; ; ++num) {
snprintf(name, 127, "%s%02d", gameButtonName, num);
if (_runtime->testObject(name)) {
QDObject obj = _runtime->getObject(name);
- gameData.write(obj->R());
+ obj->R().write(gameData);
_games.push_back(_runtime->getObject(name));
} else
break;
@@ -69,33 +69,36 @@ Scores::Scores(MinigameManager *runtime) {
return;
_positions.resize(_games.size());
- for (int idx = 0; idx < _games.size(); ++idx)
- gameData.read(_positions[idx]);
+ GameInfo *gameInfo = _runtime->getCurrentGameInfo();
+ if (gameInfo) {
+ Common::MemoryReadStream buf((byte *)gameInfo->_gameData, gameInfo->_dataSize);
+ for (auto &it : _positions)
+ it.read(buf);
+ } else {
+ for (auto &it : _positions)
+ it.read(gameData);
+ }
- XStream file(false);
- if (!file.open(fileName, XS_IN)) {
+ Common::File file;
+ if (!file.open(Common::Path(_runtime->gameListFileName()))) {
error("Failed to open games list file '%s'", transCyrillic(fileName));
}
char read_buf[512];
- while (!file.eof()) {
- file.getline(read_buf, 512);
- XBuffer xbuf((void*)read_buf, strlen(read_buf));
- int level;
- xbuf >= level;
- unsigned char ch;
- xbuf > ch;
+ while (!file.eos()) {
+ file.readLine(read_buf, 512);
+ Common::MemoryReadStream buf((const byte *)&read_buf[0], strlen(read_buf));
+ int level = buf.readByte() - '0';
+ byte ch = buf.readByte();
if (ch != ':') {
error("Wrong file format");
}
Level lvl(level);
debugCN(2, kDebugMinigames, "%d: ", level);
- while (xbuf.tell() < xbuf.size()) {
- xbuf > ch;
+ while (buf.pos() < buf.size()) {
+ ch = buf.readByte();
if (Common::isDigit(ch)) {
- --xbuf;
- int game;
- xbuf >= game;
+ int game = ch - '0';
lvl.games.push_back(game);
debugCN(2, kDebugMinigames, "%d, ", game);
if (const MinigameData *data = _runtime->getScore(level, game))
@@ -109,7 +112,6 @@ Scores::Scores(MinigameManager *runtime) {
levels_.push_back(lvl);
debugC(2, kDebugMinigames, "");
}
-#endif
if (levels_.empty())
return;
@@ -128,9 +130,9 @@ Scores::Scores(MinigameManager *runtime) {
if (!(_currentLevel = _runtime->parameter("current_level")))
return;
- if (!(_prev = _runtime->getObject(_runtime->parameter("_prevbutton"))))
+ if (!(_prev = _runtime->getObject(_runtime->parameter("prev_button"))))
return;
- if (!(_next = _runtime->getObject(_runtime->parameter("_nextbutton"))))
+ if (!(_next = _runtime->getObject(_runtime->parameter("next_button"))))
return;
_outMaxLevel = _runtime->getObject(_runtime->parameter("for_game_level"));
diff --git a/engines/qdengine/minigames/adv/m_scores.h b/engines/qdengine/minigames/adv/m_scores.h
index 4bfc7b8de58..9e190b0884a 100644
--- a/engines/qdengine/minigames/adv/m_scores.h
+++ b/engines/qdengine/minigames/adv/m_scores.h
@@ -27,6 +27,8 @@
namespace QDEngine {
+MinigameInterface *createMinigameScores(MinigameManager *runtime);
+
class Scores : public MinigameInterface {
public:
Scores(MinigameManager *runtime);
diff --git a/engines/qdengine/qdcore/qd_minigame.cpp b/engines/qdengine/qdcore/qd_minigame.cpp
index ad91e1c016a..c8ac64be804 100644
--- a/engines/qdengine/qdcore/qd_minigame.cpp
+++ b/engines/qdengine/qdcore/qd_minigame.cpp
@@ -64,6 +64,7 @@
#include "qdengine/minigames/3mice2_babochka.h"
// dogncat
+#include "qdengine/minigames/adv/m_scores.h"
#include "qdengine/minigames/adv/m_triangles.h"
namespace QDEngine {
@@ -378,8 +379,9 @@ bool qdMiniGame::load_interface() {
} else if (_dll_name == "DLL\\triangles.dll") {
_interface = create_adv_minigame(_dll_name.c_str(), createMinigameTriangle);
return true;
- // scores.dll
- // triangles.dll
+ } else if (_dll_name == "DLL\\scores.dll") {
+ _interface = create_adv_minigame(_dll_name.c_str(), createMinigameScores);
+ return true;
// dogncat2
// scores.dll
Commit: 829530f2d4f7821e70623ff8c8fa5f216fd43754
https://github.com/scummvm/scummvm/commit/829530f2d4f7821e70623ff8c8fa5f216fd43754
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Implement swap.dll minigame
Changed paths:
engines/qdengine/minigames/adv/m_swap.cpp
engines/qdengine/minigames/adv/m_swap.h
engines/qdengine/qdcore/qd_minigame.cpp
diff --git a/engines/qdengine/minigames/adv/m_swap.cpp b/engines/qdengine/minigames/adv/m_swap.cpp
index f5ea853e9eb..9881b4a62dc 100644
--- a/engines/qdengine/minigames/adv/m_swap.cpp
+++ b/engines/qdengine/minigames/adv/m_swap.cpp
@@ -20,6 +20,7 @@
*/
#include "common/debug.h"
+#include "common/memstream.h"
#include "qdengine/qdengine.h"
#include "qdengine/minigames/adv/common.h"
@@ -71,11 +72,9 @@ Swap::Swap(MinigameManager *runtime) {
return;
_nextRotateTime = _runtime->getTime() + _rotateTimePeriod;
- /*const char *name_begin = */_runtime->parameter("obj_name_begin", "obj_");
+ const char *name_begin = _runtime->parameter("obj_name_begin", "obj_");
- warning("STUB: Swap::Swap()");
-#if 0
- XBuffer gameData;
+ Common::MemoryReadWriteStream gameData(DisposeAfterUse::YES);
for (int idx = 0; idx < _gameSize; ++idx) {
Common::String buf = Common::String::format("%s%02d", name_begin, idx + 1);
@@ -86,16 +85,22 @@ Swap::Swap(MinigameManager *runtime) {
node.obj.setState(getStateName(node.angle, false));
_nodes.push_back(node);
- gameData.write(node.obj->R());
+ node.obj->R().write(gameData);
}
if (!_runtime->processGameData(gameData))
return;
_positions.resize(_gameSize);
- for (int idx = 0; idx < _gameSize; ++idx)
- gameData.read(_positions[idx]);
-#endif
+ GameInfo *gameInfo = _runtime->getCurrentGameInfo();
+ if (gameInfo) {
+ Common::MemoryReadStream buf((byte *)gameInfo->_gameData, gameInfo->_dataSize);
+ for (auto &it : _positions)
+ it.read(buf);
+ } else {
+ for (auto &it : _positions)
+ it.read(gameData);
+ }
_size = _runtime->getParameter("element_size", _runtime->getSize(_nodes[0].obj));
assert(_size.x > 0.f && _size.y > 0.f && _size.x < 500.f && _size.y < 500.f);
diff --git a/engines/qdengine/minigames/adv/m_swap.h b/engines/qdengine/minigames/adv/m_swap.h
index 79ad429c7cc..ee02bcb34f9 100644
--- a/engines/qdengine/minigames/adv/m_swap.h
+++ b/engines/qdengine/minigames/adv/m_swap.h
@@ -26,6 +26,8 @@
namespace QDEngine {
+MinigameInterface *createMinigameSwap(MinigameManager *runtime);
+
class Swap : public MinigameInterface {
public:
Swap(MinigameManager *runtime);
diff --git a/engines/qdengine/qdcore/qd_minigame.cpp b/engines/qdengine/qdcore/qd_minigame.cpp
index c8ac64be804..e60be55bdd6 100644
--- a/engines/qdengine/qdcore/qd_minigame.cpp
+++ b/engines/qdengine/qdcore/qd_minigame.cpp
@@ -67,6 +67,9 @@
#include "qdengine/minigames/adv/m_scores.h"
#include "qdengine/minigames/adv/m_triangles.h"
+// dogncat2
+#include "qdengine/minigames/adv/m_swap.h"
+
namespace QDEngine {
qdMiniGame::qdMiniGame() : _dll_handle(NULL),
@@ -384,8 +387,9 @@ bool qdMiniGame::load_interface() {
return true;
// dogncat2
- // scores.dll
- // swap.dll
+ } else if (_dll_name == "DLL\\swap.dll") {
+ _interface = create_adv_minigame(_dll_name.c_str(), createMinigameSwap);
+ return true;
} else {
warning("qdMiniGame::load_interface(): trying to load dll: %s", _dll_name.c_str());
// call here dll->open_game_interface(game_name())
Commit: 6174696541f1b55d58a7c8597ae6f278486df58a
https://github.com/scummvm/scummvm/commit/6174696541f1b55d58a7c8597ae6f278486df58a
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Implement MinigameManager::testAllGamesWin()
Changed paths:
engines/qdengine/minigames/adv/RunTime.cpp
diff --git a/engines/qdengine/minigames/adv/RunTime.cpp b/engines/qdengine/minigames/adv/RunTime.cpp
index b17dbf8adae..b7f7aa0dbb3 100644
--- a/engines/qdengine/minigames/adv/RunTime.cpp
+++ b/engines/qdengine/minigames/adv/RunTime.cpp
@@ -20,6 +20,7 @@
*/
#include "common/debug.h"
+#include "common/file.h"
#include "common/memstream.h"
#include "common/savefile.h"
@@ -616,38 +617,30 @@ const MinigameData *MinigameManager::getScore(int level, int game) const {
}
bool MinigameManager::testAllGamesWin() {
- warning("STUB: MinigameManager::testAllGamesWin()");
-
-#if 0
- XStream file(false);
- if (!file.open(gameListFileName(), XS_IN))
+ Common::File file;
+ if (!file.open(Common::Path(gameListFileName())))
return false;
char read_buf[512];
- while (!file.eof()) {
- file.getline(read_buf, 512);
- XBuffer xbuf((void*)read_buf, strlen(read_buf));
- int level;
- xbuf >= level;
- unsigned char ch;
- xbuf > ch;
+ while (!file.eos()) {
+ file.readLine(read_buf, 512);
+ Common::MemoryReadStream buf((const byte *)&read_buf[0], strlen(read_buf));
+ int level = buf.readByte() - '0';
+ byte ch = buf.readByte();
if (ch != ':') {
warning("MinigameManager::testAllGamesWin(): incorrect file format: '%s'", gameListFileName());
return false;
}
- while (xbuf.tell() < xbuf.size()) {
- xbuf > ch;
+ while (buf.pos() < buf.size()) {
+ ch = buf.readByte();
if (Common::isDigit(ch)) {
- --xbuf;
- int game;
- xbuf >= game;
+ int game = ch - '0';
const MinigameData *data = getScore(level, game);
if (!data || data->_sequenceIndex == -1)
return false;
}
}
}
-#endif
return true;
}
Commit: ef2a199af17f3a9167c619c3836bdaf5d09970ba
https://github.com/scummvm/scummvm/commit/ef2a199af17f3a9167c619c3836bdaf5d09970ba
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Fix unfinished games being displayed in scores.dll
Changed paths:
engines/qdengine/minigames/adv/m_scores.cpp
diff --git a/engines/qdengine/minigames/adv/m_scores.cpp b/engines/qdengine/minigames/adv/m_scores.cpp
index f38043cd789..8e48606c78b 100644
--- a/engines/qdengine/minigames/adv/m_scores.cpp
+++ b/engines/qdengine/minigames/adv/m_scores.cpp
@@ -101,8 +101,10 @@ Scores::Scores(MinigameManager *runtime) {
int game = ch - '0';
lvl.games.push_back(game);
debugCN(2, kDebugMinigames, "%d, ", game);
- if (const MinigameData *data = _runtime->getScore(level, game))
- lvl.data.push_back(GameData(game, *data));
+ if (const MinigameData *data = _runtime->getScore(level, game)) {
+ if (data->_sequenceIndex != -1)
+ lvl.data.push_back(GameData(game, *data));
+ }
}
}
if (lvl.games.size() > _games.size()) {
Commit: 0c9b2d89df2352b1b36ae869c36811b107a9c5a6
https://github.com/scummvm/scummvm/commit/0c9b2d89df2352b1b36ae869c36811b107a9c5a6
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Add missing parameters in scores.dll minigame
Changed paths:
engines/qdengine/minigames/adv/m_scores.cpp
engines/qdengine/minigames/adv/m_scores.h
diff --git a/engines/qdengine/minigames/adv/m_scores.cpp b/engines/qdengine/minigames/adv/m_scores.cpp
index 8e48606c78b..62dc3b0d90e 100644
--- a/engines/qdengine/minigames/adv/m_scores.cpp
+++ b/engines/qdengine/minigames/adv/m_scores.cpp
@@ -129,6 +129,8 @@ Scores::Scores(MinigameManager *runtime) {
return;
if (!(_lastTime = _runtime->parameter("last_time")))
return;
+ if (!(_timeFormat = _runtime->parameter("time_format")))
+ return;
if (!(_currentLevel = _runtime->parameter("current_level")))
return;
@@ -137,6 +139,9 @@ Scores::Scores(MinigameManager *runtime) {
if (!(_next = _runtime->getObject(_runtime->parameter("next_button"))))
return;
+ if (!(_gameBorder = _runtime->getObject(_runtime->parameter("game_border"))))
+ return;
+
_outMaxLevel = _runtime->getObject(_runtime->parameter("for_game_level"));
if (_outMaxLevel) {
uint level = 0;
diff --git a/engines/qdengine/minigames/adv/m_scores.h b/engines/qdengine/minigames/adv/m_scores.h
index 9e190b0884a..e0eaf09dffb 100644
--- a/engines/qdengine/minigames/adv/m_scores.h
+++ b/engines/qdengine/minigames/adv/m_scores.h
@@ -64,8 +64,11 @@ private:
const char *_lastScore;
const char *_lastTime;
+ const char *_timeFormat;
+
QDObject _prev;
QDObject _next;
+ QDObject _gameBorder;
QDObject _outMaxLevel;
QDObjects _games;
Commit: f2dc7d426696430af0354eedfe60ba7323f088ab
https://github.com/scummvm/scummvm/commit/f2dc7d426696430af0354eedfe60ba7323f088ab
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Fix game border position in scores.dll
Changed paths:
engines/qdengine/minigames/adv/m_scores.cpp
diff --git a/engines/qdengine/minigames/adv/m_scores.cpp b/engines/qdengine/minigames/adv/m_scores.cpp
index 62dc3b0d90e..d301c63257c 100644
--- a/engines/qdengine/minigames/adv/m_scores.cpp
+++ b/engines/qdengine/minigames/adv/m_scores.cpp
@@ -205,6 +205,14 @@ void Scores::quant(float dt) {
}
}
+ _runtime->hide(_gameBorder);
+ for (int idx = 0; idx < (int)_games.size(); ++idx) {
+ if (_games[idx].hit(_runtime->mousePosition())) {
+ _gameBorder->set_R(_runtime->game2world(_runtime->world2game(_games[idx])));
+ break;
+ }
+ }
+
if (_runtime->mouseLeftPressed()) {
if (_level < (int)levels_.size() - 1 && lvl.data.size() == lvl.games.size() && _next.hit(_runtime->mousePosition()))
++_level;
Commit: d5e9f90be1e0d23959c9d32d450adc1e205b1483
https://github.com/scummvm/scummvm/commit/d5e9f90be1e0d23959c9d32d450adc1e205b1483
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Fix how time is displayed in scores.dll
Changed paths:
engines/qdengine/minigames/adv/m_scores.cpp
diff --git a/engines/qdengine/minigames/adv/m_scores.cpp b/engines/qdengine/minigames/adv/m_scores.cpp
index d301c63257c..7424d2d7754 100644
--- a/engines/qdengine/minigames/adv/m_scores.cpp
+++ b/engines/qdengine/minigames/adv/m_scores.cpp
@@ -171,6 +171,8 @@ void Scores::quant(float dt) {
assert(_level >= 0 && _level < (int)levels_.size());
const Level& lvl = levels_[_level];
+ char timeBuf[32];
+
if (_level != _preLevel) {
_preLevel = _level;
@@ -193,9 +195,21 @@ void Scores::quant(float dt) {
_games[gameNum].setState(Common::String::format("%d", _level).c_str());
_games[gameNum]->set_R(_positions[idx]);
_runtime->setText(getName(_bestScore, idx), data.info._bestScore);
- _runtime->setText(getName(_bestTime, idx), data.info._bestTime);
+
+ if (!_timeFormat || !*_timeFormat)
+ snprintf(timeBuf, 31, "%d", data.info._bestTime);
+ else
+ snprintf(timeBuf, 31, _timeFormat, data.info._bestTime / 60, data.info._bestTime % 60);
+
+ _runtime->setText(getName(_bestTime, idx), timeBuf);
_runtime->setText(getName(_lastScore, idx), data.info._lastScore);
- _runtime->setText(getName(_lastTime, idx), data.info._lastTime);
+
+ if (!_timeFormat || !*_timeFormat)
+ snprintf(timeBuf, 31, "%d", data.info._lastTime);
+ else
+ snprintf(timeBuf, 31, _timeFormat, data.info._lastTime / 60, data.info._lastTime % 60);
+
+ _runtime->setText(getName(_lastTime, idx), timeBuf);
} else {
_runtime->setText(getName(_bestScore, idx), "");
_runtime->setText(getName(_bestTime, idx), "");
Commit: d2df53446b5f3d376ac7e9c0d2b8518a6f56ae3e
https://github.com/scummvm/scummvm/commit/d2df53446b5f3d376ac7e9c0d2b8518a6f56ae3e
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Add missing parameter in triangles.dll minigame
Changed paths:
engines/qdengine/minigames/adv/m_triangles.cpp
engines/qdengine/minigames/adv/m_triangles.h
diff --git a/engines/qdengine/minigames/adv/m_triangles.cpp b/engines/qdengine/minigames/adv/m_triangles.cpp
index 35c6376b79a..5935879c0ce 100644
--- a/engines/qdengine/minigames/adv/m_triangles.cpp
+++ b/engines/qdengine/minigames/adv/m_triangles.cpp
@@ -108,6 +108,8 @@ MinigameTriangle::MinigameTriangle(MinigameManager *runtime) {
if (!_runtime->getParameter("animation_time", _animationTime, true))
return;
+ _quickReselect = _runtime->getParameter("quick_reselect", false);
+
const char *faceNameBegin = _runtime->parameter("object_name_begin", "obj_");
const char *backNameBegin = _runtime->parameter("backg_name_begin", "element__back");
const char *selectNameBegin = _runtime->parameter("select_name_begin", "element_select_");
diff --git a/engines/qdengine/minigames/adv/m_triangles.h b/engines/qdengine/minigames/adv/m_triangles.h
index 202268bdef1..6453e61923c 100644
--- a/engines/qdengine/minigames/adv/m_triangles.h
+++ b/engines/qdengine/minigames/adv/m_triangles.h
@@ -91,6 +91,8 @@ private:
int _selected = 0;
int _hovered = 0;
+ bool _quickReselect;
+
AnimationState _animationState = NO_ANIMATION;
int _animatedNodes[2] = { 0 };
float _animationTime = 0.0;
Commit: 364c812b58a63d66aea6014dafa1452ab1fbfa3e
https://github.com/scummvm/scummvm/commit/364c812b58a63d66aea6014dafa1452ab1fbfa3e
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Implement puzzle.dll minigame
Changed paths:
engines/qdengine/minigames/adv/m_puzzle.cpp
engines/qdengine/minigames/adv/m_puzzle.h
engines/qdengine/qdcore/qd_minigame.cpp
diff --git a/engines/qdengine/minigames/adv/m_puzzle.cpp b/engines/qdengine/minigames/adv/m_puzzle.cpp
index b6885a5abfe..d3957461da6 100644
--- a/engines/qdengine/minigames/adv/m_puzzle.cpp
+++ b/engines/qdengine/minigames/adv/m_puzzle.cpp
@@ -20,6 +20,7 @@
*/
#include "common/debug.h"
+#include "common/memstream.h"
#include "qdengine/qdengine.h"
#include "qdengine/minigames/adv/common.h"
@@ -96,15 +97,12 @@ Puzzle::Puzzle(MinigameManager *runtime) {
assert(flySpeed_ > 0.f);
returnSpeed_ = _runtime->getParameter("inventory_return_speed", -1.f);
- warning("STUB: Puzzle::Puzzle()");
-
-#if 0
const char *name_begin = _runtime->parameter("obj_name_begin", "obj_");
char buf[128];
buf[127] = 0;
- XBuffer gameData;
+ Common::MemoryReadWriteStream gameData(DisposeAfterUse::YES);
for (int idx = 0; idx < gameSize_; ++idx) {
snprintf(buf, 127, "%s%02d", name_begin, idx + 1);
@@ -119,7 +117,7 @@ Puzzle::Puzzle(MinigameManager *runtime) {
node.angle = _runtime->rnd(0, angles_ - 1);
node.obj.setState(getStateName(node.angle, false, true));
- gameData.write(node.obj->R());
+ node.obj->R().write(gameData);
nodes_.push_back(node);
}
@@ -127,13 +125,24 @@ Puzzle::Puzzle(MinigameManager *runtime) {
if (!_runtime->processGameData(gameData))
return;
- for (int idx = 0; idx < gameSize_; ++idx) {
- mgVect3f crd;
- gameData.read(crd);
- nodes_[idx].obj->set_R(crd);
- positions_.push_back(crd);
+ GameInfo *gameInfo = _runtime->getCurrentGameInfo();
+ if (gameInfo) {
+ Common::MemoryReadStream data((byte *)gameInfo->_gameData, gameInfo->_dataSize);
+ for (int idx = 0; idx < gameSize_; ++idx) {
+ mgVect3f crd;
+ crd.read(data);
+ nodes_[idx].obj->set_R(crd);
+ positions_.push_back(crd);
+ }
+ } else {
+ for (int idx = 0; idx < gameSize_; ++idx) {
+ mgVect3f crd;
+ crd.read(gameData);
+ nodes_[idx].obj->set_R(crd);
+ positions_.push_back(crd);
+ }
}
-#endif
+
if (_runtime->debugMode())
nodes_[0].angle = angles_ - 1;
@@ -201,23 +210,24 @@ void Puzzle::put(int where, int what, float flowSpeed) {
if (flowSpeed > 0.f || isFlying(what)) {
FlyQDObject* flyObj = 0;
- for (auto &fit : flyObjs_) {
- if (fit.data == what)
+ FlyQDObjects::iterator fit;
+ for (fit = flyObjs_.begin(); fit != flyObjs_.end(); fit++) {
+ if (fit->data == what)
break;
- if (&fit != flyObjs_.end()) // ÐÑÐ¾Ñ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ñже леÑиÑ, пÑоÑÑо поменÑÑÑ ÑоÑÐºÑ Ð½Ð°Ð·Ð½Ð°ÑениÑ
- flyObj = &fit;
- else { // ÐобавлÑем новÑй леÑÑÑий ÑÑагменÑ
- flyObjs_.push_back(FlyQDObject());
- flyObj = &flyObjs_.back();
+ }
+ if (fit != flyObjs_.end()) // ÐÑÐ¾Ñ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ñже леÑиÑ, пÑоÑÑо поменÑÑÑ ÑоÑÐºÑ Ð½Ð°Ð·Ð½Ð°ÑениÑ
+ flyObj = fit;
+ else { // ÐобавлÑем новÑй леÑÑÑий ÑÑагменÑ
+ flyObjs_.push_back(FlyQDObject());
+ flyObj = &flyObjs_.back();
- flyObj->data = what;
+ flyObj->data = what;
- mgVect3f from = isOnMouse(node) ? node.obj->R() : start < -1 ? stackPosition(stidx(start)) : position(start);
- flyObj->current = _runtime->world2game(from);
- node.obj->set_R(from);
+ mgVect3f from = isOnMouse(node) ? node.obj->R() : start < -1 ? stackPosition(stidx(start)) : position(start);
+ flyObj->current = _runtime->world2game(from);
+ node.obj->set_R(from);
- flyObj->speed = flowSpeed;
- }
+ flyObj->speed = flowSpeed;
}
mgVect3f to = where < -1 ? stackPosition(stidx(where)) : position(where);
diff --git a/engines/qdengine/minigames/adv/m_puzzle.h b/engines/qdengine/minigames/adv/m_puzzle.h
index 03ecd988d19..19c71d528cb 100644
--- a/engines/qdengine/minigames/adv/m_puzzle.h
+++ b/engines/qdengine/minigames/adv/m_puzzle.h
@@ -27,6 +27,8 @@
namespace QDEngine {
+MinigameInterface *createMinigamePuzzle(MinigameManager *runtime);
+
class Puzzle : public MinigameInterface {
struct Node {
QDObject obj;
diff --git a/engines/qdengine/qdcore/qd_minigame.cpp b/engines/qdengine/qdcore/qd_minigame.cpp
index e60be55bdd6..ade5b88d047 100644
--- a/engines/qdengine/qdcore/qd_minigame.cpp
+++ b/engines/qdengine/qdcore/qd_minigame.cpp
@@ -70,6 +70,9 @@
// dogncat2
#include "qdengine/minigames/adv/m_swap.h"
+// klepa
+#include "qdengine/minigames/adv/m_puzzle.h"
+
namespace QDEngine {
qdMiniGame::qdMiniGame() : _dll_handle(NULL),
@@ -342,6 +345,9 @@ bool qdMiniGame::load_interface() {
// klepa
// Karaoke.dll
// puzzle.dll
+ } else if (_dll_name == "DLL\\puzzle.dll") {
+ _interface = create_adv_minigame(_dll_name.c_str(), createMinigamePuzzle);
+ return true;
// 3mice2
} else if (_dll_name == "DLL\\3Mice2_sbor_karty.dll") {
Commit: 4332759d763bb56847321c04e4524238a128171e
https://github.com/scummvm/scummvm/commit/4332759d763bb56847321c04e4524238a128171e
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Add stub warnings to triangles minigame
Changed paths:
engines/qdengine/minigames/adv/m_triangles.cpp
diff --git a/engines/qdengine/minigames/adv/m_triangles.cpp b/engines/qdengine/minigames/adv/m_triangles.cpp
index 5935879c0ce..087a92a295d 100644
--- a/engines/qdengine/minigames/adv/m_triangles.cpp
+++ b/engines/qdengine/minigames/adv/m_triangles.cpp
@@ -343,6 +343,8 @@ void MinigameTriangle::endSwapNodes(int pos1, int pos2) {
}
bool MinigameTriangle::animate(float dt) {
+ warning("STUB: MinigameTriangle::animate()");
+
if (_animationState == NO_ANIMATION)
return false;
@@ -497,6 +499,8 @@ void MinigameTriangle::quant(float dt) {
}
}
+ warning("STUB: MinigameTriangle::quant()");
+
if (_hovered != mousePos || _selected != lastSelected) {
highlight(_hovered, false);
highlight(_selected >= 0 ? _selected : lastSelected, false);
Commit: 2028a536220d78a77098328a31f75ff0b7a88d6e
https://github.com/scummvm/scummvm/commit/2028a536220d78a77098328a31f75ff0b7a88d6e
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Fix crash when translating long string in debug messages
Ensure string terminator is placed within array bounds. This fixes the
crashes that happen when trying to use transCyrillic in debug output
messages. For example, the program crashes with scores.dll minigame,
when hovering the animal's image with mouse
Changed paths:
engines/qdengine/qdengine.cpp
diff --git a/engines/qdengine/qdengine.cpp b/engines/qdengine/qdengine.cpp
index fed3bc6d4a3..a479af45757 100644
--- a/engines/qdengine/qdengine.cpp
+++ b/engines/qdengine/qdengine.cpp
@@ -624,7 +624,10 @@ byte *transCyrillic(const Common::String &str) {
}
}
- tmp[i] = 0;
+ if (i < 1024)
+ tmp[i] = 0;
+ else
+ tmp[1023] = 0;
return tmp;
}
Commit: 77a914c19a2c242b504773eeb2aabd133af6bc52
https://github.com/scummvm/scummvm/commit/77a914c19a2c242b504773eeb2aabd133af6bc52
Author: Alikhan Balpykov (luxrage1990 at gmail.com)
Date: 2025-05-26T17:40:39+02:00
Commit Message:
QDENGINE: Call finit() before destroying qdMiniGameInterface
Changed paths:
engines/qdengine/qdcore/qd_minigame.cpp
diff --git a/engines/qdengine/qdcore/qd_minigame.cpp b/engines/qdengine/qdcore/qd_minigame.cpp
index ade5b88d047..b8c3d5edecd 100644
--- a/engines/qdengine/qdcore/qd_minigame.cpp
+++ b/engines/qdengine/qdcore/qd_minigame.cpp
@@ -87,6 +87,8 @@ qdMiniGame::qdMiniGame(const qdMiniGame &mg) : qdNamedObject(mg),
}
qdMiniGame::~qdMiniGame() {
+ if (_interface)
+ _interface->finit();
release_interface();
}
More information about the Scummvm-git-logs
mailing list