aboutsummaryrefslogtreecommitdiff
path: root/object.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'object.cpp')
-rw-r--r--object.cpp133
1 files changed, 95 insertions, 38 deletions
diff --git a/object.cpp b/object.cpp
index 71cffd06a6..1c98b7d811 100644
--- a/object.cpp
+++ b/object.cpp
@@ -134,27 +134,33 @@ void Scumm::getObjectXYPos(int object) {
ImageHeader *imhd;
int x,y;
AdjustBoxResult abr;
-
- if (_features&GF_AFTER_V6) {
- state = getState(object)-1;
- if (state<0)
- state = 0;
-
- if (od->fl_object_index) {
- ptr = getResourceAddress(rtFlObject, od->fl_object_index);
- ptr = findResource(MKID('OBIM'), ptr);
- } else {
- ptr = getResourceAddress(rtRoom, _roomResource);
- ptr += od->offs_obim_to_room;
- }
- assert(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 {
- x = (int16)READ_LE_UINT16(&od->walk_x);
- y = (int16)READ_LE_UINT16(&od->walk_y);
- }
+ if(!(_features & GF_SMALL_HEADER)) {
+ if (_features&GF_AFTER_V6) {
+ state = getState(object)-1;
+ if (state<0)
+ state = 0;
+
+ if (od->fl_object_index) {
+ ptr = getResourceAddress(rtFlObject, od->fl_object_index);
+ ptr = findResource(MKID('OBIM'), ptr);
+ } else {
+ ptr = getResourceAddress(rtRoom, _roomResource);
+ ptr += od->offs_obim_to_room;
+ }
+ assert(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 {
+ x = (int16)READ_LE_UINT16(&od->walk_x);
+ y = (int16)READ_LE_UINT16(&od->walk_y);
+ }
+ } else {
+ x = (int16)READ_LE_UINT16(&od->x_pos);
+ y = (int16)READ_LE_UINT16(&od->y_pos);
+ _xPos = x;
+ _yPos = y;
+ }
// abr = adjustXYToBeInBox(0, x, y);
// _xPos = abr.x;
@@ -304,7 +310,10 @@ void Scumm::drawObject(int obj, int arg) {
ptr = ptr + od->offs_obim_to_room;
}
- ptr = findResource(IMxx_tags[getState(od->obj_nr)], ptr);
+ if(_features & GF_SMALL_HEADER)
+ ptr +=8;
+ else
+ ptr = findResource(IMxx_tags[getState(od->obj_nr)], ptr);
if (!ptr)
return;
@@ -473,8 +482,24 @@ void Scumm::setupRoomObject(ObjectData *od, byte *room) {
CodeHeader *cdhd;
ImageHeader *imhd;
- cdhd = (CodeHeader*)findResourceData(MKID('CDHD'), room + od->offs_obcd_to_room);
+ if(_features & GF_SMALL_HEADER) {
+ byte *ptr = room + od->offs_obcd_to_room;
+ od->obj_nr = READ_LE_UINT16(ptr+6);
+ od->width = *(ptr+11)<<3;
+ od->height = *(ptr+17);
+ od->x_pos = *(ptr+9)<<3;
+ od->y_pos = *(ptr+10)<<3;
+
+ if(*(ptr+10) == 0x80) {
+ od->parentstate = 1; // it's 0x10 in the original code
+ } else {
+ od->parentstate = 0;
+ }
+
+ return;
+ }
+ cdhd = (CodeHeader*)findResourceData(MKID('CDHD'), room + od->offs_obcd_to_room);
od->obj_nr = READ_LE_UINT16(&cdhd->obj_id);
#if !defined(FULL_THROTTLE)
@@ -614,6 +639,14 @@ byte *Scumm::getObjOrActorName(int obj) {
if (obj < NUM_ACTORS)
return getActorName(derefActorSafe(obj, "getObjOrActorName"));
+ if(_features & GF_SMALL_HEADER) {
+ byte offset;
+
+ objptr = getOBCDFromObject(obj);
+ offset = *(objptr+18);
+ return(objptr+offset);
+ }
+
objptr = getOBCDFromObject(obj);
if (objptr==NULL)
return (byte*)" ";
@@ -677,7 +710,10 @@ void Scumm::addObjectToInventory(uint obj, uint room) {
memcpy(getResourceAddress(rtInventory, slot), ptr, size);
} else {
findObjectInRoom(&foir, foCodeHeader, obj, room);
- size = READ_BE_UINT32_UNALIGNED(foir.obcd+4);
+ if(_features & GF_SMALL_HEADER )
+ size = READ_LE_UINT32(foir.obcd);
+ else
+ size = READ_BE_UINT32_UNALIGNED(foir.obcd+4);
slot = getInventorySlot();
_inventory[slot] = obj;
createResource(rtInventory, slot, size);
@@ -715,15 +751,26 @@ void Scumm::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id, uint
if (findWhat & foCodeHeader) {
searchptr = roomptr;
for (i=0;;) {
- obcdptr = findResource(MKID('OBCD'), searchptr);
+ if(_features & GF_SMALL_HEADER)
+ obcdptr = findResourceSmall(MKID('OBCD'), searchptr);
+ else
+ obcdptr = findResource(MKID('OBCD'), searchptr);
if(obcdptr==NULL)
error("findObjectInRoom: Not enough code blocks in room %d", room);
- cdhd = (CodeHeader*)findResourceData(MKID('CDHD'), obcdptr);
- if ( READ_LE_UINT16(&cdhd->obj_id) == (uint16)id) {
- fo->cdhd = cdhd;
- fo->obcd = obcdptr;
- break;
- }
+ if ( _features & GF_SMALL_HEADER) {
+ if ( READ_LE_UINT16(obcdptr+6) == (uint16)id) {
+ fo->cdhd = NULL;
+ fo->obcd = obcdptr;
+ break;
+ }
+ } else {
+ cdhd = (CodeHeader*)findResourceData(MKID('CDHD'), obcdptr);
+ if ( READ_LE_UINT16(&cdhd->obj_id) == (uint16)id) {
+ fo->cdhd = cdhd;
+ fo->obcd = obcdptr;
+ break;
+ }
+ }
if (++i == numobj)
error("findObjectInRoom: Object %d not found in room %d", id, room);
searchptr = NULL;
@@ -733,16 +780,26 @@ void Scumm::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id, uint
if (findWhat & foImageHeader) {
searchptr = roomptr;
for(i=0;;) {
- obimptr = findResource(MKID('OBIM'), searchptr);
+ if(_features & GF_SMALL_HEADER)
+ obimptr = findResourceSmall(MKID('OBIM'), searchptr);
+ else
+ obimptr = findResource(MKID('OBIM'), searchptr);
if (obimptr==NULL)
error("findObjectInRoom: Not enough image blocks in room %d", room);
imhd = (ImageHeader*)findResourceData(MKID('IMHD'), obimptr);
- if (READ_LE_UINT16(&imhd->obj_id) == (uint16)id) {
- fo->obim = obimptr;
- fo->imhd = imhd;
- break;
- }
-
+ if(_features & GF_SMALL_HEADER){
+ if (READ_LE_UINT16(obimptr+6) == (uint16)id) {
+ fo->obim = obimptr;
+ fo->imhd = imhd;
+ break;
+ }
+ } else {
+ if (READ_LE_UINT16(&imhd->obj_id) == (uint16)id) {
+ fo->obim = obimptr;
+ fo->imhd = imhd;
+ break;
+ }
+ }
if (++i==numobj)
error("findObjectInRoom: Object %d image not found in room %d", id, room);
searchptr = NULL;