aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorTobias Gunkel2012-01-15 20:11:30 +0100
committerTobias Gunkel2012-02-11 08:28:44 +0100
commitf2309998ffbcb33a96edac7f2959abc534717827 (patch)
tree6b084dd891829d1d39abe6301ea2868caa53ffeb /engines
parent6ca91a2be5e2f2ad981e52a5c21ca97ca3dee48d (diff)
downloadscummvm-rg350-f2309998ffbcb33a96edac7f2959abc534717827.tar.gz
scummvm-rg350-f2309998ffbcb33a96edac7f2959abc534717827.tar.bz2
scummvm-rg350-f2309998ffbcb33a96edac7f2959abc534717827.zip
SCUMM: fix debugger for v0
Diffstat (limited to 'engines')
-rw-r--r--engines/scumm/debugger.cpp11
-rw-r--r--engines/scumm/object.cpp11
-rw-r--r--engines/scumm/object.h12
-rw-r--r--engines/scumm/script.cpp6
-rw-r--r--engines/scumm/script_v0.cpp14
-rw-r--r--engines/scumm/scumm.h1
-rw-r--r--engines/scumm/scumm_v0.h13
-rw-r--r--engines/scumm/verbs.cpp2
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);
}