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:
parent
c16ef940a1
commit
b337823bab
4 changed files with 15 additions and 25 deletions
|
@ -196,12 +196,8 @@ int ScummEngine::getVerbEntrypoint(int obj, int entry) {
|
||||||
} else if (_game.version <= 2) {
|
} else if (_game.version <= 2) {
|
||||||
do {
|
do {
|
||||||
const int kFallbackEntry = (_game.version == 0 ? 0x0F : 0xFF);
|
const int kFallbackEntry = (_game.version == 0 ? 0x0F : 0xFF);
|
||||||
if (!*verbptr) {
|
if (!*verbptr)
|
||||||
if (_game.version == 0 && entry == kVerbWalkTo)
|
return 0;
|
||||||
return 13;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (*verbptr == entry || *verbptr == kFallbackEntry)
|
if (*verbptr == entry || *verbptr == kFallbackEntry)
|
||||||
break;
|
break;
|
||||||
verbptr += 2;
|
verbptr += 2;
|
||||||
|
@ -1160,8 +1156,6 @@ void ScummEngine_v0::walkToActorOrObject(int object) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine_v0::checkAndRunSentenceScript() {
|
void ScummEngine_v0::checkAndRunSentenceScript() {
|
||||||
const ScriptSlot *ss;
|
|
||||||
|
|
||||||
if (_walkToObjectIdx) {
|
if (_walkToObjectIdx) {
|
||||||
ActorC64 *a = (ActorC64 *)derefActor(VAR(VAR_EGO), "checkAndRunSentenceScript");
|
ActorC64 *a = (ActorC64 *)derefActor(VAR(VAR_EGO), "checkAndRunSentenceScript");
|
||||||
if (a->_moving)
|
if (a->_moving)
|
||||||
|
@ -1175,7 +1169,6 @@ void ScummEngine_v0::checkAndRunSentenceScript() {
|
||||||
if (!_sentenceNum || _sentence[_sentenceNum - 1].freezeCount)
|
if (!_sentenceNum || _sentence[_sentenceNum - 1].freezeCount)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//_sentenceNum--;
|
|
||||||
SentenceTab &st = _sentence[_sentenceNum - 1];
|
SentenceTab &st = _sentence[_sentenceNum - 1];
|
||||||
|
|
||||||
if (st.preposition && st.objectB == st.objectA)
|
if (st.preposition && st.objectB == st.objectA)
|
||||||
|
@ -1232,30 +1225,27 @@ void ScummEngine_v0::checkAndRunSentenceScript() {
|
||||||
void ScummEngine_v0::runSentenceScript() {
|
void ScummEngine_v0::runSentenceScript() {
|
||||||
int obj = OBJECT_V0(_cmdObjectNr, _cmdObjectType);
|
int obj = OBJECT_V0(_cmdObjectNr, _cmdObjectType);
|
||||||
|
|
||||||
// FIXME: should it really ever return 0xD on WalkTo, seems wrong?
|
|
||||||
if (getVerbEntrypoint(obj, _cmdVerb) != 0) {
|
if (getVerbEntrypoint(obj, _cmdVerb) != 0) {
|
||||||
if (_cmdVerb == kVerbRead && VAR(VAR_CURRENT_LIGHTS) == 0) {
|
// do not read in the dark
|
||||||
//slot = 0xFF;
|
if (!(_cmdVerb == kVerbRead && _currentLights == 0)) {
|
||||||
VAR(VAR_ACTIVE_VERB) = _cmdVerb;
|
VAR(VAR_ACTIVE_OBJECT2) = _cmdObject2Nr;
|
||||||
runScript(3, 0, 0, 0);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
VAR(VAR_ACTIVE_ACTOR) = _cmdObject2Nr;
|
|
||||||
runObjectScript(obj, _cmdVerb, false, false, NULL);
|
runObjectScript(obj, _cmdVerb, false, false, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (_cmdVerb == kVerbGive) {
|
if (_cmdVerb == kVerbGive) {
|
||||||
|
// no "give to"-script: give to other kid or ignore
|
||||||
if (_cmdObject2Nr < 8)
|
if (_cmdObject2Nr < 8)
|
||||||
setOwnerOf(obj, _cmdObject2Nr);
|
setOwnerOf(obj, _cmdObject2Nr);
|
||||||
return;
|
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) {
|
void ScummEngine_v2::runInputScript(int clickArea, int val, int mode) {
|
||||||
|
|
|
@ -726,7 +726,7 @@ ScummEngine_v0::ScummEngine_v0(OSystem *syst, const DetectorResult &dr)
|
||||||
_cmdObject2Nr = 0;
|
_cmdObject2Nr = 0;
|
||||||
_cmdObject2Type = 0;
|
_cmdObject2Type = 0;
|
||||||
|
|
||||||
VAR_ACTIVE_ACTOR = 0xFF;
|
VAR_ACTIVE_OBJECT2 = 0xFF;
|
||||||
VAR_IS_SOUND_RUNNING = 0xFF;
|
VAR_IS_SOUND_RUNNING = 0xFF;
|
||||||
VAR_ACTIVE_VERB = 0xFF;
|
VAR_ACTIVE_VERB = 0xFF;
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,7 +159,7 @@ protected:
|
||||||
void o_beginOverride();
|
void o_beginOverride();
|
||||||
void o_setOwnerOf();
|
void o_setOwnerOf();
|
||||||
|
|
||||||
byte VAR_ACTIVE_ACTOR;
|
byte VAR_ACTIVE_OBJECT2;
|
||||||
byte VAR_IS_SOUND_RUNNING;
|
byte VAR_IS_SOUND_RUNNING;
|
||||||
byte VAR_ACTIVE_VERB;
|
byte VAR_ACTIVE_VERB;
|
||||||
};
|
};
|
||||||
|
|
|
@ -115,7 +115,7 @@ void ScummEngine_v0::setupScummVars() {
|
||||||
VAR_CAMERA_POS_X = 2;
|
VAR_CAMERA_POS_X = 2;
|
||||||
VAR_HAVE_MSG = 3;
|
VAR_HAVE_MSG = 3;
|
||||||
VAR_ROOM = 4;
|
VAR_ROOM = 4;
|
||||||
VAR_ACTIVE_ACTOR = 5;
|
VAR_ACTIVE_OBJECT2 = 5;
|
||||||
VAR_OVERRIDE = 6;
|
VAR_OVERRIDE = 6;
|
||||||
VAR_IS_SOUND_RUNNING = 8;
|
VAR_IS_SOUND_RUNNING = 8;
|
||||||
VAR_ACTIVE_VERB = 9;
|
VAR_ACTIVE_VERB = 9;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue