diff options
Diffstat (limited to 'object.cpp')
-rw-r--r-- | object.cpp | 1009 |
1 files changed, 537 insertions, 472 deletions
diff --git a/object.cpp b/object.cpp index 8a3aaa6a25..481cf4e305 100644 --- a/object.cpp +++ b/object.cpp @@ -23,92 +23,110 @@ #include "stdafx.h" #include "scumm.h" -bool Scumm::getClass(int obj, int cls) { - checkRange(_numGlobalObjects-1, 0, obj, "Object %d out of range in getClass"); +bool Scumm::getClass(int obj, int cls) +{ + checkRange(_numGlobalObjects - 1, 0, obj, + "Object %d out of range in getClass"); cls &= 0x7F; - checkRange(32,1,cls,"Class %d out of range in getClass"); + checkRange(32, 1, cls, "Class %d out of range in getClass"); if (_features & GF_SMALL_HEADER) { - if (cls == 32) // CLASS_TOUCHABLE - cls = 23; + if (cls == 32) // CLASS_TOUCHABLE + cls = 24; } - return (_classData[obj] & (1<<(cls-1))) != 0; + return (_classData[obj] & (1 << (cls - 1))) != 0; } -void Scumm::putClass(int obj, int cls, bool set) { - checkRange(_numGlobalObjects-1, 0, obj, "Object %d out of range in putClass"); +void Scumm::putClass(int obj, int cls, bool set) +{ + checkRange(_numGlobalObjects - 1, 0, obj, + "Object %d out of range in putClass"); cls &= 0x7F; - checkRange(32,1,cls,"Class %d out of range in getClass"); + checkRange(32, 1, cls, "Class %d out of range in getClass"); if (_features & GF_SMALL_HEADER) { - if (cls == 32) // CLASS_TOUCHABLE - cls = 23; + if (cls == 32) // CLASS_TOUCHABLE + cls = 24; } + + if (set) - _classData[obj] |= (1<<(cls-1)); + _classData[obj] |= (1 << (cls - 1)); else - _classData[obj] &= ~(1<<(cls-1)); + _classData[obj] &= ~(1 << (cls - 1)); } -int Scumm::getOwner(int obj) { - checkRange(_numGlobalObjects-1, 0, obj, "Object %d out of range in getOwner"); +int Scumm::getOwner(int obj) +{ + checkRange(_numGlobalObjects - 1, 0, obj, + "Object %d out of range in getOwner"); return _objectOwnerTable[obj]; } -void Scumm::putOwner(int act, int owner) { - checkRange(_numGlobalObjects-1, 0, act, "Object %d out of range in putOwner"); +void Scumm::putOwner(int act, int owner) +{ + checkRange(_numGlobalObjects - 1, 0, act, + "Object %d out of range in putOwner"); checkRange(0xFF, 0, owner, "Owner %d out of range in putOwner"); _objectOwnerTable[act] = owner; } -int Scumm::getState(int act) { - checkRange(_numGlobalObjects-1, 0, act, "Object %d out of range in getState"); +int Scumm::getState(int act) +{ + checkRange(_numGlobalObjects - 1, 0, act, + "Object %d out of range in getState"); return _objectStateTable[act]; } -void Scumm::putState(int act, int state) { - checkRange(_numGlobalObjects-1, 0, act, "Object %d out of range in putState"); +void Scumm::putState(int act, int state) +{ + checkRange(_numGlobalObjects - 1, 0, act, + "Object %d out of range in putState"); checkRange(0xFF, 0, state, "State %d out of range in putState"); _objectStateTable[act] = state; } -int Scumm::getObjectRoom(int obj) { - checkRange(_numGlobalObjects-1, 0, obj, "Object %d out of range in getObjectRoom"); +int Scumm::getObjectRoom(int obj) +{ + checkRange(_numGlobalObjects - 1, 0, obj, + "Object %d out of range in getObjectRoom"); return _objectRoomTable[obj]; } -int Scumm::getObjectIndex(int object) { +int Scumm::getObjectIndex(int object) +{ int i; /* OF_OWNER_ROOM should be 0xFF for full throttle, else 0xF */ if (_objectOwnerTable[object] != OF_OWNER_ROOM) { - for (i=0; i<_maxInventoryItems; i++) + for (i = 0; i < _maxInventoryItems; i++) if (_inventory[i] == object) return i; return -1; } else { - for (i=_numObjectsInRoom; i>0; i--) { - if (_objs[i].obj_nr==object) + for (i = _numObjectsInRoom; i > 0; i--) { + if (_objs[i].obj_nr == object) return i; } return -1; } } -int Scumm::whereIsObject(int object) { +int Scumm::whereIsObject(int object) +{ int i; if (object >= _numGlobalObjects) return WIO_NOT_FOUND; if (_objectOwnerTable[object] != OF_OWNER_ROOM) { - for (i=0; i<_maxInventoryItems; i++) + for (i = 0; i < _maxInventoryItems; i++) if (_inventory[i] == object) return WIO_INVENTORY; return WIO_NOT_FOUND; } - for (i=_numObjectsInRoom; i>0; i--) + for (i = _numObjectsInRoom; i > 0; i--) if (_objs[i].obj_nr == object) { if (_objs[i].fl_object_index) return WIO_FLOBJECT; @@ -117,16 +135,19 @@ int Scumm::whereIsObject(int object) { return WIO_NOT_FOUND; } -int Scumm::getObjectOrActorXY(int object) { +int Scumm::getObjectOrActorXY(int object) +{ if (object < NUM_ACTORS) return getActorXYPos(derefActorSafe(object, "getObjectOrActorXY")); - - switch(whereIsObject(object)) { + + switch (whereIsObject(object)) { case WIO_NOT_FOUND: return -1; - case WIO_INVENTORY: + case WIO_INVENTORY: if (_objectOwnerTable[object] < NUM_ACTORS) - return getActorXYPos(derefActorSafe(_objectOwnerTable[object],"getObjectOrActorXY(2)")); + return + getActorXYPos(derefActorSafe + (_objectOwnerTable[object], "getObjectOrActorXY(2)")); else return 0xFF; } @@ -137,74 +158,76 @@ int Scumm::getObjectOrActorXY(int object) { /* Return the position of an object. Returns X, Y and direction in angles */ -void Scumm::getObjectXYPos(int object) { +void Scumm::getObjectXYPos(int object) +{ ObjectData *od = &_objs[getObjectIndex(object)]; int state; byte *ptr; ImageHeader *imhd; - int x,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); - if( _features & GF_AFTER_V7) { - x = od->x_pos + (int16)READ_LE_UINT16(&imhd->v7.hotspot[state].x); - y = od->y_pos + (int16)READ_LE_UINT16(&imhd->v7.hotspot[state].y); + int x, 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); + if (_features & GF_AFTER_V7) { + x = od->x_pos + (int16) READ_LE_UINT16(&imhd->v7.hotspot[state].x); + y = od->y_pos + (int16) READ_LE_UINT16(&imhd->v7.hotspot[state].y); } else { - x = od->x_pos + (int16)READ_LE_UINT16(&imhd->old.hotspot[state].x); - y = od->y_pos + (int16)READ_LE_UINT16(&imhd->old.hotspot[state].y); + x = od->x_pos + (int16) READ_LE_UINT16(&imhd->old.hotspot[state].x); + y = od->y_pos + (int16) READ_LE_UINT16(&imhd->old.hotspot[state].y); } - } else { - x = od->walk_x; + } else { + x = od->walk_x; y = od->walk_y; - } + } _xPos = x; _yPos = y; - _dir = oldDirToNewDir(od->actordir&3); - } else { - x = od->walk_x; + _dir = oldDirToNewDir(od->actordir & 3); + } else { + x = od->walk_x; y = od->walk_y; - _xPos = x; - _yPos = y; - _dir= oldDirToNewDir(od->actordir&3); - - } + _xPos = x; + _yPos = y; + _dir = oldDirToNewDir(od->actordir & 3); + + } } -int Scumm::getObjActToObjActDist(int a, int b) { - int x,y; +int Scumm::getObjActToObjActDist(int a, int b) +{ + int x, y; Actor *acta = NULL; Actor *actb = NULL; - if (a<NUM_ACTORS) + if (a < NUM_ACTORS) acta = derefActorSafe(a, "getObjActToObjActDist"); - if (b<NUM_ACTORS) + if (b < NUM_ACTORS) actb = derefActorSafe(b, "getObjActToObjActDist(2)"); - if (acta && actb && acta->room==actb->room && acta->room && - acta->room != _currentRoom) - return 0; + if (acta && actb && acta->room == actb->room && acta->room && + acta->room != _currentRoom) + return 0; - if (getObjectOrActorXY(a)==-1) + if (getObjectOrActorXY(a) == -1) return 0xFF; x = _xPos; y = _yPos; - if (getObjectOrActorXY(b)==-1) + if (getObjectOrActorXY(b) == -1) return 0xFF; if (acta) { @@ -213,38 +236,40 @@ int Scumm::getObjActToObjActDist(int a, int b) { _yPos = r.y; } - y = abs(y-_yPos); - x = abs(x-_xPos); + y = abs(y - _yPos); + x = abs(x - _xPos); - if (y>x) x=y; + if (y > x) + x = y; return x; } -int Scumm::findObject(int x, int y) { - int i,b; +int Scumm::findObject(int x, int y) +{ + int i, b; byte a; - for (i=1; i<=_numObjectsInRoom; i++) { + for (i = 1; i <= _numObjectsInRoom; i++) { if (!_objs[i].obj_nr || getClass(_objs[i].obj_nr, 32)) continue; b = i; do { a = _objs[b].parentstate; b = _objs[b].parent; - if (b==0) { + if (b == 0) { if (_objs[i].x_pos <= x && _objs[i].width + _objs[i].x_pos > x && - _objs[i].y_pos <= y && - _objs[i].height + _objs[i].y_pos > y) - return _objs[i].obj_nr; + _objs[i].y_pos <= y && _objs[i].height + _objs[i].y_pos > y) + return _objs[i].obj_nr; break; } - } while ( _objs[b].state == a); + } while (_objs[b].state == a); } return 0; } -void Scumm::drawRoomObject(int i, int arg) { +void Scumm::drawRoomObject(int i, int arg) +{ ObjectData *od; byte a; @@ -259,18 +284,19 @@ void Scumm::drawRoomObject(int i, int arg) { break; } od = &_objs[od->parent]; - } while (od->state==a); + } while (od->state == a); } -void Scumm::drawRoomObjects(int arg) { +void Scumm::drawRoomObjects(int arg) +{ int i; if (_features & GF_DRAWOBJ_OTHER_ORDER) { - for(i=1; i<=_numObjectsInRoom; i++) - drawRoomObject(i,arg); + for (i = 1; i <= _numObjectsInRoom; i++) + drawRoomObject(i, arg); } else { - for(i=_numObjectsInRoom; i!=0; i--) - drawRoomObject(i,arg); + for (i = _numObjectsInRoom; i != 0; i--) + drawRoomObject(i, arg); } } @@ -293,50 +319,52 @@ const uint32 IMxx_tags[] = { MKID('IM0F') }; -void Scumm::drawObject(int obj, int arg) { +void Scumm::drawObject(int obj, int arg) +{ ObjectData *od; int xpos, ypos, height, width; byte *ptr; - int x,a,numstrip; + int x, a, numstrip; int tmp; if (_BgNeedsRedraw) arg = 0; _curVirtScreen = &virtscr[0]; - + od = &_objs[obj]; - xpos = od->x_pos>>3; + xpos = od->x_pos >> 3; ypos = od->y_pos; - width = od->width>>3; - height = od->height &= 0xF8; // Ender + width = od->width >> 3; + height = od->height &= 0xF8; // Ender - if (width==0 || xpos > _screenEndStrip || xpos + width < _screenStartStrip) + if (width == 0 || xpos > _screenEndStrip + || xpos + width < _screenStartStrip) return; - + if (od->fl_object_index) { ptr = getResourceAddress(rtFlObject, od->fl_object_index); - ptr = findResource(MKID('OBIM'), ptr); + ptr = findResource(MKID('OBIM'), ptr); } else { ptr = getResourceAddress(rtRoom, _roomResource); ptr = ptr + od->offs_obim_to_room; } - if(_features & GF_SMALL_HEADER) - ptr +=8; - else - 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; x = 0xFFFF; - for (a=numstrip=0; a<width; a++) { + for (a = numstrip = 0; a < width; a++) { tmp = xpos + a; - if (arg==1 && _screenStartStrip!=tmp) + if (arg == 1 && _screenStartStrip != tmp) continue; - if (arg==2 && _screenEndStrip!=tmp) + if (arg == 2 && _screenEndStrip != tmp) continue; if (tmp < _screenStartStrip || tmp > _screenEndStrip) continue; @@ -346,62 +374,61 @@ void Scumm::drawObject(int obj, int arg) { numstrip++; } - if (numstrip!=0) { + if (numstrip != 0) { byte flags = Gdi::dbAllowMaskOr; - if (_features&GF_AFTER_V7 && 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); + gdi.drawBitmap(ptr, _curVirtScreen, x, ypos, height, x - xpos, numstrip, + flags); } } -void Scumm::loadRoomObjects() { - int i,j; +void Scumm::loadRoomObjects() +{ + int i, j; ObjectData *od; byte *ptr; uint16 obim_id; - byte *room,*searchptr; + byte *room, *searchptr; ImageHeader *imhd; RoomHeader *roomhdr; - CodeHeader *cdhd; + CodeHeader *cdhd; - CHECK_HEAP - - room = getResourceAddress(rtRoom, _roomResource); - roomhdr = (RoomHeader*)findResourceData(MKID('RMHD'), room); + CHECK_HEAP room = getResourceAddress(rtRoom, _roomResource); + roomhdr = (RoomHeader *)findResourceData(MKID('RMHD'), room); - if(_features & GF_AFTER_V7) + if (_features & GF_AFTER_V7) _numObjectsInRoom = READ_LE_UINT16(&(roomhdr->v7.numObjects)); else _numObjectsInRoom = READ_LE_UINT16(&(roomhdr->old.numObjects)); - + if (_numObjectsInRoom == 0) return; - + if (_numObjectsInRoom > _numLocalObjects) error("More than %d objects in room %d", _numLocalObjects, _roomResource); od = &_objs[1]; searchptr = room; - for (i=0; i<_numObjectsInRoom; i++,od++) { + for (i = 0; i < _numObjectsInRoom; i++, od++) { ptr = findResource(MKID('OBCD'), searchptr); - if (ptr==NULL) + if (ptr == NULL) error("Room %d missing object code block(s)", _roomResource); od->offs_obcd_to_room = ptr - room; - cdhd = (CodeHeader*)findResourceData(MKID('CDHD'), ptr); + cdhd = (CodeHeader *)findResourceData(MKID('CDHD'), ptr); - if(_features & GF_AFTER_V7) + if (_features & GF_AFTER_V7) od->obj_nr = READ_LE_UINT16(&(cdhd->v7.obj_id)); + else if (_features & GF_AFTER_V6) + od->obj_nr = READ_LE_UINT16(&(cdhd->v6.obj_id)); else - if(_features & GF_AFTER_V6) - od->obj_nr = READ_LE_UINT16(&(cdhd->v6.obj_id)); - else - od->obj_nr = READ_LE_UINT16(&(cdhd->v5.obj_id)); + od->obj_nr = READ_LE_UINT16(&(cdhd->v5.obj_id)); #ifdef DUMP_SCRIPTS do { char buf[32]; - sprintf(buf,"roomobj-%d-",_roomResource); + sprintf(buf, "roomobj-%d-", _roomResource); dumpResource(buf, od->obj_nr, ptr); } while (0); #endif @@ -409,161 +436,160 @@ void Scumm::loadRoomObjects() { } searchptr = room; - for (i=0; i<_numObjectsInRoom; i++) { + for (i = 0; i < _numObjectsInRoom; i++) { ptr = findResource(MKID('OBIM'), searchptr); - if (ptr==NULL) + if (ptr == NULL) error("Room %d missing image blocks(s)", _roomResource); - imhd = (ImageHeader*)findResourceData(MKID('IMHD'), ptr); + imhd = (ImageHeader *)findResourceData(MKID('IMHD'), ptr); if (_features & GF_AFTER_V7) obim_id = READ_LE_UINT16(&imhd->v7.obj_id); else obim_id = READ_LE_UINT16(&imhd->old.obj_id); - for(j=1; j<=_numObjectsInRoom; j++) { - if (_objs[j].obj_nr==obim_id) + for (j = 1; j <= _numObjectsInRoom; j++) { + if (_objs[j].obj_nr == obim_id) _objs[j].offs_obim_to_room = ptr - room; } searchptr = NULL; } od = &_objs[1]; - for (i=1; i<=_numObjectsInRoom; i++,od++) { + for (i = 1; i <= _numObjectsInRoom; i++, od++) { setupRoomObject(od, room); } - CHECK_HEAP -} +CHECK_HEAP} -void Scumm::loadRoomObjectsSmall() { - int i,j; - ObjectData *od; - byte *ptr; - uint16 obim_id; - byte *room,*searchptr; - RoomHeader *roomhdr; - - CHECK_HEAP - - room = getResourceAddress(rtRoom, _roomResource); - roomhdr = (RoomHeader*)findResourceData(MKID('RMHD'), room); - - _numObjectsInRoom = READ_LE_UINT16(&(roomhdr->old.numObjects)); - - if (_numObjectsInRoom == 0) - return; - - if (_numObjectsInRoom > _numLocalObjects) - error("More than %d objects in room %d", _numLocalObjects, _roomResource); - - od = &_objs[1]; - searchptr = room; - for (i=0; i<_numObjectsInRoom; i++,od++) { - ptr = findResourceSmall(MKID('OBCD'), searchptr); - if (ptr==NULL) - error("Room %d missing object code block(s)", _roomResource); - - od->offs_obcd_to_room = ptr - room; - od->obj_nr = READ_LE_UINT16(ptr+6); +void Scumm::loadRoomObjectsSmall() +{ + int i, j; + ObjectData *od; + byte *ptr; + uint16 obim_id; + byte *room, *searchptr; + RoomHeader *roomhdr; + + CHECK_HEAP room = getResourceAddress(rtRoom, _roomResource); + roomhdr = (RoomHeader *)findResourceData(MKID('RMHD'), room); + + _numObjectsInRoom = READ_LE_UINT16(&(roomhdr->old.numObjects)); + + if (_numObjectsInRoom == 0) + return; + + if (_numObjectsInRoom > _numLocalObjects) + error("More than %d objects in room %d", _numLocalObjects, _roomResource); + + od = &_objs[1]; + searchptr = room; + for (i = 0; i < _numObjectsInRoom; i++, od++) { + ptr = findResourceSmall(MKID('OBCD'), searchptr); + if (ptr == NULL) + error("Room %d missing object code block(s)", _roomResource); + + od->offs_obcd_to_room = ptr - room; + od->obj_nr = READ_LE_UINT16(ptr + 6); #ifdef DUMP_SCRIPTS - do { - char buf[32]; - sprintf(buf,"roomobj-%d-",_roomResource); - dumpResource(buf, od->obj_nr, ptr); - } while (0); + do { + char buf[32]; + sprintf(buf, "roomobj-%d-", _roomResource); + dumpResource(buf, od->obj_nr, ptr); + } while (0); #endif - searchptr = NULL; - } - - searchptr = room; - for (i=0; i<_numObjectsInRoom; i++) { - ptr = findResourceSmall(MKID('OBIM'), searchptr); - if (ptr==NULL) - error("Room %d missing image blocks(s)", _roomResource); - - obim_id = READ_LE_UINT16(ptr+6); - - for(j=1; j<=_numObjectsInRoom; j++) { - if (_objs[j].obj_nr==obim_id) - _objs[j].offs_obim_to_room = ptr - room; - } - searchptr = NULL; - } - - od = &_objs[1]; - for (i=1; i<=_numObjectsInRoom; i++,od++) { - setupRoomObject(od, room); - } - - CHECK_HEAP -} + searchptr = NULL; + } -void Scumm::setupRoomObject(ObjectData *od, byte *room) { - CodeHeader *cdhd; - ImageHeader *imhd; + searchptr = room; + for (i = 0; i < _numObjectsInRoom; i++) { + ptr = findResourceSmall(MKID('OBIM'), searchptr); + if (ptr == NULL) + error("Room %d missing image blocks(s)", _roomResource); + + obim_id = READ_LE_UINT16(ptr + 6); + + for (j = 1; j <= _numObjectsInRoom; j++) { + if (_objs[j].obj_nr == obim_id) + _objs[j].offs_obim_to_room = ptr - room; + } + searchptr = NULL; + } + + od = &_objs[1]; + for (i = 1; i <= _numObjectsInRoom; i++, od++) { + setupRoomObject(od, room); + } + +CHECK_HEAP} + +void Scumm::setupRoomObject(ObjectData *od, byte *room) +{ + CodeHeader *cdhd; + ImageHeader *imhd; + + if (_features & GF_SMALL_HEADER) { - if(_features & GF_SMALL_HEADER) { - byte *ptr = room + od->offs_obcd_to_room; - - od->obj_nr = READ_LE_UINT16(ptr+6); // ok - - od->width = *(ptr+11)<<3; // ok - od->x_pos = *(ptr+9)<<3; // ok - - if(*(ptr+10) & 0x80) { - od->parentstate = 1; // it's 0x10 in the original code + + od->obj_nr = READ_LE_UINT16(ptr + 6); // ok + + od->width = *(ptr + 11) << 3; // ok + od->x_pos = *(ptr + 9) << 3; // ok + + if (*(ptr + 10) & 0x80) { + od->parentstate = 1; // it's 0x10 in the original code } else { od->parentstate = 0; } - od->y_pos = ((*(ptr+10))&0x7F)<<3; - - od->parent = *(ptr+12); - od->walk_x = READ_LE_UINT16(ptr+13); - - od->walk_y = READ_LE_UINT16(ptr+15); - - od->actordir = (*(ptr+17))&7; - od->height = *(ptr+17); // ok - - - - return; - } - - cdhd = (CodeHeader*)findResourceData(MKID('CDHD'), room + od->offs_obcd_to_room); - if(_features & GF_AFTER_V7) + od->y_pos = ((*(ptr + 10)) & 0x7F) << 3; + + od->parent = *(ptr + 12); + od->walk_x = READ_LE_UINT16(ptr + 13); + + od->walk_y = READ_LE_UINT16(ptr + 15); + + od->actordir = (*(ptr + 17)) & 7; + od->height = *(ptr + 17); // ok + + + + return; + } + + cdhd = + (CodeHeader *)findResourceData(MKID('CDHD'), + room + od->offs_obcd_to_room); + if (_features & GF_AFTER_V7) od->obj_nr = READ_LE_UINT16(&(cdhd->v7.obj_id)); + else if (_features & GF_AFTER_V6) + od->obj_nr = READ_LE_UINT16(&(cdhd->v6.obj_id)); else - if(_features & GF_AFTER_V6) - od->obj_nr = READ_LE_UINT16(&(cdhd->v6.obj_id)); - else - od->obj_nr = READ_LE_UINT16(&(cdhd->v5.obj_id)); - - if(!(_features & GF_AFTER_V7)) { + od->obj_nr = READ_LE_UINT16(&(cdhd->v5.obj_id)); + + if (!(_features & GF_AFTER_V7)) { if (_features & GF_AFTER_V6) { od->width = READ_LE_UINT16(&cdhd->v6.w); od->height = READ_LE_UINT16(&cdhd->v6.h); - od->x_pos = ((int16)READ_LE_UINT16(&cdhd->v6.x)); - od->y_pos = ((int16)READ_LE_UINT16(&cdhd->v6.y)); + od->x_pos = ((int16) READ_LE_UINT16(&cdhd->v6.x)); + od->y_pos = ((int16) READ_LE_UINT16(&cdhd->v6.y)); if (cdhd->v6.flags == 0x80) { od->parentstate = 1; } else { - od->parentstate = (cdhd->v6.flags&0xF); + od->parentstate = (cdhd->v6.flags & 0xF); } od->parent = cdhd->v6.parent; od->actordir = cdhd->v6.actordir; } else { - od->width = cdhd->v5.w<<3; - od->height = cdhd->v5.h<<3; - od->x_pos = cdhd->v5.x<<3; - od->y_pos = cdhd->v5.y<<3; + od->width = cdhd->v5.w << 3; + od->height = cdhd->v5.h << 3; + od->x_pos = cdhd->v5.x << 3; + od->y_pos = cdhd->v5.y << 3; if (cdhd->v5.flags == 0x80) { od->parentstate = 1; } else { - od->parentstate = (cdhd->v5.flags&0xF); + od->parentstate = (cdhd->v5.flags & 0xF); } od->parent = cdhd->v5.parent; od->walk_x = READ_LE_UINT16(&cdhd->v5.walk_x); @@ -574,10 +600,12 @@ void Scumm::setupRoomObject(ObjectData *od, byte *room) { od->parent = cdhd->v7.parent; od->parentstate = cdhd->v7.parentstate; - imhd = (ImageHeader*)findResourceData(MKID('IMHD'), room + od->offs_obim_to_room); + imhd = + (ImageHeader *)findResourceData(MKID('IMHD'), + room + od->offs_obim_to_room); od->x_pos = READ_LE_UINT16(&imhd->v7.x_pos); od->y_pos = READ_LE_UINT16(&imhd->v7.y_pos); - od->width = READ_LE_UINT16(&imhd->v7.width); + od->width = READ_LE_UINT16(&imhd->v7.width); od->height = READ_LE_UINT16(&imhd->v7.height); od->actordir = READ_LE_UINT16(&imhd->v7.actordir); @@ -585,57 +613,60 @@ void Scumm::setupRoomObject(ObjectData *od, byte *room) { od->fl_object_index = 0; } -void Scumm::fixObjectFlags() { +void Scumm::fixObjectFlags() +{ int i; ObjectData *od = &_objs[1]; - for (i=1; i<=_numObjectsInRoom; i++,od++) { + for (i = 1; i <= _numObjectsInRoom; i++, od++) { od->state = _objectStateTable[od->obj_nr]; } } -void Scumm::processDrawQue() { +void Scumm::processDrawQue() +{ int i, j; - for (i=0; i<_drawObjectQueNr; i++) { + for (i = 0; i < _drawObjectQueNr; i++) { j = _drawObjectQue[i]; if (j) - drawObject(j,0); + drawObject(j, 0); } _drawObjectQueNr = 0; } -void Scumm::clearOwnerOf(int obj) { - int i,j; - uint16 *a; +void Scumm::clearOwnerOf(int obj) +{ + int i, j; + uint16 *a; stopObjectScript(obj); - - if (getOwner(obj)==OF_OWNER_ROOM) { + + if (getOwner(obj) == OF_OWNER_ROOM) { i = 0; do { - if (_objs[i].obj_nr==obj) { + if (_objs[i].obj_nr == obj) { if (!_objs[i].fl_object_index) return; nukeResource(rtFlObject, _objs[i].fl_object_index); _objs[i].obj_nr = 0; _objs[i].fl_object_index = 0; } - } while(++i <= _numObjectsInRoom); + } while (++i <= _numObjectsInRoom); return; } - for (i=1; i<_maxInventoryItems; i++) { + for (i = 1; i < _maxInventoryItems; i++) { if (_inventory[i] == obj) { j = whereIsObject(obj); - if (j==WIO_INVENTORY) { + if (j == WIO_INVENTORY) { nukeResource(rtInventory, i); _inventory[i] = 0; } a = &_inventory[1]; - for (i=1; i < _maxInventoryItems-1; i++,a++) { + for (i = 1; i < _maxInventoryItems - 1; i++, a++) { if (!a[0] && a[1]) { a[0] = a[1]; a[1] = 0; - _baseInventoryItems[i] = _baseInventoryItems[i+1]; - _baseInventoryItems[i+1] = NULL; + _baseInventoryItems[i] = _baseInventoryItems[i + 1]; + _baseInventoryItems[i + 1] = NULL; } } return; @@ -643,15 +674,16 @@ void Scumm::clearOwnerOf(int obj) { } } -void Scumm::removeObjectFromRoom(int obj) { - int i,cnt; +void Scumm::removeObjectFromRoom(int obj) +{ + int i, cnt; uint32 *ptr; - - for(i=1; i<=_numObjectsInRoom; i++) { - if (_objs[i].obj_nr==(uint16)obj) { + + for (i = 1; i <= _numObjectsInRoom; i++) { + if (_objs[i].obj_nr == (uint16)obj) { if (_objs[i].width != 0) { - ptr = &gfxUsageBits[_objs[i].x_pos>>3]; - cnt = _objs[i].width>>3; + ptr = &gfxUsageBits[_objs[i].x_pos >> 3]; + cnt = _objs[i].width >> 3; do { *ptr++ |= 0x80000000; } while (--cnt); @@ -662,46 +694,51 @@ void Scumm::removeObjectFromRoom(int obj) { } } -void Scumm::addObjectToDrawQue(int object) { +void Scumm::addObjectToDrawQue(int object) +{ _drawObjectQue[_drawObjectQueNr++] = object; - if ((unsigned int)_drawObjectQueNr > sizeof(_drawObjectQue)/sizeof(_drawObjectQue[0])) + if ((unsigned int)_drawObjectQueNr > + sizeof(_drawObjectQue) / sizeof(_drawObjectQue[0])) error("Draw Object Que overflow"); } -void Scumm::clearDrawObjectQueue() { +void Scumm::clearDrawObjectQueue() +{ _drawObjectQueNr = 0; } -byte *Scumm::getObjOrActorName(int obj) { +byte *Scumm::getObjOrActorName(int obj) +{ byte *objptr; if (obj < NUM_ACTORS) return getActorName(derefActorSafe(obj, "getObjOrActorName")); - if(_features & GF_SMALL_HEADER) { - byte offset=0; + if (_features & GF_SMALL_HEADER) { + byte offset = 0; objptr = getOBCDFromObject(obj); if (objptr) - offset = *(objptr+18); - return(objptr+offset); - } + offset = *(objptr + 18); + return (objptr + offset); + } objptr = getOBCDFromObject(obj); - if (objptr==NULL) - return (byte*)" "; - + if (objptr == NULL) + return (byte *)" "; + return findResourceData(MKID('OBNA'), objptr); } -uint32 Scumm::getOBCDOffs(int object) { +uint32 Scumm::getOBCDOffs(int object) +{ int i; if (_objectOwnerTable[object] != OF_OWNER_ROOM) return 0; - for (i=_numObjectsInRoom; i>0; i--) { + for (i = _numObjectsInRoom; i > 0; i--) { if (_objs[i].obj_nr == object) { - if (_objs[i].fl_object_index!=0) + if (_objs[i].fl_object_index != 0) return 8; return _objs[i].offs_obcd_to_room; } @@ -709,40 +746,41 @@ uint32 Scumm::getOBCDOffs(int object) { return 0; } -byte *Scumm::getOBCDFromObject(int obj) { +byte *Scumm::getOBCDFromObject(int obj) +{ int i; if (_objectOwnerTable[obj] != OF_OWNER_ROOM) { - for(i=0; i<_maxInventoryItems; i++) { + for (i = 0; i < _maxInventoryItems; i++) { if (_inventory[i] == obj) return getResourceAddress(rtInventory, i); } } else { - for(i=_numObjectsInRoom; i>0; --i) { - if (_objs[i].obj_nr==obj) { + for (i = _numObjectsInRoom; i > 0; --i) { + if (_objs[i].obj_nr == obj) { if (_objs[i].fl_object_index) - return getResourceAddress(rtFlObject, _objs[i].fl_object_index)+8; - return getResourceAddress(rtRoom, _roomResource) + _objs[i].offs_obcd_to_room; + return getResourceAddress(rtFlObject, _objs[i].fl_object_index) + 8; + return getResourceAddress(rtRoom, + _roomResource) + _objs[i].offs_obcd_to_room; } } } return 0; } -void Scumm::addObjectToInventory(uint obj, uint room) { +void Scumm::addObjectToInventory(uint obj, uint room) +{ int i, slot; uint32 size; - byte *obcdptr,*ptr; + byte *obcdptr, *ptr; FindObjectInRoom foir; - debug(1,"Adding object %d from room %d into inventory", obj, room); + debug(1, "Adding object %d from room %d into inventory", obj, room); - CHECK_HEAP - - if (whereIsObject(obj)==WIO_FLOBJECT) { + CHECK_HEAP if (whereIsObject(obj) == WIO_FLOBJECT) { i = getObjectIndex(obj); ptr = getResourceAddress(rtFlObject, _objs[i].fl_object_index) + 8; - size = READ_BE_UINT32_UNALIGNED(ptr+4); + size = READ_BE_UINT32_UNALIGNED(ptr + 4); slot = getInventorySlot(); _inventory[slot] = obj; createResource(rtInventory, slot, size); @@ -750,86 +788,88 @@ void Scumm::addObjectToInventory(uint obj, uint room) { memcpy(getResourceAddress(rtInventory, slot), ptr, size); } else { findObjectInRoom(&foir, foCodeHeader, obj, room); - if(_features & GF_SMALL_HEADER ) - size = READ_LE_UINT32(foir.obcd); - else - 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); obcdptr = getResourceAddress(rtRoom, room) - foir.roomptr + foir.obcd; - memcpy(getResourceAddress(rtInventory,slot),obcdptr,size); + memcpy(getResourceAddress(rtInventory, slot), obcdptr, size); } - CHECK_HEAP -} +CHECK_HEAP} -void Scumm::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id, uint room) { +void Scumm::findObjectInRoom(FindObjectInRoom * fo, byte findWhat, uint id, + uint room) +{ CodeHeader *cdhd; int i, numobj; - byte *roomptr,*obcdptr,*obimptr,*searchptr; + byte *roomptr, *obcdptr, *obimptr, *searchptr; RoomHeader *roomhdr; ImageHeader *imhd; int id2; int id3; - - if (findWhat&foCheckAlreadyLoaded && getObjectIndex(id) != -1) { + + if (findWhat & foCheckAlreadyLoaded && getObjectIndex(id) != -1) { fo->obcd = obcdptr = getOBCDFromObject(id); - assert((byte*)obcdptr > (byte*)256); - 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); + assert((byte *)obcdptr > (byte *)256); + 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); - if (!roomptr) { // FIXME: ZAK256 AIRPORT WORKAROUND (buying book from devotee) + if (!roomptr) { // FIXME: ZAK256 AIRPORT WORKAROUND (buying book from devotee) warning("findObjectInRoom: failed getting roomptr to %d", room); return; } - roomhdr = (RoomHeader*)findResourceData(MKID('RMHD'), roomptr); - - if(_features & GF_AFTER_V7) + roomhdr = (RoomHeader *)findResourceData(MKID('RMHD'), roomptr); + + if (_features & GF_AFTER_V7) numobj = READ_LE_UINT16(&(roomhdr->v7.numObjects)); else numobj = READ_LE_UINT16(&(roomhdr->old.numObjects)); - - if (numobj==0) + + if (numobj == 0) error("findObjectInRoom: No object found in room %d", room); if (numobj > _numLocalObjects) - error("findObjectInRoom: More (%d) than %d objects in room %d", numobj, _numLocalObjects, room); + error("findObjectInRoom: More (%d) than %d objects in room %d", numobj, + _numLocalObjects, room); if (findWhat & foCodeHeader) { searchptr = roomptr; - for (i=0;;) { - if(_features & GF_SMALL_HEADER) - obcdptr = findResourceSmall(MKID('OBCD'), searchptr); - else - obcdptr = findResource(MKID('OBCD'), searchptr); - if(obcdptr==NULL) + for (i = 0;;) { + 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); - 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 ( _features & GF_AFTER_V7) + 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 (_features & GF_AFTER_V7) id2 = READ_LE_UINT16(&(cdhd->v7.obj_id)); + else if (_features & GF_AFTER_V6) + id2 = READ_LE_UINT16(&(cdhd->v6.obj_id)); else - if( _features & GF_AFTER_V6) - id2 = READ_LE_UINT16(&(cdhd->v6.obj_id)); - else - id2 = READ_LE_UINT16(&(cdhd->v5.obj_id)); - - if ( id2 == (uint16)id) { - fo->cdhd = cdhd; - fo->obcd = obcdptr; - break; - } - } + id2 = READ_LE_UINT16(&(cdhd->v5.obj_id)); + + if (id2 == (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; @@ -838,68 +878,73 @@ void Scumm::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id, uint if (findWhat & foImageHeader) { searchptr = roomptr; - for(i=0;;) { - if(_features & GF_SMALL_HEADER) - obimptr = findResourceSmall(MKID('OBIM'), searchptr); - else - obimptr = findResource(MKID('OBIM'), searchptr); - if (obimptr==NULL) + for (i = 0;;) { + 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(_features & GF_SMALL_HEADER){ - if (READ_LE_UINT16(obimptr+6) == (uint16)id) { - fo->obim = obimptr; - fo->imhd = imhd; - break; - } - } else { - if(_features & GF_AFTER_V7) + imhd = (ImageHeader *)findResourceData(MKID('IMHD'), obimptr); + if (_features & GF_SMALL_HEADER) { + if (READ_LE_UINT16(obimptr + 6) == (uint16)id) { + fo->obim = obimptr; + fo->imhd = imhd; + break; + } + } else { + if (_features & GF_AFTER_V7) id3 = READ_LE_UINT16(&imhd->v7.obj_id); else id3 = READ_LE_UINT16(&imhd->old.obj_id); - if (id3 == (uint16)id) { - fo->obim = obimptr; - fo->imhd = imhd; - break; - } - } - if (++i==numobj) - error("findObjectInRoom: Object %d image not found in room %d", id, room); + if (id3 == (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; } } } -int Scumm::getInventorySlot() { +int Scumm::getInventorySlot() +{ int i; - for (i=1; i<=_maxInventoryItems; i++) { - if (_inventory[i]==0) + for (i = 1; i <= _maxInventoryItems; i++) { + if (_inventory[i] == 0) return i; } error("Inventory full, %d max items", _maxInventoryItems); } -void Scumm::SamInventoryHack(int obj) { // FIXME: Sam and Max hack +void Scumm::SamInventoryHack(int obj) +{ // FIXME: Sam and Max hack int base = 6; while (base < 80) { int value = readArray(178, 0, base); - if (value == obj) return; + if (value == obj) + return; if (value == 0) { - _vars[179]++; - writeArray(178, 0, base, obj); - return; + _vars[179]++; + writeArray(178, 0, base, obj); + return; } base++; } } -void Scumm::setOwnerOf(int obj, int owner) { +void Scumm::setOwnerOf(int obj, int owner) +{ ScriptSlot *ss; - if (owner==0) { + if (owner == 0) { clearOwnerOf(obj); ss = &vm.slot[_currentScript]; - if (ss->where==WIO_INVENTORY && _inventory[ss->number]==obj) { + if (ss->where == WIO_INVENTORY && _inventory[ss->number] == obj) { putOwner(obj, 0); runHook(0); stopObjectCode(); @@ -913,64 +958,70 @@ void Scumm::setOwnerOf(int obj, int owner) { runHook(0); } -int Scumm::getObjX(int obj) { +int Scumm::getObjX(int obj) +{ if (obj < NUM_ACTORS) { - if (obj<1) - return 0; /* fix for indy4's map */ - return derefActorSafe(obj,"getObjX")->x; + if (obj < 1) + return 0; /* fix for indy4's map */ + return derefActorSafe(obj, "getObjX")->x; } else { - if (whereIsObject(obj)==WIO_NOT_FOUND) + if (whereIsObject(obj) == WIO_NOT_FOUND) return -1; getObjectOrActorXY(obj); return _xPos; } } -int Scumm::getObjY(int obj) { +int Scumm::getObjY(int obj) +{ if (obj < NUM_ACTORS) { - if (obj<1) - return 0; /* fix for indy4's map */ - return derefActorSafe(obj,"getObjY")->y; + if (obj < 1) + return 0; /* fix for indy4's map */ + return derefActorSafe(obj, "getObjY")->y; } else { - if (whereIsObject(obj)==WIO_NOT_FOUND) + if (whereIsObject(obj) == WIO_NOT_FOUND) return -1; getObjectOrActorXY(obj); return _yPos; } } -int Scumm::getObjOldDir(int obj) { +int Scumm::getObjOldDir(int obj) +{ if (obj < NUM_ACTORS) { - return newDirToOldDir(derefActorSafe(obj,"getObjOldDir")->facing); + return newDirToOldDir(derefActorSafe(obj, "getObjOldDir")->facing); } else { getObjectXYPos(obj); return _dir; } } -int Scumm::getObjNewDir(int obj) { +int Scumm::getObjNewDir(int obj) +{ if (obj < NUM_ACTORS) { - return derefActorSafe(obj,"getObjNewDir")->facing; + return derefActorSafe(obj, "getObjNewDir")->facing; } else { getObjectXYPos(obj); return oldDirToNewDir(_dir); } } -int Scumm::findInventory(int owner, int idx) { +int Scumm::findInventory(int owner, int idx) +{ int count = 1, i, obj; - for (i=0; i!=_maxInventoryItems; i++) { + for (i = 0; i != _maxInventoryItems; i++) { obj = _inventory[i]; - if (obj && getOwner(obj)==owner && count++ == idx) + if (obj && getOwner(obj) == owner && count++ == idx) return obj; } - return 0; + return 0; } -int Scumm::getInventoryCount(int owner) { - int i,obj; +int Scumm::getInventoryCount(int owner) +{ + int i, obj; int count = 0; - for (i=0; i!=_maxInventoryItems; i++) { + for (i = 0; i != _maxInventoryItems; i++) { obj = _inventory[i]; if (obj && getOwner(obj) == owner) count++; @@ -978,41 +1029,45 @@ int Scumm::getInventoryCount(int owner) { return count; } -void Scumm::setObjectState(int obj, int state, int x, int y) { +void Scumm::setObjectState(int obj, int state, int x, int y) +{ int i; i = getObjectIndex(obj); - if (i==-1) { + if (i == -1) { warning("setObjectState: no such object"); return; } if (x != -1) { - _objs[i].x_pos = x<<3; - _objs[i].y_pos = y<<3; + _objs[i].x_pos = x << 3; + _objs[i].y_pos = y << 3; } addObjectToDrawQue(i); putState(obj, state); } -static int getDist(int x, int y, int x2, int y2) { - int a = abs(y-y2); - int b = abs(x-x2); - if (a>b) +static int getDist(int x, int y, int x2, int y2) +{ + int a = abs(y - y2); + int b = abs(x - x2); + if (a > b) return a; return b; } -int Scumm::getDistanceBetween(bool is_obj_1, int b, int c, bool is_obj_2, int e, int f) { - int i,j; - int x,y; - int x2,y2; - +int Scumm::getDistanceBetween(bool is_obj_1, int b, int c, bool is_obj_2, + int e, int f) +{ + int i, j; + int x, y; + int x2, y2; + j = i = 0xFF; if (is_obj_1) { - if (getObjectOrActorXY(b)==-1) + if (getObjectOrActorXY(b) == -1) return -1; if (b < NUM_ACTORS) i = derefActorSafe(b, "unkObjProc1")->scalex; @@ -1024,7 +1079,7 @@ int Scumm::getDistanceBetween(bool is_obj_1, int b, int c, bool is_obj_2, int e, } if (is_obj_2) { - if (getObjectOrActorXY(e)==-1) + if (getObjectOrActorXY(e) == -1) return -1; if (e < NUM_ACTORS) j = derefActorSafe(e, "unkObjProc1(2)")->scalex; @@ -1035,43 +1090,43 @@ int Scumm::getDistanceBetween(bool is_obj_1, int b, int c, bool is_obj_2, int e, y2 = f; } - return getDist(x,y,x2,y2) * 0xFF / ((i + j)>>1); + return getDist(x, y, x2, y2) * 0xFF / ((i + j) >> 1); } -void Scumm::setCursorImg(uint img, uint room, uint imgindex) { - int w,h; - byte *dataptr,*bomp; +void Scumm::setCursorImg(uint img, uint room, uint imgindex) +{ + int w, h; + byte *dataptr, *bomp; uint32 size; FindObjectInRoom foir; - - if (room==(uint)-1) + + if (room == (uint) - 1) room = getObjectRoom(img); - findObjectInRoom(&foir, foCodeHeader | foImageHeader | foCheckAlreadyLoaded, img, room); + findObjectInRoom(&foir, foCodeHeader | foImageHeader | foCheckAlreadyLoaded, + img, room); - if(_features & GF_AFTER_V7) - setCursorHotspot2( - READ_LE_UINT16(&foir.imhd->v7.hotspot[0].x), - READ_LE_UINT16(&foir.imhd->v7.hotspot[0].y)); + if (_features & GF_AFTER_V7) + setCursorHotspot2(READ_LE_UINT16(&foir.imhd->v7.hotspot[0].x), + READ_LE_UINT16(&foir.imhd->v7.hotspot[0].y)); else - setCursorHotspot2( - READ_LE_UINT16(&foir.imhd->old.hotspot[0].x), - READ_LE_UINT16(&foir.imhd->old.hotspot[0].y)); - - - if(!(_features & GF_AFTER_V7)) { - w = READ_LE_UINT16(&foir.cdhd->v6.w)>>3; - h = READ_LE_UINT16(&foir.cdhd->v6.h)>>3; + setCursorHotspot2(READ_LE_UINT16(&foir.imhd->old.hotspot[0].x), + READ_LE_UINT16(&foir.imhd->old.hotspot[0].y)); + + + if (!(_features & GF_AFTER_V7)) { + w = READ_LE_UINT16(&foir.cdhd->v6.w) >> 3; + h = READ_LE_UINT16(&foir.cdhd->v6.h) >> 3; } else { - w = READ_LE_UINT16(&foir.imhd->v7.width)>>3; - h = READ_LE_UINT16(&foir.imhd->v7.height)>>3; + w = READ_LE_UINT16(&foir.imhd->v7.width) >> 3; + h = READ_LE_UINT16(&foir.imhd->v7.height) >> 3; } - dataptr = findResource(IMxx_tags[imgindex],foir.obim); - if (dataptr==NULL) + dataptr = findResource(IMxx_tags[imgindex], foir.obim); + if (dataptr == NULL) error("setCursorImg: No such image"); - size = READ_BE_UINT32_UNALIGNED(dataptr+4); + size = READ_BE_UINT32_UNALIGNED(dataptr + 4); if (size > sizeof(_grabbedCursor)) error("setCursorImg: Cursor image too large"); @@ -1082,25 +1137,28 @@ void Scumm::setCursorImg(uint img, uint room, uint imgindex) { } -void Scumm::nukeFlObjects(int min, int max) { +void Scumm::nukeFlObjects(int min, int max) +{ ObjectData *od; int i; warning("nukeFlObjects(%d,%d)", min, max); - for (i=_numObjectsInRoom,od=_objs; --i>=0; od++) - if (od->fl_object_index && od->obj_nr>=min && od->obj_nr<=max) { + for (i = _numObjectsInRoom, od = _objs; --i >= 0; od++) + if (od->fl_object_index && od->obj_nr >= min && od->obj_nr <= max) { nukeResource(rtFlObject, od->fl_object_index); od->obj_nr = 0; od->fl_object_index = 0; } } -void Scumm::enqueueObject(int a, int b, int c, int d, int e, int f, int g, int h, int mode) { +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; - if (_enqueuePos==sizeof(_enqueuedObjects)/sizeof(_enqueuedObjects[0])) + if (_enqueuePos == sizeof(_enqueuedObjects) / sizeof(_enqueuedObjects[0])) error("enqueueObject: overflow"); eo = &_enqueuedObjects[_enqueuePos++]; @@ -1111,13 +1169,13 @@ void Scumm::enqueueObject(int a, int b, int c, int d, int e, int f, int g, int h eo->e = _enqueue_e; eo->x = b; eo->y = c; - if (d==0) { + if (d == 0) { od = &_objs[getObjectIndex(a)]; eo->width = od->width; } else { eo->width = d; } - if (e==0) { + if (e == 0) { od = &_objs[getObjectIndex(a)]; eo->height = od->height; } else { @@ -1129,20 +1187,22 @@ void Scumm::enqueueObject(int a, int b, int c, int d, int e, int f, int g, int h eo->l = h; } -void Scumm::drawEnqueuedObjects() { +void Scumm::drawEnqueuedObjects() +{ EnqueuedObject *eo; int i; eo = _enqueuedObjects; - for(i=0; i < _enqueuePos; i++,eo++) { + for (i = 0; i < _enqueuePos; i++, eo++) { drawEnqueuedObject(eo); } } -void Scumm::drawEnqueuedObject(EnqueuedObject *eo) { +void Scumm::drawEnqueuedObject(EnqueuedObject * eo) +{ VirtScreen *vs; - byte *roomptr,*bomp; + byte *roomptr, *bomp; byte *ptr; int idx; ObjectData *od; @@ -1153,12 +1213,12 @@ void Scumm::drawEnqueuedObject(EnqueuedObject *eo) { _lastXstart = vs->xstart; - if (eo->l==0) { + if (eo->l == 0) { roomptr = getResourceAddress(1, _roomResource); idx = getObjectIndex(eo->a); assert(idx != -1); ptr = roomptr + _objs[idx].offs_obim_to_room; - } else if (eo->a!=0) { + } else if (eo->a != 0) { od = &_objs[getObjectIndex(eo->a)]; ptr = getResourceAddress(rtFlObject, od->fl_object_index); assert(ptr); @@ -1168,18 +1228,18 @@ void Scumm::drawEnqueuedObject(EnqueuedObject *eo) { return; } - if(eo->l == 0) + if (eo->l == 0) eo->l = 1; - + assert(ptr); ptr = findResource(IMxx_tags[eo->l], ptr); // assert(ptr); - if (!ptr) /* FIXME: Sam and Max highway subgame */ - return; + if (!ptr) /* FIXME: Sam and Max highway subgame */ + return; bomp = findResourceData(MKID('BOMP'), ptr); - bdd.srcwidth = READ_LE_UINT16(&((BompHeader*)bomp)->width); - bdd.srcheight = READ_LE_UINT16(&((BompHeader*)bomp)->height); + bdd.srcwidth = READ_LE_UINT16(&((BompHeader *)bomp)->width); + bdd.srcheight = READ_LE_UINT16(&((BompHeader *)bomp)->height); bdd.out = vs->screenPtr + vs->xstart; bdd.outwidth = 320; @@ -1190,43 +1250,48 @@ void Scumm::drawEnqueuedObject(EnqueuedObject *eo) { bdd.scale_x = (unsigned char)eo->j; bdd.scale_y = (unsigned char)eo->k; - updateDirtyRect(vs->number, bdd.x, bdd.x+bdd.srcwidth, bdd.y, bdd.y+bdd.srcheight, 0); + updateDirtyRect(vs->number, bdd.x, bdd.x + bdd.srcwidth, bdd.y, + bdd.y + bdd.srcheight, 0); if (eo->a) { drawBomp(&bdd); } } -void Scumm::removeEnqueuedObjects() { +void Scumm::removeEnqueuedObjects() +{ EnqueuedObject *eo; int i; eo = _enqueuedObjects; - for(i=0; i < _enqueuePos; i++,eo++) { + for (i = 0; i < _enqueuePos; i++, eo++) { removeEnqueuedObject(eo); } clearEnqueue(); } -void Scumm::removeEnqueuedObject(EnqueuedObject *eo) { +void Scumm::removeEnqueuedObject(EnqueuedObject * eo) +{ restoreBG(eo->x, eo->y, eo->x + eo->width, eo->y + eo->height); } -int Scumm::findFlObjectSlot() { +int Scumm::findFlObjectSlot() +{ int i; - for(i=1; i<_maxFLObject; i++) { + for (i = 1; i < _maxFLObject; i++) { if (_baseFLObject[i] == NULL) return i; } error("findFlObjectSlot: Out of FLObject slots"); } -void Scumm::loadFlObject(uint object, uint room) { +void Scumm::loadFlObject(uint object, uint room) +{ FindObjectInRoom foir; int slot; ObjectData *od; - byte *flob,*roomptr; + byte *flob, *roomptr; uint32 obcd_size, obim_size, flob_size; /* Don't load an already loaded object */ @@ -1255,8 +1320,8 @@ void Scumm::loadFlObject(uint object, uint room) { /* Copy object code + object image to floating object */ roomptr = getResourceAddress(rtRoom, room); flob = getResourceAddress(rtFlObject, slot); - ((uint32*)flob)[0] = MKID('FLOB'); - ((uint32*)flob)[1] = TO_BE_32(flob_size); + ((uint32 *)flob)[0] = MKID('FLOB'); + ((uint32 *)flob)[1] = TO_BE_32(flob_size); memcpy(flob + 8, roomptr - foir.roomptr + foir.obcd, obcd_size); memcpy(flob + 8 + obcd_size, roomptr - foir.roomptr + foir.obim, obim_size); |