[Scummvm-git-logs] scummvm master -> 88c796e3a6cbf9455b25283c91a97612063a77f9
sev-
noreply at scummvm.org
Tue Oct 22 16:22:47 UTC 2024
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
df0c514fe9 QDENGINE: Unstub MinigameManager::saveState()
33512fc49b QDENGINE: Unstub MinigameManager::loadState()
88c796e3a6 QDENGINE: Fix potential null dereference. CID 1563896
Commit: df0c514fe9b22bb59258afdfd06cfad2fb109036
https://github.com/scummvm/scummvm/commit/df0c514fe9b22bb59258afdfd06cfad2fb109036
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-10-22T18:22:33+02:00
Commit Message:
QDENGINE: Unstub MinigameManager::saveState()
Changed paths:
engines/qdengine/minigames/adv/RunTime.cpp
engines/qdengine/minigames/adv/RunTime.h
engines/qdengine/qdcore/qd_minigame_interface.cpp
engines/qdengine/qdcore/qd_minigame_interface.h
engines/qdengine/qdengine.h
diff --git a/engines/qdengine/minigames/adv/RunTime.cpp b/engines/qdengine/minigames/adv/RunTime.cpp
index 5518cdeb143..6ffa3217eec 100644
--- a/engines/qdengine/minigames/adv/RunTime.cpp
+++ b/engines/qdengine/minigames/adv/RunTime.cpp
@@ -21,6 +21,7 @@
#include "common/debug.h"
#include "common/memstream.h"
+#include "common/savefile.h"
#include "qdengine/qdengine.h"
#include "qdengine/minigames/adv/common.h"
@@ -68,7 +69,7 @@ private:
MinigameManager::MinigameManager(MinigameConsCallback callback)
: currentGameIndex_(-1, -1) {
- state_container_name_ = "Saves/minigames.dat";
+ state_container_name_ = Common::String::format("%s.min", g_engine->getTargetName().c_str());
engine_ = 0;
scene_ = 0;
@@ -465,31 +466,27 @@ bool MinigameManager::loadState(bool current) {
return true;
}
-extern bool createDirForFile(const char *partialPath);
void MinigameManager::saveState(bool force) {
debugC(2, kDebugMinigames, "MinigameManager::save_state(): save state");
- warning("STUB: MinigameManager::saveState()");
-
-#if 0
if (force || currentGameIndex_.gameNum_ >= 0) {
- XStream file(false);
- if (createDirForFile(state_container_name_) && file.open(state_container_name_, XS_OUT)) {
- file < GameInfo::version();
- file < (engine_ ? engine_->rnd(999999) : seed_);
+ Common::OutSaveFile *file = g_engine->getSaveFileManager()->openForSaving(state_container_name_);
+
+ if (file) {
+ file->writeUint32LE(GameInfo::version());
+ file->writeUint32LE(engine_ ? engine_->rnd(999999) : seed_);
for (auto &it : gameInfos_) {
if (!it._value.empty()) {
debugC(2, kDebugMinigames, "MinigameManager::save_state(): write game info: (%d,%d), index: %d, game data: %d", it._key.gameLevel_, it._key.gameNum_, it._value.game_.sequenceIndex_, it._value.empty_ ? 0 : 1);
- file.write(it._key);
- file < it._value;
+ it._key.write(*file);
+ it._value.write(*file);
}
}
} else {
- warning("MinigameManager::saveState(): Failed to save file '%s'", state_container_name_);
+ warning("MinigameManager::saveState(): Failed to save file '%s'", state_container_name_.c_str());
}
}
-#endif
}
bool MinigameManager::quant(float dt) {
@@ -894,13 +891,13 @@ bool MinigameManager::processGameData(Common::SeekableReadStream &data) {
if (currentGameInfo_->empty_) {
currentGameInfo_->empty_ = false;
assert(data.pos());
- currentGameInfo_->write(data);
+ currentGameInfo_->persist(data);
} else {
if (data.pos() != currentGameInfo_->dataSize_)
- warning("MinigameManager::processGameData(): Old minigame save detected. Remove '%s'", state_container_name_);
+ warning("MinigameManager::processGameData(): Old minigame save detected. Remove '%s'", state_container_name_.c_str());
if (data.pos() == currentGameInfo_->dataSize_) {
- currentGameInfo_->write(data);
+ currentGameInfo_->persist(data);
} else {
data.seek(0);
return false;
@@ -920,7 +917,7 @@ MinigameData::MinigameData() {
bestScore_ = 0;
}
-void MinigameData::write(Common::SeekableWriteStream &out) {
+void MinigameData::write(Common::WriteStream &out) const {
out.writeSint32LE(sequenceIndex_);
out.writeSint32LE(lastScore_);
out.writeSint32LE(lastTime_);
@@ -928,7 +925,7 @@ void MinigameData::write(Common::SeekableWriteStream &out) {
out.writeSint32LE(bestScore_);
}
-void MinigameData::read(Common::SeekableReadStream &out) {
+void MinigameData::read(Common::ReadStream &out) {
sequenceIndex_ = out.readSint32LE();
lastScore_ = out.readSint32LE();
lastTime_ = out.readSint32LE();
@@ -952,7 +949,7 @@ void GameInfo::free() {
dataSize_ = 0;
}
-void GameInfo::write(Common::SeekableReadStream &in) {
+void GameInfo::persist(Common::SeekableReadStream &in) {
if (dataSize_ != in.size()) {
free();
if (in.size() > 0) {
@@ -964,35 +961,48 @@ void GameInfo::write(Common::SeekableReadStream &in) {
in.read(gameData_, dataSize_);
}
-#if 0
-XStream &operator< (XStream& out, const GameInfo& info) {
- out.write(info.game_);
- out.write(info.empty_);
- if (!info.empty_) {
- out.write(info.timeManagerData_);
- out.write(info.effectManagerData_);
- out < info.dataSize_;
- if (info.dataSize_ > 0)
- out.write(info.gameData_, info.dataSize_);
+void GameInfo::write(Common::WriteStream &out) const {
+ game_.write(out);
+ out.writeByte(empty_);
+
+ if (!empty_) {
+ timeManagerData_.crd.write(out);
+ effectManagerData_.crd.write(out);
+
+ out.writeUint32LE(dataSize_);
+ if (dataSize_ > 0)
+ out.write(gameData_, dataSize_);
}
- return out;
}
-XStream &operator> (XStream& in, GameInfo& info) {
- in.read(info.game_);
- in.read(info.empty_);
- if (!info.empty_) {
- in.read(info.timeManagerData_);
- in.read(info.effectManagerData_);
- uint size;
- in > size;
- XBuffer buf(size);
- in.read(buf.buffer(), size);
- info.write(buf.buffer(), size);
+void GameInfo::read(Common::ReadStream &in) {
+ game_.read(in);
+ empty_ = in.readByte();
+
+ if (!empty_) {
+ timeManagerData_.crd.read(in);
+ effectManagerData_.crd.read(in);
+
+ free();
+
+ dataSize_ = in.readUint32LE();
+
+ if (dataSize_) {
+ gameData_ = malloc(dataSize_);
+ in.read(gameData_, dataSize_);
+ }
}
- return in;
}
-#endif
+
+void MinigameManager::GameInfoIndex::write(Common::WriteStream &out) const {
+ out.writeUint32LE(gameNum_);
+ out.writeUint32LE(gameLevel_);
+}
+
+void MinigameManager::GameInfoIndex::read(Common::ReadStream &in) {
+ gameNum_ = in.readUint32LE();
+ gameLevel_ = in.readUint32LE();
+}
//========================================================================================================================
diff --git a/engines/qdengine/minigames/adv/RunTime.h b/engines/qdengine/minigames/adv/RunTime.h
index ae803bd4b7e..9f990f3d084 100644
--- a/engines/qdengine/minigames/adv/RunTime.h
+++ b/engines/qdengine/minigames/adv/RunTime.h
@@ -58,13 +58,17 @@ struct MinigameData {
int bestTime_;
int bestScore_;
- void write(Common::SeekableWriteStream &out);
- void read(Common::SeekableReadStream &out);
+ void write(Common::WriteStream &out) const;
+ void read(Common::ReadStream &out);
};
struct GameInfo {
GameInfo();
- void write(Common::SeekableReadStream &in);
+ void persist(Common::SeekableReadStream &in);
+
+ void write(Common::WriteStream &out) const;
+ void read(Common::ReadStream &in);
+
void free();
static int version() {
return 9;
@@ -241,7 +245,7 @@ private:
bool invertMouseButtons_;
// Ð¸Ð¼Ñ Ñайла и инÑоÑмаÑией о миниигÑаÑ
- const char *state_container_name_;
+ Common::String state_container_name_;
// колиÑеÑÑво пÑойденнÑÑ
Ð¸Ð³Ñ Ð½Ð° каждом ÑÑовне
typedef Common::HashMap<int, int> Counters;
Counters completeCounters_;
@@ -250,6 +254,10 @@ private:
GameInfoIndex(int idx, int level) : gameNum_(idx), gameLevel_(level) {}
int gameNum_;
int gameLevel_;
+
+ void write(Common::WriteStream &out) const;
+ void read(Common::ReadStream &in);
+
bool operator< (const GameInfoIndex& rs) const {
return gameLevel_ == rs.gameLevel_ ? gameNum_ < rs.gameNum_ : gameLevel_ < rs.gameLevel_;
}
diff --git a/engines/qdengine/qdcore/qd_minigame_interface.cpp b/engines/qdengine/qdcore/qd_minigame_interface.cpp
index c3e084c8b23..3123174693f 100644
--- a/engines/qdengine/qdcore/qd_minigame_interface.cpp
+++ b/engines/qdengine/qdcore/qd_minigame_interface.cpp
@@ -43,7 +43,7 @@
namespace QDEngine {
template<>
-void mgVect3<float>::write(Common::WriteStream &out) {
+void mgVect3<float>::write(Common::WriteStream &out) const {
out.writeFloatLE(x);
out.writeFloatLE(y);
out.writeFloatLE(z);
diff --git a/engines/qdengine/qdcore/qd_minigame_interface.h b/engines/qdengine/qdcore/qd_minigame_interface.h
index cefda9663a8..1f5617bb262 100644
--- a/engines/qdengine/qdcore/qd_minigame_interface.h
+++ b/engines/qdengine/qdcore/qd_minigame_interface.h
@@ -214,7 +214,7 @@ public:
return mgVect3(*this) *= v;
}
- void write(Common::WriteStream &out);
+ void write(Common::WriteStream &out) const;
void read(Common::ReadStream &out);
T x;
diff --git a/engines/qdengine/qdengine.h b/engines/qdengine/qdengine.h
index d37ef004715..36f1400cb1c 100644
--- a/engines/qdengine/qdengine.h
+++ b/engines/qdengine/qdengine.h
@@ -96,6 +96,7 @@ public:
* Returns the game Id
*/
Common::String getGameId() const;
+ Common::String getTargetName() const { return _targetName; }
const char *getExeName() const;
Commit: 33512fc49b1f59ae2b9db19468558d9e83c986cf
https://github.com/scummvm/scummvm/commit/33512fc49b1f59ae2b9db19468558d9e83c986cf
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-10-22T18:22:36+02:00
Commit Message:
QDENGINE: Unstub 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 6ffa3217eec..f1f27c84898 100644
--- a/engines/qdengine/minigames/adv/RunTime.cpp
+++ b/engines/qdengine/minigames/adv/RunTime.cpp
@@ -412,8 +412,6 @@ int MinigameManager::load_game(const qdEngineInterface *engine, const qdMinigame
}
bool MinigameManager::loadState(bool current) {
- warning("STUB: MinigameManager::loadState()");
-#if 0
if (game_) {
debugC(2, kDebugMinigames, "MinigameManager::loadState(): load state skiped");
return false;
@@ -434,35 +432,40 @@ bool MinigameManager::loadState(bool current) {
if (current)
debugC(2, kDebugMinigames, "MinigameManager::loadState(): current game: (%d,%d)", currentGameIndex_.gameLevel_, currentGameIndex_.gameNum_);
- XStream file(false);
- if (file.open(state_container_name_, XS_IN)) {
- int version;
- file > version;
+ Common::InSaveFile *file = g_engine->getSaveFileManager()->openForLoading(state_container_name_);
+ if (file) {
+ int version = file->readUint32LE();
+
if (version != GameInfo::version()) {
- warning("MinigameManager::loadState(): Minigame savestate version mismatch. Remove '%s'", state_container_name_);
+ warning("MinigameManager::loadState(): Minigame savestate version mismatch. Remove '%s'", state_container_name_.c_str());
+
+ delete file;
return false;
}
- file > seed_;
+ seed_ = file->readUint32LE();
+
GameInfoIndex index(0, 0);
- while (!file.eof()) {
- file.read(index);
- assert(gameInfos_.find(index) == gameInfos_.end());
- if (file.eof())
- return false;
- {
- GameInfo data;
- file > data;
- debugC(2, kDebugMinigames, "MinigameManager::loadState(): read game info: (%d,%d), index: %d, game data:%d", index.gameLevel_, index.gameNum_, data.game_.sequenceIndex_, data.empty_ ? 0 : 1);
- if (data.game_.sequenceIndex_ >= 0)
- completeCounters_[index.gameLevel_]++;
- gameInfos_[index] = data;
- }
+
+ while (!file->eos()) {
+ index.read(*file);
+
+ GameInfo data;
+ data.read(*file);
+
+ debugC(2, kDebugMinigames, "MinigameManager::loadState(): read game info: (%d,%d), index: %d, game data:%d", index.gameLevel_, index.gameNum_, data.game_.sequenceIndex_, data.empty_ ? 0 : 1);
+
+ if (data.game_.sequenceIndex_ >= 0)
+ completeCounters_[index.gameLevel_]++;
+
+ gameInfos_[index] = data;
}
+
+ delete file;
}
currentGameInfo_ = current ? &gameInfos_[currentGameIndex_] : 0;
}
-#endif
+
return true;
}
@@ -483,6 +486,9 @@ void MinigameManager::saveState(bool force) {
it._value.write(*file);
}
}
+
+ file->finalize();
+ delete file;
} else {
warning("MinigameManager::saveState(): Failed to save file '%s'", state_container_name_.c_str());
}
Commit: 88c796e3a6cbf9455b25283c91a97612063a77f9
https://github.com/scummvm/scummvm/commit/88c796e3a6cbf9455b25283c91a97612063a77f9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-10-22T18:22:36+02:00
Commit Message:
QDENGINE: Fix potential null dereference. CID 1563896
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 f1f27c84898..65503d46865 100644
--- a/engines/qdengine/minigames/adv/RunTime.cpp
+++ b/engines/qdengine/minigames/adv/RunTime.cpp
@@ -273,13 +273,14 @@ bool MinigameManager::finit() {
if (scene_) {
SAFE_RELEASE(state_flag_)
SAFE_RELEASE(pause_flag_)
- }
- release(complete_help_miniature_);
- release(complete_help_);
+ release(complete_help_miniature_);
+ release(complete_help_);
+
+ release(game_help_);
+ release(game_help_trigger_);
+ }
- release(game_help_);
- release(game_help_trigger_);
game_help_enabled_ = true;
complete_help_state_name_.clear();
More information about the Scummvm-git-logs
mailing list