aboutsummaryrefslogtreecommitdiff
path: root/sword1/resman.cpp
diff options
context:
space:
mode:
authorMax Horn2006-02-11 22:45:04 +0000
committerMax Horn2006-02-11 22:45:04 +0000
commit26ee630756ebdd7c96bccede0881a8c8b98e8f2b (patch)
tree26e378d5cf990a2b81c2c96e9e683a7f333b62e8 /sword1/resman.cpp
parent2a9a0d4211b1ea5723f1409d91cb95de8984429e (diff)
downloadscummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.gz
scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.bz2
scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.zip
Moved engines to the new engines/ directory
svn-id: r20582
Diffstat (limited to 'sword1/resman.cpp')
-rw-r--r--sword1/resman.cpp421
1 files changed, 0 insertions, 421 deletions
diff --git a/sword1/resman.cpp b/sword1/resman.cpp
deleted file mode 100644
index fd86993dfa..0000000000
--- a/sword1/resman.cpp
+++ /dev/null
@@ -1,421 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2003-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/scummsys.h"
-#include "sword1/memman.h"
-#include "sword1/resman.h"
-#include "sword1/sworddefs.h"
-#include "base/engine.h"
-#include "common/config-manager.h"
-#include "common/util.h"
-#include "common/str.h"
-#include "sword1/swordres.h"
-
-#include "gui/message.h"
-#include "gui/newgui.h"
-
-namespace Sword1 {
- void guiFatalError(char *msg) {
- // Displays a dialog on-screen before terminating the engine.
- // TODO: We really need to setup a special palette for cases when
- // the engine is erroring before setting one... otherwise invisible cursor :)
-
- GUI::MessageDialog dialog(msg);
- dialog.runModal();
- error(msg);
-}
-
-#define MAX_PATH_LEN 260
-
-ResMan::ResMan(const char *fileName) {
- _openCluStart = _openCluEnd = NULL;
- _openClus = 0;
- _memMan = new MemMan();
- loadCluDescript(fileName);
-}
-
-ResMan::~ResMan(void) {
-#if 0
- for (uint32 clusCnt = 0; clusCnt < _prj.noClu; clusCnt++) {
- Clu *cluster = _prj.clu[clusCnt];
- if (cluster) {
- for (uint32 grpCnt = 0; grpCnt < cluster->noGrp; grpCnt++) {
- Grp *group = cluster->grp[grpCnt];
- if (group) {
- for (uint32 resCnt = 0; resCnt < group->noRes; resCnt++) {
- if (group->resHandle[resCnt].cond == MEM_DONT_FREE) {
- warning("ResMan::~ResMan: Resource %02X.%04X.%02X is still open",
- clusCnt + 1, grpCnt, resCnt);
- }
- }
- }
- }
- }
- }
- debug(0, "ResMan closed\n");
-#endif
- flush();
- freeCluDescript();
- delete _memMan;
-}
-
-void ResMan::loadCluDescript(const char *fileName) {
- Common::File file;
- file.open(fileName);
-
- if (!file.isOpen()) {
- char msg[512];
- sprintf(msg, "Couldn't open CLU description '%s'\n\nIf you are running from CD, please ensure you have read the ScummVM documentation regarding multi-cd games.", fileName);
- guiFatalError(msg);
- }
-
-
- _prj.noClu = file.readUint32LE();
- _prj.clu = new Clu[_prj.noClu];
- memset(_prj.clu, 0, _prj.noClu * sizeof(Clu));
-
- uint32 *cluIndex = (uint32*)malloc(_prj.noClu * 4);
- file.read(cluIndex, _prj.noClu * 4);
-
- for (uint32 clusCnt = 0; clusCnt < _prj.noClu; clusCnt++)
- if (cluIndex[clusCnt]) {
- Clu *cluster = _prj.clu + clusCnt;
- file.read(cluster->label, MAX_LABEL_SIZE);
-
- cluster->file = NULL;
- cluster->noGrp = file.readUint32LE();
- cluster->grp = new Grp[cluster->noGrp];
- cluster->nextOpen = NULL;
- memset(cluster->grp, 0, cluster->noGrp * sizeof(Grp));
- cluster->refCount = 0;
-
- uint32 *grpIndex = (uint32*)malloc(cluster->noGrp * 4);
- file.read(grpIndex, cluster->noGrp * 4);
-
- for (uint32 grpCnt = 0; grpCnt < cluster->noGrp; grpCnt++)
- if (grpIndex[grpCnt]) {
- Grp *group = cluster->grp + grpCnt;
- group->noRes = file.readUint32LE();
- group->resHandle = new MemHandle[group->noRes];
- group->offset = new uint32[group->noRes];
- group->length = new uint32[group->noRes];
- uint32 *resIdIdx = (uint32*)malloc(group->noRes * 4);
- file.read(resIdIdx, group->noRes * 4);
-
- for (uint32 resCnt = 0; resCnt < group->noRes; resCnt++) {
- if (resIdIdx[resCnt]) {
- group->offset[resCnt] = file.readUint32LE();
- group->length[resCnt] = file.readUint32LE();
- _memMan->initHandle(group->resHandle + resCnt);
- } else {
- group->offset[resCnt] = 0xFFFFFFFF;
- group->length[resCnt] = 0;
- _memMan->initHandle(group->resHandle + resCnt);
- }
- }
- free(resIdIdx);
- }
- free(grpIndex);
- }
- free(cluIndex);
-
- if (_prj.clu[3].grp[5].noRes == 29)
- for (uint8 cnt = 0; cnt < 29; cnt++)
- _srIdList[cnt] = 0x04050000 | cnt;
-}
-
-void ResMan::freeCluDescript(void) {
-
- for (uint32 clusCnt = 0; clusCnt < _prj.noClu; clusCnt++) {
- Clu *cluster = _prj.clu + clusCnt;
- for (uint32 grpCnt = 0; grpCnt < cluster->noGrp; grpCnt++) {
- Grp *group = cluster->grp + grpCnt;
- if (group->resHandle != NULL) {
- for (uint32 resCnt = 0; resCnt < group->noRes; resCnt++)
- _memMan->freeNow(group->resHandle + resCnt);
-
- delete[] group->resHandle;
- delete[] group->offset;
- delete[] group->length;
- }
- }
- delete[] cluster->grp;
-
- if (cluster->file != NULL)
- delete cluster->file;
- }
- delete[] _prj.clu;
-}
-
-void ResMan::flush(void) {
- for (uint32 clusCnt = 0; clusCnt < _prj.noClu; clusCnt++) {
- Clu *cluster = _prj.clu + clusCnt;
- for (uint32 grpCnt = 0; grpCnt < cluster->noGrp; grpCnt++) {
- Grp *group = cluster->grp + grpCnt;
- for (uint32 resCnt = 0; resCnt < group->noRes; resCnt++)
- if (group->resHandle[resCnt].cond != MEM_FREED) {
- _memMan->setCondition(group->resHandle + resCnt, MEM_CAN_FREE);
- group->resHandle[resCnt].refCount = 0;
- }
- }
- if (cluster->file) {
- cluster->file->close();
- delete cluster->file;
- cluster->file = NULL;
- cluster->refCount = 0;
- }
- }
- _openClus = 0;
- _openCluStart = _openCluEnd = NULL;
- // the memory manager cached the blocks we asked it to free, so explicitly make it free them
- _memMan->flush();
-}
-
-void *ResMan::fetchRes(uint32 id) {
- MemHandle *memHandle = resHandle(id);
- if (!memHandle->data)
- error("fetchRes:: resource %d is not open!", id);
- return memHandle->data;
-}
-
-void *ResMan::openFetchRes(uint32 id) {
- resOpen(id);
- return fetchRes(id);
-}
-
-void ResMan::dumpRes(uint32 id) {
- char outn[30];
- sprintf(outn, "DUMP%08X.BIN", id);
- Common::File outf;
- if (outf.open(outn, Common::File::kFileWriteMode)) {
- resOpen(id);
- MemHandle *memHandle = resHandle(id);
- outf.write(memHandle->data, memHandle->size);
- outf.close();
- resClose(id);
- }
-}
-
-Header *ResMan::lockScript(uint32 scrID) {
- if (!_scriptList[scrID / ITM_PER_SEC])
- error("Script id %d not found.\n", scrID);
- scrID = _scriptList[scrID / ITM_PER_SEC];
-#ifdef SCUMM_BIG_ENDIAN
- MemHandle *memHandle = resHandle(scrID);
- if (memHandle->cond == MEM_FREED)
- openScriptResourceBigEndian(scrID);
- else
- resOpen(scrID);
-#else
- resOpen(scrID);
-#endif
- return (Header*)resHandle(scrID)->data;
-}
-
-void ResMan::unlockScript(uint32 scrID) {
- resClose(_scriptList[scrID / ITM_PER_SEC]);
-}
-
-void *ResMan::cptResOpen(uint32 id) {
-#ifdef SCUMM_BIG_ENDIAN
- MemHandle *memHandle = resHandle(id);
- if (memHandle->cond == MEM_FREED)
- openCptResourceBigEndian(id);
- else
- resOpen(id);
-#else
- resOpen(id);
-#endif
- return resHandle(id)->data;
-}
-
-void ResMan::resOpen(uint32 id) { // load resource ID into memory
- MemHandle *memHandle = resHandle(id);
- if (memHandle->cond == MEM_FREED) { // memory has been freed
- uint32 size = resLength(id);
- _memMan->alloc(memHandle, size);
- Common::File *clusFile = resFile(id);
- assert(clusFile);
- clusFile->seek( resOffset(id) );
- clusFile->read( memHandle->data, size);
- if (clusFile->ioFailed()) {
- error("Can't read %d bytes from offset %d from cluster file %s\nResource ID: %d (%08X)\n", size, resOffset(id), _prj.clu[(id >> 24) - 1].label, id, id);
- }
- } else
- _memMan->setCondition(memHandle, MEM_DONT_FREE);
-
- memHandle->refCount++;
- if (memHandle->refCount > 20) {
- debug(1, "%d references to id %d. Guess there's something wrong.", memHandle->refCount, id);
- }
-}
-
-void ResMan::resClose(uint32 id) {
- MemHandle *handle = resHandle(id);
- if (!handle->refCount) {
- warning("Resource Manager fail: unlocking object with refCount 0. Id: %d\n", id);
- } else {
- handle->refCount--;
- if (!handle->refCount)
- _memMan->setCondition( handle, MEM_CAN_FREE);
- }
-}
-
-FrameHeader *ResMan::fetchFrame(void *resourceData, uint32 frameNo) {
- uint8 *frameFile = (uint8*)resourceData;
- uint8 *idxData = frameFile + sizeof(Header);
- if (frameNo >= READ_LE_UINT32(idxData))
- error("fetchFrame:: frame %d doesn't exist in resource.", frameNo);
- frameFile += READ_LE_UINT32(idxData + (frameNo+1) * 4);
- return (FrameHeader*)frameFile;
-}
-
-Common::File *ResMan::resFile(uint32 id) {
- Clu *cluster = _prj.clu + ((id >> 24) - 1);
- if (cluster->file == NULL) {
- _openClus++;
- if (_openCluEnd == NULL) {
- _openCluStart = _openCluEnd = cluster;
- } else {
- _openCluEnd->nextOpen = cluster;
- _openCluEnd = cluster;
- }
- cluster->file = new Common::File();
- char fileName[15];
- sprintf(fileName, "%s.CLU", _prj.clu[(id >> 24)-1].label);
- cluster->file->open(fileName);
-
- if (!cluster->file->isOpen()) {
- char msg[512];
- sprintf(msg, "Couldn't open game cluster file '%s'\n\nIf you are running from CD, please ensure you have read the ScummVM documentation regarding multi-cd games.", fileName);
- guiFatalError(msg);
- }
- while (_openClus > MAX_OPEN_CLUS) {
- assert(_openCluStart);
- Clu *closeClu = _openCluStart;
- _openCluStart = _openCluStart->nextOpen;
-
- closeClu->file->close();
- delete closeClu->file;
- closeClu->file = NULL;
- closeClu->nextOpen = NULL;
- _openClus--;
- }
- }
- return cluster->file;
-}
-
-MemHandle *ResMan::resHandle(uint32 id) {
- if ((id >> 16) == 0x0405)
- id = _srIdList[id & 0xFFFF];
- uint8 cluster = (uint8)((id >> 24) - 1);
- uint8 group = (uint8)(id >> 16);
-
- return &(_prj.clu[cluster].grp[group].resHandle[id & 0xFFFF]);
-}
-
-uint32 ResMan::resLength(uint32 id) {
- if ((id >> 16) == 0x0405)
- id = _srIdList[id & 0xFFFF];
- uint8 cluster = (uint8)((id >> 24) - 1);
- uint8 group = (uint8)(id >> 16);
-
- return _prj.clu[cluster].grp[group].length[id & 0xFFFF];
-}
-
-uint32 ResMan::resOffset(uint32 id) {
- if ((id >> 16) == 0x0405)
- id = _srIdList[id & 0xFFFF];
- uint8 cluster = (uint8)((id >> 24) - 1);
- uint8 group = (uint8)(id >> 16);
-
- return _prj.clu[cluster].grp[group].offset[id & 0xFFFF];
-}
-
-void ResMan::openCptResourceBigEndian(uint32 id) {
- resOpen(id);
- MemHandle *handle = resHandle(id);
- uint32 totSize = handle->size;
- uint32 *data = (uint32*)((uint8*)handle->data + sizeof(Header));
- totSize -= sizeof(Header);
- if (totSize & 3)
- error("Illegal compact size for id %d: %d", id, totSize);
- totSize /= 4;
- for (uint32 cnt = 0; cnt < totSize; cnt++) {
- *data = READ_LE_UINT32(data);
- data++;
- }
-}
-
-void ResMan::openScriptResourceBigEndian(uint32 id) {
- resOpen(id);
- MemHandle *handle = resHandle(id);
- // uint32 totSize = handle->size;
- Header *head = (Header*)handle->data;
- head->comp_length = FROM_LE_32(head->comp_length);
- head->decomp_length = FROM_LE_32(head->decomp_length);
- head->version = FROM_LE_16(head->version);
- uint32 *data = (uint32*)((uint8*)handle->data + sizeof(Header));
- uint32 size = handle->size - sizeof(Header);
- if (size & 3)
- error("Odd size during script endian conversion. Resource ID =%d, size = %d", id, size);
- size >>= 2;
- for (uint32 cnt = 0; cnt < size; cnt++) {
- *data = READ_LE_UINT32(data);
- data++;
- }
-}
-
-uint32 ResMan::_srIdList[29] = { // the file numbers differ for the control panel file IDs, so we need this array
- OTHER_SR_FONT, // SR_FONT
- 0x04050000, // SR_BUTTON
- OTHER_SR_REDFONT, // SR_REDFONT
- 0x04050001, // SR_PALETTE
- 0x04050002, // SR_PANEL_ENGLISH
- 0x04050003, // SR_PANEL_FRENCH
- 0x04050004, // SR_PANEL_GERMAN
- 0x04050005, // SR_PANEL_ITALIAN
- 0x04050006, // SR_PANEL_SPANISH
- 0x04050007, // SR_PANEL_AMERICAN
- 0x04050008, // SR_TEXT_BUTTON
- 0x04050009, // SR_SPEED
- 0x0405000A, // SR_SCROLL1
- 0x0405000B, // SR_SCROLL2
- 0x0405000C, // SR_CONFIRM
- 0x0405000D, // SR_VOLUME
- 0x0405000E, // SR_VLIGHT
- 0x0405000F, // SR_VKNOB
- 0x04050010, // SR_WINDOW
- 0x04050011, // SR_SLAB1
- 0x04050012, // SR_SLAB2
- 0x04050013, // SR_SLAB3
- 0x04050014, // SR_SLAB4
- 0x04050015, // SR_BUTUF
- 0x04050016, // SR_BUTUS
- 0x04050017, // SR_BUTDS
- 0x04050018, // SR_BUTDF
- 0x04050019, // SR_DEATHPANEL
- 0,
-};
-
-} // End of namespace Sword1