diff options
author | Tobias Gunkel | 2012-01-07 16:08:55 +0100 |
---|---|---|
committer | Tobias Gunkel | 2012-02-11 08:28:14 +0100 |
commit | 1c32000a004cc184a8744e2467035a4c7ba2f3a5 (patch) | |
tree | 0be70cec22cace4d981817558ce15534f308c25c /engines/scumm/script_v0.cpp | |
parent | c69a52853ccc42f3891ce4212fa281dbea65c3ea (diff) | |
download | scummvm-rg350-1c32000a004cc184a8744e2467035a4c7ba2f3a5.tar.gz scummvm-rg350-1c32000a004cc184a8744e2467035a4c7ba2f3a5.tar.bz2 scummvm-rg350-1c32000a004cc184a8744e2467035a4c7ba2f3a5.zip |
SCUMM: start handling object type and id correctly in mm c64
- removed complicated and unnecessary _v0ObjectIndex, _v0ObjectInInventory, _v0ObjectFlag vars
- started to merge object id and type into one object value (type<<8|id)
- verb preposition ids do not dependent on language -> remove from VerbSettings
Note:
- objects with type=0 are foreground objects. They have a state, an owner and a bg overlay image.
- objects with type=1 are bg objects. They do not have a state or owner and are already contained in the bg image. The do not have an entry in objectState/OwnerTable
Diffstat (limited to 'engines/scumm/script_v0.cpp')
-rw-r--r-- | engines/scumm/script_v0.cpp | 65 |
1 files changed, 19 insertions, 46 deletions
diff --git a/engines/scumm/script_v0.cpp b/engines/scumm/script_v0.cpp index 2bbde617ad..14df89b28d 100644 --- a/engines/scumm/script_v0.cpp +++ b/engines/scumm/script_v0.cpp @@ -365,7 +365,7 @@ uint ScummEngine_v0::fetchScriptWord() { int ScummEngine_v0::getActiveObject() { if (_opcode & PARAM_2) - return _activeObject; + return _activeObjectNr; return fetchScriptByte(); } @@ -406,22 +406,9 @@ void ScummEngine_v0::decodeParseString() { actorTalk(buffer); } -const byte *ScummEngine_v0::getObjectName(int object, int type) { - const byte *temp; - - if (type == kObjectTypeInventory) - _v0ObjectInInventory = true; - - temp = getObjOrActorName(object); - - _v0ObjectInInventory = false; - - return temp; -} - void ScummEngine_v0::drawSentenceObject(int object, int type) { const byte *temp; - temp = getObjectName(object, type); + temp = getObjOrActorName(OBJECT_V0(object, type)); if (temp) { _sentenceBuf += " "; _sentenceBuf += (const char *)temp; @@ -443,25 +430,25 @@ void ScummEngine_v0::drawSentence() { return; } - if (_activeObject) { + if (_activeObjectNr) { // Draw the 1st active object - drawSentenceObject(_activeObject, _activeObjectType); + drawSentenceObject(_activeObjectNr, _activeObjectType); // Append verb preposition - int sentencePrep = verbPrep(); + int sentencePrep = activeVerbPrep(); if (sentencePrep) { drawPreposition(sentencePrep); // Draw the 2nd active object - if (_activeObject2) { + if (_activeObject2Nr) { // 2nd Object is an actor if (_activeObject2Type == kObjectTypeActor) { - Actor *a = derefActor(_activeObject2, ""); + Actor *a = derefActor(_activeObject2Nr, ""); _sentenceBuf += " "; _sentenceBuf += (const char *)a->getActorName(); // 2nd Object is an inventory or room object } else { - drawSentenceObject(_activeObject2, _activeObject2Type); + drawSentenceObject(_activeObject2Nr, _activeObject2Type); } } } @@ -705,26 +692,13 @@ void ScummEngine_v0::o_putActorAtObject() { } void ScummEngine_v0::o_pickupObject() { - int obj = fetchScriptByte(); - if (obj == 0) { - if (_activeObject) { - obj = _activeObject; - } else { - // might happen if an inventory item was picked again - return; - } - } + int objNr = fetchScriptByte(); + int obj = OBJECT_V0((objNr ? objNr : _activeObjectNr), 0); - if (obj < 1) { - error("pickupObject received invalid index %d (script %d)", obj, vm.slot[_currentScript].number); - } - - if (getObjectIndex(obj) == -1) + /* Don't take an object twice */ + if (whereIsObject(obj) == WIO_INVENTORY) return; - if (whereIsObjectInventory(_activeObject2) == WIO_INVENTORY) /* Don't take an */ - return; /* object twice */ - addObjectToInventory(obj, _roomResource); markObjectRectAsDirty(obj); putOwner(obj, VAR(VAR_EGO)); @@ -822,8 +796,8 @@ void ScummEngine_v0::o_doSentence() { bool ScummEngine_v0::ifEqualActiveObject2Common(bool inventoryObject) { byte obj = fetchScriptByte(); - if (!inventoryObject || (_activeObject2Type == kObjectTypeInventory)) - return (obj == _activeObject2); + if (!inventoryObject || (_activeObject2Type == kObjectTypeFG)) + return (obj == _activeObject2Nr); return false; } @@ -920,7 +894,7 @@ void ScummEngine_v0::o_setOwnerOf() { owner = getVarOrDirectByte(PARAM_2); if (obj == 0) - obj = _activeObject; + obj = _activeObjectNr; // FIXME: the original interpreter seems to set the owner of // an item to remove (new owner 0) to 13 (purple tentacle). @@ -939,16 +913,15 @@ void ScummEngine_v0::resetSentence(bool walking) { // If the actor is walking, or the screen is a keypad (no sentence verbs/objects are drawn) // Then reset all active objects (stops the radio crash, bug #3077966) if (!walking || !(_userState & 32)) { - _v0ObjectFlag = 0; - _activeObject = 0; - _activeObject2 = 0; + _activeObjectNr = 0; + _activeObjectType = kObjectTypeBG; + _activeObject2Nr = 0; + _activeObject2Type = kObjectTypeBG; } _verbExecuting = false; _verbPickup = false; - _activeObjectType = kObjectTypeRoom; - _activeObject2Type = kObjectTypeRoom; _activeObjectObtained = false; _activeObject2Obtained = false; } |