[Scummvm-git-logs] scummvm master -> 7572ce24874b39d3f1e8c323cd93598940ba82c3

sdelamarre noreply at scummvm.org
Mon May 1 20:15:00 UTC 2023


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

Summary:
01530e25a2 GOB: workaround for an infinite loop in the save screen of Adibou1 "Paint" game
7572ce2487 GOB: save/load drawings with thumbnail in later Adibou1 versions


Commit: 01530e25a273f2dea11680d600800df4499c1c39
    https://github.com/scummvm/scummvm/commit/01530e25a273f2dea11680d600800df4499c1c39
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-05-01T22:14:10+02:00

Commit Message:
GOB: workaround for an infinite loop in the save screen of Adibou1 "Paint" game

Changed paths:
    engines/gob/inter_v1.cpp


diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index fb312b66637..7858b4dd504 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -791,6 +791,17 @@ void Inter_v1::o1_repeatUntil(OpFuncParams &params) {
 		size = _vm->_game->_script->peekUint16(2) + 2;
 
 		funcBlock(1);
+		if (_vm->getGameType() == kGameTypeAdibou1) {
+			// WORKAROUND: some Adibou1 scripts have loops checking for
+			// VAR(1) (= isSoundPlaying) without calling opcodes which
+			// usually update this variable, leading to an infinite loop.
+			// This may be a script bug that was innocuous in the original
+			// version due to slightly different timing of sound state
+			// transition.
+			bool isSoundPlaying = _vm->_sound->blasterPlayingSound() ||
+								  _vm->_vidPlayer->isSoundPlaying();
+			WRITE_VAR(1, isSoundPlaying);
+		}
 
 		_vm->_game->_script->seek(blockPos + size + 1);
 


Commit: 7572ce24874b39d3f1e8c323cd93598940ba82c3
    https://github.com/scummvm/scummvm/commit/7572ce24874b39d3f1e8c323cd93598940ba82c3
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-05-01T22:14:10+02:00

Commit Message:
GOB: save/load drawings with thumbnail in later Adibou1 versions

Drawings from the "Paint" game are saved together with their thumbnail in a same "dessinXX.inf" file.

Changed paths:
    engines/gob/save/saveload.h
    engines/gob/save/saveload_adibou1.cpp


diff --git a/engines/gob/save/saveload.h b/engines/gob/save/saveload.h
index 46ba7091595..c9e46cf4a89 100644
--- a/engines/gob/save/saveload.h
+++ b/engines/gob/save/saveload.h
@@ -265,6 +265,7 @@ protected:
 /** Save/Load class for Adibou 1 */
 class SaveLoad_Adibou1 : public SaveLoad {
 public:
+	static const int32 kAdibou1NbrOfDrawings = 8;
 	SaveLoad_Adibou1(GobEngine *vm, const char *targetName);
 	~SaveLoad_Adibou1() override;
 
@@ -297,6 +298,30 @@ protected:
 		File _file;
 	};
 
+
+	class DrawingWithThumbnailHandler : public TempSpriteHandler {
+	public:
+		DrawingWithThumbnailHandler(GobEngine *vm,
+								   const Common::String &target,
+								   const Common::String &ext);
+		~DrawingWithThumbnailHandler() override;
+
+		int32 getSize() override;
+		bool load(int16 dataVar, int32 size, int32 offset) override;
+		bool save(int16 dataVar, int32 size, int32 offset) override;
+
+	private:
+		class File : public SlotFileStatic {
+		public:
+			File(GobEngine *vm, const Common::String &base, const Common::String &ext);
+			~File() override;
+		};
+
+		File _file;
+		SaveWriter *_writer;
+		SaveReader *_reader;
+	};
+
 	class GameFileHandler : public SaveHandler {
 	public:
 		GameFileHandler(GobEngine *vm, const Common::String &target, const Common::String &ext);
@@ -326,6 +351,7 @@ protected:
 	GameFileHandler *_constructionHandler;
 	SpriteHandler   *_drawingHandler;
 	TempSpriteHandler *_menuHandler;
+	DrawingWithThumbnailHandler *_drawingWithThumbnailHandler[kAdibou1NbrOfDrawings];
 
 	SaveHandler *getHandler(const char *fileName) const override;
 	const char *getDescription(const char *fileName) const override;
diff --git a/engines/gob/save/saveload_adibou1.cpp b/engines/gob/save/saveload_adibou1.cpp
index c36fd3f8db8..44144c5f965 100644
--- a/engines/gob/save/saveload_adibou1.cpp
+++ b/engines/gob/save/saveload_adibou1.cpp
@@ -30,16 +30,31 @@ SaveLoad_Adibou1::SaveFile SaveLoad_Adibou1::_saveFiles[] = {
 	{ "bou.inf", kSaveModeSave, nullptr, "adibou1"},
 	{ "dessin.inf", kSaveModeSave, nullptr, "paint game drawing"},
 	{ "const.inf", kSaveModeSave, nullptr, "construction game"},
-	{ "menu.inf", kSaveModeSave, nullptr, "temporary sprite"}
+	{ "menu.inf", kSaveModeSave, nullptr, "temporary sprite"},
+	{ "dessin1.inf", kSaveModeSave, nullptr, "paint game drawing"},
+	{ "dessin2.inf", kSaveModeSave, nullptr, "paint game drawing"},
+	{ "dessin3.inf", kSaveModeSave, nullptr, "paint game drawing"},
+	{ "dessin4.inf", kSaveModeSave, nullptr, "paint game drawing"},
+	{ "dessin5.inf", kSaveModeSave, nullptr, "paint game drawing"},
+	{ "dessin6.inf", kSaveModeSave, nullptr, "paint game drawing"},
+	{ "dessin7.inf", kSaveModeSave, nullptr, "paint game drawing"},
+	{ "dessin8.inf", kSaveModeSave, nullptr, "paint game drawing"}
 };
 
 SaveLoad_Adibou1::SaveLoad_Adibou1(GobEngine *vm, const char *targetName) :
 	SaveLoad(vm) {
 
-	_saveFiles[0].handler = _bouHandler = new GameFileHandler(vm, targetName, "bouinf");
-	_saveFiles[1].handler = _drawingHandler = new SpriteHandler(vm, targetName, "drawing");
-	_saveFiles[2].handler = _constructionHandler = new GameFileHandler(vm, targetName, "construction");
-	_saveFiles[3].handler = _menuHandler = new TempSpriteHandler(vm);;
+	uint32 index = 0;
+	_saveFiles[index++].handler = _bouHandler = new GameFileHandler(vm, targetName, "bouinf");
+	_saveFiles[index++].handler = _drawingHandler = new SpriteHandler(vm, targetName, "drawing");
+	_saveFiles[index++].handler = _constructionHandler = new GameFileHandler(vm, targetName, "construction");
+	_saveFiles[index++].handler = _menuHandler = new TempSpriteHandler(vm);;
+	for (int i = 0; i < kAdibou1NbrOfDrawings; i++) {
+		_saveFiles[index++].handler = _drawingWithThumbnailHandler[i] = new DrawingWithThumbnailHandler(vm,
+																									   targetName,
+																									   Common::String::format("drawing%02d", i + 1));
+	}
+
 }
 
 SaveLoad_Adibou1::~SaveLoad_Adibou1() {
@@ -47,6 +62,8 @@ SaveLoad_Adibou1::~SaveLoad_Adibou1() {
 	delete _drawingHandler;
 	delete _constructionHandler;
 	delete _menuHandler;
+	for (int i = 0; i < kAdibou1NbrOfDrawings; i++)
+		delete _drawingWithThumbnailHandler[i];
 }
 
 SaveLoad_Adibou1::SpriteHandler::File::File(GobEngine *vm, const Common::String &base, const Common::String &ext) :
@@ -112,6 +129,76 @@ bool SaveLoad_Adibou1::SpriteHandler::save(int16 dataVar, int32 size, int32 offs
 	return writer.writePart(0, _sprite);
 }
 
+SaveLoad_Adibou1::DrawingWithThumbnailHandler::File::File(GobEngine *vm, const Common::String &base, const Common::String &ext) :
+	SlotFileStatic(vm, base, ext) {
+}
+
+SaveLoad_Adibou1::DrawingWithThumbnailHandler::File::~File() {
+}
+
+SaveLoad_Adibou1::DrawingWithThumbnailHandler::DrawingWithThumbnailHandler(GobEngine *vm,
+																		 const Common::String &target,
+																		 const Common::String &ext)
+	: TempSpriteHandler(vm), _file(vm, target, ext) {
+
+	Common::String fileName = _file.build();
+	_reader = new SaveReader(2, 0, fileName); // Two parts: the thumbnail + the actual drawing
+	_writer = new SaveWriter(2, 0, fileName);
+}
+
+SaveLoad_Adibou1::DrawingWithThumbnailHandler::~DrawingWithThumbnailHandler() {
+	delete _reader;
+	delete _writer;
+}
+
+int32 SaveLoad_Adibou1::DrawingWithThumbnailHandler::getSize() {
+	if (!_reader)
+		return -1;;
+
+	if (!_reader->load())
+		return -1;
+
+	SaveHeader header1, header2;
+	if (!_reader->readPartHeader(0, &header1))
+		return -1;
+
+	if (!_reader->readPartHeader(1, &header2))
+		return -1;
+
+	return header1.getSize() + header2.getSize();
+}
+
+bool SaveLoad_Adibou1::DrawingWithThumbnailHandler::load(int16 dataVar, int32 size, int32 offset) {
+	if (!TempSpriteHandler::createFromSprite(dataVar, size, offset))
+		return false;
+
+	Common::String fileName = _file.build();
+	if (fileName.empty())
+		return false;
+
+	if (!_reader->load())
+		return false;
+
+	uint32 part = (offset == 0) ? 0 : 1;
+	if (!_reader->readPart(part, _sprite))
+		return false;
+
+	return TempSpriteHandler::load(dataVar, size, offset);
+}
+
+bool SaveLoad_Adibou1::DrawingWithThumbnailHandler::save(int16 dataVar, int32 size, int32 offset) {
+	if (!TempSpriteHandler::save(dataVar, size, offset))
+		return false;
+
+	Common::String fileName = _file.build();
+	if (fileName.empty())
+		return false;
+
+	uint32 part = (offset == 0) ? 0 : 1;
+	return _writer->writePart(part, _sprite);
+}
+
+
 SaveLoad_Adibou1::GameFileHandler::File::File(GobEngine *vm, const Common::String &base, const Common::String &ext) :
 	SlotFileStatic(vm, base, ext) {
 }




More information about the Scummvm-git-logs mailing list