aboutsummaryrefslogtreecommitdiff
path: root/kyra/resource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kyra/resource.cpp')
-rw-r--r--kyra/resource.cpp366
1 files changed, 0 insertions, 366 deletions
diff --git a/kyra/resource.cpp b/kyra/resource.cpp
deleted file mode 100644
index 0dd76ff5de..0000000000
--- a/kyra/resource.cpp
+++ /dev/null
@@ -1,366 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2004-2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/stdafx.h"
-#include "common/file.h"
-#include "kyra/resource.h"
-#include "kyra/script.h"
-#include "kyra/wsamovie.h"
-#include "kyra/screen.h"
-
-namespace Kyra {
-Resource::Resource(KyraEngine *engine) {
- _engine = engine;
-
- // No PAK files in the demo version
- if (_engine->features() & GF_DEMO)
- return;
-
- // prefetches all PAK Files
-
- // ugly a hardcoded list
- // TODO: use the FS Backend to get all .PAK Files and load them
- // or any other thing to get all files
- static const char *kyra1Filelist[] = {
- "A_E.PAK", "DAT.PAK", "F_L.PAK", "MAP_5.PAK", "MSC.PAK", "M_S.PAK",
- "S_Z.PAK", "WSA1.PAK", "WSA2.PAK", "WSA3.PAK", "WSA4.PAK", "WSA5.PAK",
- "WSA6.PAK", 0
- };
-
- static const char *kyra1CDFilelist[] = {
- "ALTAR.APK", "BELROOM.APK", "BONKBG.APK", "BROKEN.APK", "CASTLE.APK", "CAVE.APK", "CGATE.APK",
- "DEAD.APK", "DNSTAIR.APK", "DRAGON1.APK", "DRAGON2.APK", "EXTPOT.APK", "FORESTA.APK", "FORESTB.APK",
- "FOUNTN.APK", "FOYER.APK", "GATECV.APK", "GEM.APK", "GEMCUT.APK", "GENHALL.APK", "GLADE.APK",
- "GRAVE.APK", "HEALER.APK", "LAGOON.APK", "LANDING.APK", "LAVA.APK", "LEPHOLE.APK", "LIBRARY.APK",
- "MIX.APK", "MOONCAV.APK", "POTION.APK", "SONG.APK", "SORROW.APK", "SPELL.APK", "STUMP.APK",
- "TEMPLE.APK", "TRUNK.APK", "WILLOW.APK", "XEDGE.APK",
-
- "ADL.PAK", "BRINS.PAK", "CLIFF.PAK", "ENTER.PAK", "FORESTA.PAK", "GEM.PAK", "INTRO1.PAK",
- "LEPHOLE.PAK", "OAKS.PAK", "SPELL.PAK", "WILLOW.PAK", "ALCHEMY.PAK", "BROKEN.PAK", "COL.PAK",
- "EXTHEAL.PAK", "FORESTB.PAK", "GEMCUT.PAK", "INTRO2.PAK", "LIBRARY.PAK", "PLATEAU.PAK", "SPRING.PAK",
- "WISE.PAK", "ALGAE.PAK", "BURN.PAK", "DARMS.PAK", "EXTPOT.PAK", "FORESTC.PAK", "GENCAVB.PAK",
- "INTRO3.PAK", "MISC.PAK", "PLTCAVE.PAK", "SQUARE.PAK", "XEDGE.PAK", "ALTAR.PAK", "CASTLE.PAK",
- "DEAD.PAK", "EXTSPEL.PAK", "FOUNTN.PAK", "GENHALL.PAK", "INTRO4.PAK", "MIX.PAK", "POTION.PAK",
- "STARTUP.PAK", "XEDGEB.PAK", "ARCH.PAK", "CATACOM.PAK", "DNSTAIR.PAK", "FALLS.PAK", "FOYER.PAK",
- "GEN_CAV.PAK", "KITCHEN.PAK", "MOONCAV.PAK", "RUBY.PAK", "STUMP.PAK", "XEDGEC.PAK", "BALCONY.PAK",
- "CAVE.PAK", "DRAGON.PAK", "FESTSTH.PAK", "FSOUTH.PAK", "GLADE.PAK", "KYRAGEM.PAK", "NCLIFF.PAK",
- "SICKWIL.PAK", "TEMPLE.PAK", "XMI.PAK", "BELROOM.PAK", "CAVEB.PAK", "EDGE.PAK", "FGOWEST.PAK",
- "FSOUTHB.PAK", "GRAVE.PAK", "LAGOON.PAK", "NCLIFFB.PAK", "SND.PAK", "TRUNK.PAK", "ZROCK.PAK",
- "BONKBG.PAK", "CGATE.PAK", "EDGEB.PAK", "FINALE.PAK", "FWSTSTH.PAK", "GRTHALL.PAK", "LANDING.PAK",
- "NWCLIFB.PAK", "SONG.PAK", "UPSTAIR.PAK", "BRIDGE.PAK", "CHASM.PAK", "EMCAV.PAK", "FNORTH.PAK",
- "GATECV.PAK", "HEALER.PAK", "LAVA.PAK", "NWCLIFF.PAK", "SORROW.PAK", "WELL.PAK",
-
- "CHAPTER1.VRM", 0
- };
-
- const char **usedFilelist = 0;
-
- if (_engine->features() & GF_FLOPPY)
- usedFilelist = kyra1Filelist;
- else if (_engine->features() & GF_TALKIE)
- usedFilelist = kyra1CDFilelist;
- else
- error("no filelist found for this game");
-
- for (uint32 tmp = 0; usedFilelist[tmp]; ++tmp) {
- // prefetch file
- PAKFile *file = new PAKFile(usedFilelist[tmp]);
- assert(file);
-
- PakFileEntry newPak;
- newPak._file = file;
- strncpy(newPak._filename, usedFilelist[tmp], 32);
- if (file->isOpen() && file->isValid())
- _pakfiles.push_back(newPak);
- else {
- delete file;
- debug(3, "couldn't load file '%s' correctly", usedFilelist[tmp]);
- }
- }
-}
-
-Resource::~Resource() {
- Common::List<PakFileEntry>::iterator start = _pakfiles.begin();
-
- for (;start != _pakfiles.end(); ++start) {
- delete start->_file;
- start->_file = 0;
- }
-}
-
-bool Resource::loadPakFile(const char *filename) {
- if (isInPakList(filename))
- return true;
- PAKFile *file = new PAKFile(filename);
- if (!file) {
- error("couldn't load file: '%s'", filename);
- }
- PakFileEntry newPak;
- newPak._file = file;
- strncpy(newPak._filename, filename, 32);
- _pakfiles.push_back(newPak);
- return true;
-}
-
-void Resource::unloadPakFile(const char *filename) {
- Common::List<PakFileEntry>::iterator start = _pakfiles.begin();
- for (;start != _pakfiles.end(); ++start) {
- if (scumm_stricmp(start->_filename, filename) == 0) {
- delete start->_file;
- _pakfiles.erase(start);
- break;
- }
- }
- return;
-}
-
-bool Resource::isInPakList(const char *filename) {
- Common::List<PakFileEntry>::iterator start = _pakfiles.begin();
- for (;start != _pakfiles.end(); ++start) {
- if (scumm_stricmp(start->_filename, filename) == 0)
- return true;
- }
- return false;
-}
-
-uint8 *Resource::fileData(const char *file, uint32 *size) {
- uint8 *buffer = 0;
- Common::File file_;
-
- // test to open it in the main dir
- if (file_.open(file)) {
-
- *size = file_.size();
- buffer = new uint8[*size];
- assert(buffer);
-
- file_.read(buffer, *size);
-
- file_.close();
- } else {
- // opens the file in a PAK File
- Common::List<PakFileEntry>::iterator start = _pakfiles.begin();
-
- for (;start != _pakfiles.end(); ++start) {
- *size = start->_file->getFileSize(file);
-
- if (!(*size))
- continue;
-
- buffer = start->_file->getFile(file);
- break;
- }
- }
-
- if (!buffer || !(*size)) {
- return 0;
- }
-
- return buffer;
-}
-
-bool Resource::fileHandle(const char *file, uint32 *size, Common::File &filehandle) {
- filehandle.close();
-
- if (filehandle.open(file))
- return true;
-
- Common::List<PakFileEntry>::iterator start = _pakfiles.begin();
-
- for (;start != _pakfiles.end(); ++start) {
- *size = start->_file->getFileSize(file);
-
- if (!(*size))
- continue;
-
- if (start->_file->getFileHandle(file, filehandle)) {
- return true;
- }
- }
-
- return false;
-}
-
-///////////////////////////////////////////
-// Pak file manager
-#define PAKFile_Iterate Common::List<PakChunk*>::iterator start=_files.begin();start != _files.end(); ++start
-PAKFile::PAKFile(const Common::String& file) {
- _filename = 0;
-
- Common::File pakfile;
- uint8 *buffer = 0;
- _open = false;
-
- if (!pakfile.open(file.c_str())) {
- debug(3, "couldn't open pakfile '%s'\n", file.c_str());
- return;
- }
-
- uint32 filesize = pakfile.size();
- buffer = new uint8[filesize];
- assert(buffer);
-
- pakfile.read(buffer, filesize);
- pakfile.close();
-
- // works with the file
- uint32 pos = 0, startoffset = 0, endoffset = 0;
-
- startoffset = READ_LE_UINT32(buffer + pos);
- pos += 4;
-
- while (pos < filesize) {
- PakChunk* chunk = new PakChunk;
- assert(chunk);
-
- // saves the name
- chunk->_name = new char[strlen((const char*)buffer + pos) + 1];
- assert(chunk->_name);
- strcpy(chunk->_name, (const char*)buffer + pos);
- pos += strlen(chunk->_name) + 1;
- if (!(*chunk->_name))
- break;
-
- endoffset = READ_LE_UINT32(buffer + pos);
- pos += 4;
-
- if (endoffset == 0) {
- endoffset = filesize;
- }
-
- chunk->_start = startoffset;
- chunk->_size = endoffset - startoffset;
-
- _files.push_back(chunk);
-
- if (endoffset == filesize)
- break;
-
- startoffset = endoffset;
- }
- _open = true;
- delete [] buffer;
-
- _filename = new char[file.size()+1];
- assert(_filename);
- strcpy(_filename, file.c_str());
-}
-
-PAKFile::~PAKFile() {
- delete [] _filename;
- _filename = 0;
- _open = false;
-
- for (PAKFile_Iterate) {
- delete [] (*start)->_name;
- (*start)->_name = 0;
- delete *start;
- *start = 0;
- }
-}
-
-uint8 *PAKFile::getFile(const char *file) {
- for (PAKFile_Iterate) {
- if (!scumm_stricmp((*start)->_name, file)) {
- Common::File pakfile;
- if (!pakfile.open(_filename)) {
- debug(3, "couldn't open pakfile '%s'\n", _filename);
- return 0;
- }
- pakfile.seek((*start)->_start);
- uint8 *buffer = new uint8[(*start)->_size];
- assert(buffer);
- pakfile.read(buffer, (*start)->_size);
- return buffer;
- }
- }
- return 0;
-}
-
-bool PAKFile::getFileHandle(const char *file, Common::File &filehandle) {
- filehandle.close();
-
- for (PAKFile_Iterate) {
- if (!scumm_stricmp((*start)->_name, file)) {
- if (!filehandle.open(_filename)) {
- debug(3, "couldn't open pakfile '%s'\n", _filename);
- return 0;
- }
- filehandle.seek((*start)->_start);
- return true;
- }
- }
- return false;
-}
-
-uint32 PAKFile::getFileSize(const char* file) {
- for (PAKFile_Iterate) {
- if (!scumm_stricmp((*start)->_name, file))
- return (*start)->_size;
- }
- return 0;
-}
-
-void KyraEngine::loadPalette(const char *filename, uint8 *palData) {
- debug(9, "KyraEngine::loadPalette('%s' 0x%X)", filename, palData);
- uint32 fileSize = 0;
- uint8 *srcData = _res->fileData(filename, &fileSize);
-
- if (palData && fileSize) {
- debug(9, "Loading a palette of size %i from '%s'", fileSize, filename);
- memcpy(palData, srcData, fileSize);
- }
- delete [] srcData;
-}
-
-void KyraEngine::loadBitmap(const char *filename, int tempPage, int dstPage, uint8 *palData) {
- debug(9, "KyraEngine::copyBitmap('%s', %d, %d, 0x%X)", filename, tempPage, dstPage, palData);
- uint32 fileSize;
- uint8 *srcData = _res->fileData(filename, &fileSize);
- uint8 compType = srcData[2];
- uint32 imgSize = READ_LE_UINT32(srcData + 4);
- uint16 palSize = READ_LE_UINT16(srcData + 8);
- if (palData && palSize) {
- debug(9, "Loading a palette of size %i from %s", palSize, filename);
- memcpy(palData, srcData + 10, palSize);
- }
- uint8 *srcPtr = srcData + 10 + palSize;
- uint8 *dstData = _screen->getPagePtr(dstPage);
- switch (compType) {
- case 0:
- memcpy(dstData, srcPtr, imgSize);
- break;
- case 3:
- Screen::decodeFrame3(srcPtr, dstData, imgSize);
- break;
- case 4:
- Screen::decodeFrame4(srcPtr, dstData, imgSize);
- break;
- default:
- error("Unhandled bitmap compression %d", compType);
- break;
- }
- delete[] srcData;
-}
-
-} // end of namespace Kyra
-