New virtual method getObjectIdFromOBIM

svn-id: r17660
This commit is contained in:
Max Horn 2005-04-17 23:19:16 +00:00
parent c4e7f403f8
commit 96e40213ef
5 changed files with 45 additions and 40 deletions

View file

@ -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;
}

View file

@ -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();

View file

@ -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++) {

View file

@ -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;
};

View file

@ -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);