diff options
Diffstat (limited to 'engines/sci/engine')
-rw-r--r-- | engines/sci/engine/game.cpp | 2 | ||||
-rw-r--r-- | engines/sci/engine/kernel.cpp | 3 | ||||
-rw-r--r-- | engines/sci/engine/kernel.h | 8 | ||||
-rw-r--r-- | engines/sci/engine/script.cpp | 1 | ||||
-rw-r--r-- | engines/sci/engine/vm.cpp | 4 | ||||
-rw-r--r-- | engines/sci/engine/vm.h | 7 |
6 files changed, 19 insertions, 6 deletions
diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp index a1e2c24955..a1e7569967 100644 --- a/engines/sci/engine/game.cpp +++ b/engines/sci/engine/game.cpp @@ -377,7 +377,7 @@ int script_init_engine(EngineState *s) { s->bp_list = NULL; // No breakpoints defined s->have_bp = 0; - if ((s->_flags & GF_SCI1_LOFSABSOLUTE) && s->_version < SCI_VERSION_1_1) + if (s->_kernel->hasLofsAbsolute()) s->seg_manager->setExportWidth(1); else s->seg_manager->setExportWidth(0); diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index ab6fb36085..eaa1cbcbc2 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -365,6 +365,9 @@ Kernel::Kernel(ResourceManager *resmgr, bool isOldSci0) : _resmgr(resmgr) { // SCI0 games using old graphics functions (before version 0.000.502) did not have a // curAngle selector _oldGfxFunctions = (_selectorMap.curAngle == -1 && _resmgr->_sciVersion == SCI_VERSION_0); + + // SCI1 games which use absolute lofs have the egoMoveSpeed selector + _hasLofsAbsolute = (_selectorMap.egoMoveSpeed != -1 && _resmgr->_sciVersion < SCI_VERSION_1_1); } Kernel::~Kernel() { diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index ad7605753b..da8ef04135 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -92,6 +92,13 @@ public: */ bool usesOldGfxFunctions() const { return _oldGfxFunctions; } + /** + * Applies to all SCI1 versions after 1.000.200 + * In late SCI1 versions, the argument of lofs[as] instructions + * is absolute rather than relative. + */ + bool hasLofsAbsolute() const { return _hasLofsAbsolute; } + // Script dissection/dumping functions void dissectScript(int scriptNumber, Vocabulary *vocab); void dumpScriptObject(char *data, int seeker, int objsize); @@ -140,6 +147,7 @@ private: ResourceManager *_resmgr; bool _oldGfxFunctions; + bool _hasLofsAbsolute; // Kernel-related lists /** diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index ca5379a4c0..0b89fbc093 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -205,6 +205,7 @@ void Kernel::mapSelectors() { FIND_SELECTOR(curAngle); FIND_SELECTOR(sightAngle); FIND_SELECTOR(setVol); + FIND_SELECTOR(egoMoveSpeed); } void Kernel::dumpScriptObject(char *data, int seeker, int objsize) { diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 92f890512a..a31af68323 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1193,7 +1193,7 @@ void run_vm(EngineState *s, int restoring) { if (s->_version >= SCI_VERSION_1_1) { s->r_acc.offset = opparams[0] + local_script->script_size; } else { - if (s->_flags & GF_SCI1_LOFSABSOLUTE) + if (s->_kernel->hasLofsAbsolute()) s->r_acc.offset = opparams[0]; else s->r_acc.offset = xs->addr.pc.offset + opparams[0]; @@ -1210,7 +1210,7 @@ void run_vm(EngineState *s, int restoring) { case 0x3a: // lofss r_temp.segment = xs->addr.pc.segment; - if (s->_flags & GF_SCI1_LOFSABSOLUTE) + if (s->_kernel->hasLofsAbsolute()) r_temp.offset = opparams[0]; else r_temp.offset = xs->addr.pc.offset + opparams[0]; diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index f1e89bba45..f20838bb4a 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -203,9 +203,10 @@ struct selector_map_t { Selector printLang; /**< Used for i18n */ Selector subtitleLang; Selector parseLang; - Selector curAngle; // Used to detect newer graphics functions semantics. - Selector sightAngle; // Used to detect some SCI0/SCI01 games which need a SCI1 table - Selector setVol; // Used to detect newer sound semantics + Selector curAngle; // Used to detect newer graphics functions semantics. + Selector sightAngle; // Used to detect some SCI0/SCI01 games which need a SCI1 table + Selector setVol; // Used to detect newer sound semantics + Selector egoMoveSpeed; // Used to detect SCI1 games which use absolute values in lofs }; // A reference to an object's variable. |