aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/cursor.cpp22
-rw-r--r--scumm/intern.h8
-rw-r--r--scumm/object.cpp52
-rw-r--r--scumm/object.h1
-rw-r--r--scumm/scumm.h2
5 files changed, 45 insertions, 40 deletions
diff --git a/scumm/cursor.cpp b/scumm/cursor.cpp
index 9d025c6e60..8f49b9f624 100644
--- a/scumm/cursor.cpp
+++ b/scumm/cursor.cpp
@@ -157,26 +157,28 @@ void ScummEngine_v6::setCursorFromImg(uint img, uint room, uint imgindex) {
const byte *dataptr, *bomp;
uint32 size;
FindObjectInRoom foir;
+ const ImageHeader *imhd;
if (room == (uint) - 1)
room = getObjectRoom(img);
findObjectInRoom(&foir, foCodeHeader | foImageHeader | foCheckAlreadyLoaded, img, room);
+ imhd = (const ImageHeader *)findResourceData(MKID('IMHD'), foir.obim);
if (_version == 8) {
- setCursorHotspot(READ_LE_UINT32(&foir.imhd->v8.hotspot[0].x),
- READ_LE_UINT32(&foir.imhd->v8.hotspot[0].y));
- w = READ_LE_UINT32(&foir.imhd->v8.width) / 8;
- h = READ_LE_UINT32(&foir.imhd->v8.height) / 8;
+ setCursorHotspot(READ_LE_UINT32(&imhd->v8.hotspot[0].x),
+ READ_LE_UINT32(&imhd->v8.hotspot[0].y));
+ w = READ_LE_UINT32(&imhd->v8.width) / 8;
+ h = READ_LE_UINT32(&imhd->v8.height) / 8;
} else if (_version == 7) {
- setCursorHotspot(READ_LE_UINT16(&foir.imhd->v7.hotspot[0].x),
- READ_LE_UINT16(&foir.imhd->v7.hotspot[0].y));
- w = READ_LE_UINT16(&foir.imhd->v7.width) / 8;
- h = READ_LE_UINT16(&foir.imhd->v7.height) / 8;
+ setCursorHotspot(READ_LE_UINT16(&imhd->v7.hotspot[0].x),
+ READ_LE_UINT16(&imhd->v7.hotspot[0].y));
+ w = READ_LE_UINT16(&imhd->v7.width) / 8;
+ h = READ_LE_UINT16(&imhd->v7.height) / 8;
} else {
if (!(_features & GF_HUMONGOUS))
- setCursorHotspot(READ_LE_UINT16(&foir.imhd->old.hotspot[0].x),
- READ_LE_UINT16(&foir.imhd->old.hotspot[0].y));
+ setCursorHotspot(READ_LE_UINT16(&imhd->old.hotspot[0].x),
+ READ_LE_UINT16(&imhd->old.hotspot[0].y));
w = READ_LE_UINT16(&foir.cdhd->v6.w) / 8;
h = READ_LE_UINT16(&foir.cdhd->v6.h) / 8;
}
diff --git a/scumm/intern.h b/scumm/intern.h
index 53944e7430..792f68abec 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -1203,6 +1203,8 @@ protected:
virtual void setCameraFollows(Actor *a);
virtual void moveCamera();
virtual void panCameraTo(int x, int y);
+
+ virtual int getObjectIdFromOBIM(const byte *obim);
};
class ScummEngine_v8 : public ScummEngine_v7 {
@@ -1214,7 +1216,9 @@ protected:
};
const OpcodeEntryV8 *_opcodesV8;
-
+
+ ObjectIDMap _objectIDMap;
+
public:
ScummEngine_v8(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16]) : ScummEngine_v7(detector, syst, gs, md5sum) {}
@@ -1236,6 +1240,8 @@ protected:
virtual int readVar(uint var);
virtual void writeVar(uint var, int value);
+ virtual int getObjectIdFromOBIM(const byte *obim);
+
/* Version 8 script opcodes */
void o8_mod();
void o8_wait();
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++) {
diff --git a/scumm/object.h b/scumm/object.h
index 78cfc811ff..a50933c3d5 100644
--- a/scumm/object.h
+++ b/scumm/object.h
@@ -165,7 +165,6 @@ struct ImageHeader { /* file format */
struct FindObjectInRoom {
const CodeHeader *cdhd;
const byte *obcd;
- const ImageHeader *imhd;
const byte *obim;
const byte *roomptr;
};
diff --git a/scumm/scumm.h b/scumm/scumm.h
index 35da5caa02..4935af2ada 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -744,7 +744,6 @@ public:
protected:
byte *_objectOwnerTable, *_objectRoomTable, *_objectStateTable;
- ObjectIDMap _objectIDMap;
int _numObjectsInRoom;
virtual void setupRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL);
@@ -794,6 +793,7 @@ protected:
byte *getOBCDFromObject(int obj);
const byte *getOBIMFromObject(const ObjectData &od);
const byte *getObjectImage(const byte *ptr, int state);
+ virtual int getObjectIdFromOBIM(const byte *obim);
int getDistanceBetween(bool is_obj_1, int b, int c, bool is_obj_2, int e, int f);