some updates that get us up to the bootscripts of he v7 games before erroring out on unimplemented opcodes

svn-id: r7576
This commit is contained in:
Jonathan Gray 2003-05-16 16:09:16 +00:00
parent e503df12a6
commit 52832cc954
2 changed files with 35 additions and 18 deletions

View file

@ -81,6 +81,8 @@ void Scumm::openRoom(int room) {
VAR(VAR_CURRENTDISK) = res.roomno[rtRoom][room]; VAR(VAR_CURRENTDISK) = res.roomno[rtRoom][room];
sprintf(buf, "%s.la%d", _exe_name, room == 0 ? 0 : 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]); 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) } else if (_features & GF_HUMONGOUS)
sprintf(buf, "%s.he%.1d", _exe_name, room == 0 ? 0 : res.roomno[rtRoom][room]); sprintf(buf, "%s.he%.1d", _exe_name, room == 0 ? 0 : res.roomno[rtRoom][room]);
else { else {
@ -163,7 +165,8 @@ void Scumm::deleteRoomOffsets() {
/* Read room offsets */ /* Read room offsets */
void Scumm::readRoomsOffsets() { void Scumm::readRoomsOffsets() {
int num, room; int num, room, i;
byte *ptr;
debug(9, "readRoomOffsets()"); debug(9, "readRoomOffsets()");
@ -171,6 +174,16 @@ void Scumm::readRoomsOffsets() {
if (_features & GF_SMALL_NAMES) if (_features & GF_SMALL_NAMES)
return; 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 (!(_features & GF_SMALL_HEADER)) {
if (!_dynamicRoomOffsets) if (!_dynamicRoomOffsets)
return; return;
@ -289,11 +302,8 @@ void Scumm::readIndexFile() {
switch (blocktype) { switch (blocktype) {
case MKID('DCHR'): case MKID('DCHR'):
readResTypeList(rtCharset, MKID('CHAR'), "charset");
break;
case MKID('DIRF'): case MKID('DIRF'):
readResTypeList(rtCharset, MKID('DIRF'), "charset"); readResTypeList(rtCharset, MKID('CHAR'), "charset");
break; break;
case MKID('DOBJ'): case MKID('DOBJ'):
@ -302,6 +312,7 @@ void Scumm::readIndexFile() {
else else
num = _fileHandle.readUint16LE(); num = _fileHandle.readUint16LE();
assert(num == _numGlobalObjects); assert(num == _numGlobalObjects);
if (_features & GF_AFTER_V8) { /* FIXME: Not sure.. */ if (_features & GF_AFTER_V8) { /* FIXME: Not sure.. */
char buffer[40]; char buffer[40];
@ -326,6 +337,10 @@ void Scumm::readIndexFile() {
_objectStateTable[i] = _objectOwnerTable[i] >> OF_STATE_SHL; _objectStateTable[i] = _objectOwnerTable[i] >> OF_STATE_SHL;
_objectOwnerTable[i] &= OF_OWNER_MASK; _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)) { if (!(_features & GF_AFTER_V8)) {
@ -340,13 +355,17 @@ void Scumm::readIndexFile() {
break; break;
case MKID('RNAM'): case MKID('RNAM'):
case MKID('DIRI'):
case MKID('DLFL'):
_fileHandle.seek(itemsize - 8, SEEK_CUR); _fileHandle.seek(itemsize - 8, SEEK_CUR);
break; break;
case MKID('DLFL'):
_HEV7RoomOffsets = (byte *)calloc(itemsize - 8, 1);
_fileHandle.read(_HEV7RoomOffsets, itemsize - 8);
break;
case 0xFFFFFFFF: case MKID('DIRI'):
stop = true; num = _fileHandle.readUint16LE();
_fileHandle.seek(num + (8 * num), SEEK_CUR);
break; break;
case MKID('ANAM'): case MKID('ANAM'):
@ -360,7 +379,7 @@ void Scumm::readIndexFile() {
break; break;
case MKID('DIRR'): case MKID('DIRR'):
readResTypeList(rtRoom, MKID('DIRR'), "room"); readResTypeList(rtRoom, MKID('RMDA'), "room");
break; break;
case MKID('DRSC'): // FIXME: Verify case MKID('DRSC'): // FIXME: Verify
@ -368,19 +387,13 @@ void Scumm::readIndexFile() {
break; break;
case MKID('DSCR'): case MKID('DSCR'):
case MKID('DIRS'):
readResTypeList(rtScript, MKID('SCRP'), "script"); readResTypeList(rtScript, MKID('SCRP'), "script");
break; break;
case MKID('DIRS'):
readResTypeList(rtScript, MKID('DIRS'), "script");
break;
case MKID('DCOS'): case MKID('DCOS'):
readResTypeList(rtCostume, MKID('COST'), "costume");
break;
case MKID('DIRC'): case MKID('DIRC'):
readResTypeList(rtCostume, MKID('DIRC'), "costume"); readResTypeList(rtCostume, MKID('COST'), "costume");
break; break;
case MKID('MAXS'): case MKID('MAXS'):
@ -501,6 +514,9 @@ void Scumm::readResTypeList(int id, uint32 tag, const char *name) {
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
res.roomoffs[id][i] = _fileHandle.readUint32LE(); res.roomoffs[id][i] = _fileHandle.readUint32LE();
} }
if (_features & GF_AFTER_HEV7) {
_fileHandle.seek(4 * num, SEEK_CUR); // FIXME what are these additional offsets
}
} }
} }

View file

@ -556,6 +556,7 @@ protected:
byte _resourceMapper[128]; byte _resourceMapper[128];
uint32 _allocatedSize; uint32 _allocatedSize;
byte _expire_counter; byte _expire_counter;
byte *_HEV7RoomOffsets;
void allocateArrays(); void allocateArrays();
void openRoom(int room); void openRoom(int room);