aboutsummaryrefslogtreecommitdiff
path: root/engines/scumm/script_v0.cpp
diff options
context:
space:
mode:
authorTobias Gunkel2012-01-07 16:08:55 +0100
committerTobias Gunkel2012-02-11 08:28:14 +0100
commit1c32000a004cc184a8744e2467035a4c7ba2f3a5 (patch)
tree0be70cec22cace4d981817558ce15534f308c25c /engines/scumm/script_v0.cpp
parentc69a52853ccc42f3891ce4212fa281dbea65c3ea (diff)
downloadscummvm-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.cpp65
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;
}