aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Gray2003-05-16 16:09:16 +0000
committerJonathan Gray2003-05-16 16:09:16 +0000
commit52832cc954d16e11db37af4053b2cc04ca25adfc (patch)
tree902f7a75a7f0d0dea5865cabe7026f16c9a60830
parente503df12a62a7bcf2fef9ff84b089213fba70e02 (diff)
downloadscummvm-rg350-52832cc954d16e11db37af4053b2cc04ca25adfc.tar.gz
scummvm-rg350-52832cc954d16e11db37af4053b2cc04ca25adfc.tar.bz2
scummvm-rg350-52832cc954d16e11db37af4053b2cc04ca25adfc.zip
some updates that get us up to the bootscripts of he v7 games before erroring out on unimplemented opcodes
svn-id: r7576
-rw-r--r--scumm/resource.cpp52
-rw-r--r--scumm/scumm.h1
2 files changed, 35 insertions, 18 deletions
diff --git a/scumm/resource.cpp b/scumm/resource.cpp
index a2b2aada12..54b2884745 100644
--- a/scumm/resource.cpp
+++ b/scumm/resource.cpp
@@ -81,6 +81,8 @@ void Scumm::openRoom(int room) {
VAR(VAR_CURRENTDISK) = res.roomno[rtRoom][room];
sprintf(buf, "%s.la%d", _exe_name, room == 0 ? 0 : res.roomno[rtRoom][room]);
sprintf(buf2, "%s.%.3d", _exe_name, room == 0 ? 0 : res.roomno[rtRoom][room]);
+ } else if (_features & GF_AFTER_HEV7) {
+ sprintf(buf, "%s.he%.1d", _exe_name, room == 0 ? 0 : 1);
} else if (_features & GF_HUMONGOUS)
sprintf(buf, "%s.he%.1d", _exe_name, room == 0 ? 0 : res.roomno[rtRoom][room]);
else {
@@ -163,7 +165,8 @@ void Scumm::deleteRoomOffsets() {
/* Read room offsets */
void Scumm::readRoomsOffsets() {
- int num, room;
+ int num, room, i;
+ byte *ptr;
debug(9, "readRoomOffsets()");
@@ -171,6 +174,16 @@ void Scumm::readRoomsOffsets() {
if (_features & GF_SMALL_NAMES)
return;
+ if (_features & GF_AFTER_HEV7) {
+ num = READ_LE_UINT16(_HEV7RoomOffsets);
+ ptr = _HEV7RoomOffsets + 2;
+ for (i = 0; i < num; i++) {
+ _roomFileOffsets[i] = READ_LE_UINT32(ptr);
+ ptr += 4;
+ }
+ return;
+ }
+
if (!(_features & GF_SMALL_HEADER)) {
if (!_dynamicRoomOffsets)
return;
@@ -289,11 +302,8 @@ void Scumm::readIndexFile() {
switch (blocktype) {
case MKID('DCHR'):
- readResTypeList(rtCharset, MKID('CHAR'), "charset");
- break;
-
case MKID('DIRF'):
- readResTypeList(rtCharset, MKID('DIRF'), "charset");
+ readResTypeList(rtCharset, MKID('CHAR'), "charset");
break;
case MKID('DOBJ'):
@@ -302,6 +312,7 @@ void Scumm::readIndexFile() {
else
num = _fileHandle.readUint16LE();
assert(num == _numGlobalObjects);
+
if (_features & GF_AFTER_V8) { /* FIXME: Not sure.. */
char buffer[40];
@@ -326,6 +337,10 @@ void Scumm::readIndexFile() {
_objectStateTable[i] = _objectOwnerTable[i] >> OF_STATE_SHL;
_objectOwnerTable[i] &= OF_OWNER_MASK;
}
+ if (_features & GF_AFTER_HEV7) {
+ // FIXME nasty nasty hack handle properly...
+ _fileHandle.seek(num * 6000, SEEK_CUR);
+ }
}
if (!(_features & GF_AFTER_V8)) {
@@ -340,13 +355,17 @@ void Scumm::readIndexFile() {
break;
case MKID('RNAM'):
- case MKID('DIRI'):
- case MKID('DLFL'):
_fileHandle.seek(itemsize - 8, SEEK_CUR);
break;
+
+ case MKID('DLFL'):
+ _HEV7RoomOffsets = (byte *)calloc(itemsize - 8, 1);
+ _fileHandle.read(_HEV7RoomOffsets, itemsize - 8);
+ break;
- case 0xFFFFFFFF:
- stop = true;
+ case MKID('DIRI'):
+ num = _fileHandle.readUint16LE();
+ _fileHandle.seek(num + (8 * num), SEEK_CUR);
break;
case MKID('ANAM'):
@@ -360,7 +379,7 @@ void Scumm::readIndexFile() {
break;
case MKID('DIRR'):
- readResTypeList(rtRoom, MKID('DIRR'), "room");
+ readResTypeList(rtRoom, MKID('RMDA'), "room");
break;
case MKID('DRSC'): // FIXME: Verify
@@ -368,19 +387,13 @@ void Scumm::readIndexFile() {
break;
case MKID('DSCR'):
- readResTypeList(rtScript, MKID('SCRP'), "script");
- break;
-
case MKID('DIRS'):
- readResTypeList(rtScript, MKID('DIRS'), "script");
+ readResTypeList(rtScript, MKID('SCRP'), "script");
break;
case MKID('DCOS'):
- readResTypeList(rtCostume, MKID('COST'), "costume");
- break;
-
case MKID('DIRC'):
- readResTypeList(rtCostume, MKID('DIRC'), "costume");
+ readResTypeList(rtCostume, MKID('COST'), "costume");
break;
case MKID('MAXS'):
@@ -501,6 +514,9 @@ void Scumm::readResTypeList(int id, uint32 tag, const char *name) {
for (i = 0; i < num; i++) {
res.roomoffs[id][i] = _fileHandle.readUint32LE();
}
+ if (_features & GF_AFTER_HEV7) {
+ _fileHandle.seek(4 * num, SEEK_CUR); // FIXME what are these additional offsets
+ }
}
}
diff --git a/scumm/scumm.h b/scumm/scumm.h
index 3569d6d80d..9550d4cc38 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -556,6 +556,7 @@ protected:
byte _resourceMapper[128];
uint32 _allocatedSize;
byte _expire_counter;
+ byte *_HEV7RoomOffsets;
void allocateArrays();
void openRoom(int room);