diff options
Diffstat (limited to 'engines/scumm')
-rw-r--r-- | engines/scumm/debugger.cpp | 11 | ||||
-rw-r--r-- | engines/scumm/object.cpp | 11 | ||||
-rw-r--r-- | engines/scumm/object.h | 12 | ||||
-rw-r--r-- | engines/scumm/script.cpp | 6 | ||||
-rw-r--r-- | engines/scumm/script_v0.cpp | 14 | ||||
-rw-r--r-- | engines/scumm/scumm.h | 1 | ||||
-rw-r--r-- | engines/scumm/scumm_v0.h | 13 | ||||
-rw-r--r-- | engines/scumm/verbs.cpp | 2 |
8 files changed, 41 insertions, 29 deletions
diff --git a/engines/scumm/debugger.cpp b/engines/scumm/debugger.cpp index 54f7fea97b..59018f1269 100644 --- a/engines/scumm/debugger.cpp +++ b/engines/scumm/debugger.cpp @@ -382,7 +382,7 @@ 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->getObjOrActorName(actnum)); + DebugPrintf("Name of actor %d: %s\n", actnum, _vm->getActorName(actnum)); } else if (!strcmp(argv[2], "condmask")) { if (argc > 3) { a->_heCondMask = value; @@ -427,9 +427,11 @@ bool ScummDebugger::Cmd_PrintObjects(int argc, const char **argv) { o = &(_vm->_objs[i]); if (o->obj_nr == 0) continue; + int obj = (_vm->_game.version != 0 ? o->obj_nr : OBJECT_V0(o->obj_nr, o->obj_type)); + int classData = (_vm->_game.version != 0 ? _vm->_classData[o->obj_nr] : 0); DebugPrintf("|%4d|%4d|%4d|%5d|%6d|%5d|%2d|$%08x|\n", - o->obj_nr, o->x_pos, o->y_pos, o->width, o->height, o->state, - o->fl_object_index, _vm->_classData[o->obj_nr]); + obj, o->x_pos, o->y_pos, o->width, o->height, o->state, + o->fl_object_index, classData); } DebugPrintf("\n"); @@ -446,7 +448,8 @@ bool ScummDebugger::Cmd_Object(int argc, const char **argv) { } obj = atoi(argv[1]); - if (obj >= _vm->_numGlobalObjects) { + int obj_nr = (_vm->_game.version != 0 ? obj : OBJECT_V0_NR(obj)); + if (obj_nr >= _vm->_numGlobalObjects) { DebugPrintf("Object %d is out of range (range: 1 - %d)\n", obj, _vm->_numGlobalObjects); return true; } diff --git a/engines/scumm/object.cpp b/engines/scumm/object.cpp index 86d9065385..d3ed086892 100644 --- a/engines/scumm/object.cpp +++ b/engines/scumm/object.cpp @@ -1150,6 +1150,17 @@ 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; diff --git a/engines/scumm/object.h b/engines/scumm/object.h index 7e4a5b57ab..12956fc4fd 100644 --- a/engines/scumm/object.h +++ b/engines/scumm/object.h @@ -31,6 +31,18 @@ static inline int OBJECT_V0(int id, byte type) { #define OBJECT_V0_NR(obj) (obj & 0xFF) #define OBJECT_V0_TYPE(obj) ((obj >> 8) & 0xFF) +enum ObjectV0Type { + kObjectV0TypeFG = 0, // foreground object + // - with owner/state, might (but has not to) be pickupable + // -> with entry in _objectOwner/StateTable + // -> all objects in _inventory have this type + // - image can be exchanged (background overlay) + kObjectV0TypeBG = 1, // background object + // - without owner/state, not pickupable (room only) + // -> without entry in _objectOwner/StateTable + // - image cannot be exchanged (part of background image) + kObjectV0TypeActor = 2 // object is an actor +}; enum ObjectClass { kObjectClassNeverClip = 20, diff --git a/engines/scumm/script.cpp b/engines/scumm/script.cpp index eb0f7bf16a..bc6873edf2 100644 --- a/engines/scumm/script.cpp +++ b/engines/scumm/script.cpp @@ -1137,7 +1137,7 @@ void ScummEngine_v0::walkToActorOrObject(int object) { _walkToObject = object; _walkToObjectIdx = getObjectIndex(object); - if (OBJECT_V0_TYPE(object) == kObjectTypeActor) { + if (OBJECT_V0_TYPE(object) == kObjectV0TypeActor) { walkActorToActor(VAR(VAR_EGO), OBJECT_V0_NR(object), 4); x = a->getRealPos().x; y = a->getRealPos().y; @@ -1187,8 +1187,8 @@ void ScummEngine_v0::checkAndRunSentenceScript() { // If two objects are involved, at least one must be in the actors inventory if (obj2Nr && - (obj1Type != kObjectTypeFG || _objectOwnerTable[obj1Nr] != VAR(VAR_EGO)) && - (obj2Type != kObjectTypeFG || _objectOwnerTable[obj2Nr] != VAR(VAR_EGO))) + (obj1Type != kObjectV0TypeFG || _objectOwnerTable[obj1Nr] != VAR(VAR_EGO)) && + (obj2Type != kObjectV0TypeFG || _objectOwnerTable[obj2Nr] != VAR(VAR_EGO))) { if (getVerbEntrypoint(st.objectA, kVerbPickUp)) doSentence(kVerbPickUp, st.objectA, 0); diff --git a/engines/scumm/script_v0.cpp b/engines/scumm/script_v0.cpp index e3d74fcd90..f35230b6e2 100644 --- a/engines/scumm/script_v0.cpp +++ b/engines/scumm/script_v0.cpp @@ -461,8 +461,7 @@ void ScummEngine_v0::drawSentenceLine() { if (_activeVerb == kVerbNewKid) { _sentenceBuf = ""; for (int i = 0; i < 3; ++i) { - Actor *a = derefActor(VAR(97 + i), "drawSentence"); - _sentenceBuf += Common::String::format("%-13s", a->getActorName()); + _sentenceBuf += Common::String::format("%-13s", getActorName(VAR(97 + i))); } flushSentenceLine(); return; @@ -488,10 +487,9 @@ void ScummEngine_v0::drawSentenceLine() { // Draw the 2nd active object if (_activeObject2Nr) { // 2nd Object is an actor - if (_activeObject2Type == kObjectTypeActor) { - Actor *a = derefActor(_activeObject2Nr, ""); + if (_activeObject2Type == kObjectV0TypeActor) { _sentenceBuf += " "; - _sentenceBuf += (const char *)a->getActorName(); + _sentenceBuf += (const char *)getActorName(_activeObject2Nr); // 2nd Object is an inventory or room object } else { drawSentenceObject(OBJECT_V0(_activeObject2Nr, _activeObject2Type)); @@ -838,7 +836,7 @@ void ScummEngine_v0::o_doSentence() { bool ScummEngine_v0::ifEqualActiveObject2Common(bool ignoreType) { byte obj = fetchScriptByte(); - if (!ignoreType || (_cmdObject2Type == kObjectTypeFG)) + if (!ignoreType || (_cmdObject2Type == kObjectV0TypeFG)) return (obj == _cmdObject2Nr); return false; } @@ -952,9 +950,9 @@ void ScummEngine_v0::o_setOwnerOf() { void ScummEngine_v0::resetSentence(bool walking) { _activeVerb = kVerbWalkTo; _activeObjectNr = 0; - _activeObjectType = kObjectTypeBG; + _activeObjectType = kObjectV0TypeBG; _activeObject2Nr = 0; - _activeObject2Type = kObjectTypeBG; + _activeObject2Type = kObjectV0TypeBG; _walkToObjectIdx = 0; } diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index fadc3902c0..d77ae44d4c 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -804,6 +804,7 @@ 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); diff --git a/engines/scumm/scumm_v0.h b/engines/scumm/scumm_v0.h index c2af6d4c5f..4da46b31bf 100644 --- a/engines/scumm/scumm_v0.h +++ b/engines/scumm/scumm_v0.h @@ -39,19 +39,6 @@ protected: kModeNormal = 3, // normal playing mode }; - enum ObjectType { - kObjectTypeFG = 0, // foreground object - // - with owner/state, might (but has not to) be pickupable - // -> with entry in _objectOwner/StateTable - // -> all objects in _inventory have this type - // - image can be exchanged (background overlay) - kObjectTypeBG = 1, // background object - // - without owner/state, not pickupable (room only) - // -> without entry in _objectOwner/StateTable - // - image cannot be exchanged (part of background image) - kObjectTypeActor = 2 // object is an actor - }; - protected: byte _currentMode; diff --git a/engines/scumm/verbs.cpp b/engines/scumm/verbs.cpp index 30d0d02976..99fdafa5b6 100644 --- a/engines/scumm/verbs.cpp +++ b/engines/scumm/verbs.cpp @@ -829,7 +829,7 @@ void ScummEngine_v0::checkExecVerbs() { } else if (zone->number == kMainVirtScreen) { // click into main screen if (_activeVerb == kVerbGive && _activeObjectNr) { - obj = OBJECT_V0(getActorFromPos(_virtualMouse.x, _virtualMouse.y), kObjectTypeActor); + obj = OBJECT_V0(getActorFromPos(_virtualMouse.x, _virtualMouse.y), kObjectV0TypeActor); } else { obj = findObject(_virtualMouse.x, _virtualMouse.y); } |