aboutsummaryrefslogtreecommitdiff
path: root/object.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'object.cpp')
-rw-r--r--object.cpp58
1 files changed, 32 insertions, 26 deletions
diff --git a/object.cpp b/object.cpp
index 783336492d..98c1f43407 100644
--- a/object.cpp
+++ b/object.cpp
@@ -148,7 +148,7 @@ void Scumm::getObjectXYPos(int object) {
ptr += od->offs_obim_to_room;
}
assert(ptr);
- imhd = (ImageHeader*)findResource(MKID('IMHD'), ptr);
+ imhd = (ImageHeader*)findResourceData(MKID('IMHD'), ptr);
x = od->x_pos + (int16)READ_LE_UINT16(&imhd->hotspot[state].x);
y = od->y_pos + (int16)READ_LE_UINT16(&imhd->hotspot[state].y);
} else {
@@ -326,7 +326,7 @@ void Scumm::drawObject(int obj, int arg) {
if (numstrip!=0) {
byte flags = Gdi::dbAllowMaskOr;
- if (getClass(od->obj_nr, 22))
+ if (_features&GF_AFTER_V7 && getClass(od->obj_nr, 22))
flags |= Gdi::dbDrawMaskOnBoth;
gdi.drawBitmap(ptr, _curVirtScreen, x, ypos, height, x-xpos, numstrip, flags);
}
@@ -346,7 +346,7 @@ void Scumm::loadRoomObjects() {
CHECK_HEAP
room = getResourceAddress(rtRoom, _roomResource);
- roomhdr = (RoomHeader*)findResource(MKID('RMHD'), room);
+ roomhdr = (RoomHeader*)findResourceData(MKID('RMHD'), room);
_numObjectsInRoom = READ_LE_UINT16(&roomhdr->numObjects);
@@ -364,7 +364,7 @@ void Scumm::loadRoomObjects() {
error("Room %d missing object code block(s)", _roomResource);
od->offs_obcd_to_room = ptr - room;
- cdhd = (CodeHeader*)findResource(MKID('CDHD'), ptr, 0);
+ cdhd = (CodeHeader*)findResourceData(MKID('CDHD'), ptr);
od->obj_nr = READ_LE_UINT16(&cdhd->obj_id);
#ifdef DUMP_SCRIPTS
@@ -383,7 +383,7 @@ void Scumm::loadRoomObjects() {
if (ptr==NULL)
error("Room %d missing image blocks(s)", _roomResource);
- imhd = (ImageHeader*)findResource(MKID('IMHD'), ptr, 0);
+ imhd = (ImageHeader*)findResourceData(MKID('IMHD'), ptr);
obim_id = READ_LE_UINT16(&imhd->obj_id);
for(j=1; j<=_numObjectsInRoom; j++) {
@@ -406,7 +406,7 @@ void Scumm::setupRoomObject(ObjectData *od, byte *room) {
CodeHeader *cdhd;
ImageHeader *imhd;
- cdhd = (CodeHeader*)findResource(MKID('CDHD'), room + od->offs_obcd_to_room);
+ cdhd = (CodeHeader*)findResourceData(MKID('CDHD'), room + od->offs_obcd_to_room);
od->obj_nr = READ_LE_UINT16(&cdhd->obj_id);
@@ -442,7 +442,7 @@ void Scumm::setupRoomObject(ObjectData *od, byte *room) {
od->parent = cdhd->parent;
od->parentstate = cdhd->parentstate;
- imhd = (ImageHeader*)findResource(MKID('IMHD'), room + od->offs_obim_to_room);
+ imhd = (ImageHeader*)findResourceData(MKID('IMHD'), room + od->offs_obim_to_room);
od->x_pos = imhd->x_pos;
od->y_pos = imhd->y_pos;
od->width = imhd->width;
@@ -547,11 +547,11 @@ byte *Scumm::getObjOrActorName(int obj) {
if (obj < NUM_ACTORS)
return getActorName(derefActorSafe(obj, "getObjOrActorName"));
- objptr = getObjectAddress(obj);
+ objptr = getOBCDFromObject(obj);
if (objptr==NULL)
return (byte*)" ";
- return findResource(MKID('OBNA'), objptr) + 8;
+ return findResourceData(MKID('OBNA'), objptr);
}
uint32 Scumm::getOBCDOffs(int object) {
@@ -569,7 +569,7 @@ uint32 Scumm::getOBCDOffs(int object) {
return 0;
}
-byte *Scumm::getObjectAddress(int obj) {
+byte *Scumm::getOBCDFromObject(int obj) {
int i;
if (_objectOwnerTable[obj] != OF_OWNER_ROOM) {
@@ -601,12 +601,12 @@ void Scumm::addObjectToInventory(uint obj, uint room) {
if (whereIsObject(obj)==WIO_FLOBJECT) {
i = getObjectIndex(obj);
- ptr = getResourceAddress(rtFlObject, _objs[i].fl_object_index) + 64;
+ ptr = getResourceAddress(rtFlObject, _objs[i].fl_object_index) + 8;
size = READ_BE_UINT32_UNALIGNED(ptr+4);
slot = getInventorySlot();
_inventory[slot] = obj;
createResource(rtInventory, slot, size);
- ptr = getResourceAddress(rtFlObject, _objs[i].fl_object_index) + 64;
+ ptr = getResourceAddress(rtFlObject, _objs[i].fl_object_index) + 8;
memcpy(getResourceAddress(rtInventory, slot), ptr, size);
} else {
findObjectInRoom(&foir, foCodeHeader, obj, room);
@@ -629,16 +629,16 @@ void Scumm::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id, uint
ImageHeader *imhd;
if (findWhat&foCheckAlreadyLoaded && getObjectIndex(id) != -1) {
- fo->obcd = obcdptr = getObjectAddress(id);
+ fo->obcd = obcdptr = getOBCDFromObject(id);
assert((byte*)obcdptr > (byte*)256);
- fo->obim = obimptr = obcdptr + READ_BE_UINT32_UNALIGNED(&((ImageHeader*)obcdptr)->size);
- fo->cdhd = (CodeHeader*)findResource(MKID('CDHD'), obcdptr);
- fo->imhd = (ImageHeader*)findResource(MKID('IMHD'), obimptr);
+ fo->obim = obimptr = obcdptr + READ_BE_UINT32_UNALIGNED(&((ResHdr*)obcdptr)->size);
+ fo->cdhd = (CodeHeader*)findResourceData(MKID('CDHD'), obcdptr);
+ fo->imhd = (ImageHeader*)findResourceData(MKID('IMHD'), obimptr);
return;
}
fo->roomptr = roomptr = getResourceAddress(rtRoom, room);
- roomhdr = (RoomHeader*)findResource(MKID('RMHD'), roomptr);
+ roomhdr = (RoomHeader*)findResourceData(MKID('RMHD'), roomptr);
numobj = READ_LE_UINT16(&roomhdr->numObjects);
if (numobj==0)
error("findObjectInRoom: No object found in room %d", room);
@@ -651,7 +651,7 @@ void Scumm::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id, uint
obcdptr = findResource(MKID('OBCD'), searchptr);
if(obcdptr==NULL)
error("findObjectInRoom: Not enough code blocks in room %d", room);
- cdhd = (CodeHeader*)findResource(MKID('CDHD'), obcdptr, 0);
+ cdhd = (CodeHeader*)findResourceData(MKID('CDHD'), obcdptr);
if ( READ_LE_UINT16(&cdhd->obj_id) == (uint16)id) {
fo->cdhd = cdhd;
fo->obcd = obcdptr;
@@ -669,7 +669,7 @@ void Scumm::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id, uint
obimptr = findResource(MKID('OBIM'), searchptr);
if (obimptr==NULL)
error("findObjectInRoom: Not enough image blocks in room %d", room);
- imhd = (ImageHeader*)findResource(MKID('IMHD'), obimptr, 0);
+ imhd = (ImageHeader*)findResourceData(MKID('IMHD'), obimptr);
if (READ_LE_UINT16(&imhd->obj_id) == (uint16)id) {
fo->obim = obimptr;
fo->imhd = imhd;
@@ -730,15 +730,24 @@ int Scumm::getObjY(int obj) {
}
}
-int Scumm::getObjDir(int obj) {
+int Scumm::getObjOldDir(int obj) {
if (obj < NUM_ACTORS) {
- return newDirToOldDir(derefActorSafe(obj,"getObjDir")->facing);
+ return newDirToOldDir(derefActorSafe(obj,"getObjOldDir")->facing);
} else {
getObjectXYPos(obj);
return _dir;
}
}
+int Scumm::getObjNewDir(int obj) {
+ if (obj < NUM_ACTORS) {
+ return derefActorSafe(obj,"getObjNewDir")->facing;
+ } else {
+ getObjectXYPos(obj);
+ return oldDirToNewDir(_dir);
+ }
+}
+
int Scumm::findInventory(int owner, int index) {
int count = 1, i, obj;
for (i=0; i!=_maxInventoryItems; i++) {
@@ -876,7 +885,7 @@ void Scumm::nukeFlObjects(int min, int max) {
}
}
-void Scumm::enqueueObject(int a, int b, int c, int d, int e, int f, int g, int h) {
+void Scumm::enqueueObject(int a, int b, int c, int d, int e, int f, int g, int h, int mode) {
EnqueuedObject *eo;
ObjectData *od;
@@ -955,7 +964,7 @@ void Scumm::drawEnqueuedObject(EnqueuedObject *eo) {
assert(ptr);
ptr = findResource(MKID('IM01'), ptr);
assert(ptr);
- bomp = findResource(MKID('BOMP'), ptr);
+ bomp = findResourceData(MKID('BOMP'), ptr);
bdd.srcwidth = READ_LE_UINT16(&((BompHeader*)bomp)->width);
bdd.srcheight = READ_LE_UINT16(&((BompHeader*)bomp)->height);
@@ -1012,9 +1021,6 @@ void Scumm::loadFlObject(uint object, uint room) {
if (whereIsObject(object) != WIO_NOT_FOUND)
return;
- if (room==(uint)-1)
- room = getObjectRoom(object);
-
/* Locate the object in the room resource */
findObjectInRoom(&foir, foImageHeader | foCodeHeader, object, room);