diff options
Diffstat (limited to 'scumm')
-rw-r--r-- | scumm/resource.cpp | 298 | ||||
-rw-r--r-- | scumm/resource_v2.cpp | 30 | ||||
-rw-r--r-- | scumm/resource_v3.cpp | 48 | ||||
-rw-r--r-- | scumm/resource_v4.cpp | 4 | ||||
-rw-r--r-- | scumm/scumm.h | 29 | ||||
-rw-r--r-- | scumm/scummvm.cpp | 15 | ||||
-rw-r--r-- | scumm/sys.cpp | 139 |
7 files changed, 199 insertions, 364 deletions
diff --git a/scumm/resource.cpp b/scumm/resource.cpp index 8c4399722b..1792e90121 100644 --- a/scumm/resource.cpp +++ b/scumm/resource.cpp @@ -48,8 +48,7 @@ void Scumm::openRoom(int room) if (room == -1) { _encbyte = 0; deleteRoomOffsets(); - fileClose(_fileHandle); - _fileHandle = NULL; + _fileHandle.close(); return; } @@ -158,20 +157,20 @@ void Scumm::readRoomsOffsets() if (!_dynamicRoomOffsets) return; - fileSeek(_fileHandle, 16, SEEK_SET); + _fileHandle.seek(16, SEEK_SET); } 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) { num--; - room = fileReadByte(); + room = _fileHandle.readByte(); if (_roomFileOffsets[room] != 0xFFFFFFFF) { - _roomFileOffsets[room] = fileReadDwordLE(); + _roomFileOffsets[room] = _fileHandle.readDwordLE(); } else { - fileReadDwordLE(); + _fileHandle.readDwordLE(); } } } @@ -182,34 +181,33 @@ bool Scumm::openResourceFile(const char *filename) debug(9, "openResourceFile(%s)", filename); - if (_fileHandle != NULL) { - fileClose(_fileHandle); - _fileHandle = NULL; + if (_fileHandle.isOpen() == true) { + _fileHandle.close(); } strcpy(buf, filename); - _fileHandle = fileOpen(buf, 1); - if (!_fileHandle) { + _fileHandle.open(buf, 1, _encbyte); + if (_fileHandle.isOpen() == false) { char *e = strrchr(buf, '/'); if (!e) e = buf; do *e = tolower(*e); while (*e++); - _fileHandle = fileOpen(buf, 1); + _fileHandle.open(buf, 1, _encbyte); } - if (!_fileHandle) { + if (_fileHandle.isOpen() == false) { char *e = strrchr(buf, '/'); if (!e) e = buf; do *e = toupper(*e); while (*e++); - _fileHandle = fileOpen(buf, 1); + _fileHandle.open(buf, 1, _encbyte); } - return _fileHandle != NULL; + return _fileHandle.isOpen(); } void Scumm::askForDisk(const char *filename) @@ -230,48 +228,48 @@ void Scumm::readIndexFile() if (!(_features & GF_AFTER_V6)) { /* Figure out the sizes of various resources */ - while (!fileEof(_fileHandle)) { + while (!_fileHandle.eof()) { blocktype = fileReadDword(); - itemsize = fileReadDwordBE(); - if (fileReadFailed(_fileHandle)) + itemsize = _fileHandle.readDwordBE(); + if (_fileHandle.ioFailed()) break; switch (blocktype) { case MKID('DOBJ'): - _numGlobalObjects = fileReadWordLE(); + _numGlobalObjects = _fileHandle.readWordLE(); itemsize -= 2; break; case MKID('DROO'): - _numRooms = fileReadWordLE(); + _numRooms = _fileHandle.readWordLE(); itemsize -= 2; break; case MKID('DSCR'): - _numScripts = fileReadWordLE(); + _numScripts = _fileHandle.readWordLE(); itemsize -= 2; break; case MKID('DCOS'): - _numCostumes = fileReadWordLE(); + _numCostumes = _fileHandle.readWordLE(); itemsize -= 2; break; case MKID('DSOU'): - _numSounds = fileReadWordLE(); + _numSounds = _fileHandle.readWordLE(); itemsize -= 2; break; } - fileSeek(_fileHandle, itemsize - 8, SEEK_CUR); + _fileHandle.seek(itemsize - 8, SEEK_CUR); } - clearFileReadFailed(_fileHandle); - fileSeek(_fileHandle, 0, SEEK_SET); + _fileHandle.clearIOFailed(); + _fileHandle.seek(0, SEEK_SET); } while (1) { blocktype = fileReadDword(); - if (fileReadFailed(_fileHandle)) + if (_fileHandle.ioFailed()) break; - itemsize = fileReadDwordBE(); + itemsize = _fileHandle.readDwordBE(); numblock++; @@ -282,25 +280,25 @@ void Scumm::readIndexFile() case MKID('DOBJ'): if (_features & GF_AFTER_V8) - num = fileReadDwordLE(); + num = _fileHandle.readDwordLE(); else - num = fileReadWordLE(); + num = _fileHandle.readWordLE(); assert(num == _numGlobalObjects); if (_features & GF_AFTER_V8) { /* FIXME: Not sure.. */ for (i = 0; i < num; i++) { - fileSeek(_fileHandle, 40, SEEK_CUR); - _objectStateTable[i] = fileReadByte(); - _objectRoomTable[i] = fileReadByte(); - _classData[i] = fileReadDwordLE(); + _fileHandle.seek(40, SEEK_CUR); + _objectStateTable[i] = _fileHandle.readByte(); + _objectRoomTable[i] = _fileHandle.readByte(); + _classData[i] = _fileHandle.readDwordLE(); } memset(_objectOwnerTable, 0xFF, num); } else if (_features & GF_AFTER_V7) { - fileRead(_fileHandle, _objectStateTable, num); - fileRead(_fileHandle, _objectRoomTable, num); + _fileHandle.read(_objectStateTable, num); + _fileHandle.read(_objectRoomTable, num); memset(_objectOwnerTable, 0xFF, num); } else { - fileRead(_fileHandle, _objectOwnerTable, num); + _fileHandle.read(_objectOwnerTable, num); for (i = 0; i < num; i++) { _objectStateTable[i] = _objectOwnerTable[i] >> OF_STATE_SHL; _objectOwnerTable[i] &= OF_OWNER_MASK; @@ -308,7 +306,7 @@ void Scumm::readIndexFile() } if (!(_features & GF_AFTER_V8)) { - fileRead(_fileHandle, _classData, num * sizeof(uint32)); + _fileHandle.read(_classData, num * sizeof(uint32)); // Swap flag endian where applicable #if defined(SCUMM_BIG_ENDIAN) @@ -320,7 +318,7 @@ void Scumm::readIndexFile() case MKID('RNAM'): case MKID('ANAM'): - fileSeek(_fileHandle, itemsize - 8, SEEK_CUR); + _fileHandle.seek(itemsize - 8, SEEK_CUR); break; case MKID('DROO'): @@ -369,10 +367,10 @@ void Scumm::readArrayFromIndexFile() int num; int a, b, c; - while ((num = fileReadWordLE()) != 0) { - a = fileReadWordLE(); - b = fileReadWordLE(); - c = fileReadWordLE(); + while ((num = _fileHandle.readWordLE()) != 0) { + a = _fileHandle.readWordLE(); + b = _fileHandle.readWordLE(); + c = _fileHandle.readWordLE(); if (c == 1) defineArray(num, 1, a, b); 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); if (_features & GF_AFTER_V8) - num = fileReadDwordLE(); + num = _fileHandle.readDwordLE(); else if (!(_features & GF_OLD_BUNDLE)) - num = fileReadWordLE(); + num = _fileHandle.readWordLE(); else - num = fileReadByte(); + num = _fileHandle.readByte(); if (1 || _features & GF_AFTER_V6) { if (num != res.num[id]) { @@ -409,21 +407,21 @@ void Scumm::readResTypeList(int id, uint32 tag, const char *name) if (id == rtRoom){ for (i = 0; i < num; i++) res.roomno[id][i] = i; - fileSeek(_fileHandle, num, SEEK_CUR); + _fileHandle.seek(num, SEEK_CUR); } else { for (i = 0; i < num; i++) - res.roomno[id][i] = fileReadByte(); + res.roomno[id][i] = _fileHandle.readByte(); } for (i = 0; i < num; i++) - res.roomoffs[id][i] = fileReadWordLE(); + res.roomoffs[id][i] = _fileHandle.readWordLE(); } else if (_features & GF_SMALL_HEADER) { for (i = 0; i < num; i++) { - res.roomno[id][i] = fileReadByte(); + res.roomno[id][i] = _fileHandle.readByte(); res.roomoffs[id][i] = fileReadDword(); } } else { - fileRead(_fileHandle, res.roomno[id], num * sizeof(uint8)); - fileRead(_fileHandle, res.roomoffs[id], num * sizeof(uint32)); + _fileHandle.read(res.roomno[id], num * sizeof(uint8)); + _fileHandle.read(res.roomoffs[id], num * sizeof(uint32)); } #if defined(SCUMM_BIG_ENDIAN) @@ -541,20 +539,20 @@ int Scumm::loadResource(int type, int idx) for (i = 0; i < 5; i++) { openRoom(roomNr); - fileSeek(_fileHandle, fileOffs + _fileOffset, SEEK_SET); + _fileHandle.seek(fileOffs + _fileOffset, SEEK_SET); if (_features & GF_OLD_BUNDLE) { - size = fileReadWordLE(); + size = _fileHandle.readWordLE(); } else if (_features & GF_SMALL_HEADER) { if (!(_features & GF_SMALL_NAMES)) - fileSeek(_fileHandle, 8, SEEK_CUR); - size = fileReadDwordLE(); - tag = fileReadWordLE(); - fileSeek(_fileHandle, -6, SEEK_CUR); + _fileHandle.seek(8, SEEK_CUR); + size = _fileHandle.readDwordLE(); + tag = _fileHandle.readWordLE(); + _fileHandle.seek(-6, SEEK_CUR); } else { if (type == rtSound) { - fileReadDwordLE(); - fileReadDwordLE(); + _fileHandle.readDwordLE(); + _fileHandle.readDwordLE(); 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); } - size = fileReadDwordBE(); - fileSeek(_fileHandle, -8, SEEK_CUR); + size = _fileHandle.readDwordBE(); + _fileHandle.seek(-8, SEEK_CUR); } - fileRead(_fileHandle, createResource(type, idx, size), size); + _fileHandle.read(createResource(type, idx, size), size); /* dump the resource */ #ifdef DUMP_SCRIPTS @@ -576,7 +574,7 @@ int Scumm::loadResource(int type, int idx) } #endif - if (!fileReadFailed(_fileHandle)) { + if (!_fileHandle.ioFailed()) { return 1; } @@ -597,7 +595,7 @@ int Scumm::readSoundResource(int type, int idx) pos = 0; basetag = fileReadDword(); - total_size = fileReadDwordBE(); + total_size = _fileHandle.readDwordBE(); debug(8, " basetag: %c%c%c%c, total_size=%d", (char)((basetag >> 24) & 0xff), @@ -606,14 +604,14 @@ int Scumm::readSoundResource(int type, int idx) //if (_gameId == GID_SAMNMAX || _features & GF_AFTER_V7) { if (basetag == MKID('MIDI') || basetag == MKID('iMUS')) { - fileSeek(_fileHandle, -8, SEEK_CUR); - fileRead(_fileHandle, createResource(type, idx, total_size + 8), total_size + 8); + _fileHandle.seek(-8, SEEK_CUR); + _fileHandle.read(createResource(type, idx, total_size + 8), total_size + 8); return 1; } else if (basetag == MKID('SOU ')) { best_pri = -1; while (pos < total_size) { tag = fileReadDword(); - size = fileReadDwordBE() + 8; + size = _fileHandle.readDwordBE() + 8; pos += size; pri = -1; @@ -652,26 +650,26 @@ int Scumm::readSoundResource(int type, int idx) if (pri > best_pri) { best_pri = pri; 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) { - fileSeek(_fileHandle, best_offs - 8, SEEK_SET); - fileRead(_fileHandle, createResource(type, idx, best_size), best_size); + _fileHandle.seek(best_offs - 8, SEEK_SET); + _fileHandle.read(createResource(type, idx, best_size), best_size); return 1; } } else if (FROM_LE_32(basetag) == 24) { - fileSeek(_fileHandle, -12, SEEK_CUR); - total_size = fileReadDwordBE(); - fileSeek(_fileHandle, -8, SEEK_CUR); - fileRead(_fileHandle, createResource(type, idx, total_size), total_size); + _fileHandle.seek(-12, SEEK_CUR); + total_size = _fileHandle.readDwordBE(); + _fileHandle.seek(-8, SEEK_CUR); + _fileHandle.read(createResource(type, idx, total_size), total_size); return 1; } else if (basetag == MKID('Mac0')) { 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 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 seem to suggest it's 2 byte oriented, or even variable length... */ - fileSeek(_fileHandle, -12, SEEK_CUR); - total_size = fileReadDwordBE(); - fileRead(_fileHandle, createResource(type, idx, total_size), total_size - 8); + _fileHandle.seek(-12, SEEK_CUR); + total_size = _fileHandle.readDwordBE(); + _fileHandle.read(createResource(type, idx, total_size), total_size - 8); return 1; } else if (basetag == MKID('Mac1')) { - fileSeek(_fileHandle, -12, SEEK_CUR); - total_size = fileReadDwordBE(); - fileRead(_fileHandle, createResource(type, idx, total_size), total_size - 8); + _fileHandle.seek(-12, SEEK_CUR); + total_size = _fileHandle.readDwordBE(); + _fileHandle.read(createResource(type, idx, total_size), total_size - 8); return 1; } else if (basetag == MKID('DIGI')) { // Use in Putt-Putt Demo 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); - total_size = fileReadDwordBE(); - fileRead(_fileHandle, createResource(type, idx, total_size), total_size - 8); + _fileHandle.seek(-12, SEEK_CUR); + total_size = _fileHandle.readDwordBE(); + _fileHandle.read(createResource(type, idx, total_size), total_size - 8); return 1; } else if (basetag == MKID('Crea')) { - fileSeek(_fileHandle, -12, SEEK_CUR); - total_size = fileReadDwordBE(); - fileRead(_fileHandle, createResource(type, idx, total_size), total_size - 8); + _fileHandle.seek(-12, SEEK_CUR); + total_size = _fileHandle.readDwordBE(); + _fileHandle.read(createResource(type, idx, total_size), total_size - 8); return 1; } else { 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() { if (_features & GF_AFTER_V8) { - fileSeek(_fileHandle, 50 + 50, SEEK_CUR); - _numVariables = fileReadDwordLE(); /* ? 1500 */ - _numBitVariables = fileReadDwordLE(); /* ? 2048 */ - fileReadDwordLE(); /* 40 */ - _numScripts = fileReadDwordLE(); - _numSounds = fileReadDwordLE(); - _numCharsets = fileReadDwordLE(); - _numCostumes = fileReadDwordLE(); - _numRooms = fileReadDwordLE(); - _numInventory = fileReadDwordLE(); - _numGlobalObjects = fileReadDwordLE(); - _numFlObject = fileReadDwordLE(); - _numLocalObjects = fileReadDwordLE(); - _numVerbs = fileReadDwordLE(); - _numNewNames = fileReadDwordLE(); - fileReadDwordLE(); - fileReadDwordLE(); - _numArray = fileReadDwordLE(); + _fileHandle.seek(50 + 50, SEEK_CUR); + _numVariables = _fileHandle.readDwordLE(); /* ? 1500 */ + _numBitVariables = _fileHandle.readDwordLE(); /* ? 2048 */ + _fileHandle.readDwordLE(); /* 40 */ + _numScripts = _fileHandle.readDwordLE(); + _numSounds = _fileHandle.readDwordLE(); + _numCharsets = _fileHandle.readDwordLE(); + _numCostumes = _fileHandle.readDwordLE(); + _numRooms = _fileHandle.readDwordLE(); + _numInventory = _fileHandle.readDwordLE(); + _numGlobalObjects = _fileHandle.readDwordLE(); + _numFlObject = _fileHandle.readDwordLE(); + _numLocalObjects = _fileHandle.readDwordLE(); + _numVerbs = _fileHandle.readDwordLE(); + _numNewNames = _fileHandle.readDwordLE(); + _fileHandle.readDwordLE(); + _fileHandle.readDwordLE(); + _numArray = _fileHandle.readDwordLE(); _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); _numGlobalScripts = 2000; _shadowPaletteSize = NUM_SHADOW_PALETTE * 256; } else if (_features & GF_AFTER_V7) { - fileSeek(_fileHandle, 50 + 50, SEEK_CUR); - _numVariables = fileReadWordLE(); - _numBitVariables = fileReadWordLE(); - fileReadWordLE(); - _numGlobalObjects = fileReadWordLE(); - _numLocalObjects = fileReadWordLE(); - _numNewNames = fileReadWordLE(); - _numVerbs = fileReadWordLE(); - _numFlObject = fileReadWordLE(); - _numInventory = fileReadWordLE(); - _numArray = fileReadWordLE(); - _numRooms = fileReadWordLE(); - _numScripts = fileReadWordLE(); - _numSounds = fileReadWordLE(); - _numCharsets = fileReadWordLE(); - _numCostumes = fileReadWordLE(); + _fileHandle.seek(50 + 50, SEEK_CUR); + _numVariables = _fileHandle.readWordLE(); + _numBitVariables = _fileHandle.readWordLE(); + _fileHandle.readWordLE(); + _numGlobalObjects = _fileHandle.readWordLE(); + _numLocalObjects = _fileHandle.readWordLE(); + _numNewNames = _fileHandle.readWordLE(); + _numVerbs = _fileHandle.readWordLE(); + _numFlObject = _fileHandle.readWordLE(); + _numInventory = _fileHandle.readWordLE(); + _numArray = _fileHandle.readWordLE(); + _numRooms = _fileHandle.readWordLE(); + _numScripts = _fileHandle.readWordLE(); + _numSounds = _fileHandle.readWordLE(); + _numCharsets = _fileHandle.readWordLE(); + _numCostumes = _fileHandle.readWordLE(); _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); _numGlobalScripts = 2000; _shadowPaletteSize = NUM_SHADOW_PALETTE * 256; } else if (_features & GF_AFTER_V6) { - _numVariables = fileReadWordLE(); - fileReadWordLE(); - _numBitVariables = fileReadWordLE(); - _numLocalObjects = fileReadWordLE(); - _numArray = fileReadWordLE(); - fileReadWordLE(); - _numVerbs = fileReadWordLE(); - _numFlObject = fileReadWordLE(); - _numInventory = fileReadWordLE(); - _numRooms = fileReadWordLE(); - _numScripts = fileReadWordLE(); - _numSounds = fileReadWordLE(); - _numCharsets = fileReadWordLE(); - _numCostumes = fileReadWordLE(); - _numGlobalObjects = fileReadWordLE(); + _numVariables = _fileHandle.readWordLE(); + _fileHandle.readWordLE(); + _numBitVariables = _fileHandle.readWordLE(); + _numLocalObjects = _fileHandle.readWordLE(); + _numArray = _fileHandle.readWordLE(); + _fileHandle.readWordLE(); + _numVerbs = _fileHandle.readWordLE(); + _numFlObject = _fileHandle.readWordLE(); + _numInventory = _fileHandle.readWordLE(); + _numRooms = _fileHandle.readWordLE(); + _numScripts = _fileHandle.readWordLE(); + _numSounds = _fileHandle.readWordLE(); + _numCharsets = _fileHandle.readWordLE(); + _numCostumes = _fileHandle.readWordLE(); + _numGlobalObjects = _fileHandle.readWordLE(); _numNewNames = 50; _objectRoomTable = NULL; @@ -1255,20 +1253,20 @@ void Scumm::readMAXS() _shadowPaletteSize = 256; } else { - _numVariables = fileReadWordLE(); /* 800 */ - fileReadWordLE(); /* 16 */ - _numBitVariables = fileReadWordLE(); /* 2048 */ - _numLocalObjects = fileReadWordLE(); /* 200 */ + _numVariables = _fileHandle.readWordLE(); /* 800 */ + _fileHandle.readWordLE(); /* 16 */ + _numBitVariables = _fileHandle.readWordLE(); /* 2048 */ + _numLocalObjects = _fileHandle.readWordLE(); /* 200 */ _numArray = 50; _numVerbs = 100; _numNewNames = 0; _objectRoomTable = NULL; - fileReadWordLE(); /* 50 */ - _numCharsets = fileReadWordLE(); /* 9 */ - fileReadWordLE(); /* 100 */ - fileReadWordLE(); /* 50 */ - _numInventory = fileReadWordLE(); /* 80 */ + _fileHandle.readWordLE(); /* 50 */ + _numCharsets = _fileHandle.readWordLE(); /* 9 */ + _fileHandle.readWordLE(); /* 100 */ + _fileHandle.readWordLE(); /* 50 */ + _numInventory = _fileHandle.readWordLE(); /* 80 */ _numGlobalScripts = 200; _shadowPaletteSize = 256; diff --git a/scumm/resource_v2.cpp b/scumm/resource_v2.cpp index 0b8cf47d57..1bbadf9d40 100644 --- a/scumm/resource_v2.cpp +++ b/scumm/resource_v2.cpp @@ -30,21 +30,21 @@ void Scumm_v2::readIndexFile() openRoom(-1); openRoom(0); - if (fileReadWordLE() != 0x0100) + if (_fileHandle.readWordLE() != 0x0100) warning("The magic id doesn't match\n"); - _numGlobalObjects = fileReadWordLE(); - fileSeek(_fileHandle, _numGlobalObjects, SEEK_CUR); // Skip object flags - _numRooms = fileReadByte(); - fileSeek(_fileHandle, _numRooms * 3, SEEK_CUR); - _numCostumes = fileReadByte(); - fileSeek(_fileHandle, _numCostumes * 3, SEEK_CUR); - _numScripts = fileReadByte(); - fileSeek(_fileHandle, _numScripts * 3, SEEK_CUR); - _numSounds = fileReadByte(); + _numGlobalObjects = _fileHandle.readWordLE(); + _fileHandle.seek(_numGlobalObjects, SEEK_CUR); // Skip object flags + _numRooms = _fileHandle.readByte(); + _fileHandle.seek(_numRooms * 3, SEEK_CUR); + _numCostumes = _fileHandle.readByte(); + _fileHandle.seek(_numCostumes * 3, SEEK_CUR); + _numScripts = _fileHandle.readByte(); + _fileHandle.seek(_numScripts * 3, SEEK_CUR); + _numSounds = _fileHandle.readByte(); - clearFileReadFailed(_fileHandle); - fileSeek(_fileHandle, 0, SEEK_SET); + _fileHandle.clearIOFailed(); + _fileHandle.seek(0, SEEK_SET); // 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; allocateArrays(); - fileReadWordLE(); /* version magic number */ - fileReadWordLE(); /* nb global objects */ - fileSeek(_fileHandle, _numGlobalObjects, SEEK_CUR); // Skip object flags + _fileHandle.readWordLE(); /* version magic number */ + _fileHandle.readWordLE(); /* nb global objects */ + _fileHandle.seek(_numGlobalObjects, SEEK_CUR); // Skip object flags readResTypeList(rtRoom, MKID('ROOM'), "room"); readResTypeList(rtCostume, MKID('COST'), "costume"); readResTypeList(rtScript, MKID('SCRP'), "script"); diff --git a/scumm/resource_v3.cpp b/scumm/resource_v3.cpp index c3af1c9ef2..a17bc89636 100644 --- a/scumm/resource_v3.cpp +++ b/scumm/resource_v3.cpp @@ -37,37 +37,37 @@ void Scumm_v3::readIndexFile() openRoom(-1); openRoom(0); - while (!fileEof(_fileHandle)) { - itemsize = fileReadDwordLE(); - blocktype = fileReadWordLE(); - if (fileReadFailed(_fileHandle)) + while (!_fileHandle.eof()) { + itemsize = _fileHandle.readDwordLE(); + blocktype = _fileHandle.readWordLE(); + if (_fileHandle.ioFailed()) break; switch (blocktype) { case 0x4E52: // 'NR' - fileReadWordLE(); + _fileHandle.readWordLE(); break; case 0x5230: // 'R0' - _numRooms = fileReadWordLE(); + _numRooms = _fileHandle.readWordLE(); break; case 0x5330: // 'S0' - _numScripts = fileReadWordLE(); + _numScripts = _fileHandle.readWordLE(); break; case 0x4E30: // 'N0' - _numSounds = fileReadWordLE(); + _numSounds = _fileHandle.readWordLE(); break; case 0x4330: // 'C0' - _numCostumes = fileReadWordLE(); + _numCostumes = _fileHandle.readWordLE(); break; case 0x4F30: // 'O0' - _numGlobalObjects = fileReadWordLE(); + _numGlobalObjects = _fileHandle.readWordLE(); break; } - fileSeek(_fileHandle, itemsize - 8, SEEK_CUR); + _fileHandle.seek(itemsize - 8, SEEK_CUR); } - clearFileReadFailed(_fileHandle); - fileSeek(_fileHandle, 0, SEEK_SET); + _fileHandle.clearIOFailed(); + _fileHandle.seek(0, SEEK_SET); /* I'm not sure for those values yet, they will have to be rechecked */ @@ -88,19 +88,19 @@ void Scumm_v3::readIndexFile() allocateArrays(); while (1) { - itemsize = fileReadDwordLE(); + itemsize = _fileHandle.readDwordLE(); - if (fileReadFailed(_fileHandle)) + if (_fileHandle.ioFailed()) break; - blocktype = fileReadWordLE(); + blocktype = _fileHandle.readWordLE(); numblock++; switch (blocktype) { case 0x4E52: // 'NR' - fileSeek(_fileHandle, itemsize - 6, SEEK_CUR); + _fileHandle.seek(itemsize - 6, SEEK_CUR); break; case 0x5230: // 'R0' @@ -120,15 +120,15 @@ void Scumm_v3::readIndexFile() break; case 0x4F30: // 'O0' - num = fileReadWordLE(); + num = _fileHandle.readWordLE(); assert(num == _numGlobalObjects); for (i = 0; i != num; i++) { - uint32 bits = fileReadByte(); + uint32 bits = _fileHandle.readByte(); byte tmp; - bits |= fileReadByte() << 8; - bits |= fileReadByte() << 16; + bits |= _fileHandle.readByte() << 8; + bits |= _fileHandle.readByte() << 16; _classData[i] = bits; - tmp = fileReadByte(); + tmp = _fileHandle.readByte(); _objectOwnerTable[i] = tmp & OF_OWNER_MASK; _objectStateTable[i] = tmp >> OF_STATE_SHL; } @@ -154,8 +154,8 @@ void Scumm_v3::loadCharset(int 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); } diff --git a/scumm/resource_v4.cpp b/scumm/resource_v4.cpp index 64ba6c2255..21fe321cc5 100644 --- a/scumm/resource_v4.cpp +++ b/scumm/resource_v4.cpp @@ -33,8 +33,8 @@ void Scumm_v4::loadCharset(int 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); } diff --git a/scumm/scumm.h b/scumm/scumm.h index d882cef6a2..ee564405ee 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -554,7 +554,7 @@ public: /* Should be in Resource class */ byte _encbyte; - void *_fileHandle; + File _fileHandle; char *_resFilePrefix, *_resFilePath; uint32 _fileOffset; char *_exe_name; @@ -597,9 +597,6 @@ public: virtual void loadCharset(int i); void nukeCharset(int i); - bool fileReadFailed(void *handle); - void clearFileReadFailed(void *handle); - int _lastLoadedRoom, _roomResource; byte _resFilePathId, _fileReadFailed; byte *findResourceData(uint32 tag, byte *ptr); @@ -933,34 +930,14 @@ public: 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(); 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) - uint32 fileReadDword() { return fileReadDwordLE(); } - uint32 fileReadDword(void *handle) { return fileReadDwordLE(handle); } + uint32 fileReadDword() { return _fileHandle.readDwordLE(); } #elif defined(SCUMM_BIG_ENDIAN) - uint32 fileReadDword() { return fileReadDwordBE(); } - uint32 fileReadDword(void *handle) { return fileReadDwordBE(handle); } + uint32 fileReadDword() { return _fileHandle.readDwordBE(); } #endif - uint fileReadWordLE(); - uint fileReadWordBE(); - uint fileReadWordLE(void *handle); - uint fileReadWordBE(void *handle); /* Version 5 script opcodes */ void o5_actorFollowCamera(); diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp index a5b3d7e9ec..24c0bbb804 100644 --- a/scumm/scummvm.cpp +++ b/scumm/scummvm.cpp @@ -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) { char buf[256]; - FILE *out; + File out; uint32 size; 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); #endif - out = fopen(buf, "rb"); - if (!out) { - out = fopen(buf, "wb"); - if (!out) + out.open(buf, 1); + if (out.isOpen() == false) { + out.open(buf, 2); + if (out.isOpen() == false) return; - fwrite(ptr, size, 1, out); + out.write(ptr, size); } - fclose(out); + out.close(); } @@ -1463,7 +1463,6 @@ void Scumm::launch() { charset._vm = this; gdi._vm = this; - _fileHandle = NULL; _maxHeapThreshold = 450000; _minHeapThreshold = 400000; diff --git a/scumm/sys.cpp b/scumm/sys.cpp index ff023e642f..8cd3efe342 100644 --- a/scumm/sys.cpp +++ b/scumm/sys.cpp @@ -23,145 +23,6 @@ #include "stdafx.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() { return true; |