aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/file.cpp2
-rw-r--r--scumm/resource.cpp298
-rw-r--r--scumm/resource_v2.cpp30
-rw-r--r--scumm/resource_v3.cpp48
-rw-r--r--scumm/resource_v4.cpp4
-rw-r--r--scumm/scumm.h29
-rw-r--r--scumm/scummvm.cpp15
-rw-r--r--scumm/sys.cpp139
8 files changed, 201 insertions, 364 deletions
diff --git a/common/file.cpp b/common/file.cpp
index 58bb8b559b..df0df9c5f2 100644
--- a/common/file.cpp
+++ b/common/file.cpp
@@ -97,6 +97,8 @@ bool File::open(const char *filename, int mode, byte encbyte) {
return false;
}
+ _encbyte = encbyte;
+
return true;
}
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;