[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