aboutsummaryrefslogtreecommitdiff
path: root/engines/m4/resource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/m4/resource.cpp')
-rw-r--r--engines/m4/resource.cpp530
1 files changed, 0 insertions, 530 deletions
diff --git a/engines/m4/resource.cpp b/engines/m4/resource.cpp
deleted file mode 100644
index f5b2050052..0000000000
--- a/engines/m4/resource.cpp
+++ /dev/null
@@ -1,530 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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.
- *
- */
-
-#include "m4/m4.h"
-#include "m4/resource.h"
-#include "m4/events.h"
-
-#include "common/substream.h"
-#include "common/textconsole.h"
-
-namespace M4 {
-
-FileSystem::FileSystem(const char *hashFilename) {
-
- for (int i = 0; i < 10; i++) {
- _hagEntries[i].filename[0] = '\0';
- _hagEntries[i].fileIndex = 0; // Was -1
- _hagEntries[i].hagFile = 0;
- }
-
- Common::File hashFile;
- uint32 hashSize;
-
- hashFile.open(hashFilename);
-
- if (!hashFile.isOpen()) {
- debugCN(kDebugCore, "FileSystem::FileSystem: error opening hash %s\n", hashFilename);
- }
-
- hashSize = hashFile.readUint32LE();
-
- //debugCN(kDebugCore, "FileSystem::FileSystem: hashSize = %d\n", hashSize);
-
- /* load file records and add them to the hash list */
- for (uint i = 0; i < hashSize; i++) {
- HashFileEntry entry;
- hashFile.read(entry.filename, kM4MaxFilenameSize);
- str_lower(entry.filename);
- entry.hagfile = hashFile.readByte();
- hashFile.readByte();
- entry.offset = hashFile.readUint32LE();
- entry.size = hashFile.readUint32LE();
- hashFile.readUint32LE();
-
- if (entry.filename[0]) {
- /*
- debugCN(kDebugCore, " filename: %s\n", entry.filename);
- debugCN(kDebugCore, " hagfile: %d\n", entry.hagfile);
- debugCN(kDebugCore, " disks: %d\n", entry.disks);
- debugCN(kDebugCore, " offset: %08X\n", entry.offset);
- debugCN(kDebugCore, " size: %d\n", entry.size);
- debugCN(kDebugCore, " next: %08X\n", entry.next);
- */
- _fileEntries[entry.filename] = entry;
- }
-
- }
-
- /* load hagfile records and update the list */
- while (!hashFile.eos()) {
- HashHagEntry entry;
- hashFile.read(entry.filename, kM4MaxFilenameSize);
- entry.fileIndex = hashFile.readByte();
- if (hashFile.eos())
- break;
-
- changeExtension(_hagEntries[entry.fileIndex].filename, entry.filename, "HAG");
- _hagEntries[entry.fileIndex].fileIndex = entry.fileIndex;
-
- _hagEntries[entry.fileIndex].hagFile = new Common::File();
- _hagEntries[entry.fileIndex].hagFile->open(_hagEntries[entry.fileIndex].filename);
-
- if (!_hagEntries[entry.fileIndex].hagFile->isOpen()) {
- debugCN(kDebugCore, "FileSystem::FileSystem: error opening hag %s\n", _hagEntries[entry.fileIndex].filename);
- }
-
- }
-
- hashFile.close();
-
-}
-
-FileSystem::~FileSystem() {
-
- for (int i = 0; i < 10; i++) {
- if (_hagEntries[i].hagFile)
- delete _hagEntries[i].hagFile;
- }
-
-}
-
-Common::SeekableReadStream *FileSystem::loadFile(const char *resourceName, bool preloadFlag) {
- const HashFileEntry *hfe = getHashFileEntry(resourceName);
- Common::SeekableReadStream *result = NULL;
-
- if (hfe) {
- //debugCN(kDebugCore, "FileSystem::loadFile() success opening %s\n", filename);
- HashHagEntry *hagEntry = &_hagEntries[hfe->hagfile];
-
- if (preloadFlag) {
- // Creates a MemoryReadStream object that contains all of the resource in memory
- hagEntry->hagFile->seek(hfe->offset);
- result = _hagEntries[hfe->hagfile].hagFile->readStream(hfe->size);
- }
- else
- // Creates a SeekableSubReadStream, which will read the data in from disk as the
- // caller reads in data
- result = new Common::SeekableSubReadStream(hagEntry->hagFile, hfe->offset,
- hfe->offset + hfe->size);
-
- } else {
- debugCN(kDebugCore, "FileSystem::loadFile() error opening %s\n", resourceName);
- }
-
- return result;
-}
-
-const FileSystem::HashFileEntry *FileSystem::getHashFileEntry(const char *filename) {
- char resourceName[20];
- strcpy(resourceName, filename);
- str_lower(resourceName);
-
- FileHashMap::const_iterator entry = _fileEntries.find(filename);
- if (entry != _fileEntries.end())
- return &(entry->_value);
- else
- return NULL;
-}
-
-void FileSystem::changeExtension(char *destName, const char *sourceName, const char *extension) {
- if (sourceName != destName)
- strcpy(destName, sourceName);
- char *dot = strrchr(destName, '.');
- if (dot != NULL)
- *dot = 0;
-
- strcat(destName, ".");
- strcat(destName, extension);
-
- str_upper(destName);
-}
-
-//--------------------------------------------------------------------------
-
-ResourceManager::~ResourceManager() {
- ResourceIterator i;
- for (i = _resources.begin(); i != _resources.end(); ++i) {
- Resource *r = (*i).get();
- delete r->stream;
- }
-}
-
-Common::SeekableReadStream *ResourceManager::get(const char *resourceName, bool preloadFlag) {
- char lowerName[kM4MaxFilenameSize];
-
- strcpy(lowerName, resourceName);
- str_lower(lowerName);
-
- // Check whether the resource is already loaded
- ResourceIterator i;
- for (i = _resources.begin(); i != _resources.end(); ++i) {
- Resource *r = (*i).get();
- if (!strcmp(r->name, resourceName)) {
- // Just in case resource was marked to be purged, reactive it again
- r->flags &= ~kResourcePurge;
-
- // Return the existing copy of the resource
- r->stream->seek(0, SEEK_SET);
- return r->stream;
- }
- }
-
- // the resource wasn't found in the list, load it from disk
- Resource *newRes = new Resource();
- strncpy(newRes->name, resourceName, 63);
- newRes->name[63] = '\0';
- newRes->flags = 0;
- newRes->stream = loadResource(resourceName, preloadFlag);
-
- _resources.push_back(ResourceList::value_type(newRes));
- return newRes->stream;
-}
-
-void ResourceManager::toss(const char *resourceName) {
- ResourceIterator i;
- for (i = _resources.begin(); i != _resources.end(); ++i) {
- Resource *r = (*i).get();
-
- if (!strcmp(r->name, resourceName)) {
- r->flags |= kResourcePurge;
- //debugCN(kDebugCore, "M4ResourceManager::toss: mark resource %s to be purged\n", resourceName);
- }
- }
-}
-
-void ResourceManager::purge() {
- ResourceIterator i = _resources.begin();
- while (i != _resources.end()) {
- Resource *r = (*i).get();
-
- if (r->flags & kResourcePurge) {
- delete r->stream;
- i = _resources.erase(i);
- } else {
- ++i;
- }
- }
-}
-
-void ResourceManager::dump() {
- _vm->_events->getConsole()->DebugPrintf("Scene resources:\n");
-
- int index = 0;
- ResourceIterator i;
- for (i = _resources.begin(); i != _resources.end(); ++i) {
- Resource *r = (*i).get();
-
- if (!(r->flags & kResourcePurge)) {
- _vm->_events->getConsole()->DebugPrintf(
- "Resource #%i, name: %s, handle pointer: %p, size: %d, flags: %02X\n",
- index++, r->name, r->buffer, r->stream->size(), r->flags);
- }
- }
-}
-
-//--------------------------------------------------------------------------
-
-const char *madsConcatString = "MADSCONCAT";
-
-ResourceType MADSResourceManager::getResourceType(const char *resourceName) {
- if (!strncmp(resourceName, "RM", 2)) {
- // Room resource
- return RESTYPE_ROOM;
- } else if (!strncmp(resourceName, "SC", 2)) {
- // SC resource
- return RESTYPE_SC;
- } else if (strstr(resourceName, ".TXT")) {
- // Text resource
- return RESTYPE_TEXT;
- } else if (strstr(resourceName, ".QUO")) {
- // QUO resource
- return RESTYPE_QUO;
- } else if (*resourceName == 'I') {
- // I resource
- return RESTYPE_I;
- } else if (!strncmp(resourceName, "OB", 2)) {
- // OB resource
- return RESTYPE_OB;
- } else if (!strncmp(resourceName, "FONT", 4)) {
- // FONT resource
- return RESTYPE_FONT;
- } else if (!strncmp(resourceName, "SOUND", 5)) {
- // SOUND resource
- return RESTYPE_SOUND;
- } else if (!strncmp(resourceName, "SPCHC", 5)) {
- // SPEECH resource
- return RESTYPE_SPEECH;
- }
-
- // Check for a known extension
- const char *extPos = strchr(resourceName, '.');
- if (extPos) {
- ++extPos;
- if (!strcmp(extPos, "FL") || !strcmp(extPos, "LBM") || !strcmp(extPos, "ANM") ||
- !strcmp(extPos, "AA") || !strcmp(extPos, "SS")) {
- return RESTYPE_HAS_EXT;
- }
- }
-
- return RESTYPE_NO_EXT;
-}
-
-const char *MADSResourceManager::getResourceFilename(const char *resourceName) {
- static char outputFilename[64];
-
- ResourceType resType = getResourceType(resourceName);
-
- strcpy(outputFilename, "GLOBAL.HAG");
-
- if ((resType == RESTYPE_ROOM) || (resType == RESTYPE_SC)) {
- int value = atoi(resourceName + 2);
- int hagFileNum = (resType == RESTYPE_ROOM) ? value / 100 : value;
-
- if (hagFileNum > 0)
- sprintf(outputFilename, "SECTION%d.HAG", hagFileNum);
- }
-
- if (resType == RESTYPE_SPEECH)
- strcpy(outputFilename, "SPEECH.HAG");
-
- return outputFilename;
-}
-
-/**
- * Forms a resource name based on the passed specifiers
- */
-const char *MADSResourceManager::getResourceName(char asciiCh, int prefix, ExtensionType extType,
- const char *suffix, int index) {
- static char resourceName[100];
-
- if (prefix <= 0)
- strcpy(resourceName, "*");
- else {
- if (prefix < 100)
- strcpy(resourceName, "*SC");
- else
- strcpy(resourceName, "*RM");
- sprintf(resourceName + 3, "%.3d", prefix);
- }
-
- // Append the specified ascii prefix character
- char asciiStr[2];
- asciiStr[0] = asciiCh;
- asciiStr[1] = '\0';
- strcat(resourceName, asciiStr);
-
- // Add in the index specified
- if (index >= 0)
- sprintf(resourceName + strlen(resourceName), "%d", index);
-
- // Add in any suffix
- if (suffix)
- strcat(resourceName, suffix);
-
- // Handle extension types
- switch (extType) {
- case EXTTYPE_SS:
- strcat(resourceName, ".SS");
- break;
- case EXTTYPE_AA:
- strcat(resourceName, ".AA");
- break;
- case EXTTYPE_DAT:
- strcat(resourceName, ".DAT");
- break;
- case EXTTYPE_HH:
- strcat(resourceName, ".HH");
- break;
- case EXTTYPE_ART:
- strcat(resourceName, ".ART");
- break;
- case EXTTYPE_INT:
- strcat(resourceName, ".INT");
- break;
- default:
- break;
- }
-
- return &resourceName[0];
-}
-
-/**
- * Another variation for forming resource names
- */
-const char *MADSResourceManager::getResourceName(ResourcePrefixType prefixType, int idx, const char *extension) {
- static char resourceName[100];
-
- strcpy(resourceName, "*");
-
- if (extension) {
- switch (prefixType) {
- case RESPREFIX_GL:
- strcat(resourceName, "GL000");
- break;
- case RESPREFIX_SC:
- case RESPREFIX_RM:
- strcat(resourceName, (prefixType == RESPREFIX_SC) ? "SC" : "RM");
- sprintf(resourceName + 3, "%.3d", idx);
- break;
- default:
- break;
- }
-
- strcat(resourceName, extension);
- }
-
- return &resourceName[0];
-}
-
-/**
- * Forms an AA resource name based on the given passed index
- */
-const char *MADSResourceManager::getAAName(int index) {
- return getResourceName('I', 0, EXTTYPE_AA, NULL, index);
-}
-
-Common::SeekableReadStream *MADSResourceManager::loadResource(const char *resourceName, bool loadFlag) {
- Common::File hagFile;
- uint32 offset = 0, size = 0;
-
- // If the first character is a '@' then look for an external file
-
- if (*resourceName == '@') {
- ++resourceName;
-
- hagFile.open(resourceName);
- if (loadFlag)
- return hagFile.readStream(hagFile.size());
- else
- return new Common::SeekableSubReadStream(&hagFile, 0, hagFile.size());
- }
-
- // If the first character is the wildcard (resource indicator), skip over it
- if (*resourceName == '*')
- ++resourceName;
-
- char resName[20];
- strcpy(resName, resourceName);
- str_upper(resName);
-
- hagFile.open(getResourceFilename(resName));
-
- // Validate hag file header
- char headerBuffer[16];
- if ((hagFile.read(headerBuffer, 16) != 16) || (strncmp(headerBuffer, madsConcatString, 10) != 0))
- error("Invalid HAG file opened");
-
- int numEntries = hagFile.readUint16LE();
-
- int resIndex = -1;
- while (++resIndex < numEntries) {
- // Read in the details of the next resource
- char resourceBuffer[14];
- offset = hagFile.readUint32LE();
- size = hagFile.readUint32LE();
- hagFile.read(resourceBuffer, 14);
-
- if (!strcmp(resName, resourceBuffer))
- break;
- }
-
- if (resIndex == numEntries)
- error("Invalid resource '%s' specified", resourceName);
-
- // Get the resource, either loading it in it's entirely or getting a stream reference
-
- if (loadFlag) {
- hagFile.seek(offset);
- return hagFile.readStream(size);
- } else {
- return new Common::SeekableSubReadStream(&hagFile, offset, offset + size);
- }
-}
-
-bool MADSResourceManager::resourceExists(const char *resourceName) {
- Common::File hagFile;
-
- // If the first character is the wildcard (resource indicator), skip over it
- if (*resourceName == '*')
- ++resourceName;
-
- char resName[20];
- strcpy(resName, resourceName);
- str_upper(resName);
-
- hagFile.open(getResourceFilename(resName));
-
- // Validate hag file header
- char headerBuffer[16];
- if ((hagFile.read(headerBuffer, 16) != 16) || (strncmp(headerBuffer, madsConcatString, 10) != 0))
- error("Invalid HAG file opened");
-
- int numEntries = hagFile.readUint16LE();
-
- int resIndex = -1;
- while (++resIndex < numEntries) {
- // Read in the details of the next resource
- char resourceBuffer[14];
- hagFile.readUint32LE(); // offset
- hagFile.readUint32LE(); // size
- hagFile.read(resourceBuffer, 14);
-
- if (!strcmp(resName, resourceBuffer))
- break;
- }
-
- if (resIndex == numEntries)
- return false;
- else
- return true;
-}
-
-//--------------------------------------------------------------------------
-
-M4ResourceManager::M4ResourceManager(MadsM4Engine *vm): ResourceManager(vm) {
- _hfs = new FileSystem(_vm->getGameFile(kFileTypeHash));
-}
-
-M4ResourceManager::~M4ResourceManager() {
-}
-
-Common::SeekableReadStream *M4ResourceManager::loadResource(const char *resourceName, bool preloadFlag) {
- //debugCN(kDebugCore, "M4ResourceManager::loadResource() loading resource %s\n", resourceName);
- Common::SeekableReadStream* result = NULL;
- if (_hfs) {
- // actually load the resource
- result = _hfs->loadFile(resourceName, preloadFlag);
- if (!result) {
- error("M4ResourceManager::loadResource() Resource %s not found", resourceName);
- }
- } else {
- error("M4ResourceManager::loadResource() No FileSystem attached");
- }
- return result;
-}
-
-bool M4ResourceManager::resourceExists(const char *resourceName) {
- return (_hfs->getHashFileEntry(resourceName) != NULL);
-}
-
-} // End of namespace M4