diff options
-rw-r--r-- | engines/sci/engine/kgraphics.cpp | 7 | ||||
-rw-r--r-- | engines/sci/engine/script_patches.cpp | 22 | ||||
-rw-r--r-- | engines/sci/engine/selector.cpp | 1 | ||||
-rw-r--r-- | engines/sci/engine/selector.h | 1 | ||||
-rw-r--r-- | engines/sci/graphics/frameout.cpp | 24 | ||||
-rw-r--r-- | engines/sci/sci.cpp | 9 | ||||
-rw-r--r-- | engines/sci/sci.h | 3 |
7 files changed, 39 insertions, 28 deletions
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 7294bb1e44..e6644b54bd 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -997,12 +997,7 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { if (!changeDirButton.isNull()) { // check if checkDirButton is still enabled, in that case we are called the first time during that room if (!(readSelectorValue(s->_segMan, changeDirButton, SELECTOR(state)) & SCI_CONTROLS_STYLE_DISABLED)) { - showScummVMDialog(_("Characters saved inside ScummVM are shown " - "automatically. Character files saved in the original " - "interpreter need to be put inside ScummVM's saved games " - "directory and a prefix needs to be added depending on which " - "game it was saved in: 'qfg1-' for Quest for Glory 1, 'qfg2-' " - "for Quest for Glory 2. Example: 'qfg2-thief.sav'.")); + g_sci->showQfgImportMessageBox(); } } diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index bd21d5fc5d..72196ad91b 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -9963,27 +9963,6 @@ static const uint16 qfg4BenchmarkPatch[] = { PATCH_END }; -// Disable the Change Directory button on the character import screen as we -// don't allow the game engine to change the directory where character files -// are placed. Character files are only read from our save game directory. -// -// Applies to: All versions -// Responsible method: Heap in script 54 -static const uint16 qfg4ChangeDirectorySignature[] = { - // changeButton - SIG_UINT16(0x0003), // state = 3 [ enabled ] - SIG_ADDTOOFFSET(+38), - SIG_MAGICDWORD, - SIG_UINT16(0xfdde), // view = 64990 - SIG_UINT16(0x0001), // loop = 1 - SIG_END, -}; - -static const uint16 qfg4ChangeDirectoryPatch[] = { - PATCH_UINT16(0x0000), // state = 0 [ disabled ] - PATCH_END -}; - // In room 800, at the start of the game, when automatically sliding down a // slope an error may happen inside Grooper::doit caused by a timing issue. // @@ -14041,7 +14020,6 @@ static const SciScriptPatcherEntry qfg4Signatures[] = { { true, 51, "fix necrotaur blackout", 1, qfg4NecrotaurBlackoutSignature,qfg4NecrotaurBlackoutPatch }, { true, 51, "CD: fix necrotaur capture", 3, qfg4NecrotaurCaptureSignature, qfg4NecrotaurCapturePatch }, { true, 53, "NRS: fix wraith lockup", 1, qfg4WraithLockupNrsSignature, qfg4WraithLockupNrsPatch }, - { true, 54, "disable import change directory button", 1, qfg4ChangeDirectorySignature, qfg4ChangeDirectoryPatch }, { true, 83, "fix incorrect array type", 1, qfg4TrapArrayTypeSignature, qfg4TrapArrayTypePatch }, { true, 140, "fix character selection", 1, qfg4CharacterSelectSignature, qfg4CharacterSelectPatch }, { true, 250, "fix hectapus death lockup", 1, qfg4HectapusDeathSignature, qfg4HectapusDeathPatch }, diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index d2f6a14797..6fbccb81a3 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -236,6 +236,7 @@ void Kernel::mapSelectors() { FIND_SELECTOR(dispose); FIND_SELECTOR(masterVolume); FIND_SELECTOR(setCel); + FIND_SELECTOR(value); #endif } diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index 2c1a34e938..fa2df8ced6 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -194,6 +194,7 @@ struct SelectorCache { Selector dispose; // for RAMA save/load save from launcher Selector masterVolume; // for RAMA volume sync Selector setCel; // for RAMA volume sync + Selector value; // for QFG4 import dialog #endif }; diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 99fd8e62cb..e20166b8ee 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -269,6 +269,7 @@ void GfxFrameout::kernelDeleteScreenItem(const reg_t object) { #pragma mark Planes void GfxFrameout::kernelAddPlane(const reg_t object) { + Plane *plane = _planes.findByObject(object); if (plane != nullptr) { plane->update(object); @@ -277,6 +278,29 @@ void GfxFrameout::kernelAddPlane(const reg_t object) { plane = new Plane(object); addPlane(plane); } + + // Detect the QFG4 import character dialog, disable the Change Directory + // button, and display a message box explaining how to import saved + // character files in ScummVM. SCI16 games are handled by kDrawControl. + if (g_sci->inQfGImportRoom()) { + // kAddPlane is called several times, this detects the second call + // which is for the import character dialog. If changeButton:value + // is non-zero then the dialog is initializing. If the button isn't + // disabled then we havne't displayed the message box yet. There + // are multiple changeButtons because the script clones the object. + SegManager *segMan = g_sci->getEngineState()->_segMan; + Common::Array<reg_t> changeDirButtons = _segMan->findObjectsByName("changeButton"); + for (uint i = 0; i < changeDirButtons.size(); ++i) { + if (readSelectorValue(segMan, changeDirButtons[i], SELECTOR(value))) { + // disable Change Directory button by setting state to zero + if (readSelectorValue(segMan, changeDirButtons[i], SELECTOR(state))) { + writeSelectorValue(segMan, changeDirButtons[i], SELECTOR(state), 0); + g_sci->showQfgImportMessageBox(); + break; + } + } + } + } } void GfxFrameout::kernelUpdatePlane(const reg_t object) { diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 428c914a0d..09adf73d3b 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -829,6 +829,15 @@ int SciEngine::inQfGImportRoom() const { return 0; } +void SciEngine::showQfgImportMessageBox() const { + showScummVMDialog(_("Characters saved inside ScummVM are shown " + "automatically. Character files saved in the original " + "interpreter need to be put inside ScummVM's saved games " + "directory and a prefix needs to be added depending on which " + "game it was saved in: 'qfg1-' for Quest for Glory 1, 'qfg2-' " + "for Quest for Glory 2. Example: 'qfg2-thief.sav'.")); +} + void SciEngine::sleep(uint32 msecs) { if (!msecs) { return; diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 353cf5b676..8dd73ef5b3 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -312,6 +312,9 @@ public: */ int inQfGImportRoom() const; + /* Shows a ScummVM message box explaining how to import Qfg saved character files */ + void showQfgImportMessageBox() const; + void sleep(uint32 msecs); void scriptDebug(); |