diff options
Diffstat (limited to 'engines/sci/engine/state.cpp')
-rw-r--r-- | engines/sci/engine/state.cpp | 64 |
1 files changed, 49 insertions, 15 deletions
diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index d53e6b48c8..c23add1211 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -70,9 +70,6 @@ static const uint16 s_halfWidthSJISMap[256] = { EngineState::EngineState(SegManager *segMan) : _segMan(segMan), -#ifdef ENABLE_SCI32 - _virtualIndexFile(0), -#endif _dirseeker() { reset(false); @@ -80,9 +77,6 @@ EngineState::EngineState(SegManager *segMan) EngineState::~EngineState() { delete _msgState; -#ifdef ENABLE_SCI32 - delete _virtualIndexFile; -#endif } void EngineState::reset(bool isRestoring) { @@ -95,6 +89,7 @@ void EngineState::reset(bool isRestoring) { // reset delayed restore game functionality _delayedRestoreGame = false; _delayedRestoreGameId = 0; + _delayedRestoreFromLauncher = false; executionStackBase = 0; _executionStackPosChanged = false; @@ -126,9 +121,6 @@ void EngineState::reset(bool isRestoring) { _videoState.reset(); _syncedAudioOptions = false; - - _vmdPalStart = 0; - _vmdPalEnd = 256; } void EngineState::speedThrottler(uint32 neededSleep) { @@ -167,11 +159,11 @@ void EngineState::initGlobals() { } uint16 EngineState::currentRoomNumber() const { - return variables[VAR_GLOBAL][13].toUint16(); + return variables[VAR_GLOBAL][kGlobalVarNewRoomNo].toUint16(); } void EngineState::setRoomNumber(uint16 roomNumber) { - variables[VAR_GLOBAL][13] = make_reg(0, roomNumber); + variables[VAR_GLOBAL][kGlobalVarNewRoomNo] = make_reg(0, roomNumber); } void EngineState::shrinkStackToBase() { @@ -210,12 +202,12 @@ Common::String SciEngine::getSciLanguageString(const Common::String &str, kLangu const byte *textPtr = (const byte *)str.c_str(); byte curChar = 0; byte curChar2 = 0; - + while (1) { curChar = *textPtr; if (!curChar) break; - + if ((curChar == '%') || (curChar == '#')) { curChar2 = *(textPtr + 1); foundLanguage = charToLanguage(curChar2); @@ -244,7 +236,7 @@ Common::String SciEngine::getSciLanguageString(const Common::String &str, kLangu while (1) { curChar = *textPtr; - + switch (curChar) { case 0: // Terminator NUL return fullWidth; @@ -265,7 +257,7 @@ Common::String SciEngine::getSciLanguageString(const Common::String &str, kLangu continue; } } - + textPtr++; mappedChar = s_halfWidthSJISMap[curChar]; @@ -388,4 +380,46 @@ void SciEngine::checkVocabularySwitch() { } } +SciCallOrigin EngineState::getCurrentCallOrigin() const { + // IMPORTANT: This method must always return values that match *exactly* the + // values in the workaround tables in workarounds.cpp, or workarounds will + // be broken + + Common::String curObjectName = _segMan->getObjectName(xs->sendp); + Common::String curMethodName; + const Script *localScript = _segMan->getScriptIfLoaded(xs->local_segment); + int curScriptNr = localScript->getScriptNumber(); + + if (xs->debugLocalCallOffset != -1) { + // if lastcall was actually a local call search back for a real call + Common::List<ExecStack>::const_iterator callIterator = _executionStack.end(); + while (callIterator != _executionStack.begin()) { + callIterator--; + const ExecStack &loopCall = *callIterator; + if ((loopCall.debugSelector != -1) || (loopCall.debugExportId != -1)) { + xs->debugSelector = loopCall.debugSelector; + xs->debugExportId = loopCall.debugExportId; + break; + } + } + } + + if (xs->type == EXEC_STACK_TYPE_CALL) { + if (xs->debugSelector != -1) { + curMethodName = g_sci->getKernel()->getSelectorName(xs->debugSelector); + } else if (xs->debugExportId != -1) { + curObjectName = ""; + curMethodName = Common::String::format("export %d", xs->debugExportId); + } + } + + SciCallOrigin reply; + reply.objectName = curObjectName; + reply.methodName = curMethodName; + reply.scriptNr = curScriptNr; + reply.localCallOffset = xs->debugLocalCallOffset; + reply.roomNr = currentRoomNumber(); + return reply; +} + } // End of namespace Sci |