mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
SCUMM: merge _activeObjectNr/_activeObjectType and _cmdObjectNr/_cmdObjectType
This commit is contained in:
@@ -382,7 +382,8 @@ bool ScummDebugger::Cmd_Actor(int argc, const char **argv) {
|
||||
DebugPrintf("Actor[%d].costume = %d\n", actnum, a->_costume);
|
||||
}
|
||||
} else if (!strcmp(argv[2], "name")) {
|
||||
DebugPrintf("Name of actor %d: %s\n", actnum, _vm->getActorName(actnum));
|
||||
int actor = (_vm->_game.version != 0 ? actnum : OBJECT_V0(actnum, kObjectV0TypeActor));
|
||||
DebugPrintf("Name of actor %d: %s\n", actnum, _vm->getObjOrActorName(actor));
|
||||
} else if (!strcmp(argv[2], "condmask")) {
|
||||
if (argc > 3) {
|
||||
a->_heCondMask = value;
|
||||
|
||||
@@ -1150,23 +1150,15 @@ void ScummEngine::markObjectRectAsDirty(int obj) {
|
||||
}
|
||||
}
|
||||
|
||||
const byte *ScummEngine::getActorName(int id) {
|
||||
if (_game.version == 0) {
|
||||
if (id > 0 && id < _numActors)
|
||||
return derefActor(id, "getActorName")->getActorName();
|
||||
else
|
||||
return NULL;
|
||||
} else {
|
||||
return getObjOrActorName(id);
|
||||
}
|
||||
}
|
||||
|
||||
const byte *ScummEngine::getObjOrActorName(int obj) {
|
||||
byte *objptr;
|
||||
int i;
|
||||
|
||||
if (obj < _numActors && _game.version >= 1)
|
||||
return derefActor(obj, "getObjOrActorName")->getActorName();
|
||||
if ((_game.version == 0 && OBJECT_V0_TYPE(obj) == kObjectV0TypeActor) ||
|
||||
(_game.version != 0 && obj < _numActors)) {
|
||||
int actorNr = (_game.version != 0 ? obj : OBJECT_V0_NR(obj));
|
||||
return derefActor(actorNr, "getObjOrActorName")->getActorName();
|
||||
}
|
||||
|
||||
for (i = 0; i < _numNewNames; i++) {
|
||||
if (_newNames[i] == obj) {
|
||||
|
||||
+12
-19
@@ -1179,16 +1179,12 @@ void ScummEngine_v0::checkAndRunSentenceScript() {
|
||||
// FIXME: should this be executed?
|
||||
//_currentScript = 0xFF;
|
||||
|
||||
int obj1Nr = OBJECT_V0_NR(st.objectA);
|
||||
int obj1Type = OBJECT_V0_TYPE(st.objectA);
|
||||
int obj2Nr = OBJECT_V0_NR(st.objectB);
|
||||
int obj2Type = OBJECT_V0_TYPE(st.objectB);
|
||||
assert(obj1Nr);
|
||||
assert(st.objectA);
|
||||
|
||||
// If two objects are involved, at least one must be in the actors inventory
|
||||
if (obj2Nr &&
|
||||
(obj1Type != kObjectV0TypeFG || _objectOwnerTable[obj1Nr] != VAR(VAR_EGO)) &&
|
||||
(obj2Type != kObjectV0TypeFG || _objectOwnerTable[obj2Nr] != VAR(VAR_EGO)))
|
||||
if (st.objectB &&
|
||||
(OBJECT_V0_TYPE(st.objectA) != kObjectV0TypeFG || _objectOwnerTable[st.objectA] != VAR(VAR_EGO)) &&
|
||||
(OBJECT_V0_TYPE(st.objectB) != kObjectV0TypeFG || _objectOwnerTable[st.objectB] != VAR(VAR_EGO)))
|
||||
{
|
||||
if (getVerbEntrypoint(st.objectA, kVerbPickUp))
|
||||
doSentence(kVerbPickUp, st.objectA, 0);
|
||||
@@ -1200,10 +1196,8 @@ void ScummEngine_v0::checkAndRunSentenceScript() {
|
||||
}
|
||||
|
||||
_cmdVerb = st.verb;
|
||||
_cmdObjectNr = obj1Nr;
|
||||
_cmdObjectType = obj1Type;
|
||||
_cmdObject2Nr = obj2Nr;
|
||||
_cmdObject2Type = obj2Type;
|
||||
_cmdObject = st.objectA;
|
||||
_cmdObject2 = st.objectB;
|
||||
_sentenceNum--;
|
||||
|
||||
// TODO: check sentenceNum
|
||||
@@ -1225,22 +1219,21 @@ void ScummEngine_v0::checkAndRunSentenceScript() {
|
||||
}
|
||||
|
||||
void ScummEngine_v0::runSentenceScript() {
|
||||
int obj = OBJECT_V0(_cmdObjectNr, _cmdObjectType);
|
||||
|
||||
drawSentenceLine();
|
||||
|
||||
if (getVerbEntrypoint(obj, _cmdVerb) != 0) {
|
||||
if (getVerbEntrypoint(_cmdObject, _cmdVerb) != 0) {
|
||||
// do not read in the dark
|
||||
if (!(_cmdVerb == kVerbRead && _currentLights == 0)) {
|
||||
VAR(VAR_ACTIVE_OBJECT2) = _cmdObject2Nr;
|
||||
runObjectScript(obj, _cmdVerb, false, false, NULL);
|
||||
VAR(VAR_ACTIVE_OBJECT2) = OBJECT_V0_NR(_cmdObject2);
|
||||
runObjectScript(_cmdObject, _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);
|
||||
int actor = OBJECT_V0_NR(_cmdObject2);
|
||||
if (actor < 8)
|
||||
setOwnerOf(_cmdObject, actor);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
+23
-39
@@ -365,7 +365,7 @@ uint ScummEngine_v0::fetchScriptWord() {
|
||||
|
||||
int ScummEngine_v0::getActiveObject() {
|
||||
if (_opcode & PARAM_2)
|
||||
return _cmdObjectNr;
|
||||
return OBJECT_V0_NR(_cmdObject);
|
||||
|
||||
return fetchScriptByte();
|
||||
}
|
||||
@@ -461,7 +461,8 @@ void ScummEngine_v0::drawSentenceLine() {
|
||||
if (_activeVerb == kVerbNewKid) {
|
||||
_sentenceBuf = "";
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
_sentenceBuf += Common::String::format("%-13s", getActorName(VAR(97 + i)));
|
||||
Actor *a = derefActor(VAR(97 + i), "drawSentenceLine");
|
||||
_sentenceBuf += Common::String::format("%-13s", a->getActorName());
|
||||
}
|
||||
flushSentenceLine();
|
||||
return;
|
||||
@@ -475,9 +476,9 @@ void ScummEngine_v0::drawSentenceLine() {
|
||||
assert(verbName);
|
||||
_sentenceBuf = verbName;
|
||||
|
||||
if (_activeObjectNr) {
|
||||
if (_activeObject) {
|
||||
// Draw the 1st active object
|
||||
drawSentenceObject(OBJECT_V0(_activeObjectNr, _activeObjectType));
|
||||
drawSentenceObject(_activeObject);
|
||||
|
||||
// Append verb preposition
|
||||
int sentencePrep = activeVerbPrep();
|
||||
@@ -485,16 +486,8 @@ void ScummEngine_v0::drawSentenceLine() {
|
||||
drawPreposition(sentencePrep);
|
||||
|
||||
// Draw the 2nd active object
|
||||
if (_activeObject2Nr) {
|
||||
// 2nd Object is an actor
|
||||
if (_activeObject2Type == kObjectV0TypeActor) {
|
||||
_sentenceBuf += " ";
|
||||
_sentenceBuf += (const char *)getActorName(_activeObject2Nr);
|
||||
// 2nd Object is an inventory or room object
|
||||
} else {
|
||||
drawSentenceObject(OBJECT_V0(_activeObject2Nr, _activeObject2Type));
|
||||
}
|
||||
}
|
||||
if (_activeObject2)
|
||||
drawSentenceObject(_activeObject2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -708,8 +701,9 @@ void ScummEngine_v0::o_putActorAtObject() {
|
||||
}
|
||||
|
||||
void ScummEngine_v0::o_pickupObject() {
|
||||
int objNr = fetchScriptByte();
|
||||
int obj = OBJECT_V0((objNr ? objNr : _cmdObjectNr), 0);
|
||||
int obj = fetchScriptByte();
|
||||
if (!obj)
|
||||
obj = _cmdObject;
|
||||
|
||||
/* Don't take an object twice */
|
||||
if (whereIsObject(obj) == WIO_INVENTORY)
|
||||
@@ -761,7 +755,7 @@ void ScummEngine_v0::o_setActorBitVar() {
|
||||
void ScummEngine_v0::o_getObjectOwner() {
|
||||
getResultPos();
|
||||
int obj = getVarOrDirectWord(PARAM_1);
|
||||
setResult(getOwner(obj ? obj : _cmdObjectNr));
|
||||
setResult(getOwner(obj ? obj : _cmdObject));
|
||||
}
|
||||
|
||||
void ScummEngine_v0::o_getActorBitVar() {
|
||||
@@ -815,20 +809,20 @@ void ScummEngine_v0::o_doSentence() {
|
||||
|
||||
b = fetchScriptByte();
|
||||
if (b == 0xFF) {
|
||||
obj = OBJECT_V0(_cmdObject2Nr, _cmdObject2Type);
|
||||
obj = _cmdObject2;
|
||||
} else if (b == 0xFE) {
|
||||
obj = OBJECT_V0(_cmdObjectNr, _cmdObjectType);
|
||||
obj = _cmdObject;
|
||||
} else {
|
||||
obj = OBJECT_V0(b, (_opcode & 0x80) ? 1 : 0);
|
||||
obj = OBJECT_V0(b, (_opcode & 0x80) ? kObjectV0TypeBG : kObjectV0TypeFG);
|
||||
}
|
||||
|
||||
b = fetchScriptByte();
|
||||
if (b == 0xFF) {
|
||||
obj2 = OBJECT_V0(_cmdObject2Nr, _cmdObject2Type);
|
||||
obj2 = _cmdObject2;
|
||||
} else if (b == 0xFE) {
|
||||
obj2 = OBJECT_V0(_cmdObjectNr, _cmdObjectType);
|
||||
obj2 = _cmdObject;
|
||||
} else {
|
||||
obj2 = OBJECT_V0(b, (_opcode & 0x40) ? 1 : 0);
|
||||
obj2 = OBJECT_V0(b, (_opcode & 0x40) ? kObjectV0TypeBG : kObjectV0TypeFG);
|
||||
}
|
||||
|
||||
doSentence(verb, obj, obj2);
|
||||
@@ -836,8 +830,8 @@ void ScummEngine_v0::o_doSentence() {
|
||||
|
||||
bool ScummEngine_v0::ifEqualActiveObject2Common(bool ignoreType) {
|
||||
byte obj = fetchScriptByte();
|
||||
if (!ignoreType || (_cmdObject2Type == kObjectV0TypeFG))
|
||||
return (obj == _cmdObject2Nr);
|
||||
if (!ignoreType || (OBJECT_V0_TYPE(_cmdObject2) == kObjectV0TypeFG))
|
||||
return (obj == OBJECT_V0_NR(_cmdObject2));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -933,26 +927,16 @@ void ScummEngine_v0::o_setOwnerOf() {
|
||||
obj = getVarOrDirectWord(PARAM_1);
|
||||
owner = getVarOrDirectByte(PARAM_2);
|
||||
|
||||
if (obj == 0)
|
||||
obj = _cmdObjectNr;
|
||||
|
||||
// FIXME: the original interpreter seems to set the owner of
|
||||
// an item to remove (new owner 0) to 13 (purple tentacle).
|
||||
// Ignore this behavior for now.
|
||||
/*
|
||||
if (owner == 0)
|
||||
owner = 13;
|
||||
*/
|
||||
if (!obj)
|
||||
obj = _cmdObject;
|
||||
|
||||
setOwnerOf(obj, owner);
|
||||
}
|
||||
|
||||
void ScummEngine_v0::resetSentence(bool walking) {
|
||||
_activeVerb = kVerbWalkTo;
|
||||
_activeObjectNr = 0;
|
||||
_activeObjectType = kObjectV0TypeBG;
|
||||
_activeObject2Nr = 0;
|
||||
_activeObject2Type = kObjectV0TypeBG;
|
||||
_activeObject = 0;
|
||||
_activeObject2 = 0;
|
||||
_walkToObjectIdx = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -715,16 +715,12 @@ ScummEngine_v0::ScummEngine_v0(OSystem *syst, const DetectorResult &dr)
|
||||
_currentMode = 0;
|
||||
|
||||
_activeVerb = kVerbNone;
|
||||
_activeObjectNr = 0;
|
||||
_activeObjectType = 0;
|
||||
_activeObject2Nr = 0;
|
||||
_activeObject2Type = 0;
|
||||
_activeObject = 0;
|
||||
_activeObject2 = 0;
|
||||
|
||||
_cmdVerb = kVerbNone;
|
||||
_cmdObjectNr = 0;
|
||||
_cmdObjectType = 0;
|
||||
_cmdObject2Nr = 0;
|
||||
_cmdObject2Type = 0;
|
||||
_cmdObject = 0;
|
||||
_cmdObject2 = 0;
|
||||
|
||||
VAR_ACTIVE_OBJECT2 = 0xFF;
|
||||
VAR_IS_SOUND_RUNNING = 0xFF;
|
||||
|
||||
@@ -804,7 +804,6 @@ public:
|
||||
protected:
|
||||
|
||||
int getObjActToObjActDist(int a, int b); // Not sure how to handle
|
||||
const byte *getActorName(int id);
|
||||
const byte *getObjOrActorName(int obj); // these three..
|
||||
void setObjectName(int obj);
|
||||
|
||||
|
||||
@@ -42,17 +42,13 @@ protected:
|
||||
protected:
|
||||
byte _currentMode;
|
||||
|
||||
int _activeVerb;
|
||||
int _activeObjectNr; // 1st Object Number
|
||||
int _activeObjectType; // 1st Object Type (0: inventory (or room), 1: room)
|
||||
int _activeObject2Nr; // 2nd Object Number
|
||||
int _activeObject2Type; // 2nd Object Type (0: inventory (or room), 1: room, 2: actor)
|
||||
int _activeVerb; // selected verb
|
||||
int _activeObject; // 1st selected object (see OBJECT_V0(nr, type), cannot be an actor)
|
||||
int _activeObject2; // 2nd selected object or actor (see OBJECT_V0(nr, type))
|
||||
|
||||
int _cmdVerb;
|
||||
int _cmdObjectNr;
|
||||
int _cmdObjectType;
|
||||
int _cmdObject2Nr;
|
||||
int _cmdObject2Type;
|
||||
int _cmdVerb; // script verb
|
||||
int _cmdObject; // 1st script object (see OBJECT_V0(nr, type))
|
||||
int _cmdObject2; // 2nd script object or actor (see OBJECT_V0(nr, type))
|
||||
|
||||
int _walkToObject;
|
||||
int _walkToObjectIdx;
|
||||
|
||||
+25
-39
@@ -686,14 +686,14 @@ int ScummEngine_v0::getVerbPrepId() {
|
||||
if (_verbs[_activeVerb].prep != 0xFF) {
|
||||
return _verbs[_activeVerb].prep;
|
||||
} else {
|
||||
byte *ptr = getOBCDFromObject(OBJECT_V0(_activeObjectNr, _activeObjectType), true);
|
||||
byte *ptr = getOBCDFromObject(_activeObject, true);
|
||||
assert(ptr);
|
||||
return (*(ptr + 11) >> 5);
|
||||
}
|
||||
}
|
||||
|
||||
int ScummEngine_v0::activeVerbPrep() {
|
||||
if (!_activeVerb || !_activeObjectNr)
|
||||
if (!_activeVerb || !_activeObject)
|
||||
return 0;
|
||||
return getVerbPrepId();
|
||||
}
|
||||
@@ -702,16 +702,12 @@ void ScummEngine_v0::verbExec() {
|
||||
if (_activeVerb == kVerbWhatIs)
|
||||
return;
|
||||
|
||||
if (_activeVerb != kVerbWalkTo || _activeObjectNr != 0) {
|
||||
doSentence(_activeVerb,
|
||||
OBJECT_V0(_activeObjectNr, _activeObjectType),
|
||||
OBJECT_V0(_activeObject2Nr, _activeObject2Type));
|
||||
if (!(_activeVerb == kVerbWalkTo && _activeObject == 0)) {
|
||||
doSentence(_activeVerb, _activeObject, _activeObject2);
|
||||
if (_activeVerb != kVerbWalkTo) {
|
||||
_activeVerb = kVerbWalkTo;
|
||||
_activeObjectNr = 0;
|
||||
_activeObjectType = 0;
|
||||
_activeObject2Nr = 0;
|
||||
_activeObject2Type = 0;
|
||||
_activeObject = 0;
|
||||
_activeObject2 = 0;
|
||||
}
|
||||
_walkToObjectIdx = 0;
|
||||
return;
|
||||
@@ -735,7 +731,7 @@ void ScummEngine_v0::verbExec() {
|
||||
|
||||
bool ScummEngine_v0::checkSentenceComplete() {
|
||||
if (_activeVerb && _activeVerb != kVerbWalkTo && _activeVerb != kVerbWhatIs) {
|
||||
if (_activeObjectNr && (!activeVerbPrep() || _activeObject2Nr))
|
||||
if (_activeObject && (!activeVerbPrep() || _activeObject2))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -757,12 +753,9 @@ void ScummEngine_v0::checkExecVerbs() {
|
||||
if (over) {
|
||||
if (_activeVerb != over) { // new verb
|
||||
// keep first object if no preposition is used yet
|
||||
if (activeVerbPrep()) {
|
||||
_activeObjectNr = 0;
|
||||
_activeObjectType = 0;
|
||||
}
|
||||
_activeObject2Nr = 0;
|
||||
_activeObject2Type = 0;
|
||||
if (activeVerbPrep())
|
||||
_activeObject = 0;
|
||||
_activeObject2 = 0;
|
||||
_activeVerb = over;
|
||||
sentenceLineChanged = true;
|
||||
} else {
|
||||
@@ -828,41 +821,34 @@ void ScummEngine_v0::checkExecVerbs() {
|
||||
// click region: main screen
|
||||
} else if (zone->number == kMainVirtScreen) {
|
||||
// click into main screen
|
||||
if (_activeVerb == kVerbGive && _activeObjectNr) {
|
||||
obj = OBJECT_V0(getActorFromPos(_virtualMouse.x, _virtualMouse.y), kObjectV0TypeActor);
|
||||
if (_activeVerb == kVerbGive && _activeObject) {
|
||||
int actor = getActorFromPos(_virtualMouse.x, _virtualMouse.y);
|
||||
if (actor != 0)
|
||||
obj = OBJECT_V0(actor, kObjectV0TypeActor);
|
||||
} else {
|
||||
obj = findObject(_virtualMouse.x, _virtualMouse.y);
|
||||
}
|
||||
}
|
||||
|
||||
int id = OBJECT_V0_NR(obj);
|
||||
int type = OBJECT_V0_TYPE(obj);
|
||||
debug("found 0x%03x", obj);
|
||||
|
||||
if (!id) {
|
||||
if (!obj) {
|
||||
if (_activeVerb == kVerbWalkTo) {
|
||||
_activeObjectNr = 0;
|
||||
_activeObjectType = 0;
|
||||
_activeObject2Nr = 0;
|
||||
_activeObject2Type = 0;
|
||||
_activeObject = 0;
|
||||
_activeObject2 = 0;
|
||||
}
|
||||
} else {
|
||||
if (activeVerbPrep() == kVerbPrepNone) {
|
||||
if (id == _activeObjectNr && type == _activeObjectType) {
|
||||
if (obj == _activeObject)
|
||||
execute = true;
|
||||
} else {
|
||||
_activeObjectNr = id;
|
||||
_activeObjectType = type;
|
||||
}
|
||||
else
|
||||
_activeObject = obj;
|
||||
// immediately execute action in keypad/selection mode
|
||||
if (_currentMode == kModeKeypad)
|
||||
execute = true;
|
||||
} else {
|
||||
if (id == _activeObject2Nr && type == _activeObject2Type)
|
||||
if (obj == _activeObject2)
|
||||
execute = true;
|
||||
if (!(id == _activeObjectNr && type == _activeObjectType)) {
|
||||
_activeObject2Nr = id;
|
||||
_activeObject2Type = type;
|
||||
if (obj != _activeObject) {
|
||||
_activeObject2 = obj;
|
||||
if (_currentMode == kModeKeypad)
|
||||
execute = true;
|
||||
}
|
||||
@@ -888,9 +874,9 @@ void ScummEngine_v0::checkExecVerbs() {
|
||||
|
||||
if (_activeVerb == kVerbWalkTo)
|
||||
verbExec();
|
||||
else if (_activeObjectNr) {
|
||||
else if (_activeObject) {
|
||||
// execute if we have a 1st object and either have or do not need a 2nd
|
||||
if (activeVerbPrep() == kVerbPrepNone || _activeObject2Nr)
|
||||
if (activeVerbPrep() == kVerbPrepNone || _activeObject2)
|
||||
verbExec();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user