changed scumm file io to class File

svn-id: r4920
This commit is contained in:
Paweł Kołodziejski 2002-09-10 07:34:27 +00:00
parent 395b98a3e2
commit dcf05149fe
8 changed files with 201 additions and 364 deletions

View file

@ -97,6 +97,8 @@ bool File::open(const char *filename, int mode, byte encbyte) {
return false; return false;
} }
_encbyte = encbyte;
return true; return true;
} }

View file

@ -48,8 +48,7 @@ void Scumm::openRoom(int room)
if (room == -1) { if (room == -1) {
_encbyte = 0; _encbyte = 0;
deleteRoomOffsets(); deleteRoomOffsets();
fileClose(_fileHandle); _fileHandle.close();
_fileHandle = NULL;
return; return;
} }
@ -158,20 +157,20 @@ void Scumm::readRoomsOffsets()
if (!_dynamicRoomOffsets) if (!_dynamicRoomOffsets)
return; return;
fileSeek(_fileHandle, 16, SEEK_SET); _fileHandle.seek(16, SEEK_SET);
} else { } else {
fileSeek(_fileHandle, 12, SEEK_SET); // Directlry searching for the room offset block would be more generic... _fileHandle.seek(12, SEEK_SET); // Directlry searching for the room offset block would be more generic...
} }
num = fileReadByte(); num = _fileHandle.readByte();
while (num) { while (num) {
num--; num--;
room = fileReadByte(); room = _fileHandle.readByte();
if (_roomFileOffsets[room] != 0xFFFFFFFF) { if (_roomFileOffsets[room] != 0xFFFFFFFF) {
_roomFileOffsets[room] = fileReadDwordLE(); _roomFileOffsets[room] = _fileHandle.readDwordLE();
} else { } else {
fileReadDwordLE(); _fileHandle.readDwordLE();
} }
} }
} }
@ -182,34 +181,33 @@ bool Scumm::openResourceFile(const char *filename)
debug(9, "openResourceFile(%s)", filename); debug(9, "openResourceFile(%s)", filename);
if (_fileHandle != NULL) { if (_fileHandle.isOpen() == true) {
fileClose(_fileHandle); _fileHandle.close();
_fileHandle = NULL;
} }
strcpy(buf, filename); strcpy(buf, filename);
_fileHandle = fileOpen(buf, 1); _fileHandle.open(buf, 1, _encbyte);
if (!_fileHandle) { if (_fileHandle.isOpen() == false) {
char *e = strrchr(buf, '/'); char *e = strrchr(buf, '/');
if (!e) if (!e)
e = buf; e = buf;
do do
*e = tolower(*e); *e = tolower(*e);
while (*e++); while (*e++);
_fileHandle = fileOpen(buf, 1); _fileHandle.open(buf, 1, _encbyte);
} }
if (!_fileHandle) { if (_fileHandle.isOpen() == false) {
char *e = strrchr(buf, '/'); char *e = strrchr(buf, '/');
if (!e) if (!e)
e = buf; e = buf;
do do
*e = toupper(*e); *e = toupper(*e);
while (*e++); while (*e++);
_fileHandle = fileOpen(buf, 1); _fileHandle.open(buf, 1, _encbyte);
} }
return _fileHandle != NULL; return _fileHandle.isOpen();
} }
void Scumm::askForDisk(const char *filename) void Scumm::askForDisk(const char *filename)
@ -230,48 +228,48 @@ void Scumm::readIndexFile()
if (!(_features & GF_AFTER_V6)) { if (!(_features & GF_AFTER_V6)) {
/* Figure out the sizes of various resources */ /* Figure out the sizes of various resources */
while (!fileEof(_fileHandle)) { while (!_fileHandle.eof()) {
blocktype = fileReadDword(); blocktype = fileReadDword();
itemsize = fileReadDwordBE(); itemsize = _fileHandle.readDwordBE();
if (fileReadFailed(_fileHandle)) if (_fileHandle.ioFailed())
break; break;
switch (blocktype) { switch (blocktype) {
case MKID('DOBJ'): case MKID('DOBJ'):
_numGlobalObjects = fileReadWordLE(); _numGlobalObjects = _fileHandle.readWordLE();
itemsize -= 2; itemsize -= 2;
break; break;
case MKID('DROO'): case MKID('DROO'):
_numRooms = fileReadWordLE(); _numRooms = _fileHandle.readWordLE();
itemsize -= 2; itemsize -= 2;
break; break;
case MKID('DSCR'): case MKID('DSCR'):
_numScripts = fileReadWordLE(); _numScripts = _fileHandle.readWordLE();
itemsize -= 2; itemsize -= 2;
break; break;
case MKID('DCOS'): case MKID('DCOS'):
_numCostumes = fileReadWordLE(); _numCostumes = _fileHandle.readWordLE();
itemsize -= 2; itemsize -= 2;
break; break;
case MKID('DSOU'): case MKID('DSOU'):
_numSounds = fileReadWordLE(); _numSounds = _fileHandle.readWordLE();
itemsize -= 2; itemsize -= 2;
break; break;
} }
fileSeek(_fileHandle, itemsize - 8, SEEK_CUR); _fileHandle.seek(itemsize - 8, SEEK_CUR);
} }
clearFileReadFailed(_fileHandle); _fileHandle.clearIOFailed();
fileSeek(_fileHandle, 0, SEEK_SET); _fileHandle.seek(0, SEEK_SET);
} }
while (1) { while (1) {
blocktype = fileReadDword(); blocktype = fileReadDword();
if (fileReadFailed(_fileHandle)) if (_fileHandle.ioFailed())
break; break;
itemsize = fileReadDwordBE(); itemsize = _fileHandle.readDwordBE();
numblock++; numblock++;
@ -282,25 +280,25 @@ void Scumm::readIndexFile()
case MKID('DOBJ'): case MKID('DOBJ'):
if (_features & GF_AFTER_V8) if (_features & GF_AFTER_V8)
num = fileReadDwordLE(); num = _fileHandle.readDwordLE();
else else
num = fileReadWordLE(); num = _fileHandle.readWordLE();
assert(num == _numGlobalObjects); assert(num == _numGlobalObjects);
if (_features & GF_AFTER_V8) { /* FIXME: Not sure.. */ if (_features & GF_AFTER_V8) { /* FIXME: Not sure.. */
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
fileSeek(_fileHandle, 40, SEEK_CUR); _fileHandle.seek(40, SEEK_CUR);
_objectStateTable[i] = fileReadByte(); _objectStateTable[i] = _fileHandle.readByte();
_objectRoomTable[i] = fileReadByte(); _objectRoomTable[i] = _fileHandle.readByte();
_classData[i] = fileReadDwordLE(); _classData[i] = _fileHandle.readDwordLE();
} }
memset(_objectOwnerTable, 0xFF, num); memset(_objectOwnerTable, 0xFF, num);
} else if (_features & GF_AFTER_V7) { } else if (_features & GF_AFTER_V7) {
fileRead(_fileHandle, _objectStateTable, num); _fileHandle.read(_objectStateTable, num);
fileRead(_fileHandle, _objectRoomTable, num); _fileHandle.read(_objectRoomTable, num);
memset(_objectOwnerTable, 0xFF, num); memset(_objectOwnerTable, 0xFF, num);
} else { } else {
fileRead(_fileHandle, _objectOwnerTable, num); _fileHandle.read(_objectOwnerTable, num);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
_objectStateTable[i] = _objectOwnerTable[i] >> OF_STATE_SHL; _objectStateTable[i] = _objectOwnerTable[i] >> OF_STATE_SHL;
_objectOwnerTable[i] &= OF_OWNER_MASK; _objectOwnerTable[i] &= OF_OWNER_MASK;
@ -308,7 +306,7 @@ void Scumm::readIndexFile()
} }
if (!(_features & GF_AFTER_V8)) { if (!(_features & GF_AFTER_V8)) {
fileRead(_fileHandle, _classData, num * sizeof(uint32)); _fileHandle.read(_classData, num * sizeof(uint32));
// Swap flag endian where applicable // Swap flag endian where applicable
#if defined(SCUMM_BIG_ENDIAN) #if defined(SCUMM_BIG_ENDIAN)
@ -320,7 +318,7 @@ void Scumm::readIndexFile()
case MKID('RNAM'): case MKID('RNAM'):
case MKID('ANAM'): case MKID('ANAM'):
fileSeek(_fileHandle, itemsize - 8, SEEK_CUR); _fileHandle.seek(itemsize - 8, SEEK_CUR);
break; break;
case MKID('DROO'): case MKID('DROO'):
@ -369,10 +367,10 @@ void Scumm::readArrayFromIndexFile()
int num; int num;
int a, b, c; int a, b, c;
while ((num = fileReadWordLE()) != 0) { while ((num = _fileHandle.readWordLE()) != 0) {
a = fileReadWordLE(); a = _fileHandle.readWordLE();
b = fileReadWordLE(); b = _fileHandle.readWordLE();
c = fileReadWordLE(); c = _fileHandle.readWordLE();
if (c == 1) if (c == 1)
defineArray(num, 1, a, b); defineArray(num, 1, a, b);
else else
@ -388,11 +386,11 @@ void Scumm::readResTypeList(int id, uint32 tag, const char *name)
debug(9, "readResTypeList(%s,%x,%s)", resTypeFromId(id), FROM_LE_32(tag), name); debug(9, "readResTypeList(%s,%x,%s)", resTypeFromId(id), FROM_LE_32(tag), name);
if (_features & GF_AFTER_V8) if (_features & GF_AFTER_V8)
num = fileReadDwordLE(); num = _fileHandle.readDwordLE();
else if (!(_features & GF_OLD_BUNDLE)) else if (!(_features & GF_OLD_BUNDLE))
num = fileReadWordLE(); num = _fileHandle.readWordLE();
else else
num = fileReadByte(); num = _fileHandle.readByte();
if (1 || _features & GF_AFTER_V6) { if (1 || _features & GF_AFTER_V6) {
if (num != res.num[id]) { if (num != res.num[id]) {
@ -409,21 +407,21 @@ void Scumm::readResTypeList(int id, uint32 tag, const char *name)
if (id == rtRoom){ if (id == rtRoom){
for (i = 0; i < num; i++) for (i = 0; i < num; i++)
res.roomno[id][i] = i; res.roomno[id][i] = i;
fileSeek(_fileHandle, num, SEEK_CUR); _fileHandle.seek(num, SEEK_CUR);
} else { } else {
for (i = 0; i < num; i++) for (i = 0; i < num; i++)
res.roomno[id][i] = fileReadByte(); res.roomno[id][i] = _fileHandle.readByte();
} }
for (i = 0; i < num; i++) for (i = 0; i < num; i++)
res.roomoffs[id][i] = fileReadWordLE(); res.roomoffs[id][i] = _fileHandle.readWordLE();
} else if (_features & GF_SMALL_HEADER) { } else if (_features & GF_SMALL_HEADER) {
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
res.roomno[id][i] = fileReadByte(); res.roomno[id][i] = _fileHandle.readByte();
res.roomoffs[id][i] = fileReadDword(); res.roomoffs[id][i] = fileReadDword();
} }
} else { } else {
fileRead(_fileHandle, res.roomno[id], num * sizeof(uint8)); _fileHandle.read(res.roomno[id], num * sizeof(uint8));
fileRead(_fileHandle, res.roomoffs[id], num * sizeof(uint32)); _fileHandle.read(res.roomoffs[id], num * sizeof(uint32));
} }
#if defined(SCUMM_BIG_ENDIAN) #if defined(SCUMM_BIG_ENDIAN)
@ -541,20 +539,20 @@ int Scumm::loadResource(int type, int idx)
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
openRoom(roomNr); openRoom(roomNr);
fileSeek(_fileHandle, fileOffs + _fileOffset, SEEK_SET); _fileHandle.seek(fileOffs + _fileOffset, SEEK_SET);
if (_features & GF_OLD_BUNDLE) { if (_features & GF_OLD_BUNDLE) {
size = fileReadWordLE(); size = _fileHandle.readWordLE();
} else if (_features & GF_SMALL_HEADER) { } else if (_features & GF_SMALL_HEADER) {
if (!(_features & GF_SMALL_NAMES)) if (!(_features & GF_SMALL_NAMES))
fileSeek(_fileHandle, 8, SEEK_CUR); _fileHandle.seek(8, SEEK_CUR);
size = fileReadDwordLE(); size = _fileHandle.readDwordLE();
tag = fileReadWordLE(); tag = _fileHandle.readWordLE();
fileSeek(_fileHandle, -6, SEEK_CUR); _fileHandle.seek(-6, SEEK_CUR);
} else { } else {
if (type == rtSound) { if (type == rtSound) {
fileReadDwordLE(); _fileHandle.readDwordLE();
fileReadDwordLE(); _fileHandle.readDwordLE();
return readSoundResource(type, idx); return readSoundResource(type, idx);
} }
@ -564,10 +562,10 @@ int Scumm::loadResource(int type, int idx)
error("%s %d not in room %d at %d+%d", res.name[type], type, roomNr, _fileOffset, fileOffs); error("%s %d not in room %d at %d+%d", res.name[type], type, roomNr, _fileOffset, fileOffs);
} }
size = fileReadDwordBE(); size = _fileHandle.readDwordBE();
fileSeek(_fileHandle, -8, SEEK_CUR); _fileHandle.seek(-8, SEEK_CUR);
} }
fileRead(_fileHandle, createResource(type, idx, size), size); _fileHandle.read(createResource(type, idx, size), size);
/* dump the resource */ /* dump the resource */
#ifdef DUMP_SCRIPTS #ifdef DUMP_SCRIPTS
@ -576,7 +574,7 @@ int Scumm::loadResource(int type, int idx)
} }
#endif #endif
if (!fileReadFailed(_fileHandle)) { if (!_fileHandle.ioFailed()) {
return 1; return 1;
} }
@ -597,7 +595,7 @@ int Scumm::readSoundResource(int type, int idx)
pos = 0; pos = 0;
basetag = fileReadDword(); basetag = fileReadDword();
total_size = fileReadDwordBE(); total_size = _fileHandle.readDwordBE();
debug(8, " basetag: %c%c%c%c, total_size=%d", debug(8, " basetag: %c%c%c%c, total_size=%d",
(char)((basetag >> 24) & 0xff), (char)((basetag >> 24) & 0xff),
@ -606,14 +604,14 @@ int Scumm::readSoundResource(int type, int idx)
//if (_gameId == GID_SAMNMAX || _features & GF_AFTER_V7) { //if (_gameId == GID_SAMNMAX || _features & GF_AFTER_V7) {
if (basetag == MKID('MIDI') || basetag == MKID('iMUS')) { if (basetag == MKID('MIDI') || basetag == MKID('iMUS')) {
fileSeek(_fileHandle, -8, SEEK_CUR); _fileHandle.seek(-8, SEEK_CUR);
fileRead(_fileHandle, createResource(type, idx, total_size + 8), total_size + 8); _fileHandle.read(createResource(type, idx, total_size + 8), total_size + 8);
return 1; return 1;
} else if (basetag == MKID('SOU ')) { } else if (basetag == MKID('SOU ')) {
best_pri = -1; best_pri = -1;
while (pos < total_size) { while (pos < total_size) {
tag = fileReadDword(); tag = fileReadDword();
size = fileReadDwordBE() + 8; size = _fileHandle.readDwordBE() + 8;
pos += size; pos += size;
pri = -1; pri = -1;
@ -652,26 +650,26 @@ int Scumm::readSoundResource(int type, int idx)
if (pri > best_pri) { if (pri > best_pri) {
best_pri = pri; best_pri = pri;
best_size = size; best_size = size;
best_offs = filePos(_fileHandle); best_offs = _fileHandle.pos();
} }
fileSeek(_fileHandle, size - 8, SEEK_CUR); _fileHandle.seek(size - 8, SEEK_CUR);
} }
if (best_pri != -1) { if (best_pri != -1) {
fileSeek(_fileHandle, best_offs - 8, SEEK_SET); _fileHandle.seek(best_offs - 8, SEEK_SET);
fileRead(_fileHandle, createResource(type, idx, best_size), best_size); _fileHandle.read(createResource(type, idx, best_size), best_size);
return 1; return 1;
} }
} else if (FROM_LE_32(basetag) == 24) { } else if (FROM_LE_32(basetag) == 24) {
fileSeek(_fileHandle, -12, SEEK_CUR); _fileHandle.seek(-12, SEEK_CUR);
total_size = fileReadDwordBE(); total_size = _fileHandle.readDwordBE();
fileSeek(_fileHandle, -8, SEEK_CUR); _fileHandle.seek(-8, SEEK_CUR);
fileRead(_fileHandle, createResource(type, idx, total_size), total_size); _fileHandle.read(createResource(type, idx, total_size), total_size);
return 1; return 1;
} else if (basetag == MKID('Mac0')) { } else if (basetag == MKID('Mac0')) {
debug(1, "Found base tag Mac0 in sound %d, size %d", idx, total_size); debug(1, "Found base tag Mac0 in sound %d, size %d", idx, total_size);
debug(1, "It was at position %d", filePos(_fileHandle)); debug(1, "It was at position %d", _fileHandle.pos());
/* Offset /* Offset
0x14, 0x1C, 0x20, 0x24 - offsets of channel 1/2/3/4 chunk- 0x14, 0x1C, 0x20, 0x24 - offsets of channel 1/2/3/4 chunk-
@ -721,28 +719,28 @@ int Scumm::readSoundResource(int type, int idx)
Maybe I am mistaken when I think it's four byte, some other parts Maybe I am mistaken when I think it's four byte, some other parts
seem to suggest it's 2 byte oriented, or even variable length... seem to suggest it's 2 byte oriented, or even variable length...
*/ */
fileSeek(_fileHandle, -12, SEEK_CUR); _fileHandle.seek(-12, SEEK_CUR);
total_size = fileReadDwordBE(); total_size = _fileHandle.readDwordBE();
fileRead(_fileHandle, createResource(type, idx, total_size), total_size - 8); _fileHandle.read(createResource(type, idx, total_size), total_size - 8);
return 1; return 1;
} else if (basetag == MKID('Mac1')) { } else if (basetag == MKID('Mac1')) {
fileSeek(_fileHandle, -12, SEEK_CUR); _fileHandle.seek(-12, SEEK_CUR);
total_size = fileReadDwordBE(); total_size = _fileHandle.readDwordBE();
fileRead(_fileHandle, createResource(type, idx, total_size), total_size - 8); _fileHandle.read(createResource(type, idx, total_size), total_size - 8);
return 1; return 1;
} else if (basetag == MKID('DIGI')) { } else if (basetag == MKID('DIGI')) {
// Use in Putt-Putt Demo // Use in Putt-Putt Demo
debug(1, "Found base tag DIGI in sound %d, size %d", idx, total_size); debug(1, "Found base tag DIGI in sound %d, size %d", idx, total_size);
debug(1, "It was at position %d", filePos(_fileHandle)); debug(1, "It was at position %d", _fileHandle.pos());
fileSeek(_fileHandle, -12, SEEK_CUR); _fileHandle.seek(-12, SEEK_CUR);
total_size = fileReadDwordBE(); total_size = _fileHandle.readDwordBE();
fileRead(_fileHandle, createResource(type, idx, total_size), total_size - 8); _fileHandle.read(createResource(type, idx, total_size), total_size - 8);
return 1; return 1;
} else if (basetag == MKID('Crea')) { } else if (basetag == MKID('Crea')) {
fileSeek(_fileHandle, -12, SEEK_CUR); _fileHandle.seek(-12, SEEK_CUR);
total_size = fileReadDwordBE(); total_size = _fileHandle.readDwordBE();
fileRead(_fileHandle, createResource(type, idx, total_size), total_size - 8); _fileHandle.read(createResource(type, idx, total_size), total_size - 8);
return 1; return 1;
} else { } else {
fprintf(stderr, "WARNING: Unrecognized base tag 0x%08lx in sound %d\n", basetag, idx); fprintf(stderr, "WARNING: Unrecognized base tag 0x%08lx in sound %d\n", basetag, idx);
@ -1187,67 +1185,67 @@ void Scumm::unkHeapProc2(int a, int b)
void Scumm::readMAXS() void Scumm::readMAXS()
{ {
if (_features & GF_AFTER_V8) { if (_features & GF_AFTER_V8) {
fileSeek(_fileHandle, 50 + 50, SEEK_CUR); _fileHandle.seek(50 + 50, SEEK_CUR);
_numVariables = fileReadDwordLE(); /* ? 1500 */ _numVariables = _fileHandle.readDwordLE(); /* ? 1500 */
_numBitVariables = fileReadDwordLE(); /* ? 2048 */ _numBitVariables = _fileHandle.readDwordLE(); /* ? 2048 */
fileReadDwordLE(); /* 40 */ _fileHandle.readDwordLE(); /* 40 */
_numScripts = fileReadDwordLE(); _numScripts = _fileHandle.readDwordLE();
_numSounds = fileReadDwordLE(); _numSounds = _fileHandle.readDwordLE();
_numCharsets = fileReadDwordLE(); _numCharsets = _fileHandle.readDwordLE();
_numCostumes = fileReadDwordLE(); _numCostumes = _fileHandle.readDwordLE();
_numRooms = fileReadDwordLE(); _numRooms = _fileHandle.readDwordLE();
_numInventory = fileReadDwordLE(); _numInventory = _fileHandle.readDwordLE();
_numGlobalObjects = fileReadDwordLE(); _numGlobalObjects = _fileHandle.readDwordLE();
_numFlObject = fileReadDwordLE(); _numFlObject = _fileHandle.readDwordLE();
_numLocalObjects = fileReadDwordLE(); _numLocalObjects = _fileHandle.readDwordLE();
_numVerbs = fileReadDwordLE(); _numVerbs = _fileHandle.readDwordLE();
_numNewNames = fileReadDwordLE(); _numNewNames = _fileHandle.readDwordLE();
fileReadDwordLE(); _fileHandle.readDwordLE();
fileReadDwordLE(); _fileHandle.readDwordLE();
_numArray = fileReadDwordLE(); _numArray = _fileHandle.readDwordLE();
_objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1);
_numGlobalScripts = 2000; _numGlobalScripts = 2000;
_shadowPaletteSize = NUM_SHADOW_PALETTE * 256; _shadowPaletteSize = NUM_SHADOW_PALETTE * 256;
} else if (_features & GF_AFTER_V7) { } else if (_features & GF_AFTER_V7) {
fileSeek(_fileHandle, 50 + 50, SEEK_CUR); _fileHandle.seek(50 + 50, SEEK_CUR);
_numVariables = fileReadWordLE(); _numVariables = _fileHandle.readWordLE();
_numBitVariables = fileReadWordLE(); _numBitVariables = _fileHandle.readWordLE();
fileReadWordLE(); _fileHandle.readWordLE();
_numGlobalObjects = fileReadWordLE(); _numGlobalObjects = _fileHandle.readWordLE();
_numLocalObjects = fileReadWordLE(); _numLocalObjects = _fileHandle.readWordLE();
_numNewNames = fileReadWordLE(); _numNewNames = _fileHandle.readWordLE();
_numVerbs = fileReadWordLE(); _numVerbs = _fileHandle.readWordLE();
_numFlObject = fileReadWordLE(); _numFlObject = _fileHandle.readWordLE();
_numInventory = fileReadWordLE(); _numInventory = _fileHandle.readWordLE();
_numArray = fileReadWordLE(); _numArray = _fileHandle.readWordLE();
_numRooms = fileReadWordLE(); _numRooms = _fileHandle.readWordLE();
_numScripts = fileReadWordLE(); _numScripts = _fileHandle.readWordLE();
_numSounds = fileReadWordLE(); _numSounds = _fileHandle.readWordLE();
_numCharsets = fileReadWordLE(); _numCharsets = _fileHandle.readWordLE();
_numCostumes = fileReadWordLE(); _numCostumes = _fileHandle.readWordLE();
_objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1);
_numGlobalScripts = 2000; _numGlobalScripts = 2000;
_shadowPaletteSize = NUM_SHADOW_PALETTE * 256; _shadowPaletteSize = NUM_SHADOW_PALETTE * 256;
} else if (_features & GF_AFTER_V6) { } else if (_features & GF_AFTER_V6) {
_numVariables = fileReadWordLE(); _numVariables = _fileHandle.readWordLE();
fileReadWordLE(); _fileHandle.readWordLE();
_numBitVariables = fileReadWordLE(); _numBitVariables = _fileHandle.readWordLE();
_numLocalObjects = fileReadWordLE(); _numLocalObjects = _fileHandle.readWordLE();
_numArray = fileReadWordLE(); _numArray = _fileHandle.readWordLE();
fileReadWordLE(); _fileHandle.readWordLE();
_numVerbs = fileReadWordLE(); _numVerbs = _fileHandle.readWordLE();
_numFlObject = fileReadWordLE(); _numFlObject = _fileHandle.readWordLE();
_numInventory = fileReadWordLE(); _numInventory = _fileHandle.readWordLE();
_numRooms = fileReadWordLE(); _numRooms = _fileHandle.readWordLE();
_numScripts = fileReadWordLE(); _numScripts = _fileHandle.readWordLE();
_numSounds = fileReadWordLE(); _numSounds = _fileHandle.readWordLE();
_numCharsets = fileReadWordLE(); _numCharsets = _fileHandle.readWordLE();
_numCostumes = fileReadWordLE(); _numCostumes = _fileHandle.readWordLE();
_numGlobalObjects = fileReadWordLE(); _numGlobalObjects = _fileHandle.readWordLE();
_numNewNames = 50; _numNewNames = 50;
_objectRoomTable = NULL; _objectRoomTable = NULL;
@ -1255,20 +1253,20 @@ void Scumm::readMAXS()
_shadowPaletteSize = 256; _shadowPaletteSize = 256;
} else { } else {
_numVariables = fileReadWordLE(); /* 800 */ _numVariables = _fileHandle.readWordLE(); /* 800 */
fileReadWordLE(); /* 16 */ _fileHandle.readWordLE(); /* 16 */
_numBitVariables = fileReadWordLE(); /* 2048 */ _numBitVariables = _fileHandle.readWordLE(); /* 2048 */
_numLocalObjects = fileReadWordLE(); /* 200 */ _numLocalObjects = _fileHandle.readWordLE(); /* 200 */
_numArray = 50; _numArray = 50;
_numVerbs = 100; _numVerbs = 100;
_numNewNames = 0; _numNewNames = 0;
_objectRoomTable = NULL; _objectRoomTable = NULL;
fileReadWordLE(); /* 50 */ _fileHandle.readWordLE(); /* 50 */
_numCharsets = fileReadWordLE(); /* 9 */ _numCharsets = _fileHandle.readWordLE(); /* 9 */
fileReadWordLE(); /* 100 */ _fileHandle.readWordLE(); /* 100 */
fileReadWordLE(); /* 50 */ _fileHandle.readWordLE(); /* 50 */
_numInventory = fileReadWordLE(); /* 80 */ _numInventory = _fileHandle.readWordLE(); /* 80 */
_numGlobalScripts = 200; _numGlobalScripts = 200;
_shadowPaletteSize = 256; _shadowPaletteSize = 256;

View file

@ -30,21 +30,21 @@ void Scumm_v2::readIndexFile()
openRoom(-1); openRoom(-1);
openRoom(0); openRoom(0);
if (fileReadWordLE() != 0x0100) if (_fileHandle.readWordLE() != 0x0100)
warning("The magic id doesn't match\n"); warning("The magic id doesn't match\n");
_numGlobalObjects = fileReadWordLE(); _numGlobalObjects = _fileHandle.readWordLE();
fileSeek(_fileHandle, _numGlobalObjects, SEEK_CUR); // Skip object flags _fileHandle.seek(_numGlobalObjects, SEEK_CUR); // Skip object flags
_numRooms = fileReadByte(); _numRooms = _fileHandle.readByte();
fileSeek(_fileHandle, _numRooms * 3, SEEK_CUR); _fileHandle.seek(_numRooms * 3, SEEK_CUR);
_numCostumes = fileReadByte(); _numCostumes = _fileHandle.readByte();
fileSeek(_fileHandle, _numCostumes * 3, SEEK_CUR); _fileHandle.seek(_numCostumes * 3, SEEK_CUR);
_numScripts = fileReadByte(); _numScripts = _fileHandle.readByte();
fileSeek(_fileHandle, _numScripts * 3, SEEK_CUR); _fileHandle.seek(_numScripts * 3, SEEK_CUR);
_numSounds = fileReadByte(); _numSounds = _fileHandle.readByte();
clearFileReadFailed(_fileHandle); _fileHandle.clearIOFailed();
fileSeek(_fileHandle, 0, SEEK_SET); _fileHandle.seek(0, SEEK_SET);
// FIXME - I'm not sure for those values yet, they will have to be rechecked // FIXME - I'm not sure for those values yet, they will have to be rechecked
@ -64,9 +64,9 @@ void Scumm_v2::readIndexFile()
_numFlObject = 50; _numFlObject = 50;
allocateArrays(); allocateArrays();
fileReadWordLE(); /* version magic number */ _fileHandle.readWordLE(); /* version magic number */
fileReadWordLE(); /* nb global objects */ _fileHandle.readWordLE(); /* nb global objects */
fileSeek(_fileHandle, _numGlobalObjects, SEEK_CUR); // Skip object flags _fileHandle.seek(_numGlobalObjects, SEEK_CUR); // Skip object flags
readResTypeList(rtRoom, MKID('ROOM'), "room"); readResTypeList(rtRoom, MKID('ROOM'), "room");
readResTypeList(rtCostume, MKID('COST'), "costume"); readResTypeList(rtCostume, MKID('COST'), "costume");
readResTypeList(rtScript, MKID('SCRP'), "script"); readResTypeList(rtScript, MKID('SCRP'), "script");

View file

@ -37,37 +37,37 @@ void Scumm_v3::readIndexFile()
openRoom(-1); openRoom(-1);
openRoom(0); openRoom(0);
while (!fileEof(_fileHandle)) { while (!_fileHandle.eof()) {
itemsize = fileReadDwordLE(); itemsize = _fileHandle.readDwordLE();
blocktype = fileReadWordLE(); blocktype = _fileHandle.readWordLE();
if (fileReadFailed(_fileHandle)) if (_fileHandle.ioFailed())
break; break;
switch (blocktype) { switch (blocktype) {
case 0x4E52: // 'NR' case 0x4E52: // 'NR'
fileReadWordLE(); _fileHandle.readWordLE();
break; break;
case 0x5230: // 'R0' case 0x5230: // 'R0'
_numRooms = fileReadWordLE(); _numRooms = _fileHandle.readWordLE();
break; break;
case 0x5330: // 'S0' case 0x5330: // 'S0'
_numScripts = fileReadWordLE(); _numScripts = _fileHandle.readWordLE();
break; break;
case 0x4E30: // 'N0' case 0x4E30: // 'N0'
_numSounds = fileReadWordLE(); _numSounds = _fileHandle.readWordLE();
break; break;
case 0x4330: // 'C0' case 0x4330: // 'C0'
_numCostumes = fileReadWordLE(); _numCostumes = _fileHandle.readWordLE();
break; break;
case 0x4F30: // 'O0' case 0x4F30: // 'O0'
_numGlobalObjects = fileReadWordLE(); _numGlobalObjects = _fileHandle.readWordLE();
break; break;
} }
fileSeek(_fileHandle, itemsize - 8, SEEK_CUR); _fileHandle.seek(itemsize - 8, SEEK_CUR);
} }
clearFileReadFailed(_fileHandle); _fileHandle.clearIOFailed();
fileSeek(_fileHandle, 0, SEEK_SET); _fileHandle.seek(0, SEEK_SET);
/* I'm not sure for those values yet, they will have to be rechecked */ /* I'm not sure for those values yet, they will have to be rechecked */
@ -88,19 +88,19 @@ void Scumm_v3::readIndexFile()
allocateArrays(); allocateArrays();
while (1) { while (1) {
itemsize = fileReadDwordLE(); itemsize = _fileHandle.readDwordLE();
if (fileReadFailed(_fileHandle)) if (_fileHandle.ioFailed())
break; break;
blocktype = fileReadWordLE(); blocktype = _fileHandle.readWordLE();
numblock++; numblock++;
switch (blocktype) { switch (blocktype) {
case 0x4E52: // 'NR' case 0x4E52: // 'NR'
fileSeek(_fileHandle, itemsize - 6, SEEK_CUR); _fileHandle.seek(itemsize - 6, SEEK_CUR);
break; break;
case 0x5230: // 'R0' case 0x5230: // 'R0'
@ -120,15 +120,15 @@ void Scumm_v3::readIndexFile()
break; break;
case 0x4F30: // 'O0' case 0x4F30: // 'O0'
num = fileReadWordLE(); num = _fileHandle.readWordLE();
assert(num == _numGlobalObjects); assert(num == _numGlobalObjects);
for (i = 0; i != num; i++) { for (i = 0; i != num; i++) {
uint32 bits = fileReadByte(); uint32 bits = _fileHandle.readByte();
byte tmp; byte tmp;
bits |= fileReadByte() << 8; bits |= _fileHandle.readByte() << 8;
bits |= fileReadByte() << 16; bits |= _fileHandle.readByte() << 16;
_classData[i] = bits; _classData[i] = bits;
tmp = fileReadByte(); tmp = _fileHandle.readByte();
_objectOwnerTable[i] = tmp & OF_OWNER_MASK; _objectOwnerTable[i] = tmp & OF_OWNER_MASK;
_objectStateTable[i] = tmp >> OF_STATE_SHL; _objectStateTable[i] = tmp >> OF_STATE_SHL;
} }
@ -154,8 +154,8 @@ void Scumm_v3::loadCharset(int no)
openRoom(98 + no); openRoom(98 + no);
size = fileReadWordLE(); size = _fileHandle.readWordLE();
fileRead(_fileHandle, createResource(6, no, size), size); _fileHandle.read(createResource(6, no, size), size);
openRoom(-1); openRoom(-1);
} }

View file

@ -33,8 +33,8 @@ void Scumm_v4::loadCharset(int no)
openRoom(900 + no); openRoom(900 + no);
size = fileReadDwordLE() + 11; size = _fileHandle.readDwordLE() + 11;
fileRead(_fileHandle, createResource(6, no, size), size); _fileHandle.read(createResource(6, no, size), size);
openRoom(-1); openRoom(-1);
} }

View file

@ -554,7 +554,7 @@ public:
/* Should be in Resource class */ /* Should be in Resource class */
byte _encbyte; byte _encbyte;
void *_fileHandle; File _fileHandle;
char *_resFilePrefix, *_resFilePath; char *_resFilePrefix, *_resFilePath;
uint32 _fileOffset; uint32 _fileOffset;
char *_exe_name; char *_exe_name;
@ -597,9 +597,6 @@ public:
virtual void loadCharset(int i); virtual void loadCharset(int i);
void nukeCharset(int i); void nukeCharset(int i);
bool fileReadFailed(void *handle);
void clearFileReadFailed(void *handle);
int _lastLoadedRoom, _roomResource; int _lastLoadedRoom, _roomResource;
byte _resFilePathId, _fileReadFailed; byte _resFilePathId, _fileReadFailed;
byte *findResourceData(uint32 tag, byte *ptr); byte *findResourceData(uint32 tag, byte *ptr);
@ -933,34 +930,14 @@ public:
bool _keepText; bool _keepText;
/* Should be in System class */
void fileClose(void *file);
void *fileOpen(const char *filename, int mode);
void fileSeek(void *file, long offs, int whence);
void fileRead(void *handle, void *ptr, uint32 size);
bool fileEof(void *handle);
uint32 filePos(void *handle);
bool checkFixedDisk(); bool checkFixedDisk();
int _cdrom; int _cdrom;
int fileReadByte();
uint32 fileReadDwordLE();
uint32 fileReadDwordBE();
int fileReadByte(void *handle);
uint32 fileReadDwordLE(void *handle);
uint32 fileReadDwordBE(void *handle);
#if defined(SCUMM_LITTLE_ENDIAN) #if defined(SCUMM_LITTLE_ENDIAN)
uint32 fileReadDword() { return fileReadDwordLE(); } uint32 fileReadDword() { return _fileHandle.readDwordLE(); }
uint32 fileReadDword(void *handle) { return fileReadDwordLE(handle); }
#elif defined(SCUMM_BIG_ENDIAN) #elif defined(SCUMM_BIG_ENDIAN)
uint32 fileReadDword() { return fileReadDwordBE(); } uint32 fileReadDword() { return _fileHandle.readDwordBE(); }
uint32 fileReadDword(void *handle) { return fileReadDwordBE(handle); }
#endif #endif
uint fileReadWordLE();
uint fileReadWordBE();
uint fileReadWordLE(void *handle);
uint fileReadWordBE(void *handle);
/* Version 5 script opcodes */ /* Version 5 script opcodes */
void o5_actorFollowCamera(); void o5_actorFollowCamera();

View file

@ -853,7 +853,7 @@ void Scumm::setScaleItem(int slot, int a, int b, int c, int d)
void Scumm::dumpResource(char *tag, int idx, byte *ptr) void Scumm::dumpResource(char *tag, int idx, byte *ptr)
{ {
char buf[256]; char buf[256];
FILE *out; File out;
uint32 size; uint32 size;
if (_features & GF_SMALL_HEADER) if (_features & GF_SMALL_HEADER)
@ -867,14 +867,14 @@ void Scumm::dumpResource(char *tag, int idx, byte *ptr)
sprintf(buf, "dumps/%s%d.dmp", tag, idx); sprintf(buf, "dumps/%s%d.dmp", tag, idx);
#endif #endif
out = fopen(buf, "rb"); out.open(buf, 1);
if (!out) { if (out.isOpen() == false) {
out = fopen(buf, "wb"); out.open(buf, 2);
if (!out) if (out.isOpen() == false)
return; return;
fwrite(ptr, size, 1, out); out.write(ptr, size);
} }
fclose(out); out.close();
} }
@ -1463,7 +1463,6 @@ void Scumm::launch()
{ {
charset._vm = this; charset._vm = this;
gdi._vm = this; gdi._vm = this;
_fileHandle = NULL;
_maxHeapThreshold = 450000; _maxHeapThreshold = 450000;
_minHeapThreshold = 400000; _minHeapThreshold = 400000;

View file

@ -23,145 +23,6 @@
#include "stdafx.h" #include "stdafx.h"
#include "scumm.h" #include "scumm.h"
void *Scumm::fileOpen(const char *filename, int mode)
{
clearFileReadFailed(_fileHandle);
if (mode == 1)
return fopen(filename, "rb");
error("This should not happen!");
return NULL;
}
void Scumm::fileClose(void *file)
{
if (file)
fclose((FILE *)file);
}
bool Scumm::fileReadFailed(void *file)
{
return _fileReadFailed != 0;
}
void Scumm::clearFileReadFailed(void *file)
{
_fileReadFailed = false;
}
bool Scumm::fileEof(void *file)
{
return feof((FILE *)file) != 0;
}
uint32 Scumm::filePos(void *handle)
{
return ftell((FILE *)handle);
}
void Scumm::fileSeek(void *file, long offs, int whence)
{
if (fseek((FILE *)file, offs, whence) != 0)
clearerr((FILE *)file);
}
void Scumm::fileRead(void *file, void *ptr, uint32 size)
{
byte *ptr2 = (byte *)ptr;
if (size == 0)
return;
if ((uint32)fread(ptr2, size, 1, (FILE *)file) != 1) {
clearerr((FILE *)file);
_fileReadFailed = true;
}
do {
*ptr2++ ^= _encbyte;
} while (--size);
}
int Scumm::fileReadByte()
{
byte b;
if (fread(&b, 1, 1, (FILE *)_fileHandle) != 1) {
clearerr((FILE *)_fileHandle);
_fileReadFailed = true;
}
return b ^ _encbyte;
}
uint Scumm::fileReadWordLE()
{
uint a = fileReadByte();
uint b = fileReadByte();
return a | (b << 8);
}
uint32 Scumm::fileReadDwordLE()
{
uint a = fileReadWordLE();
uint b = fileReadWordLE();
return (b << 16) | a;
}
uint Scumm::fileReadWordBE()
{
uint b = fileReadByte();
uint a = fileReadByte();
return a | (b << 8);
}
uint32 Scumm::fileReadDwordBE()
{
uint b = fileReadWordBE();
uint a = fileReadWordBE();
return (b << 16) | a;
}
/* Overloaded versions */
int Scumm::fileReadByte(void *handle)
{
byte b;
if (fread(&b, 1, 1, (FILE *)handle) != 1) {
clearerr((FILE *)handle);
_fileReadFailed = true;
}
return b ^ _encbyte;
}
uint Scumm::fileReadWordLE(void *handle)
{
uint a = fileReadByte(handle);
uint b = fileReadByte(handle);
return a | (b << 8);
}
uint32 Scumm::fileReadDwordLE(void *handle)
{
uint a = fileReadWordLE(handle);
uint b = fileReadWordLE(handle);
return (b << 16) | a;
}
uint Scumm::fileReadWordBE(void *handle)
{
uint b = fileReadByte(handle);
uint a = fileReadByte(handle);
return a | (b << 8);
}
uint32 Scumm::fileReadDwordBE(void *handle)
{
uint b = fileReadWordBE(handle);
uint a = fileReadWordBE(handle);
return (b << 16) | a;
}
bool Scumm::checkFixedDisk() bool Scumm::checkFixedDisk()
{ {
return true; return true;