diff options
author | Max Horn | 2005-03-31 21:39:31 +0000 |
---|---|---|
committer | Max Horn | 2005-03-31 21:39:31 +0000 |
commit | ac247c9b94ec49dac4a5febf94bab2c76e7ed114 (patch) | |
tree | 558387ff7108430cbb476381c499e4185bb877a6 /scumm | |
parent | 59331fe5352420a93aaa3ddb7066993cf484f7d8 (diff) | |
download | scummvm-rg350-ac247c9b94ec49dac4a5febf94bab2c76e7ed114.tar.gz scummvm-rg350-ac247c9b94ec49dac4a5febf94bab2c76e7ed114.tar.bz2 scummvm-rg350-ac247c9b94ec49dac4a5febf94bab2c76e7ed114.zip |
Started to move some resource related code into a new class ResourceManager (hypothetic goal for the future: use ResourceManager in ScummEx)
svn-id: r17311
Diffstat (limited to 'scumm')
-rw-r--r-- | scumm/akos.cpp | 2 | ||||
-rw-r--r-- | scumm/gfx.cpp | 4 | ||||
-rw-r--r-- | scumm/imuse_digi/dimuse_sndmgr.cpp | 4 | ||||
-rw-r--r-- | scumm/insane/insane.cpp | 4 | ||||
-rw-r--r-- | scumm/object.cpp | 18 | ||||
-rw-r--r-- | scumm/resource.cpp | 127 | ||||
-rw-r--r-- | scumm/saveload.cpp | 2 | ||||
-rw-r--r-- | scumm/script.cpp | 4 | ||||
-rw-r--r-- | scumm/script_v100he.cpp | 10 | ||||
-rw-r--r-- | scumm/script_v2.cpp | 4 | ||||
-rw-r--r-- | scumm/script_v5.cpp | 28 | ||||
-rw-r--r-- | scumm/script_v6.cpp | 26 | ||||
-rw-r--r-- | scumm/script_v7he.cpp | 30 | ||||
-rw-r--r-- | scumm/script_v8.cpp | 28 | ||||
-rw-r--r-- | scumm/scumm.cpp | 36 | ||||
-rw-r--r-- | scumm/scumm.h | 67 | ||||
-rw-r--r-- | scumm/sound.cpp | 4 | ||||
-rw-r--r-- | scumm/string.cpp | 2 | ||||
-rw-r--r-- | scumm/verbs.cpp | 2 | ||||
-rw-r--r-- | scumm/wiz_he.cpp | 2 |
20 files changed, 211 insertions, 193 deletions
diff --git a/scumm/akos.cpp b/scumm/akos.cpp index 18145d8580..548a019e91 100644 --- a/scumm/akos.cpp +++ b/scumm/akos.cpp @@ -739,7 +739,7 @@ byte AkosRenderer::codec1(int xmoveCur, int ymoveCur) { /* implement custom scale table */ v1.scaletable = (_vm->_features & GF_HUMONGOUS) ? oldScaleTable : defaultScaleTable; - if (_vm->VAR_CUSTOMSCALETABLE != 0xFF && _vm->isResourceLoaded(rtString, _vm->VAR(_vm->VAR_CUSTOMSCALETABLE))) { + if (_vm->VAR_CUSTOMSCALETABLE != 0xFF && _vm->res.isResourceLoaded(rtString, _vm->VAR(_vm->VAR_CUSTOMSCALETABLE))) { v1.scaletable = _vm->getStringAddressVar(_vm->VAR_CUSTOMSCALETABLE); } diff --git a/scumm/gfx.cpp b/scumm/gfx.cpp index eb61e77423..1e4e648847 100644 --- a/scumm/gfx.cpp +++ b/scumm/gfx.cpp @@ -254,8 +254,8 @@ void ScummEngine::initScreens(int b, int h) { int adj = 0; for (i = 0; i < 3; i++) { - nukeResource(rtBuffer, i + 1); - nukeResource(rtBuffer, i + 5); + res.nukeResource(rtBuffer, i + 1); + res.nukeResource(rtBuffer, i + 5); } if (!getResourceAddress(rtBuffer, 4)) { diff --git a/scumm/imuse_digi/dimuse_sndmgr.cpp b/scumm/imuse_digi/dimuse_sndmgr.cpp index d38caa8afb..924d0e2193 100644 --- a/scumm/imuse_digi/dimuse_sndmgr.cpp +++ b/scumm/imuse_digi/dimuse_sndmgr.cpp @@ -342,7 +342,7 @@ ImuseDigiSndMgr::soundStruct *ImuseDigiSndMgr::openSound(int32 soundId, const ch assert(soundName[0] == 0); // Paranoia check _vm->ensureResourceLoaded(rtSound, soundId); - _vm->lock(rtSound, soundId); + _vm->res.lock(rtSound, soundId); ptr = _vm->getResourceAddress(rtSound, soundId); if (ptr == NULL) { closeSound(sound); @@ -413,7 +413,7 @@ void ImuseDigiSndMgr::closeSound(soundStruct *soundHandle) { found = true; } if (!found) - _vm->unlock(rtSound, soundHandle->soundId); + _vm->res.unlock(rtSound, soundHandle->soundId); } if (soundHandle->compressedStream) diff --git a/scumm/insane/insane.cpp b/scumm/insane/insane.cpp index a8a2da98cd..7ab6e0ee0f 100644 --- a/scumm/insane/insane.cpp +++ b/scumm/insane/insane.cpp @@ -1119,7 +1119,7 @@ int Insane::smlayer_loadSound(int id, int flag, int phase) { if (phase == 2) _vm->ensureResourceLoaded(rtSound, resid); - _vm->setResourceCounter(rtSound, resid, 1); + _vm->res.setResourceCounter(rtSound, resid, 1); if (phase == 1) { _objArray2Idx2++; @@ -1141,7 +1141,7 @@ int Insane::smlayer_loadCostume(int id, int phase) { return 0; _vm->ensureResourceLoaded(rtCostume, resid); - _vm->setResourceCounter(rtCostume, resid, 1); + _vm->res.setResourceCounter(rtCostume, resid, 1); // smlayer_lock(rtCostume, resid); // FIXME diff --git a/scumm/object.cpp b/scumm/object.cpp index f406b36158..28a4f86955 100644 --- a/scumm/object.cpp +++ b/scumm/object.cpp @@ -521,7 +521,7 @@ void ScummEngine::clearRoomObjects() { } else { // Nuke all unlocked flObjects if (!(res.flags[rtFlObject][_objs[i].fl_object_index] & RF_LOCK)) { - nukeResource(rtFlObject, _objs[i].fl_object_index); + res.nukeResource(rtFlObject, _objs[i].fl_object_index); _objs[i].obj_nr = 0; _objs[i].fl_object_index = 0; } @@ -896,7 +896,7 @@ void ScummEngine::clearOwnerOf(int obj) { if (_objs[i].obj_nr == obj) { if (!_objs[i].fl_object_index) return; - nukeResource(rtFlObject, _objs[i].fl_object_index); + res.nukeResource(rtFlObject, _objs[i].fl_object_index); _objs[i].obj_nr = 0; _objs[i].fl_object_index = 0; } @@ -908,7 +908,7 @@ void ScummEngine::clearOwnerOf(int obj) { if (_inventory[i] == obj) { j = whereIsObject(obj); if (j == WIO_INVENTORY) { - nukeResource(rtInventory, i); + res.nukeResource(rtInventory, i); _inventory[i] = 0; } a = _inventory; @@ -990,7 +990,7 @@ void ScummEngine::setObjectName(int obj) { for (i = 0; i < _numNewNames; i++) { if (_newNames[i] == obj) { - nukeResource(rtObjectName, i); + res.nukeResource(rtObjectName, i); _newNames[i] = 0; break; } @@ -1420,7 +1420,7 @@ void ScummEngine::nukeFlObjects(int min, int max) { for (i = (_numLocalObjects-1), od = _objs; --i >= 0; od++) if (od->fl_object_index && od->obj_nr >= min && od->obj_nr <= max) { - nukeResource(rtFlObject, od->fl_object_index); + res.nukeResource(rtFlObject, od->fl_object_index); od->obj_nr = 0; od->fl_object_index = 0; } @@ -1638,9 +1638,9 @@ void ScummEngine::loadFlObject(uint object, uint room) { isRoomLocked = ((res.flags[rtRoom][room] & RF_LOCK) != 0); isRoomScriptsLocked = ((res.flags[rtRoomScripts][room] & RF_LOCK) != 0); if (!isRoomLocked) - lock(rtRoom, room); + res.lock(rtRoom, room); if (_version == 8 && !isRoomScriptsLocked) - lock(rtRoomScripts, room); + res.lock(rtRoomScripts, room); // Allocate slot & memory for floating object slot = findFlObjectSlot(); @@ -1656,9 +1656,9 @@ void ScummEngine::loadFlObject(uint object, uint room) { // Unlock room/roomScripts if (!isRoomLocked) - unlock(rtRoom, room); + res.unlock(rtRoom, room); if (_version == 8 && !isRoomScriptsLocked) - unlock(rtRoomScripts, room); + res.unlock(rtRoomScripts, room); // Setup local object flags setupRoomObject(od, flob, flob); diff --git a/scumm/resource.cpp b/scumm/resource.cpp index 4bd07b1056..0899ffcd68 100644 --- a/scumm/resource.cpp +++ b/scumm/resource.cpp @@ -631,7 +631,7 @@ void ScummEngine::loadCharset(int no) { void ScummEngine::nukeCharset(int i) { checkRange(_numCharsets - 1, 1, i, "Nuking illegal charset %d"); - nukeResource(rtCharset, i); + res.nukeResource(rtCharset, i); } void ScummEngine::ensureResourceLoaded(int type, int i) { @@ -749,7 +749,7 @@ int ScummEngine::loadResource(int type, int idx) { return 1; } - nukeResource(type, idx); + res.nukeResource(type, idx); error("Cannot read resource"); } @@ -771,7 +771,7 @@ byte *ScummEngine::getResourceAddress(int type, int idx) { byte *ptr; CHECK_HEAP - if (!validateResource("getResourceAddress", type, idx)) + if (!res.validateResource("getResourceAddress", type, idx)) return NULL; if (!res.address[type]) { @@ -788,7 +788,7 @@ byte *ScummEngine::getResourceAddress(int type, int idx) { return NULL; } - setResourceCounter(type, idx, 1); + res.setResourceCounter(type, idx, 1); debugC(DEBUG_RESOURCE, "getResourceAddress(%s,%d) == %p", resTypeFromId(type), idx, ptr + sizeof(MemBlkHeader)); return ptr + sizeof(MemBlkHeader); @@ -811,9 +811,23 @@ byte *ScummEngine::getStringAddressVar(int i) { return getStringAddress(_scummVars[i]); } -void ScummEngine::setResourceCounter(int type, int idx, byte flag) { - res.flags[type][idx] &= ~RF_USAGE; - res.flags[type][idx] |= flag; +void ResourceManager::increaseResourceCounter() { + int i, j; + byte counter; + + for (i = rtFirst; i <= rtLast; i++) { + for (j = num[i]; --j >= 0;) { + counter = flags[i][j] & RF_USAGE; + if (counter && counter < RF_USAGE_MAX) { + setResourceCounter(i, j, counter + 1); + } + } + } +} + +void ResourceManager::setResourceCounter(int type, int idx, byte flag) { + flags[type][idx] &= ~RF_USAGE; + flags[type][idx] |= flag; } /* 2 bytes safety area to make "precaching" of bytes in the gdi drawer easier */ @@ -825,9 +839,9 @@ byte *ScummEngine::createResource(int type, int idx, uint32 size) { CHECK_HEAP debugC(DEBUG_RESOURCE, "createResource(%s,%d,%d)", resTypeFromId(type), idx, size); - if (!validateResource("allocating", type, idx)) + if (!res.validateResource("allocating", type, idx)) return NULL; - nukeResource(type, idx); + res.nukeResource(type, idx); expireResources(size); @@ -837,35 +851,41 @@ byte *ScummEngine::createResource(int type, int idx, uint32 size) { error("Out of memory while allocating %d", size); } - _allocatedSize += size; + res._allocatedSize += size; res.address[type][idx] = ptr; ((MemBlkHeader *)ptr)->size = size; - setResourceCounter(type, idx, 1); + res.setResourceCounter(type, idx, 1); return ptr + sizeof(MemBlkHeader); /* skip header */ } -bool ScummEngine::validateResource(const char *str, int type, int idx) const { - if (type < rtFirst || type > rtLast || (uint) idx >= (uint) res.num[type]) { +ResourceManager::ResourceManager(ScummEngine *vm) { + memset(this, 0, sizeof(ResourceManager)); + _vm = vm; +// _allocatedSize = 0; +} + +bool ResourceManager::validateResource(const char *str, int type, int idx) const { + if (type < rtFirst || type > rtLast || (uint) idx >= (uint)num[type]) { warning("%s Illegal Glob type %s (%d) num %d", str, resTypeFromId(type), type, idx); return false; } return true; } -void ScummEngine::nukeResource(int type, int idx) { +void ResourceManager::nukeResource(int type, int idx) { byte *ptr; CHECK_HEAP - if (!res.address[type]) + if (!address[type]) return; - assert(idx >= 0 && idx < res.num[type]); + assert(idx >= 0 && idx < num[type]); - if ((ptr = res.address[type][idx]) != NULL) { + if ((ptr = address[type][idx]) != NULL) { debugC(DEBUG_RESOURCE, "nukeResource(%s,%d)", resTypeFromId(type), idx); - res.address[type][idx] = 0; - res.flags[type][idx] = 0; + address[type][idx] = 0; + flags[type][idx] = 0; _allocatedSize -= ((MemBlkHeader *)ptr)->size; free(ptr); } @@ -896,20 +916,20 @@ int ScummEngine::getResourceDataSize(const byte *ptr) const { return READ_BE_UINT32(ptr - 4) - 8; } -void ScummEngine::lock(int type, int i) { +void ResourceManager::lock(int type, int i) { if (!validateResource("Locking", type, i)) return; - res.flags[type][i] |= RF_LOCK; + flags[type][i] |= RF_LOCK; } -void ScummEngine::unlock(int type, int i) { +void ResourceManager::unlock(int type, int i) { if (!validateResource("Unlocking", type, i)) return; - res.flags[type][i] &= ~RF_LOCK; + flags[type][i] &= ~RF_LOCK; } bool ScummEngine::isResourceInUse(int type, int i) const { - if (!validateResource("isResourceInUse", type, i)) + if (!res.validateResource("isResourceInUse", type, i)) return false; switch (type) { case rtRoom: @@ -927,20 +947,6 @@ bool ScummEngine::isResourceInUse(int type, int i) const { } } -void ScummEngine::increaseResourceCounter() { - int i, j; - byte counter; - - for (i = rtFirst; i <= rtLast; i++) { - for (j = res.num[i]; --j >= 0;) { - counter = res.flags[i][j] & RF_USAGE; - if (counter && counter < RF_USAGE_MAX) { - setResourceCounter(i, j, counter + 1); - } - } - } -} - void ScummEngine::expireResources(uint32 size) { int i, j; byte flag; @@ -948,15 +954,15 @@ void ScummEngine::expireResources(uint32 size) { int best_type, best_res = 0; uint32 oldAllocatedSize; - if (_expire_counter != 0xFF) { - _expire_counter = 0xFF; - increaseResourceCounter(); + if (res._expireCounter != 0xFF) { + res._expireCounter = 0xFF; + res.increaseResourceCounter(); } - if (size + _allocatedSize < _maxHeapThreshold) + if (size + res._allocatedSize < res._maxHeapThreshold) return; - oldAllocatedSize = _allocatedSize; + oldAllocatedSize = res._allocatedSize; do { best_type = 0; @@ -976,32 +982,27 @@ void ScummEngine::expireResources(uint32 size) { if (!best_type) break; - nukeResource(best_type, best_res); - } while (size + _allocatedSize > _minHeapThreshold); + res.nukeResource(best_type, best_res); + } while (size + res._allocatedSize > res._minHeapThreshold); - increaseResourceCounter(); + res.increaseResourceCounter(); - debugC(DEBUG_RESOURCE, "Expired resources, mem %d -> %d", oldAllocatedSize, _allocatedSize); + debugC(DEBUG_RESOURCE, "Expired resources, mem %d -> %d", oldAllocatedSize, res._allocatedSize); } -void ScummEngine::freeResources() { +void ResourceManager::freeResources() { int i, j; for (i = rtFirst; i <= rtLast; i++) { - for (j = res.num[i]; --j >= 0;) { + for (j = num[i]; --j >= 0;) { if (isResourceLoaded(i, j)) nukeResource(i, j); } - free(res.address[i]); - free(res.flags[i]); - free(res.roomno[i]); - free(res.roomoffs[i]); + free(address[i]); + free(flags[i]); + free(roomno[i]); + free(roomoffs[i]); - if (_heversion >= 70) - free(res.globsize[i]); - } - if (_heversion >= 70) { - free(_heV7RoomIntOffsets); - free(_heV7RoomOffsets); + free(globsize[i]); } } @@ -1009,7 +1010,7 @@ void ScummEngine::loadPtrToResource(int type, int resindex, const byte *source) byte *alloced; int i, len; - nukeResource(type, resindex); + res.nukeResource(type, resindex); len = resStrLen(source) + 1; @@ -1028,10 +1029,10 @@ void ScummEngine::loadPtrToResource(int type, int resindex, const byte *source) } } -bool ScummEngine::isResourceLoaded(int type, int idx) const { +bool ResourceManager::isResourceLoaded(int type, int idx) const { if (!validateResource("isResourceLoaded", type, idx)) return false; - return res.address[type][idx] != NULL; + return address[type][idx] != NULL; } void ScummEngine::resourceStats() { @@ -1048,7 +1049,7 @@ void ScummEngine::resourceStats() { } } - debug(1, "Total allocated size=%d, locked=%d(%d)", _allocatedSize, lockedSize, lockedNum); + debug(1, "Total allocated size=%d, locked=%d(%d)", res._allocatedSize, lockedSize, lockedNum); } void ScummEngine::readMAXS(int blockSize) { diff --git a/scumm/saveload.cpp b/scumm/saveload.cpp index 6743f5fa67..9f228b191e 100644 --- a/scumm/saveload.cpp +++ b/scumm/saveload.cpp @@ -167,7 +167,7 @@ bool ScummEngine::loadState(int slot, bool compat) { for (i = rtFirst; i <= rtLast; i++) if (i != rtTemp && i != rtBuffer && (i != rtSound || _saveSound || !compat)) for (j = 0; j < res.num[i]; j++) { - nukeResource(i, j); + res.nukeResource(i, j); res.flags[i][j] = 0; } diff --git a/scumm/script.cpp b/scumm/script.cpp index 17f35a3ff1..9ab92840b7 100644 --- a/scumm/script.cpp +++ b/scumm/script.cpp @@ -364,7 +364,7 @@ void ScummEngine::nukeArrays(byte script) { for (i = 1; i < _numArray; i++) { if (_arraySlot[i] == script) { - nukeResource(rtString, i); + res.nukeResource(rtString, i); _arraySlot[i] = 0; } } @@ -897,7 +897,7 @@ void ScummEngine::killScriptsAndResources() { continue; _newNames[i] = 0; - nukeResource(rtObjectName, i); + res.nukeResource(rtObjectName, i); } } } diff --git a/scumm/script_v100he.cpp b/scumm/script_v100he.cpp index 30243d86f1..01e74a38a9 100644 --- a/scumm/script_v100he.cpp +++ b/scumm/script_v100he.cpp @@ -1128,16 +1128,16 @@ void ScummEngine_v100he::o100_resourceRoutines() { if (_heResType == rtFlObject) { objidx = getObjectIndex(_heResId); //assert(objidx != -1); - //lock(_heResType, objidx); + //res.lock(_heResType, objidx); } else { - lock(_heResType, _heResId); + res.lock(_heResType, _heResId); } break; case 133: if (_heResType == rtCharset) nukeCharset(_heResId); else - nukeResource(_heResType, _heResId); + res.nukeResource(_heResType, _heResId); break; case 134: case 135: @@ -1153,9 +1153,9 @@ void ScummEngine_v100he::o100_resourceRoutines() { if (_heResType == rtFlObject) { objidx = getObjectIndex(_heResId); //assert(objidx != -1); - //unlock(_heResType, objidx); + //res.unlock(_heResType, objidx); } else { - unlock(_heResType, _heResId); + res.unlock(_heResType, _heResId); } break; default: diff --git a/scumm/script_v2.cpp b/scumm/script_v2.cpp index ca244f0be3..e12c233565 100644 --- a/scumm/script_v2.cpp +++ b/scumm/script_v2.cpp @@ -782,9 +782,9 @@ void ScummEngine_v2::o2_resourceRoutines() { ensureResourceLoaded(type, resid); } else { if (opcode & 1) - lock(type, resid); + res.lock(type, resid); else - unlock(type, resid); + res.unlock(type, resid); } } diff --git a/scumm/script_v5.cpp b/scumm/script_v5.cpp index ee028b75ae..d6457a895d 100644 --- a/scumm/script_v5.cpp +++ b/scumm/script_v5.cpp @@ -1732,40 +1732,40 @@ void ScummEngine_v5::o5_resourceRoutines() { if (_gameId == GID_ZAK256) warning("o5_resourceRoutines %d should not occur in Zak256", op); else - setResourceCounter(resType[op-5], resid, 0x7F); + res.setResourceCounter(resType[op-5], resid, 0x7F); break; case 9: // SO_LOCK_SCRIPT if (resid >= _numGlobalScripts) break; - lock(rtScript, resid); + res.lock(rtScript, resid); break; case 10: // SO_LOCK_SOUND - lock(rtSound, resid); + res.lock(rtSound, resid); break; case 11: // SO_LOCK_COSTUME - lock(rtCostume, resid); + res.lock(rtCostume, resid); break; case 12: // SO_LOCK_ROOM if (resid > 0x7F) resid = _resourceMapper[resid & 0x7F]; - lock(rtRoom, resid); + res.lock(rtRoom, resid); break; case 13: // SO_UNLOCK_SCRIPT if (resid >= _numGlobalScripts) break; - unlock(rtScript, resid); + res.unlock(rtScript, resid); break; case 14: // SO_UNLOCK_SOUND - unlock(rtSound, resid); + res.unlock(rtSound, resid); break; case 15: // SO_UNLOCK_COSTUME - unlock(rtCostume, resid); + res.unlock(rtCostume, resid); break; case 16: // SO_UNLOCK_ROOM if (resid > 0x7F) resid = _resourceMapper[resid & 0x7F]; - unlock(rtRoom, resid); + res.unlock(rtRoom, resid); break; case 17: // SO_CLEAR_HEAP @@ -2256,7 +2256,7 @@ void ScummEngine_v5::o5_stringOps() { case 2: /* copystring */ a = getVarOrDirectByte(PARAM_1); b = getVarOrDirectByte(PARAM_2); - nukeResource(rtString, a); + res.nukeResource(rtString, a); ptr = getResourceAddress(rtString, b); if (ptr) loadPtrToResource(rtString, a, ptr); @@ -2287,7 +2287,7 @@ void ScummEngine_v5::o5_stringOps() { case 5: /* create empty string */ a = getVarOrDirectByte(PARAM_1); b = getVarOrDirectByte(PARAM_2); - nukeResource(rtString, a); + res.nukeResource(rtString, a); if (b) { ptr = createResource(rtString, a, b); if (ptr) { @@ -2332,7 +2332,7 @@ void ScummEngine_v5::o5_verbOps() { case 2: // SO_VERB_NAME loadPtrToResource(rtVerb, slot, NULL); if (slot == 0) - nukeResource(rtVerb, slot); + res.nukeResource(rtVerb, slot); vs->type = kTextVerbType; vs->imgindex = 0; break; @@ -2446,12 +2446,12 @@ void ScummEngine_v5::o5_verbOps() { case 20: // SO_VERB_NAME_STR ptr = getResourceAddress(rtString, getVarOrDirectWord(PARAM_1)); if (!ptr) - nukeResource(rtVerb, slot); + res.nukeResource(rtVerb, slot); else { loadPtrToResource(rtVerb, slot, ptr); } if (slot == 0) - nukeResource(rtVerb, slot); + res.nukeResource(rtVerb, slot); vs->type = kTextVerbType; vs->imgindex = 0; break; diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index ef7790c83a..a3a7f3b419 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -466,7 +466,7 @@ void ScummEngine_v6::nukeArray(int a) { data = readVar(a); if (data) - nukeResource(rtString, data); + res.nukeResource(rtString, data); if (_features & GF_HUMONGOUS) _arraySlot[data] = 0; @@ -1559,59 +1559,59 @@ void ScummEngine_v6::o6_resourceRoutines() { if (_version >= 7) if (resid >= _numGlobalScripts) break; - setResourceCounter(rtScript, resid, 0x7F); + res.setResourceCounter(rtScript, resid, 0x7F); break; case 105: // SO_NUKE_SOUND resid = pop(); - setResourceCounter(rtSound, resid, 0x7F); + res.setResourceCounter(rtSound, resid, 0x7F); break; case 106: // SO_NUKE_COSTUME resid = pop(); - setResourceCounter(rtCostume, resid, 0x7F); + res.setResourceCounter(rtCostume, resid, 0x7F); break; case 107: // SO_NUKE_ROOM resid = pop(); - setResourceCounter(rtRoom, resid, 0x7F); + res.setResourceCounter(rtRoom, resid, 0x7F); break; case 108: // SO_LOCK_SCRIPT resid = pop(); if (resid >= _numGlobalScripts) break; - lock(rtScript, resid); + res.lock(rtScript, resid); break; case 109: // SO_LOCK_SOUND resid = pop(); - lock(rtSound, resid); + res.lock(rtSound, resid); break; case 110: // SO_LOCK_COSTUME resid = pop(); - lock(rtCostume, resid); + res.lock(rtCostume, resid); break; case 111: // SO_LOCK_ROOM resid = pop(); if (resid > 0x7F) resid = _resourceMapper[resid & 0x7F]; - lock(rtRoom, resid); + res.lock(rtRoom, resid); break; case 112: // SO_UNLOCK_SCRIPT resid = pop(); if (resid >= _numGlobalScripts) break; - unlock(rtScript, resid); + res.unlock(rtScript, resid); break; case 113: // SO_UNLOCK_SOUND resid = pop(); - unlock(rtSound, resid); + res.unlock(rtSound, resid); break; case 114: // SO_UNLOCK_COSTUME resid = pop(); - unlock(rtCostume, resid); + res.unlock(rtCostume, resid); break; case 115: // SO_UNLOCK_ROOM resid = pop(); if (resid > 0x7F) resid = _resourceMapper[resid & 0x7F]; - unlock(rtRoom, resid); + res.unlock(rtRoom, resid); break; case 116: // SO_CLEAR_HEAP /* this is actually a scumm message */ diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp index 0ef04c2cd9..3afaacb5e4 100644 --- a/scumm/script_v7he.cpp +++ b/scumm/script_v7he.cpp @@ -532,59 +532,59 @@ void ScummEngine_v70he::o70_resourceRoutines() { break; case 104: // SO_NUKE_SCRIPT resid = pop(); - setResourceCounter(rtScript, resid, 0x7F); + res.setResourceCounter(rtScript, resid, 0x7F); break; case 105: // SO_NUKE_SOUND resid = pop(); - setResourceCounter(rtSound, resid, 0x7F); + res.setResourceCounter(rtSound, resid, 0x7F); break; case 106: // SO_NUKE_COSTUME resid = pop(); - setResourceCounter(rtCostume, resid, 0x7F); + res.setResourceCounter(rtCostume, resid, 0x7F); break; case 107: // SO_NUKE_ROOM resid = pop(); - setResourceCounter(rtRoom, resid, 0x7F); + res.setResourceCounter(rtRoom, resid, 0x7F); break; case 108: // SO_LOCK_SCRIPT resid = pop(); if (resid >= _numGlobalScripts) break; - lock(rtScript, resid); + res.lock(rtScript, resid); break; case 109: // SO_LOCK_SOUND resid = pop(); - lock(rtSound, resid); + res.lock(rtSound, resid); break; case 110: // SO_LOCK_COSTUME resid = pop(); - lock(rtCostume, resid); + res.lock(rtCostume, resid); break; case 111: // SO_LOCK_ROOM resid = pop(); if (resid > 0x7F) resid = _resourceMapper[resid & 0x7F]; - lock(rtRoom, resid); + res.lock(rtRoom, resid); break; case 112: // SO_UNLOCK_SCRIPT resid = pop(); if (resid >= _numGlobalScripts) break; - unlock(rtScript, resid); + res.unlock(rtScript, resid); break; case 113: // SO_UNLOCK_SOUND resid = pop(); - unlock(rtSound, resid); + res.unlock(rtSound, resid); break; case 114: // SO_UNLOCK_COSTUME resid = pop(); - unlock(rtCostume, resid); + res.unlock(rtCostume, resid); break; case 115: // SO_UNLOCK_ROOM resid = pop(); if (resid > 0x7F) resid = _resourceMapper[resid & 0x7F]; - unlock(rtRoom, resid); + res.unlock(rtRoom, resid); break; case 116: break; @@ -611,11 +611,11 @@ void ScummEngine_v70he::o70_resourceRoutines() { break; case 159: resid = pop(); - unlock(rtImage, resid); + res.unlock(rtImage, resid); break; case 192: resid = pop(); - nukeResource(rtImage, resid); + res.nukeResource(rtImage, resid); break; case 201: resid = pop(); @@ -623,7 +623,7 @@ void ScummEngine_v70he::o70_resourceRoutines() { break; case 202: resid = pop(); - lock(rtImage, resid); + res.lock(rtImage, resid); break; case 233: resid = pop(); diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp index 0e3c74a29a..9c14ac2537 100644 --- a/scumm/script_v8.cpp +++ b/scumm/script_v8.cpp @@ -779,40 +779,40 @@ void ScummEngine_v8::o8_resourceRoutines() { break; case 0x42: // SO_HEAP_LOCK_COSTUME Lock costume in heap - lock(rtCostume, resid); + res.lock(rtCostume, resid); break; case 0x43: // SO_HEAP_LOCK_ROOM Lock room in heap - lock(rtRoom, resid); + res.lock(rtRoom, resid); break; case 0x44: // SO_HEAP_LOCK_SCRIPT Lock script in heap - lock(rtScript, resid); + res.lock(rtScript, resid); break; case 0x45: // SO_HEAP_LOCK_SOUND Lock sound in heap - lock(rtSound, resid); + res.lock(rtSound, resid); break; case 0x46: // SO_HEAP_UNLOCK_COSTUME Unlock costume - unlock(rtCostume, resid); + res.unlock(rtCostume, resid); break; case 0x47: // SO_HEAP_UNLOCK_ROOM Unlock room - unlock(rtRoom, resid); + res.unlock(rtRoom, resid); break; case 0x48: // SO_HEAP_UNLOCK_SCRIPT Unlock script - unlock(rtScript, resid); + res.unlock(rtScript, resid); break; case 0x49: // SO_HEAP_UNLOCK_SOUND Unlock sound - unlock(rtSound, resid); + res.unlock(rtSound, resid); break; case 0x4A: // SO_HEAP_NUKE_COSTUME Remove costume from heap - setResourceCounter(rtCostume, resid, 0x7F); + res.setResourceCounter(rtCostume, resid, 0x7F); break; case 0x4B: // SO_HEAP_NUKE_ROOM Remove room from heap - setResourceCounter(rtRoom, resid, 0x7F); + res.setResourceCounter(rtRoom, resid, 0x7F); break; case 0x4C: // SO_HEAP_NUKE_SCRIPT Remove script from heap - setResourceCounter(rtScript, resid, 0x7F); + res.setResourceCounter(rtScript, resid, 0x7F); break; case 0x4D: // SO_HEAP_NUKE_SOUND Remove sound from heap - setResourceCounter(rtSound, resid, 0x7F); + res.setResourceCounter(rtSound, resid, 0x7F); break; default: error("o8_resourceRoutines: default case 0x%x", subOp); @@ -1214,13 +1214,13 @@ void ScummEngine_v8::o8_kernelSetFunctions() { case 11: { // lockObject int objidx = getObjectIndex(args[1]); assert(objidx != -1); - lock(rtFlObject, objidx); + res.lock(rtFlObject, objidx); break; } case 12: { // unlockObject int objidx = getObjectIndex(args[1]); assert(objidx != -1); - unlock(rtFlObject, objidx); + res.unlock(rtFlObject, objidx); break; } case 13: // remapCostume diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp index 037bc91043..ec6e621cac 100644 --- a/scumm/scumm.cpp +++ b/scumm/scumm.cpp @@ -594,7 +594,9 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS _heversion(gs.heversion), _numActors(gs.numActors), _features(gs.features), - gdi(this), _pauseDialog(0), _mainMenuDialog(0), _versionDialog(0), + gdi(this), + res(this), + _pauseDialog(0), _mainMenuDialog(0), _versionDialog(0), _targetName(detector->_targetName) { // Copy MD5 checksum @@ -758,8 +760,6 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS _lastSaveTime = 0; _saveTemporaryState = false; memset(_saveLoadName, 0, sizeof(_saveLoadName)); - _maxHeapThreshold = 0; - _minHeapThreshold = 0; memset(_localScriptOffsets, 0, sizeof(_localScriptOffsets)); _scriptPointer = NULL; _scriptOrgPointer = NULL; @@ -776,8 +776,6 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS _fileOffset = 0; _dynamicRoomOffsets = false; memset(_resourceMapper, 0, sizeof(_resourceMapper)); - _allocatedSize = 0; - _expire_counter = 0; _lastLoadedRoom = 0; _roomResource = 0; _substResFileNameIndex = 0; @@ -1173,7 +1171,11 @@ ScummEngine::~ScummEngine() { free(_shadowPalette); - freeResources(); + res.freeResources(); + if (_heversion >= 70) { + free(_heV7RoomIntOffsets); + free(_heV7RoomOffsets); + } free(_objectStateTable); free(_objectRoomTable); @@ -1309,18 +1311,18 @@ int ScummEngine::init(GameDetector &detector) { #ifdef __PALM_OS__ if (_features & GF_NEW_COSTUMES) - _maxHeapThreshold = gVars->memory[kMemScummNewCostGames]; + res._maxHeapThreshold = gVars->memory[kMemScummNewCostGames]; else - _maxHeapThreshold = gVars->memory[kMemScummOldCostGames]; + res._maxHeapThreshold = gVars->memory[kMemScummOldCostGames]; #else // Since the new costumes are very big, we increase the heap limit, to avoid having // to constantly reload stuff from the data files. if (_features & GF_NEW_COSTUMES) - _maxHeapThreshold = 2500000; + res._maxHeapThreshold = 2500000; else - _maxHeapThreshold = 550000; + res._maxHeapThreshold = 550000; #endif - _minHeapThreshold = 400000; + res._minHeapThreshold = 400000; allocResTypeData(rtBuffer, MKID('NONE'), 10, "buffer", 0); @@ -2074,8 +2076,8 @@ load_game: camera._last = camera._cur; - if (!(++_expire_counter)) { - increaseResourceCounter(); + if (!(++res._expireCounter)) { + res.increaseResourceCounter(); } animateCursor(); @@ -2174,7 +2176,7 @@ void ScummEngine::startScene(int room, Actor *a, int objectNr) { VAR(VAR_ROOM) = room; _fullRedraw = true; - increaseResourceCounter(); + res.increaseResourceCounter(); _currentRoom = room; VAR(VAR_ROOM) = room; @@ -2391,8 +2393,8 @@ void ScummEngine::initRoomSubBlocks() { // // Load box data // - nukeResource(rtMatrix, 1); - nukeResource(rtMatrix, 2); + res.nukeResource(rtMatrix, 1); + res.nukeResource(rtMatrix, 2); if (_features & GF_SMALL_HEADER) { if (_version <= 2) ptr = roomptr + *(roomptr + 0x15); @@ -2451,7 +2453,7 @@ void ScummEngine::initRoomSubBlocks() { // Load scale data // for (i = 1; i < res.num[rtScaleTable]; i++) - nukeResource(rtScaleTable, i); + res.nukeResource(rtScaleTable, i); if (_features & GF_OLD_BUNDLE) ptr = 0; diff --git a/scumm/scumm.h b/scumm/scumm.h index ed2279a64d..bd7f8a153a 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -291,6 +291,44 @@ struct AuxEntry { int subIndex; }; +class ResourceManager { + friend class ScummDebugger; + friend class ScummEngine; +protected: + ScummEngine *_vm; + +public: + byte mode[rtNumTypes]; + uint16 num[rtNumTypes]; + uint32 tags[rtNumTypes]; + const char *name[rtNumTypes]; + byte **address[rtNumTypes]; + byte *flags[rtNumTypes]; + byte *roomno[rtNumTypes]; + uint32 *roomoffs[rtNumTypes]; + uint32 *globsize[rtNumTypes]; + + uint32 _allocatedSize; + uint32 _maxHeapThreshold, _minHeapThreshold; + byte _expireCounter; + +public: + ResourceManager(ScummEngine *vm); + + void nukeResource(int type, int i); + + void freeResources(); + + bool validateResource(const char *str, int type, int index) const; + bool isResourceLoaded(int type, int index) const; + + void lock(int type, int i); + void unlock(int type, int i); + + void setResourceCounter(int type, int index, byte flag); + void increaseResourceCounter(); +}; + class ScummEngine : public Engine { friend class ScummDebugger; friend class SmushPlayer; @@ -325,20 +363,10 @@ public: /** Graphics manager */ Gdi gdi; -protected: /** Central resource data. */ - struct { - byte mode[rtNumTypes]; - uint16 num[rtNumTypes]; - uint32 tags[rtNumTypes]; - const char *name[rtNumTypes]; - byte **address[rtNumTypes]; - byte *flags[rtNumTypes]; - byte *roomno[rtNumTypes]; - uint32 *roomoffs[rtNumTypes]; - uint32 *globsize[rtNumTypes]; - } res; + ResourceManager res; +protected: VirtualMachineState vm; public: @@ -534,13 +562,7 @@ public: void requestSave(int slot, const char *name, bool temporary = false); void requestLoad(int slot); - void lock(int type, int i); - void unlock(int type, int i); - protected: - /* Heap and memory management */ - uint32 _maxHeapThreshold, _minHeapThreshold; - /* Script VM - should be in Script class */ uint32 _localScriptOffsets[256]; const byte *_scriptPointer, *_scriptOrgPointer; @@ -631,8 +653,6 @@ protected: Common::String _targetName; // This is the game the user calls it, so use for saving bool _dynamicRoomOffsets; byte _resourceMapper[128]; - uint32 _allocatedSize; - byte _expire_counter; byte *_heV7DiskOffsets; byte *_heV7RoomOffsets; uint32 *_heV7RoomIntOffsets; @@ -652,11 +672,10 @@ protected: void allocResTypeData(int id, uint32 tag, int num, const char *name, int mode); byte *createResource(int type, int index, uint32 size); int loadResource(int type, int i); - void nukeResource(int type, int i); +// void nukeResource(int type, int i); int getResourceSize(int type, int idx); public: - bool isResourceLoaded(int type, int index) const; byte *getResourceAddress(int type, int i); byte *getStringAddress(int i); byte *getStringAddressVar(int i); @@ -669,9 +688,6 @@ protected: void convertMac0Resource(int type, int index, byte *ptr, int size); void convertADResource(int type, int index, byte *ptr, int size); int readSoundResourceSmallHeader(int type, int index); - void setResourceCounter(int type, int index, byte flag); - bool validateResource(const char *str, int type, int index) const; - void increaseResourceCounter(); bool isResourceInUse(int type, int i) const; void initRoomSubBlocks(); void clearRoomObjects(); @@ -695,7 +711,6 @@ public: protected: void resourceStats(); void expireResources(uint32 size); - void freeResources(); public: /* Should be in Object class */ diff --git a/scumm/sound.cpp b/scumm/sound.cpp index 2757fe19b4..999e461450 100644 --- a/scumm/sound.cpp +++ b/scumm/sound.cpp @@ -841,7 +841,7 @@ int Sound::isSoundRunning(int sound) const { if (isSoundInQueue(sound)) return 1; - if (sound > _vm->_numSounds || !_vm->isResourceLoaded(rtSound, sound)) + if (sound > _vm->_numSounds || !_vm->res.isResourceLoaded(rtSound, sound)) return 0; if (_vm->_musicEngine) @@ -872,7 +872,7 @@ bool Sound::isSoundInUse(int sound) const { if (isSoundInQueue(sound)) return true; - if (!_vm->isResourceLoaded(rtSound, sound)) + if (!_vm->res.isResourceLoaded(rtSound, sound)) return false; if (_vm->_imuse) diff --git a/scumm/string.cpp b/scumm/string.cpp index 427310eeb0..b63b853e98 100644 --- a/scumm/string.cpp +++ b/scumm/string.cpp @@ -720,7 +720,7 @@ void ScummEngine::initCharset(int charsetno) { int i; if (_gameId == GID_FT) { - if (!isResourceLoaded(rtCharset, charsetno)) + if (!res.isResourceLoaded(rtCharset, charsetno)) loadCharset(charsetno); } else { if (!getResourceAddress(rtCharset, charsetno)) diff --git a/scumm/verbs.cpp b/scumm/verbs.cpp index 80b4517159..d9c1c4af22 100644 --- a/scumm/verbs.cpp +++ b/scumm/verbs.cpp @@ -613,7 +613,7 @@ void ScummEngine::killVerb(int slot) { vs->verbid = 0; vs->curmode = 0; - nukeResource(rtVerb, slot); + res.nukeResource(rtVerb, slot); if (_version <= 6 && vs->saveid == 0) { drawVerb(slot, 0); diff --git a/scumm/wiz_he.cpp b/scumm/wiz_he.cpp index 83979cbe50..6f8a775049 100644 --- a/scumm/wiz_he.cpp +++ b/scumm/wiz_he.cpp @@ -1424,7 +1424,7 @@ void ScummEngine_v90he::processWizImage(const WizParameters *params) { f.seek(0, SEEK_SET); byte *p = createResource(rtImage, params->img.resNum, size); if (f.read(p, size) != size) { - nukeResource(rtImage, params->img.resNum); + res.nukeResource(rtImage, params->img.resNum); warning("i/o error when reading '%s'", params->filename); VAR(VAR_GAME_LOADED) = -2; VAR(119) = -2; |