aboutsummaryrefslogtreecommitdiff
path: root/scumm/object.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scumm/object.cpp')
-rw-r--r--scumm/object.cpp52
1 files changed, 25 insertions, 27 deletions
diff --git a/scumm/object.cpp b/scumm/object.cpp
index 23c4ec7f0d..c239c650ab 100644
--- a/scumm/object.cpp
+++ b/scumm/object.cpp
@@ -546,7 +546,6 @@ void ScummEngine::loadRoomObjects() {
const byte *ptr;
uint16 obim_id;
const byte *room, *searchptr, *rootptr;
- const ImageHeader *imhd;
const CodeHeader *cdhd;
CHECK_HEAP
@@ -599,15 +598,7 @@ void ScummEngine::loadRoomObjects() {
if (ptr == NULL)
error("Room %d missing image blocks(s)", _roomResource);
- imhd = (const ImageHeader *)findResourceData(MKID('IMHD'), ptr);
- if (_version == 8)
- // In V8, IMHD has no obj_id, but rather a name string. We map the name
- // back to an object id using a table derived from the DOBJ resource.
- obim_id = _objectIDMap[imhd->v8.name];
- else if (_version == 7)
- obim_id = READ_LE_UINT16(&imhd->v7.obj_id);
- else
- obim_id = READ_LE_UINT16(&imhd->old.obj_id);
+ obim_id = getObjectIdFromOBIM(ptr);
for (j = 1; j < _numLocalObjects; j++) {
if (_objs[j].obj_nr == obim_id)
@@ -1128,9 +1119,8 @@ void ScummEngine::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id,
const CodeHeader *cdhd;
int i, numobj;
const byte *roomptr, *obcdptr, *obimptr, *searchptr;
- const ImageHeader *imhd;
int id2;
- int id3;
+ int obim_id;
if (findWhat & foCheckAlreadyLoaded && getObjectIndex(id) != -1) {
if (_features & GF_OLD_BUNDLE) {
@@ -1143,7 +1133,6 @@ void ScummEngine::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id,
assert(obcdptr);
fo->obim = obimptr = obcdptr + READ_BE_UINT32(obcdptr + 4);
fo->cdhd = (const CodeHeader *)findResourceData(MKID('CDHD'), obcdptr);
- fo->imhd = (const ImageHeader *)findResourceData(MKID('IMHD'), obimptr);
return;
}
@@ -1187,7 +1176,6 @@ void ScummEngine::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id,
}
if (findWhat & foImageHeader) {
fo->obim = obimptr;
- fo->imhd = NULL;
}
break;
}
@@ -1235,21 +1223,10 @@ void ScummEngine::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id,
obimptr = obims.findNext(MKID('OBIM'));
if (obimptr == NULL)
error("findObjectInRoom: Not enough image blocks in room %d", room);
- imhd = (const ImageHeader *)findResourceData(MKID('IMHD'), obimptr);
- if (_features & GF_SMALL_HEADER)
- id3 = READ_LE_UINT16(obimptr + 6);
- else if (_version == 8)
- // In V8, IMHD has no obj_id, but rather a name string. We map the name
- // back to an object id using a table derived from the DOBJ resource.
- id3 = _objectIDMap[imhd->v8.name];
- else if (_version == 7)
- id3 = READ_LE_UINT16(&imhd->v7.obj_id);
- else
- id3 = READ_LE_UINT16(&imhd->old.obj_id);
+ obim_id = getObjectIdFromOBIM(obimptr);
- if (id3 == (uint16)id) {
+ if (obim_id == (uint16)id) {
fo->obim = obimptr;
- fo->imhd = imhd;
break;
}
}
@@ -1258,6 +1235,27 @@ void ScummEngine::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id,
}
}
+int ScummEngine_v8::getObjectIdFromOBIM(const byte *obim) {
+ // In V8, IMHD has no obj_id, but rather a name string. We map the name
+ // back to an object id using a table derived from the DOBJ resource.
+ const ImageHeader *imhd = (const ImageHeader *)findResourceData(MKID('IMHD'), obim);
+ return _objectIDMap[imhd->v8.name];
+}
+
+int ScummEngine_v7::getObjectIdFromOBIM(const byte *obim) {
+ const ImageHeader *imhd = (const ImageHeader *)findResourceData(MKID('IMHD'), obim);
+ return READ_LE_UINT16(&imhd->v7.obj_id);
+}
+
+int ScummEngine::getObjectIdFromOBIM(const byte *obim) {
+ if (_features & GF_SMALL_HEADER)
+ return READ_LE_UINT16(obim + 6);
+
+ const ImageHeader *imhd = (const ImageHeader *)findResourceData(MKID('IMHD'), obim);
+ return READ_LE_UINT16(&imhd->old.obj_id);
+}
+
+
int ScummEngine::getInventorySlot() {
int i;
for (i = 0; i < _numInventory; i++) {