SCUMM: fix verb and script handling

- getVerbEntrypoint() should not handle walk-to differently (revert 0x0D handling back to original behavior)
- VAR_ACTIVE_ACTOR actually is VAR_ACTIVE_OBJECT2
- runSentenceScript(): "if (_cmdVerb == kVerbWalkTo)" must be "if (_cmdVerb != kVerbWalkTo)"
This commit is contained in:
Tobias Gunkel 2012-01-09 23:21:08 +01:00
parent c16ef940a1
commit b337823bab
4 changed files with 15 additions and 25 deletions

View file

@ -196,12 +196,8 @@ int ScummEngine::getVerbEntrypoint(int obj, int entry) {
} else if (_game.version <= 2) {
do {
const int kFallbackEntry = (_game.version == 0 ? 0x0F : 0xFF);
if (!*verbptr) {
if (_game.version == 0 && entry == kVerbWalkTo)
return 13;
else
return 0;
}
if (!*verbptr)
return 0;
if (*verbptr == entry || *verbptr == kFallbackEntry)
break;
verbptr += 2;
@ -1160,8 +1156,6 @@ void ScummEngine_v0::walkToActorOrObject(int object) {
}
void ScummEngine_v0::checkAndRunSentenceScript() {
const ScriptSlot *ss;
if (_walkToObjectIdx) {
ActorC64 *a = (ActorC64 *)derefActor(VAR(VAR_EGO), "checkAndRunSentenceScript");
if (a->_moving)
@ -1175,7 +1169,6 @@ void ScummEngine_v0::checkAndRunSentenceScript() {
if (!_sentenceNum || _sentence[_sentenceNum - 1].freezeCount)
return;
//_sentenceNum--;
SentenceTab &st = _sentence[_sentenceNum - 1];
if (st.preposition && st.objectB == st.objectA)
@ -1232,30 +1225,27 @@ void ScummEngine_v0::checkAndRunSentenceScript() {
void ScummEngine_v0::runSentenceScript() {
int obj = OBJECT_V0(_cmdObjectNr, _cmdObjectType);
// FIXME: should it really ever return 0xD on WalkTo, seems wrong?
if (getVerbEntrypoint(obj, _cmdVerb) != 0) {
if (_cmdVerb == kVerbRead && VAR(VAR_CURRENT_LIGHTS) == 0) {
//slot = 0xFF;
VAR(VAR_ACTIVE_VERB) = _cmdVerb;
runScript(3, 0, 0, 0);
return;
} else {
VAR(VAR_ACTIVE_ACTOR) = _cmdObject2Nr;
// do not read in the dark
if (!(_cmdVerb == kVerbRead && _currentLights == 0)) {
VAR(VAR_ACTIVE_OBJECT2) = _cmdObject2Nr;
runObjectScript(obj, _cmdVerb, false, false, NULL);
return;
}
} else {
if (_cmdVerb == kVerbGive) {
// no "give to"-script: give to other kid or ignore
if (_cmdObject2Nr < 8)
setOwnerOf(obj, _cmdObject2Nr);
return;
} else if (_cmdVerb == kVerbWalkTo) {
//slot = 0xFF;
VAR(VAR_ACTIVE_VERB) = _cmdVerb;
runScript(3, 0, 0, 0);
return;
}
}
if (_cmdVerb != kVerbWalkTo) {
// perform verb's fallback action
VAR(VAR_ACTIVE_VERB) = _cmdVerb;
runScript(3, 0, 0, 0);
}
}
void ScummEngine_v2::runInputScript(int clickArea, int val, int mode) {

View file

@ -726,7 +726,7 @@ ScummEngine_v0::ScummEngine_v0(OSystem *syst, const DetectorResult &dr)
_cmdObject2Nr = 0;
_cmdObject2Type = 0;
VAR_ACTIVE_ACTOR = 0xFF;
VAR_ACTIVE_OBJECT2 = 0xFF;
VAR_IS_SOUND_RUNNING = 0xFF;
VAR_ACTIVE_VERB = 0xFF;
}

View file

@ -159,7 +159,7 @@ protected:
void o_beginOverride();
void o_setOwnerOf();
byte VAR_ACTIVE_ACTOR;
byte VAR_ACTIVE_OBJECT2;
byte VAR_IS_SOUND_RUNNING;
byte VAR_ACTIVE_VERB;
};

View file

@ -115,7 +115,7 @@ void ScummEngine_v0::setupScummVars() {
VAR_CAMERA_POS_X = 2;
VAR_HAVE_MSG = 3;
VAR_ROOM = 4;
VAR_ACTIVE_ACTOR = 5;
VAR_ACTIVE_OBJECT2 = 5;
VAR_OVERRIDE = 6;
VAR_IS_SOUND_RUNNING = 8;
VAR_ACTIVE_VERB = 9;