SCUMM: (v1-3) - move load post processing to extra function

This commit is contained in:
athrxx 2022-05-12 18:29:26 +02:00
parent dfe6082a12
commit 45cdc8ab07
4 changed files with 116 additions and 110 deletions

View file

@ -586,19 +586,6 @@ bool ScummEngine::loadState(int slot, bool compat, Common::String &filename) {
_sound->pauseSounds(false); _sound->pauseSounds(false);
// WORKAROUND: Original save/load script ran this script
// after game load, and o2_loadRoomWithEgo() does as well
// this script starts character-dependent music
//
// Fixes bug #3362: MANIACNES: Music Doesn't Start On Load Game
if (_game.platform == Common::kPlatformNES) {
runScript(5, 0, 0, nullptr);
if (VAR(224)) {
_sound->addSoundToQueue(VAR(224));
}
}
_sound->restoreAfterLoad(); _sound->restoreAfterLoad();
return true; return true;

View file

@ -2342,103 +2342,18 @@ load_game:
if (_completeScreenRedraw) { if (_completeScreenRedraw) {
clearCharsetMask(); clearCharsetMask();
_charset->_hasMask = false; _charset->_hasMask = false;
bool restoreFMTownsSounds = (_townsPlayer != nullptr);
if (_game.id == GID_LOOM) { if (_game.version > 3) {
// HACK as in game save stuff isn't supported exactly as in the original interpreter when using the if (_townsPlayer)
// ScummVM save/load dialog. The original save/load screen uses a special script (which we cannot _townsPlayer->restoreAfterLoad();
// call without displaying that screen) which will also makes some necessary follow-up operations. We
// simply try to achieve that manually. It fixes bugs #6011 and #13369.
// We just have to kind of pretend that we've gone through the save/load "room" (with all the right
// variables in place), so that all the operations get triggered properly.
// The glitch with the flask (#6011) seems to be present only in the DOS EGA, Amiga, Atari ST and
// FM-Towns versions. Mac, DOS Talkie and PC-Engine don't have that bug. We can rely on our old hack
// there, since it wouldn't work otherwise, anyway.
int args[NUM_SCRIPT_LOCAL];
memset(args, 0, sizeof(args));
uint saveLoadVar = 100;
if (_game.platform == Common::kPlatformMacintosh)
saveLoadVar = 105;
else if (_game.platform == Common::kPlatformPCEngine || _game.version == 4)
saveLoadVar = 150;
// Run this hack only under conditions where the original save script could actually be executed.
// Otherwise this would cause all sorts of glitches. Also exclude Mac, PC-Engine and DOS Talkie...
if (saveLoadVar == 100 && _userPut > 0 && !isScriptRunning(VAR(VAR_VERB_SCRIPT))) {
uint16 prevFlag = VAR(214) & 0x6000;
beginCutscene(args);
uint16 blockVerbsFlag = VAR(214) & (0x6000 ^ prevFlag);
if (Actor *a = derefActor(VAR(VAR_EGO))) {
// This is used to restore the correct camera position.
VAR(171) = a->_walkbox;
VAR(172) = a->getRealPos().x;
VAR(173) = a->getRealPos().y;
}
startScene(70, nullptr, 0);
VAR(saveLoadVar) = 0;
VAR(214) &= ~blockVerbsFlag;
endCutscene();
if (_game.platform == Common::kPlatformFMTowns && VAR(163)) {
// Sound restore script. Unlike other versions which handle this
// inside the usual entry scripts, FM-Towns calls this from the save script.
memset(args, 0, sizeof(args));
args[0] = VAR(163);
runScript(38, false, false, args);
}
restoreFMTownsSounds = false;
} else if (VAR(saveLoadVar) == 2) {
// This is our old hack. If verbs should be shown restore them.
byte restoreScript = (_game.platform == Common::kPlatformFMTowns) ? 17 : 18;
args[0] = 2;
runScript(restoreScript, 0, 0, args);
// Reset two variables, similar to what the save script would do, to avoid minor glitches
// of the verb image on the right of the distaff (image remaining blank when moving the
// mouse cursor over an object, bug #13369).
VAR(saveLoadVar + 2) = VAR(saveLoadVar + 3) = 0;
}
} else if (_game.version > 3) {
for (int i = 0; i < _numVerbs; i++) for (int i = 0; i < _numVerbs; i++)
drawVerb(i, 0); drawVerb(i, 0);
} else {
if (_game.platform != Common::kPlatformNES && _game.platform != Common::kPlatformC64 && _game.platform != Common::kPlatformMacintosh) {
// MM and ZAK (v1/2)
int saveLoadRoom = 50;
int saveLoadVar = 21;
int saveLoadEnable = 1;
if (_game.id == GID_INDY3) {
saveLoadRoom = 14;
saveLoadVar = 58;
} else if (_game.platform == Common::kPlatformFMTowns) {
// ZAK FM-Towns
saveLoadVar = 115;
}
// Only execute this if the original would even allow saving in that situation
if (VAR(saveLoadVar) == saveLoadEnable && _userPut > 0 && !(VAR_VERB_SCRIPT != 0xFF && isScriptRunning(VAR(VAR_VERB_SCRIPT)))) {
int args[NUM_SCRIPT_LOCAL];
memset(args, 0, sizeof(args));
beginCutscene(args);
startScene(saveLoadRoom, nullptr, 0);
endCutscene();
restoreFMTownsSounds = false;
}
}
redrawVerbs();
} }
// Update volume settings // Update volume settings
syncSoundSettings(); syncSoundSettings();
if (restoreFMTownsSounds)
_townsPlayer->restoreAfterLoad();
handleMouseOver(false); handleMouseOver(false);
_completeScreenRedraw = false; _completeScreenRedraw = false;
@ -2628,19 +2543,123 @@ void ScummEngine::scummLoop_handleSaveLoad() {
} }
} }
void ScummEngine_v4::scummLoop_handleSaveLoad() { void ScummEngine_v3::scummLoop_handleSaveLoad() {
// copy saveLoadFlag as handleSaveLoad() resets it // copy saveLoadFlag as handleSaveLoad() resets it
byte saveLoad = _saveLoadFlag; byte saveLoad = _saveLoadFlag;
ScummEngine_v5::scummLoop_handleSaveLoad(); ScummEngine::scummLoop_handleSaveLoad();
if (_completeScreenRedraw) {
clearCharsetMask();
_charset->_hasMask = false;
bool restoreFMTownsSounds = (_townsPlayer != nullptr);
if (_game.id == GID_LOOM) {
// HACK as in game save stuff isn't supported exactly as in the original interpreter when using the
// ScummVM save/load dialog. The original save/load screen uses a special script (which we cannot
// call without displaying that screen) which will also makes some necessary follow-up operations. We
// simply try to achieve that manually. It fixes bugs #6011 and #13369.
// We just have to kind of pretend that we've gone through the save/load "room" (with all the right
// variables in place), so that all the operations get triggered properly.
// The Mac, DOS Talkie and PC-Engine don't have the bugs. We can rely on our old hack there, since
// it wouldn't work otherwise, anyway.
int args[NUM_SCRIPT_LOCAL];
memset(args, 0, sizeof(args));
uint saveLoadVar = 100;
if (_game.platform == Common::kPlatformMacintosh)
saveLoadVar = 105;
else if (_game.platform == Common::kPlatformPCEngine || _game.version == 4)
saveLoadVar = 150;
// Run this hack only under conditions where the original save script could actually be executed.
// Otherwise this would cause all sorts of glitches. Also exclude Mac, PC-Engine and DOS Talkie...
if (saveLoadVar == 100 && _userPut > 0 && !isScriptRunning(VAR(VAR_VERB_SCRIPT))) {
uint16 prevFlag = VAR(214) & 0x6000;
beginCutscene(args);
uint16 blockVerbsFlag = VAR(214) & (0x6000 ^ prevFlag);
if (Actor *a = derefActor(VAR(VAR_EGO))) {
// This is used to restore the correct camera position.
VAR(171) = a->_walkbox;
VAR(172) = a->getRealPos().x;
VAR(173) = a->getRealPos().y;
}
startScene(70, nullptr, 0);
VAR(saveLoadVar) = 0;
VAR(214) &= ~blockVerbsFlag;
endCutscene();
if (_game.platform == Common::kPlatformFMTowns && VAR(163)) {
// Sound restore script. Unlike other versions which handle this
// inside the usual entry scripts, FM-Towns calls this from the save script.
memset(args, 0, sizeof(args));
args[0] = VAR(163);
runScript(38, false, false, args);
}
restoreFMTownsSounds = false;
} else if (VAR(saveLoadVar) == 2) {
// This is our old hack. If verbs should be shown restore them.
byte restoreScript = (_game.platform == Common::kPlatformFMTowns) ? 17 : 18;
args[0] = 2;
runScript(restoreScript, 0, 0, args);
// Reset two variables, similiar to what the save script would do, to avoid minor glitches
// of the verb image on the right of the distaff (image remainung blank when moving the
// mouse cursor over an object, bug #13369).
VAR(saveLoadVar + 2) = VAR(saveLoadVar + 3) = 0;
}
} else {
if (_game.platform == Common::kPlatformNES) {
// WORKAROUND: Original save/load script ran this script
// after game load, and o2_loadRoomWithEgo() does as well
// this script starts character-dependent music
// Fixes bug #3362: MANIACNES: Music Doesn't Start On Load Game
if (_game.platform == Common::kPlatformNES) {
runScript(5, 0, 0, nullptr);
if (VAR(224))
_sound->addSoundToQueue(VAR(224));
}
} else if (_game.platform != Common::kPlatformC64 && _game.platform != Common::kPlatformMacintosh) {
// MM and ZAK (v1/2)
int saveLoadRoom = 50;
int saveLoadVar = 21;
int saveLoadEnable = 1;
if (_game.id == GID_INDY3) {
saveLoadRoom = 14;
saveLoadVar = 58;
} else if (_game.platform == Common::kPlatformFMTowns) {
// ZAK FM-Towns
saveLoadVar = 115;
}
// Only execute this if the original would even allow saving in that situation
if (VAR(saveLoadVar) == saveLoadEnable && _userPut > 0 && !(VAR_VERB_SCRIPT != 0xFF && isScriptRunning(VAR(VAR_VERB_SCRIPT)))) {
int args[NUM_SCRIPT_LOCAL];
memset(args, 0, sizeof(args));
beginCutscene(args);
startScene(saveLoadRoom, nullptr, 0);
endCutscene();
restoreFMTownsSounds = false;
}
}
// update IQ points after loading // update IQ points after loading
if (saveLoad == 2) { if (saveLoad == 2) {
if (_game.id == GID_INDY3) if (_game.id == GID_INDY3)
updateIQPoints(); updateIQPoints();
} }
}
redrawVerbs();
}
if (restoreFMTownsSounds)
_townsPlayer->restoreAfterLoad();
}
}
void ScummEngine_v5::scummLoop_handleSaveLoad() { void ScummEngine_v5::scummLoop_handleSaveLoad() {
// copy saveLoadFlag as handleSaveLoad() resets it // copy saveLoadFlag as handleSaveLoad() resets it
byte saveLoad = _saveLoadFlag; byte saveLoad = _saveLoadFlag;

View file

@ -39,6 +39,8 @@ public:
protected: protected:
void setupOpcodes() override; void setupOpcodes() override;
void scummLoop_handleSaveLoad() override;
void readRoomsOffsets() override; void readRoomsOffsets() override;
void loadCharset(int no) override; void loadCharset(int no) override;

View file

@ -53,8 +53,6 @@ public:
protected: protected:
void setupOpcodes() override; void setupOpcodes() override;
void scummLoop_handleSaveLoad() override;
int readResTypeList(ResType type) override; int readResTypeList(ResType type) override;
void readIndexFile() override; void readIndexFile() override;
void loadCharset(int no) override; void loadCharset(int no) override;