[Scummvm-cvs-logs] CVS: scummvm/scumm object.cpp,1.69,1.70 scumm.h,1.162,1.163 scummvm.cpp,2.84,2.85
Max Horn
fingolfin at users.sourceforge.net
Fri Apr 11 19:10:02 CEST 2003
Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv12792
Modified Files:
object.cpp scumm.h scummvm.cpp
Log Message:
lots of unblocked aka GF_OLD_BUNDLE support code (still no load, but gets further :-)
Index: object.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/object.cpp,v
retrieving revision 1.69
retrieving revision 1.70
diff -u -d -r1.69 -r1.70
--- object.cpp 8 Mar 2003 00:56:42 -0000 1.69
+++ object.cpp 12 Apr 2003 02:09:00 -0000 1.70
@@ -520,6 +520,36 @@
CHECK_HEAP
}
+void Scumm::loadRoomObjectsOldBundle() {
+ int i;
+ ObjectData *od;
+ byte *room, *ptr;
+
+ CHECK_HEAP
+ room = getResourceAddress(rtRoom, _roomResource);
+
+ _numObjectsInRoom = room[20];
+
+ if (_numObjectsInRoom == 0)
+ return;
+
+ if (_numObjectsInRoom > _numLocalObjects)
+ error("More than %d objects in room %d", _numLocalObjects, _roomResource);
+
+ ptr = room + 29;
+ for (i = 0; i < _numObjectsInRoom; i++) {
+ od = &_objs[findLocalObjectSlot()];
+
+ od->OBIMoffset = READ_LE_UINT16(ptr);
+ od->OBCDoffset = READ_LE_UINT16(ptr + 2 * _numObjectsInRoom);
+ setupRoomObject(od, room);
+
+ ptr += 2;
+ }
+
+ CHECK_HEAP
+}
+
void Scumm::loadRoomObjectsSmall() {
int i, j;
ObjectData *od;
@@ -575,8 +605,9 @@
}
for (i = 1; i < _numLocalObjects; i++) {
- if (_objs[i].obj_nr && !_objs[i].fl_object_index)
+ if (_objs[i].obj_nr && !_objs[i].fl_object_index) {
setupRoomObject(&_objs[i], room);
+ }
}
CHECK_HEAP
@@ -592,10 +623,16 @@
byte *ptr = room + od->OBCDoffset;
- od->obj_nr = READ_LE_UINT16(ptr + 6); // ok
+ if (_features & GF_OLD_BUNDLE)
+ ptr -= 2;
- od->width = *(ptr + 11) << 3; // ok
- od->x_pos = *(ptr + 9) << 3; // ok
+ od->obj_nr = READ_LE_UINT16(ptr + 6);
+
+ od->x_pos = *(ptr + 9) << 3;
+ od->y_pos = ((*(ptr + 10)) & 0x7F) << 3;
+
+ od->width = *(ptr + 11) << 3;
+ od->height = *(ptr + 17) & 0xf8;
if (*(ptr + 10) & 0x80) {
od->parentstate = 1; // it's 0x10 in the original code
@@ -603,15 +640,12 @@
od->parentstate = 0;
}
- od->y_pos = ((*(ptr + 10)) & 0x7F) << 3;
-
od->parent = *(ptr + 12);
- od->walk_x = READ_LE_UINT16(ptr + 13);
+ 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;
}
Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.162
retrieving revision 1.163
diff -u -d -r1.162 -r1.163
--- scumm.h 7 Apr 2003 16:04:29 -0000 1.162
+++ scumm.h 12 Apr 2003 02:09:00 -0000 1.163
@@ -595,8 +595,11 @@
bool isResourceInUse(int type, int i);
void initRoomSubBlocks();
void clearRoomObjects();
+
void loadRoomObjects();
void loadRoomObjectsSmall();
+ void loadRoomObjectsOldBundle();
+
void readArrayFromIndexFile();
virtual void readMAXS();
virtual void readIndexFile();
Index: scummvm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scummvm.cpp,v
retrieving revision 2.84
retrieving revision 2.85
diff -u -d -r2.84 -r2.85
--- scummvm.cpp 11 Apr 2003 22:15:59 -0000 2.84
+++ scummvm.cpp 12 Apr 2003 02:09:00 -0000 2.85
@@ -783,7 +783,9 @@
}
initRoomSubBlocks();
- if (_features & GF_SMALL_HEADER)
+ if (_features & GF_OLD_BUNDLE)
+ loadRoomObjectsOldBundle();
+ else if (_features & GF_SMALL_HEADER)
loadRoomObjectsSmall();
else
loadRoomObjects();
@@ -866,6 +868,10 @@
for (i = 1; i < _maxScaleTable; i++)
nukeResource(rtScaleTable, i);
+ memset(_localScriptList, 0, sizeof(_localScriptList));
+
+ memset(_extraBoxFlags, 0, sizeof(_extraBoxFlags));
+
// Determine the room and room script base address
roomResPtr = roomptr = getResourceAddress(rtRoom, _roomResource);
if (_features & GF_AFTER_V8)
@@ -873,8 +879,11 @@
if (!roomptr || !roomResPtr)
error("Room %d: data not found (" __FILE__ ":%d)", _roomResource, __LINE__);
- rmhd = (RoomHeader *)findResourceData(MKID('RMHD'), roomptr);
-
+ if (_features & GF_OLD_BUNDLE)
+ rmhd = (RoomHeader *)(roomptr + 4);
+ else
+ rmhd = (RoomHeader *)findResourceData(MKID('RMHD'), roomptr);
+
if (_features & GF_AFTER_V8) {
_scrWidth = READ_LE_UINT32(&(rmhd->v8.width));
_scrHeight = READ_LE_UINT32(&(rmhd->v8.height));
@@ -886,7 +895,9 @@
_scrHeight = READ_LE_UINT16(&(rmhd->old.height));
}
- if (_features & GF_SMALL_HEADER)
+ if (_features & GF_OLD_BUNDLE)
+ _IM00_offs = READ_LE_UINT16(roomptr + 0x0A);
+ else if (_features & GF_SMALL_HEADER)
_IM00_offs = findResourceData(MKID('IM00'), roomptr) - roomptr;
else if (_features & GF_AFTER_V8) {
ptr = findResource(MKID('IMAG'), roomptr);
@@ -903,36 +914,50 @@
findResource(MKID('IM00'), findResource(MKID('RMIM'), roomptr)) - roomptr;
// Look for an exit script
- ptr = findResourceData(MKID('EXCD'), roomResPtr);
- if (ptr) {
- _EXCD_offs = ptr - roomResPtr;
- if (_dumpScripts)
- dumpResource("exit-", _roomResource, ptr - _resourceHeaderSize);
+ if (_features & GF_OLD_BUNDLE)
+ _EXCD_offs = READ_LE_UINT16(roomptr + 0x19);
+ else {
+ ptr = findResourceData(MKID('EXCD'), roomResPtr);
+ if (ptr) {
+ _EXCD_offs = ptr - roomResPtr;
+ if (_dumpScripts)
+ dumpResource("exit-", _roomResource, ptr - _resourceHeaderSize);
+ }
}
// Look for an entry script
- ptr = findResourceData(MKID('ENCD'), roomResPtr);
- if (ptr) {
- _ENCD_offs = ptr - roomResPtr;
- if (_dumpScripts)
- dumpResource("entry-", _roomResource, ptr - _resourceHeaderSize);
+ if (_features & GF_OLD_BUNDLE)
+ _EXCD_offs = READ_LE_UINT16(roomptr + 0x1B);
+ else {
+ ptr = findResourceData(MKID('ENCD'), roomResPtr);
+ if (ptr) {
+ _ENCD_offs = ptr - roomResPtr;
+ if (_dumpScripts)
+ dumpResource("entry-", _roomResource, ptr - _resourceHeaderSize);
+ }
}
if (_features & GF_SMALL_HEADER) {
- ptr = findResourceData(MKID('BOXD'), roomptr);
+ if (_features & GF_OLD_BUNDLE)
+ ptr = roomptr + READ_LE_UINT16(roomptr + 0x15);
+ else
+ ptr = findResourceData(MKID('BOXD'), roomptr);
if (ptr) {
- byte numOfBoxes = *(ptr);
+ byte numOfBoxes = *ptr;
int size;
if (_features & GF_AFTER_V3) // GF_OLD256 or GF_AFTER_V3 ?
size = numOfBoxes * (SIZEOF_BOX - 2) + 1;
else
size = numOfBoxes * SIZEOF_BOX + 1;
-
createResource(rtMatrix, 2, size);
memcpy(getResourceAddress(rtMatrix, 2), ptr, size);
ptr += size;
- size = getResourceDataSize(ptr - size - 6) - size;
+ if (_features & GF_OLD_BUNDLE)
+ // FIXME. This is an evil HACK!!!
+ size = (READ_LE_UINT16(roomptr + 0x15) - READ_LE_UINT16(roomptr + 0x0A)) - size;
+ else
+ size = getResourceDataSize(ptr - size - 6) - size;
if (size >= 0) { // do this :)
createResource(rtMatrix, 1, size);
@@ -960,7 +985,10 @@
}
}
- ptr = findResourceData(MKID('SCAL'), roomptr);
+ if (_features & GF_OLD_BUNDLE)
+ ptr = 0; // TODO ?
+ else
+ ptr = findResourceData(MKID('SCAL'), roomptr);
if (ptr) {
offs = ptr - roomptr;
if (_features & GF_AFTER_V8) {
@@ -988,7 +1016,6 @@
//
// Setup local script
//
- memset(_localScriptList, 0, sizeof(_localScriptList));
// Determine the room script base address
roomResPtr = roomptr = getResourceAddress(rtRoom, _roomResource);
@@ -996,7 +1023,20 @@
roomResPtr = getResourceAddress(rtRoomScripts, _roomResource);
searchptr = roomResPtr;
- if (_features & GF_SMALL_HEADER) {
+ if (_features & GF_OLD_BUNDLE) {
+ ptr = roomptr + 32; // FIXME ???
+ while (*ptr) {
+ int id = *ptr++;
+ int offset = READ_LE_UINT16(ptr);
+ ptr += 2;
+ // TODO / FIXME: It seems also global scripts are stored in here?!?
+ // At least there are scripts with ID < _numGlobalScripts, need to look
+ // into this...
+ printf("Local script %d at offset %d (_numGlobalScripts = %d)\n", id, offset, _numGlobalScripts);
+ if (id >= _numGlobalScripts)
+ _localScriptList[id - _numGlobalScripts] = offset;
+ }
+ } else if (_features & GF_SMALL_HEADER) {
while ((ptr = findResourceSmall(MKID('LSCR'), searchptr)) != NULL) {
int id = 0;
ptr += _resourceHeaderSize; /* skip tag & size */
@@ -1047,7 +1087,9 @@
// Of course we could just decide to not use _CLUT_offs anymore, and change
// setPaletteFromRes() to invoke findResourceData() each time
// (and also getPalettePtr()).
- if (_features & GF_SMALL_HEADER)
+ if (_features & GF_OLD_BUNDLE)
+ ptr = 0; // TODO ? do 16 bit games use a palette?!?
+ else if (_features & GF_SMALL_HEADER)
ptr = findResourceSmall(MKID('CLUT'), roomptr);
else
ptr = findResourceData(MKID('CLUT'), roomptr);
@@ -1065,22 +1107,28 @@
}
}
- ptr = findResourceData(MKID('CYCL'), roomptr);
-
+ // Color cycling
+ if (_features & GF_OLD_BUNDLE)
+ ptr = 0; // TODO / FIXME ???
+ else
+ ptr = findResourceData(MKID('CYCL'), roomptr);
if (ptr)
initCycl(ptr);
- ptr = findResourceData(MKID('TRNS'), roomptr);
- if (ptr)
- gdi._transparentColor = ptr[0];
- else if (_features & GF_AFTER_V8)
- gdi._transparentColor = 5; // FIXME
- else
- gdi._transparentColor = 255;
+ // Transparent color
+ if (_features & GF_OLD_BUNDLE)
+ gdi._transparentColor = 255; // TODO - FIXME
+ else {
+ ptr = findResourceData(MKID('TRNS'), roomptr);
+ if (ptr)
+ gdi._transparentColor = ptr[0];
+ else if (_features & GF_AFTER_V8)
+ gdi._transparentColor = 5; // FIXME
+ else
+ gdi._transparentColor = 255;
+ }
initBGBuffers(_scrHeight);
-
- memset(_extraBoxFlags, 0, sizeof(_extraBoxFlags));
}
void Scumm::setScaleItem(int slot, int a, int b, int c, int d) {
@@ -1121,7 +1169,9 @@
File out;
uint32 size;
- if (_features & GF_SMALL_HEADER)
+ if (_features & GF_OLD_BUNDLE)
+ size = READ_LE_UINT16(ptr);
+ else if (_features & GF_SMALL_HEADER)
size = READ_LE_UINT32(ptr);
else
size = READ_BE_UINT32_UNALIGNED(ptr + 4);
More information about the Scummvm-git-logs
mailing list