aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVhati2018-11-07 17:49:19 -0500
committerFilippos Karapetis2018-11-08 00:49:19 +0200
commita37e38830496f4a414bd671428aedbe8831652ff (patch)
tree4ae6ce62329cdec779fcc839c00fd590af15f4b5
parent243e261883e2b7955f1fd0925124700e899863d4 (diff)
downloadscummvm-rg350-a37e38830496f4a414bd671428aedbe8831652ff.tar.gz
scummvm-rg350-a37e38830496f4a414bd671428aedbe8831652ff.tar.bz2
scummvm-rg350-a37e38830496f4a414bd671428aedbe8831652ff.zip
SCI32: Fix QFG4 autosave deleting manual saves (#1383)
Prevents the autosave script from enforcing a 20 savegame limit, bug #10758
-rw-r--r--engines/sci/engine/script_patches.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index b91a7c22ec..be1b18fc64 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -7199,8 +7199,48 @@ static const uint16 qg4InnPathfindingPatch[] = {
PATCH_END
};
+// When autosave is enabled, Glory::save() (script 0) deletes savegame files in
+// a loop: while disk space is insufficient for a new save, or while there are
+// 20+ saves. Since ScummVM handles slots differently and allows far more
+// slots, this deletes all but the most recent 19 manual saves, merely by
+// walking from room to room!
+//
+// Ironically, kGetSaveFiles() (kfile.cpp) and the debugger's 'list_files'
+// command rely on listSavegames() (file.cpp), which specifically omits the
+// autosave slot, so the script will only ever delete manual saves. And the
+// space check doesn't take into account the reduced demand when overwriting an
+// existing autosave.
+//
+// No good can come of this loop. So we skip it entirely. If the disk truly is
+// out of space, a message box will complain, and the player can delete saves
+// voluntarily.
+//
+// Note: Glory::save() contains another space freeing loop, but it might be
+// unreachable.
+//
+// Applies to at least: English CD, English floppy
+// Responsible method: Glory::save()
+// Fixes bug: #10758
+static const uint16 qg4AutosaveSignature[] = {
+ SIG_MAGICDWORD,
+ 0x43, 0x3f, SIG_UINT16(0x0002), // callk CheckFreeSpace[3f], 02
+ 0x18, // not
+ 0x2f, 0x05, // bt 05 [skip other OR condition]
+ 0x8d, 0x09, // lst temp[9] (savegame file count)
+ 0x35, 0x14, // ldi 20d
+ 0x20, // ge?
+ 0x30, PATCH_UINT16(0x0038), // bnt [end the loop]
+ SIG_END
+};
+
+static const uint16 qg4AutosavePatch[] = {
+ 0x32, PATCH_UINT16(0x0044), // jmp [end the loop]
+ PATCH_END
+};
+
// script, description, signature patch
static const SciScriptPatcherEntry qfg4Signatures[] = {
+ { true, 0, "prevent autosave from deleting save games", 1, qg4AutosaveSignature, qg4AutosavePatch },
{ true, 1, "disable volume reset on startup", 1, sci2VolumeResetSignature, sci2VolumeResetPatch },
{ true, 1, "disable video benchmarking", 1, qfg4BenchmarkSignature, qfg4BenchmarkPatch },
{ true, 83, "fix incorrect array type", 1, qfg4TrapArrayTypeSignature, qfg4TrapArrayTypePatch },