[Scummvm-cvs-logs] CVS: scummvm/scumm object.cpp,1.20,1.21 scummvm.cpp,2.4,2.5
Max Horn
fingolfin at users.sourceforge.net
Mon Dec 23 20:03:06 CET 2002
Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv11582
Modified Files:
object.cpp scummvm.cpp
Log Message:
changed lots of stuff to read data in the V8 format; more changes still needed, and one open problem: V8 IMHD has no obj_id, we need to work around that somehow, not yet sure what the correct way is (two find out, we either need to get into a state where this actually matters, so that we can do trial & error, or we need a disassmbly)
Index: object.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/object.cpp,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- object.cpp 21 Dec 2002 01:11:41 -0000 1.20
+++ object.cpp 24 Dec 2002 04:02:21 -0000 1.21
@@ -196,7 +196,10 @@
}
assert(ptr);
imhd = (ImageHeader *)findResourceData(MKID('IMHD'), ptr);
- if (_features & GF_AFTER_V7) {
+ if (_features & GF_AFTER_V8) {
+ x = od->x_pos + (int32)READ_LE_UINT32(&imhd->v8.hotspot[state].x);
+ y = od->y_pos + (int32)READ_LE_UINT32(&imhd->v8.hotspot[state].y);
+ } else 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 {
@@ -402,7 +405,9 @@
CHECK_HEAP room = getResourceAddress(rtRoom, _roomResource);
roomhdr = (RoomHeader *)findResourceData(MKID('RMHD'), room);
- if (_features & GF_AFTER_V7)
+ if (_features & GF_AFTER_V8)
+ _numObjectsInRoom = READ_LE_UINT32(&(roomhdr->v8.numObjects));
+ else if (_features & GF_AFTER_V7)
_numObjectsInRoom = READ_LE_UINT16(&(roomhdr->v7.numObjects));
else
_numObjectsInRoom = READ_LE_UINT16(&(roomhdr->old.numObjects));
@@ -447,7 +452,11 @@
error("Room %d missing image blocks(s)", _roomResource);
imhd = (ImageHeader *)findResourceData(MKID('IMHD'), ptr);
- if (_features & GF_AFTER_V7)
+ if (_features & GF_AFTER_V8)
+ // FIXME - in v8, IMHD seems to contain no obj_id, but rather a name string
+ obim_id = 0;
+// obim_id = READ_LE_UINT32(&imhd->v8.obj_id);
+ else if (_features & GF_AFTER_V7)
obim_id = READ_LE_UINT16(&imhd->v7.obj_id);
else
obim_id = READ_LE_UINT16(&imhd->old.obj_id);
@@ -564,42 +573,23 @@
}
cdhd = (CodeHeader *)findResourceData(MKID('CDHD'), room + od->offs_obcd_to_room);
- if (_features & GF_AFTER_V7)
+
+ if (_features & GF_AFTER_V8) {
+ od->obj_nr = READ_LE_UINT16(&(cdhd->v7.obj_id));
+
+ od->parent = cdhd->v7.parent;
+ od->parentstate = cdhd->v7.parentstate;
+
+ imhd = (ImageHeader *)findResourceData(MKID('IMHD'), room + od->offs_obim_to_room);
+ od->x_pos = READ_LE_UINT32(&imhd->v8.x_pos);
+ od->y_pos = READ_LE_UINT32(&imhd->v8.y_pos);
+ od->width = READ_LE_UINT32(&imhd->v8.width);
+ od->height = READ_LE_UINT32(&imhd->v8.height);
+ od->actordir = READ_LE_UINT32(&imhd->v8.actordir);
+
+ } else 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
- 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));
- if (cdhd->v6.flags == 0x80) {
- od->parentstate = 1;
- } else {
- 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;
- if (cdhd->v5.flags == 0x80) {
- od->parentstate = 1;
- } else {
- od->parentstate = (cdhd->v5.flags & 0xF);
- }
- od->parent = cdhd->v5.parent;
- od->walk_x = READ_LE_UINT16(&cdhd->v5.walk_x);
- od->walk_y = READ_LE_UINT16(&cdhd->v5.walk_y);
- od->actordir = cdhd->v5.actordir;
- }
- } else {
od->parent = cdhd->v7.parent;
od->parentstate = cdhd->v7.parentstate;
@@ -610,7 +600,38 @@
od->height = READ_LE_UINT16(&imhd->v7.height);
od->actordir = READ_LE_UINT16(&imhd->v7.actordir);
+ } else if (_features & GF_AFTER_V6) {
+ od->obj_nr = READ_LE_UINT16(&(cdhd->v6.obj_id));
+
+ 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));
+ if (cdhd->v6.flags == 0x80) {
+ od->parentstate = 1;
+ } else {
+ od->parentstate = (cdhd->v6.flags & 0xF);
+ }
+ od->parent = cdhd->v6.parent;
+ od->actordir = cdhd->v6.actordir;
+ } else {
+ od->obj_nr = READ_LE_UINT16(&(cdhd->v5.obj_id));
+
+ 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->parent = cdhd->v5.parent;
+ od->walk_x = READ_LE_UINT16(&cdhd->v5.walk_x);
+ od->walk_y = READ_LE_UINT16(&cdhd->v5.walk_y);
+ od->actordir = cdhd->v5.actordir;
}
+
od->fl_object_index = 0;
}
@@ -810,7 +831,8 @@
memcpy(getResourceAddress(rtInventory, slot), obcdptr, size);
}
-CHECK_HEAP}
+ CHECK_HEAP
+}
void Scumm::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id, uint room)
{
@@ -837,7 +859,9 @@
roomhdr = (RoomHeader *)findResourceData(MKID('RMHD'), roomptr);
- if (_features & GF_AFTER_V7)
+ if (_features & GF_AFTER_V8)
+ numobj = READ_LE_UINT32(&(roomhdr->v8.numObjects));
+ else if (_features & GF_AFTER_V7)
numobj = READ_LE_UINT16(&(roomhdr->v7.numObjects));
else
numobj = READ_LE_UINT16(&(roomhdr->old.numObjects));
@@ -864,7 +888,11 @@
}
} else {
cdhd = (CodeHeader *)findResourceData(MKID('CDHD'), obcdptr);
- if (_features & GF_AFTER_V7)
+ if (_features & GF_AFTER_V8)
+ // FIXME - in v8, IMHD seems to contain no obj_id, but rather a name string
+ id2 = 0;
+// id2 = READ_LE_UINT32(&(cdhd->v8.obj_id));
+ else 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));
@@ -900,7 +928,11 @@
break;
}
} else {
- if (_features & GF_AFTER_V7)
+ if (_features & GF_AFTER_V8)
+ // FIXME - in v8, IMHD seems to contain no obj_id, but rather a name string
+ id3 = 0;
+// id3 = READ_LE_UINT32(&imhd->v8.obj_id);
+ else if (_features & GF_AFTER_V7)
id3 = READ_LE_UINT16(&imhd->v7.obj_id);
else
id3 = READ_LE_UINT16(&imhd->old.obj_id);
@@ -1111,20 +1143,21 @@
findObjectInRoom(&foir, foCodeHeader | foImageHeader | foCheckAlreadyLoaded, img, room);
- if (_features & GF_AFTER_V7)
+ if (_features & GF_AFTER_V8) {
+ setCursorHotspot2(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) >> 3;
+ h = READ_LE_UINT32(&foir.imhd->v8.height) >> 3;
+ } else 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
+ READ_LE_UINT16(&foir.imhd->v7.hotspot[0].y));
+ w = READ_LE_UINT16(&foir.imhd->v7.width) >> 3;
+ h = READ_LE_UINT16(&foir.imhd->v7.height) >> 3;
+ } 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)) {
+ READ_LE_UINT16(&foir.imhd->old.hotspot[0].y));
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;
}
dataptr = findResource(IMxx_tags[imgindex], foir.obim);
Index: scummvm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scummvm.cpp,v
retrieving revision 2.4
retrieving revision 2.5
diff -u -d -r2.4 -r2.5
--- scummvm.cpp 23 Dec 2002 23:30:14 -0000 2.4
+++ scummvm.cpp 24 Dec 2002 04:02:21 -0000 2.5
@@ -727,7 +727,10 @@
rmhd = (RoomHeader *)findResourceData(MKID('RMHD'), roomptr);
- if (_features & GF_AFTER_V7) {
+ if (_features & GF_AFTER_V8) {
+ _scrWidth = READ_LE_UINT32(&(rmhd->v8.width));
+ _scrHeight = READ_LE_UINT32(&(rmhd->v8.height));
+ } else if (_features & GF_AFTER_V7) {
_scrWidth = READ_LE_UINT16(&(rmhd->v7.width));
_scrHeight = READ_LE_UINT16(&(rmhd->v7.height));
} else {
@@ -747,7 +750,7 @@
if (ptr) {
_EXCD_offs = ptr - roomptr;
#ifdef DUMP_SCRIPTS
- dumpResource("exit-", _roomResource, ptr - _resourceHeaderSize);
+ dumpResource("exit-", _roomResource, ptr - _resourceHeaderSize);
#endif
}
@@ -755,7 +758,7 @@
if (ptr) {
_ENCD_offs = ptr - roomptr;
#ifdef DUMP_SCRIPTS
- dumpResource("entry-", _roomResource, ptr - _resourceHeaderSize);
+ dumpResource("entry-", _roomResource, ptr - _resourceHeaderSize);
#endif
}
@@ -804,14 +807,27 @@
ptr = findResourceData(MKID('SCAL'), roomptr);
if (ptr) {
offs = ptr - roomptr;
- for (i = 1; i < _maxScaleTable; i++, offs += 8) {
- int a = READ_LE_UINT16(roomptr + offs);
- int b = READ_LE_UINT16(roomptr + offs + 2);
- int c = READ_LE_UINT16(roomptr + offs + 4);
- int d = READ_LE_UINT16(roomptr + offs + 6);
- if (a || b || c || d) {
- setScaleItem(i, b, a, d, c);
- roomptr = getResourceAddress(rtRoom, _roomResource);
+ if (_features & GF_AFTER_V7) {
+ for (i = 1; i < _maxScaleTable; i++, offs += 16) {
+ int a = READ_LE_UINT32(roomptr + offs);
+ int b = READ_LE_UINT32(roomptr + offs + 4);
+ int c = READ_LE_UINT32(roomptr + offs + 8);
+ int d = READ_LE_UINT32(roomptr + offs + 12);
+ if (a || b || c || d) {
+ setScaleItem(i, b, a, d, c);
+ roomptr = getResourceAddress(rtRoom, _roomResource);
+ }
+ }
+ } else {
+ for (i = 1; i < _maxScaleTable; i++, offs += 8) {
+ int a = READ_LE_UINT16(roomptr + offs);
+ int b = READ_LE_UINT16(roomptr + offs + 2);
+ int c = READ_LE_UINT16(roomptr + offs + 4);
+ int d = READ_LE_UINT16(roomptr + offs + 6);
+ if (a || b || c || d) {
+ setScaleItem(i, b, a, d, c);
+ roomptr = getResourceAddress(rtRoom, _roomResource);
+ }
}
}
}
@@ -839,7 +855,11 @@
ptr += _resourceHeaderSize; /* skip tag & size */
- if (_features & GF_AFTER_V7) {
+ if (_features & GF_AFTER_V8) {
+ id = READ_LE_UINT32(ptr);
+ checkRange(NUM_LOCALSCRIPT + _numGlobalScripts, _numGlobalScripts, id, "Invalid local script %d");
+ _localScriptList[id - _numGlobalScripts] = ptr + 4 - roomptr;
+ } else if (_features & GF_AFTER_V7) {
id = READ_LE_UINT16(ptr);
checkRange(NUM_LOCALSCRIPT + _numGlobalScripts, _numGlobalScripts, id, "Invalid local script %d");
_localScriptList[id - _numGlobalScripts] = ptr + 2 - roomptr;
More information about the Scummvm-git-logs
mailing list