[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 ¶ms) {
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