aboutsummaryrefslogtreecommitdiff
path: root/engines/cruise/volume.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/cruise/volume.cpp')
-rw-r--r--engines/cruise/volume.cpp455
1 files changed, 455 insertions, 0 deletions
diff --git a/engines/cruise/volume.cpp b/engines/cruise/volume.cpp
new file mode 100644
index 0000000000..e4a00945e9
--- /dev/null
+++ b/engines/cruise/volume.cpp
@@ -0,0 +1,455 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2006 The ScummVM project
+ *
+ * cinE Engine is (C) 2004-2005 by CinE Team
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "cruise/cruise_main.h"
+
+namespace Cruise {
+
+FILE *PAL_fileHandle = NULL;
+uint8 *PAL_ptr = NULL;
+
+int16 numLoadedPal;
+int16 fileData2;
+
+void loadPal(volumeDataStruct *entry) {
+ char name[20];
+
+ return;
+
+ if (PAL_fileHandle) {
+ fclose(PAL_fileHandle);
+ }
+
+ removeExtention(entry->ident, name);
+ strcat(name, ".PAL");
+
+ PAL_fileHandle = fopen(name, "rb");
+
+ fread(&numLoadedPal, 2, 1, PAL_fileHandle);
+ fread(&fileData2, 2, 1, PAL_fileHandle);
+
+ flipShort(&numLoadedPal);
+ flipShort(&fileData2);
+
+ PAL_ptr = (uint8 *) malloc(numLoadedPal * fileData2);
+}
+
+int getVolumeDataEntry(volumeDataStruct *entry) {
+ char buffer[256];
+ int i;
+
+ volumeNumEntry = 0;
+ volumeNumberOfEntry = 0;
+
+ if (currentVolumeFile.isOpen()) {
+ freeDisk();
+ }
+
+ askDisk(-1);
+
+ strcpyuint8(buffer, entry->ident);
+
+ currentVolumeFile.open(buffer);
+
+ if (!currentVolumeFile.isOpen()) {
+ return (-14);
+ }
+
+ changeCursor(1);
+
+ currentVolumeFile.read(&volumeNumberOfEntry, 2);
+ currentVolumeFile.read(&volumeSizeOfEntry, 2);
+
+ flipShort(&volumeNumberOfEntry);
+ flipShort(&volumeSizeOfEntry);
+
+ volumeNumEntry = volumeNumberOfEntry;
+
+ assert(volumeSizeOfEntry == 14 + 4 + 4 + 4 + 4);
+
+ volumePtrToFileDescriptor =
+ (fileEntry *) mallocAndZero(sizeof(fileEntry) * volumeNumEntry);
+
+ for (i = 0; i < volumeNumEntry; i++) {
+ volumePtrToFileDescriptor[i].name[0] = 0;
+ volumePtrToFileDescriptor[i].offset = 0;
+ volumePtrToFileDescriptor[i].size = 0;
+ volumePtrToFileDescriptor[i].extSize = 0;
+ volumePtrToFileDescriptor[i].unk3 = 0;
+ }
+
+ for (i = 0; i < volumeNumEntry; i++) {
+ currentVolumeFile.read(&volumePtrToFileDescriptor[i].name, 14);
+ currentVolumeFile.read(&volumePtrToFileDescriptor[i].offset,
+ 4);
+ currentVolumeFile.read(&volumePtrToFileDescriptor[i].size, 4);
+ currentVolumeFile.read(&volumePtrToFileDescriptor[i].extSize,
+ 4);
+ currentVolumeFile.read(&volumePtrToFileDescriptor[i].unk3, 4);
+ }
+
+ for (i = 0; i < volumeNumEntry; i++) {
+ flipLong(&volumePtrToFileDescriptor[i].offset);
+ flipLong(&volumePtrToFileDescriptor[i].size);
+ flipLong(&volumePtrToFileDescriptor[i].extSize);
+ }
+
+ loadPal(entry);
+
+ return 0;
+}
+
+int searchFileInVolCnf(uint8 *fileName, int32 diskNumber) {
+ int foundDisk = -1;
+ int i;
+
+ for (i = 0; i < numOfDisks; i++) {
+ if (volumeData[i].diskNumber == diskNumber) {
+ int j;
+ int numOfEntry = volumeData[i].size / 13;
+
+ for (j = 0; j < numOfEntry; j++) {
+ if (!strcmpuint8(volumeData[i].ptr[j].name,
+ fileName)) {
+ return (i);
+ }
+ }
+ }
+ }
+
+ return (foundDisk);
+}
+
+int32 findFileInDisksSub1(uint8 *fileName) {
+ int foundDisk = -1;
+ int i;
+
+ for (i = 0; i < numOfDisks; i++) {
+ int j;
+ int numOfEntry = volumeData[i].size / 13;
+
+ for (j = 0; j < numOfEntry; j++) {
+ if (!strcmpuint8(volumeData[i].ptr[j].name, fileName)) {
+ return (i);
+ }
+ }
+ }
+
+ return (foundDisk);
+}
+
+void strToUpper(uint8 *fileName) {
+ char character;
+
+ do {
+ character = *fileName;
+
+ if (character >= 'a' && character <= 'z') {
+ character &= 0xDF;
+ *fileName = character;
+ }
+
+ fileName++;
+
+ } while (character);
+}
+
+void freeDisk(void) {
+ if (currentVolumeFile.isOpen()) {
+ currentVolumeFile.close();
+ free(volumePtrToFileDescriptor);
+ }
+
+ /* TODO
+ * if(PAL_fileHandle)
+ * {
+ * freeAllDataPtr();
+ * }
+ */
+}
+
+int16 findFileInList(uint8 *fileName) {
+ int i;
+
+ if (!currentVolumeFile.isOpen()) {
+ return (-1);
+ }
+
+ strToUpper(fileName);
+
+ if (volumeNumEntry <= 0) {
+ return (-1);
+ }
+
+ for (i = 0; i < volumeNumEntry; i++) {
+ if (!strcmpuint8(volumePtrToFileDescriptor[i].name, fileName)) {
+ return (i);
+ }
+ }
+
+ return (-1);
+}
+
+void askDisk(int16 discNumber) {
+ char diskNumberString[256];
+ uint8 fileName[256];
+ uint8 string[256];
+ char messageDrawn = 0;
+
+ if (discNumber != -1) {
+ currentDiskNumber = discNumber;
+ }
+ // skip drive selection stuff
+
+ strcpyuint8(fileName, "VOL.");
+ sprintf(diskNumberString, "%d", currentDiskNumber);
+ strcatuint8(fileName, diskNumberString);
+
+ strcpyuint8(string, "INSERER LE DISQUE ");
+ strcatuint8(string, diskNumberString);
+ strcatuint8(string, " EN ");
+
+ //while (Common::File::exists((const char*)fileName))
+ {
+ if (!messageDrawn) {
+ drawMsgString(string);
+ messageDrawn = 1;
+ }
+ }
+
+ changeCursor(currentCursor);
+}
+
+int16 findFileInDisks(uint8 *fileName) {
+ int disk;
+ int fileIdx;
+
+ strToUpper(fileName);
+
+ if (!volumeDataLoaded) {
+ printf("CNF wasn't loaded, reading now...\n");
+ if (currentVolumeFile.isOpen()) {
+ askDisk(-1);
+ freeDisk();
+ }
+
+ askDisk(1);
+ readVolCnf();
+ }
+
+ if (currentVolumeFile.isOpen()) {
+ askDisk(-1);
+ }
+
+ fileIdx = findFileInList(fileName);
+
+ if (fileIdx >= 0) {
+ return (fileIdx);
+ }
+
+ disk = searchFileInVolCnf(fileName, currentDiskNumber);
+
+ if (disk >= 0) {
+ int temp;
+
+ printf("File found on disk %d\n", disk);
+
+ if (currentVolumeFile.isOpen()) {
+ askDisk(-1);
+ }
+
+ freeDisk();
+
+ askDisk(volumeData[disk].diskNumber);
+
+ getVolumeDataEntry(&volumeData[disk]);
+
+ temp = findFileInList(fileName);
+
+ if (temp >= 0)
+ return (temp);
+
+ return (-1);
+
+ } else {
+ int temp;
+
+ temp = findFileInDisksSub1(fileName);
+
+ if (temp >= 0) {
+ int temp2;
+
+ askDisk(volumeData[temp].diskNumber);
+
+ getVolumeDataEntry(&volumeData[temp]);
+
+ temp2 = findFileInList(fileName);
+
+ if (temp2 >= 0)
+ return (temp2);
+ }
+
+ return (-1);
+ }
+}
+
+int16 readVolCnf(void) {
+ int i;
+ Common::File fileHandle;
+ short int sizeHEntry;
+
+ volumeDataLoaded = 0;
+
+ for (i = 0; i < 20; i++) {
+ volumeData[i].ident[0] = 0;
+ volumeData[i].ptr = NULL;
+ volumeData[i].diskNumber = i + 1;
+ volumeData[i].size = 0;
+ }
+
+ fileHandle.open("VOL.CNF");
+
+ if (!fileHandle.isOpen()) {
+ return (0);
+ }
+
+ fileHandle.read(&numOfDisks, 2);
+ flipShort(&numOfDisks);
+
+ fileHandle.read(&sizeHEntry, 2);
+ flipShort(&sizeHEntry); // size of one header entry - 20 bytes
+
+ for (i = 0; i < numOfDisks; i++) {
+ // fread(&volumeData[i],20,1,fileHandle);
+ fileHandle.read(&volumeData[i].ident, 10);
+ fileHandle.read(&volumeData[i].ptr, 4);
+ fileHandle.read(&volumeData[i].diskNumber, 2);
+ fileHandle.read(&volumeData[i].size, 4);
+
+ flipShort(&volumeData[i].diskNumber);
+ printf("Disk number: %d\n", volumeData[i].diskNumber);
+ flipLong(&volumeData[i].size);
+ }
+
+ for (i = 0; i < numOfDisks; i++) {
+ fileName *ptr;
+
+ fileHandle.read(&volumeData[i].size, 4);
+ flipLong(&volumeData[i].size);
+
+ ptr = (fileName *) mallocAndZero(volumeData[i].size);
+
+ volumeData[i].ptr = ptr;
+
+ if (!ptr) {
+ fileHandle.close();
+ return (-2);
+ }
+
+ fileHandle.read(ptr, volumeData[i].size);
+ }
+
+ fileHandle.close();
+
+ volumeDataLoaded = 1;
+
+//#define dumpResources
+#ifdef dumpResources
+
+ for (i = 0; i < numOfDisks; i++) {
+ int j;
+ char nameBuffer[256];
+ fileEntry *buffer;
+
+ sprintf(nameBuffer, "D%d.", i + 1);
+
+ fileHandle = fopen(nameBuffer, "rb");
+
+ short int numEntry;
+ short int sizeEntry;
+
+ fread(&numEntry, 2, 1, fileHandle);
+ fread(&sizeEntry, 2, 1, fileHandle);
+
+ flipShort(&numEntry);
+ flipShort(&sizeEntry);
+
+ buffer = (fileEntry *) mallocAndZero(numEntry * sizeEntry);
+
+ fread(buffer, numEntry * sizeEntry, 1, fileHandle);
+
+ for (j = 0; j < numEntry; j++) {
+ flipLong(&buffer[j].offset);
+ flipLong(&buffer[j].size);
+ flipLong(&buffer[j].unk2);
+ flipLong(&buffer[j].unk3);
+
+ fseek(fileHandle, buffer[j].offset, SEEK_SET);
+
+ char *bufferLocal;
+ bufferLocal = (char *)mallocAndZero(buffer[j].size);
+
+ fread(bufferLocal, buffer[j].size, 1, fileHandle);
+
+ char nameBuffer[256];
+
+ sprintf(nameBuffer, "D%d.dmp/%s", i + 1,
+ buffer[j].name);
+
+ if (buffer[j].size == buffer[j].unk2) {
+ FILE *fOut = fopen(nameBuffer, "wb+");
+ fwrite(bufferLocal, buffer[j].size, 1, fOut);
+ fclose(fOut);
+ } else {
+ char *uncompBuffer =
+ (char *)mallocAndZero(buffer[j].unk2 +
+ 500);
+
+ delphineUnpack((uint8 *) uncompBuffer, (const uint8 *) bufferLocal, buffer[j].size);
+
+ FILE *fOut = fopen(nameBuffer, "wb+");
+ fwrite(uncompBuffer, buffer[j].unk2, 1,
+ fOut);
+ fclose(fOut);
+
+ //free(uncompBuffer);
+
+ }
+
+ free(bufferLocal);
+ }
+ }
+
+#endif
+
+ return (1);
+}
+
+///////////////////////////::
+
+void drawMsgString(uint8 *string) {
+ //printf("%s\n",string);
+}
+
+} // End of namespace Cruise