diff options
Diffstat (limited to 'engines/sci/engine')
-rw-r--r-- | engines/sci/engine/script.cpp | 1 | ||||
-rw-r--r-- | engines/sci/engine/state.cpp | 38 | ||||
-rw-r--r-- | engines/sci/engine/state.h | 5 | ||||
-rw-r--r-- | engines/sci/engine/static_selectors.cpp | 11 | ||||
-rw-r--r-- | engines/sci/engine/vm.h | 5 |
5 files changed, 33 insertions, 27 deletions
diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index f7291683bf..7bd8402663 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -233,7 +233,6 @@ void Kernel::mapSelectors() { FIND_SELECTOR(subtitleLang); FIND_SELECTOR(parseLang); FIND_SELECTOR(overlay); - FIND_SELECTOR(newRoom); FIND_SELECTOR(setCursor); FIND_SELECTOR(topString); FIND_SELECTOR(scaleX); diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index de66aabf12..816aaec774 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -233,7 +233,7 @@ Common::String EngineState::strSplit(const char *str, const char *sep) { return retval; } -bool EngineState::autoDetectFeature(FeatureDetection featureDetection) { +bool EngineState::autoDetectFeature(FeatureDetection featureDetection, int methodNum) { Common::String objName; Selector slc; @@ -257,11 +257,6 @@ bool EngineState::autoDetectFeature(FeatureDetection featureDetection) { break; case kDetectLofsType: objName = "Game"; - slc = _kernel->_selectorCache.play; - break; - case kDetectLofsTypeFallback: - objName = "Game"; - slc = _kernel->_selectorCache.newRoom; break; default: break; @@ -274,9 +269,13 @@ bool EngineState::autoDetectFeature(FeatureDetection featureDetection) { return false; } - if (lookup_selector(_segMan, objAddr, slc, NULL, &addr) != kSelectorMethod) { - warning("autoDetectFeature: target selector is not a method of object %s", objName.c_str()); - return false; + if (featureDetection != kDetectLofsType) { + if (lookup_selector(_segMan, objAddr, slc, NULL, &addr) != kSelectorMethod) { + warning("autoDetectFeature: target selector is not a method of object %s", objName.c_str()); + return false; + } + } else { + addr = _segMan->getObject(objAddr)->getFunction(methodNum); } uint16 offset = addr.offset; @@ -289,7 +288,7 @@ bool EngineState::autoDetectFeature(FeatureDetection featureDetection) { int i = 0; byte argc; - if (featureDetection == kDetectLofsType || featureDetection == kDetectLofsTypeFallback) { + if (featureDetection == kDetectLofsType) { if (opcode == op_lofsa || opcode == op_lofss) { uint16 lofs; @@ -315,7 +314,8 @@ bool EngineState::autoDetectFeature(FeatureDetection featureDetection) { if ((signed)offset + (int16)lofs >= (signed)script->_bufSize) _lofsType = SCI_VERSION_1_MIDDLE; - return true; + if (_lofsType != SCI_VERSION_AUTODETECT) + return true; } } @@ -483,9 +483,19 @@ SciVersion EngineState::detectLofsType() { return _lofsType; } - // Either the init or the newRoom selectors of the Game - // object make calls to lofsa/lofss - if (!autoDetectFeature(kDetectLofsType) && !autoDetectFeature(kDetectLofsTypeFallback)) { + // Find a function of the game object which invokes lofsa/lofss + reg_t gameClass = _segMan->findObjectByName("Game"); + Object *obj = _segMan->getObject(gameClass); + bool found = false; + + for (uint m = 0; m < obj->getMethodCount(); m++) { + found = autoDetectFeature(kDetectLofsType, m); + + if (found) + break; + } + + if (!found) { warning("Lofs detection failed, taking an educated guess"); if (getSciVersion() >= SCI_VERSION_1_MIDDLE) diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index dcddf7c15c..486f5cda87 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -107,8 +107,7 @@ enum FeatureDetection { kDetectMoveCountType = 1, kDetectSoundType = 2, kDetectSetCursorType = 3, - kDetectLofsType = 4, - kDetectLofsTypeFallback = 5 + kDetectLofsType = 4 }; class FileHandle { @@ -294,7 +293,7 @@ public: Common::String getLanguageString(const char *str, kLanguage lang) const; private: - bool autoDetectFeature(FeatureDetection featureDetection); + bool autoDetectFeature(FeatureDetection featureDetection, int methodNum = -1); SciVersion _doSoundType, _setCursorType, _lofsType, _gfxFunctionsType; MoveCountType _moveCountType; diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index 89e194fea5..bfb1896e0b 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -63,17 +63,16 @@ static const char * const sci1Selectors[] = { // Taken from Codename: Iceman (Full Game) static const SelectorRemap sci0SelectorRemap[] = { - { "cue", 121 }, { "moveDone", 170 }, { "setCursor", 254 }, - { "overlay", 270 }, { "points", 316 }, { "flags", 368 }, - { 0, 0 } + { "moveDone", 170 }, { "setCursor", 254 }, { "overlay", 270 }, + { "points", 316 }, { "flags", 368 }, { 0, 0 } }; // Taken from Leisure Suit Larry 1 VGA (Full Game) static const SelectorRemap sci1SelectorRemap[] = { { "nodePtr", 44 }, { "cantBeHere", 57 }, { "topString", 101 }, - { "flags", 102 }, { "dispose", 105 }, { "newRoom", 173 }, - { "setCursor", 183 }, { "canBeHere", 232 }, { "syncTime", 247 }, - { "syncCue", 248 }, { 0, 0 } + { "flags", 102 }, { "dispose", 105 }, { "setCursor", 183 }, + { "canBeHere", 232 }, { "syncTime", 247 }, { "syncCue", 248 }, + { 0, 0 } }; // Taken from KQ6 floppy (Full Game) diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 55af3f84aa..f6afee98a4 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -192,9 +192,8 @@ struct SelectorCache { Selector scaleX, scaleY; // SCI1.1 view scaling // Used for auto detection purposes - Selector overlay; /** Used to determine if a game is using old gfx functions or not */ - Selector newRoom; /** For SCI1 lofs parameter type autodetection fallback */ - Selector setCursor; /** For autodetection */ + Selector overlay; // Used to determine if a game is using old gfx functions or not + Selector setCursor; // For autodetection }; // A reference to an object's variable. |