aboutsummaryrefslogtreecommitdiff
path: root/sky
diff options
context:
space:
mode:
authorOliver Kiehl2003-04-07 20:43:47 +0000
committerOliver Kiehl2003-04-07 20:43:47 +0000
commit77e97053d0bace7464e62edee942307937b3e60a (patch)
treee54b914d1f3c82d7d0c77dc6cd6759f3e36574ba /sky
parent7d6939e2ebf63b54dddbb4c9ab54f5f018bb8d26 (diff)
downloadscummvm-rg350-77e97053d0bace7464e62edee942307937b3e60a.tar.gz
scummvm-rg350-77e97053d0bace7464e62edee942307937b3e60a.tar.bz2
scummvm-rg350-77e97053d0bace7464e62edee942307937b3e60a.zip
new class SkyDisk
svn-id: r6932
Diffstat (limited to 'sky')
-rw-r--r--sky/disk.cpp192
-rw-r--r--sky/disk.h53
2 files changed, 134 insertions, 111 deletions
diff --git a/sky/disk.cpp b/sky/disk.cpp
index 233709cd52..b7b50e1da9 100644
--- a/sky/disk.cpp
+++ b/sky/disk.cpp
@@ -22,52 +22,45 @@
#include "stdafx.h"
#include "common/scummsys.h"
#include "common/engine.h"
-#include "common/file.h"
+#include "sky/disk.h"
#include "sky/skydefs.h"
#include "sky/sky.h"
#include "sky/rnc_deco.h"
-#define MAX_FILES_IN_LIST 60
+static const char *dataFilename = "sky.dsk";
+static const char *dinnerFilename = "sky.dnr";
-const char *dataFilename = "sky.dsk";
-const char *dinnerFilename = "sky.dnr";
-uint8 *dinnerTableArea, *fixedDest, *fileDest, *compDest;
-uint32 dinnerTableEntries, fileFlags, fileOffset, fileSize, decompSize, compFile;
-uint16 buildList[MAX_FILES_IN_LIST];
-uint32 loadedFileList[MAX_FILES_IN_LIST];
+SkyDisk::SkyDisk(char *gameDataPath) {
+ _gameDataPath = gameDataPath;
-File *dataDiskHandle = new File();
-File *dnrHandle = new File();
-
-void SkyState::initialiseDisk() {
+ _dataDiskHandle = new File();
+ _dnrHandle = new File();
uint32 entriesRead;
- dnrHandle->open(dinnerFilename, _gameDataPath);
- if (dnrHandle->isOpen() == false)
+ _dnrHandle->open(dinnerFilename, _gameDataPath);
+ if (_dnrHandle->isOpen() == false)
error("Could not open %s%s!\n", _gameDataPath, dinnerFilename);
- if (!(dinnerTableEntries = dnrHandle->readUint32LE()))
+ if (!(_dinnerTableEntries = _dnrHandle->readUint32LE()))
error("Error reading from sky.dnr!\n"); //even though it was opened correctly?!
- debug(1, "Entries in dinner table: %d", dinnerTableEntries);
+ debug(1, "Entries in dinner table: %d", _dinnerTableEntries);
- determineGameVersion(dinnerTableEntries);
-
- dinnerTableArea = (uint8 *)malloc(dinnerTableEntries * 8);
- entriesRead = dnrHandle->read(dinnerTableArea, 8 * dinnerTableEntries) / 8;
+ _dinnerTableArea = (uint8 *)malloc(_dinnerTableEntries * 8);
+ entriesRead = _dnrHandle->read(_dinnerTableArea, 8 * _dinnerTableEntries) / 8;
- if (entriesRead != dinnerTableEntries)
- warning("entriesRead != dinnerTableEntries. [%d/%d]\n", entriesRead, dinnerTableEntries);
+ if (entriesRead != _dinnerTableEntries)
+ warning("entriesRead != dinnerTableEntries. [%d/%d]\n", entriesRead, _dinnerTableEntries);
- dataDiskHandle->open(dataFilename, _gameDataPath);
- if (dataDiskHandle->isOpen() == false)
+ _dataDiskHandle->open(dataFilename, _gameDataPath);
+ if (_dataDiskHandle->isOpen() == false)
error("Error opening %s%s!\n", _gameDataPath, dataFilename);
}
//load in file file_nr to address dest
//if dest == NULL, then allocate memory for this file
-uint8 *SkyState::loadFile(uint16 fileNr, uint8 *dest) {
+uint8 *SkyDisk::loadFile(uint16 fileNr, uint8 *dest) {
uint8 cflag;
int32 bytesRead;
@@ -78,7 +71,7 @@ uint8 *SkyState::loadFile(uint16 fileNr, uint8 *dest) {
warning("File order checking not implemented yet!\n");
#endif
- compFile = fileNr;
+ _compFile = fileNr;
debug(2, "load file %d,%d (%d)", (fileNr >> 11), (fileNr & 2047), fileNr);
filePtr = getFileInfo(fileNr);
@@ -87,58 +80,58 @@ uint8 *SkyState::loadFile(uint16 fileNr, uint8 *dest) {
return NULL;
}
- fileFlags = READ_LE_UINT32((filePtr + 5));
- fileSize = fileFlags & 0x03fffff;
- _lastLoadedFileSize = fileSize;
+ _fileFlags = READ_LE_UINT32((filePtr + 5));
+ _fileSize = _fileFlags & 0x03fffff;
+ _lastLoadedFileSize = _fileSize;
- fileOffset = READ_LE_UINT32((filePtr + 2)) & 0x0ffffff;
+ _fileOffset = READ_LE_UINT32((filePtr + 2)) & 0x0ffffff;
- cflag = (uint8)((fileOffset >> (23)) & 0x1);
- fileOffset = (((1 << (23)) ^ 0xFFFFFFFF) & fileOffset);
+ cflag = (uint8)((_fileOffset >> (23)) & 0x1);
+ _fileOffset = (((1 << (23)) ^ 0xFFFFFFFF) & _fileOffset);
if (cflag)
- fileOffset <<= 4;
+ _fileOffset <<= 4;
- fixedDest = dest;
- fileDest = dest;
- compDest = dest;
+ _fixedDest = dest;
+ _fileDest = dest;
+ _compDest = dest;
if (dest == NULL) //we need to allocate memory for this file
- fileDest = (uint8 *)malloc(fileSize);
+ _fileDest = (uint8 *)malloc(_fileSize);
- dataDiskHandle->seek(fileOffset, SEEK_SET);
+ _dataDiskHandle->seek(_fileOffset, SEEK_SET);
#ifdef file_order_chk
warning("File order checking not implemented yet!\n");
#endif
//now read in the data
- bytesRead = dataDiskHandle->read(fileDest, 1 * fileSize);
+ bytesRead = _dataDiskHandle->read(_fileDest, 1 * _fileSize);
- if (bytesRead != (int32)fileSize)
- printf("ERROR: Unable to read %d bytes from datadisk (%d bytes read)\n", fileSize, bytesRead);
+ if (bytesRead != (int32)_fileSize)
+ printf("ERROR: Unable to read %d bytes from datadisk (%d bytes read)\n", _fileSize, bytesRead);
- cflag = (uint8)((fileFlags >> (23)) & 0x1);
+ cflag = (uint8)((_fileFlags >> (23)) & 0x1);
//if cflag == 0 then file is compressed, 1 == uncompressed
if (!cflag) {
debug(2, "File is compressed...");
- memcpy(&fileHeader, fileDest, sizeof(struct dataFileHeader));
+ memcpy(&fileHeader, _fileDest, sizeof(struct dataFileHeader));
if ( (uint8)((FROM_LE_16(fileHeader.flag) >> 7) & 0x1) ) {
debug(2, "with RNC!");
- decompSize = (FROM_LE_16(fileHeader.flag) & 0xFFFFFF00) << 8;
- decompSize |= FROM_LE_16((uint16)fileHeader.s_tot_size);
+ _decompSize = (FROM_LE_16(fileHeader.flag) & 0xFFFFFF00) << 8;
+ _decompSize |= FROM_LE_16((uint16)fileHeader.s_tot_size);
- if (fixedDest == NULL) // is this valid?
- compDest = (uint8 *)malloc(decompSize);
+ if (_fixedDest == NULL) // is this valid?
+ _compDest = (uint8 *)malloc(_decompSize);
- inputPtr = fileDest;
- outputPtr = compDest;
+ inputPtr = _fileDest;
+ outputPtr = _compDest;
- if ( (uint8)(fileFlags >> (22) & 0x1) ) //do we include the header?
+ if ( (uint8)(_fileFlags >> (22) & 0x1) ) //do we include the header?
inputPtr += sizeof(struct dataFileHeader);
else {
memcpy(outputPtr, inputPtr, sizeof(struct dataFileHeader));
@@ -152,39 +145,39 @@ uint8 *SkyState::loadFile(uint16 fileNr, uint8 *dest) {
debug(3, "UnpackM1 returned: %d", unPackLen);
if (unPackLen == 0) { //Unpack returned 0: file was probably not packed.
- if (fixedDest == NULL)
- free(compDest);
+ if (_fixedDest == NULL)
+ free(_compDest);
- return fileDest;
+ return _fileDest;
}
- if (! (uint8)(fileFlags >> (22) & 0x1) ) { // include header?
+ if (! (uint8)(_fileFlags >> (22) & 0x1) ) { // include header?
unPackLen += sizeof(struct dataFileHeader);
- if (unPackLen != (int32)decompSize) {
- debug(1, "ERROR: invalid decomp size! (was: %d, should be: %d)", unPackLen, decompSize);
+ if (unPackLen != (int32)_decompSize) {
+ debug(1, "ERROR: invalid decomp size! (was: %d, should be: %d)", unPackLen, _decompSize);
}
}
- _lastLoadedFileSize = decompSize; //including header
+ _lastLoadedFileSize = _decompSize; //including header
- if (fixedDest == NULL)
- free(fileDest);
+ if (_fixedDest == NULL)
+ free(_fileDest);
} else
debug(2, "but not with RNC! (?!)");
} else
- return fileDest;
+ return _fileDest;
- return compDest;
+ return _compDest;
}
-uint8 *SkyState::getFileInfo(uint16 fileNr) {
+uint8 *SkyDisk::getFileInfo(uint16 fileNr) {
uint16 i;
- uint16 *dnrTbl16Ptr = (uint16 *)dinnerTableArea;
+ uint16 *dnrTbl16Ptr = (uint16 *)_dinnerTableArea;
- for (i = 0; i < dinnerTableEntries; i++) {
+ for (i = 0; i < _dinnerTableEntries; i++) {
if (READ_LE_UINT16(dnrTbl16Ptr + (i * 4)) == fileNr) {
debug(2, "file %d found!", fileNr);
return (uint8 *)(dnrTbl16Ptr + (i * 4));
@@ -195,70 +188,47 @@ uint8 *SkyState::getFileInfo(uint16 fileNr) {
return (uint8 *)NULL;
}
-void SkyState::determineGameVersion(uint32 dnrEntries) {
+void SkyDisk::dumpFile(uint16 fileNr) {
+ char buf[128];
+ File out;
+ byte* filePtr;
- //determine game version based on number of entries in dinner table
+ filePtr = loadFile(fileNr, NULL);
+ sprintf(buf, "dumps/file-%d.dmp", fileNr);
- switch (dnrEntries) {
+ out.open(buf, "", 1);
+ if (out.isOpen() == false) {
+ out.open(buf, "", 2);
+ if (out.isOpen() == false)
+ return;
+ out.write(filePtr, _lastLoadedFileSize);
+ }
+ out.close();
+ free(filePtr);
+}
+uint32 SkyDisk::determineGameVersion() {
+ //determine game version based on number of entries in dinner table
+ switch (_dinnerTableEntries) {
case 247:
//floppy demo (v0.0267)
- _isDemo = true;
- _isCDVersion = false;
- _gameVersion = 267;
- break;
-
+ return 267;
case 1404:
//floppy (v0.0288)
- _isDemo = false;
- _isCDVersion = false;
- _gameVersion = 288;
- break;
-
+ return 288;
case 1445:
//floppy (v0.0331)
- _isDemo = false;
- _isCDVersion = false;
- _gameVersion = 331;
- break;
-
+ return 331;
case 1711:
//cd demo (v0.0365)
- _isDemo = true;
- _isCDVersion = true;
- _gameVersion = 365;
- break;
-
+ return 365;
case 5099:
//cd (v0.0368)
- _isDemo = false;
- _isCDVersion = true;
- _gameVersion = 368;
- break;
-
+ return 368;
default:
//unknown version
error("Unknown game version!");
break;
}
-
}
-void SkyState::dumpFile(uint16 fileNr) {
- char buf[128];
- File out;
- byte* filePtr;
-
- filePtr = loadFile(fileNr, NULL);
- sprintf(buf, "dumps/file-%d.dmp", fileNr);
-
- out.open(buf, "", 1);
- if (out.isOpen() == false) {
- out.open(buf, "", 2);
- if (out.isOpen() == false)
- return;
- out.write(filePtr, _lastLoadedFileSize);
- }
- out.close();
- free(filePtr);
-}
diff --git a/sky/disk.h b/sky/disk.h
new file mode 100644
index 0000000000..a824748433
--- /dev/null
+++ b/sky/disk.h
@@ -0,0 +1,53 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2003 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+#ifndef SKYDISK_H
+#define SKYDISK_H
+
+#include "common/file.h"
+
+#define MAX_FILES_IN_LIST 60
+
+class SkyDisk {
+public:
+ SkyDisk(char *gameDataPath);
+
+ uint8 *loadFile(uint16 fileNr, uint8 *dest);
+ uint32 determineGameVersion();
+
+ uint32 _lastLoadedFileSize;
+protected:
+ uint8 *getFileInfo(uint16 fileNr);
+ void dumpFile(uint16 fileNr);
+
+ char *_gameDataPath;
+ uint32 _dinnerTableEntries;
+
+ uint8 *_dinnerTableArea, *_fixedDest, *_fileDest, *_compDest;
+ uint32 _fileFlags, _fileOffset, _fileSize, _decompSize, _compFile;
+ uint16 _buildList[MAX_FILES_IN_LIST];
+ uint32 _loadedFileList[MAX_FILES_IN_LIST];
+
+ File *_dataDiskHandle;
+ File *_dnrHandle;
+};
+
+#endif