aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2005-10-17 15:00:23 +0000
committerMax Horn2005-10-17 15:00:23 +0000
commitbb8afe3839493eac79cb6cc747c0d46d41f183ab (patch)
treeb700102b868350487cba3f8b1aa1f0e378906915
parentb4a4f779e3f45e5034f5985a5bc50d4dfb9b06f0 (diff)
downloadscummvm-rg350-bb8afe3839493eac79cb6cc747c0d46d41f183ab.tar.gz
scummvm-rg350-bb8afe3839493eac79cb6cc747c0d46d41f183ab.tar.bz2
scummvm-rg350-bb8afe3839493eac79cb6cc747c0d46d41f183ab.zip
Added ResourceManager::isLocked; made ResourceManager::flags protected; moved some stuff around
svn-id: r19137
-rw-r--r--scumm/intern.h11
-rw-r--r--scumm/object.cpp6
-rw-r--r--scumm/resource.cpp17
-rw-r--r--scumm/resource.h7
-rw-r--r--scumm/saveload.cpp5
-rw-r--r--scumm/scumm.h78
-rw-r--r--scumm/string.cpp4
7 files changed, 74 insertions, 54 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 58e2700e8d..b2e53019c0 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -254,6 +254,12 @@ protected:
const OpcodeEntryV2 *_opcodesV2;
+ struct V2MouseoverBox {
+ Common::Rect rect;
+ byte color;
+ byte hicolor;
+ };
+
V2MouseoverBox _mouseOverBoxesV2[7];
int8 _mouseOverBoxV2;
@@ -1319,6 +1325,11 @@ public:
ScummEngine_v7(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16], int substResFileNameIndex);
~ScummEngine_v7();
+ struct LangIndexNode {
+ char tag[12+1];
+ int32 offset;
+ };
+
bool _existLanguageFile;
char *_languageBuffer;
LangIndexNode *_languageIndex;
diff --git a/scumm/object.cpp b/scumm/object.cpp
index 0fb9895e65..394f2e2ca4 100644
--- a/scumm/object.cpp
+++ b/scumm/object.cpp
@@ -518,7 +518,7 @@ void ScummEngine::clearRoomObjects() {
_objs[i].obj_nr = 0;
} else {
// Nuke all unlocked flObjects
- if (!(res.flags[rtFlObject][_objs[i].fl_object_index] & RF_LOCK)) {
+ if (!res.isLocked(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;
@@ -1739,8 +1739,8 @@ void ScummEngine::loadFlObject(uint object, uint room) {
// Lock room/roomScripts for the given room. They contains the OBCD/OBIM
// data, and a call to createResource might expire them, hence we lock them.
- isRoomLocked = ((res.flags[rtRoom][room] & RF_LOCK) != 0);
- isRoomScriptsLocked = ((res.flags[rtRoomScripts][room] & RF_LOCK) != 0);
+ isRoomLocked = res.isLocked(rtRoom, room);
+ isRoomScriptsLocked = res.isLocked(rtRoomScripts, room);
if (!isRoomLocked)
res.lock(rtRoom, room);
if (_version == 8 && !isRoomScriptsLocked)
diff --git a/scumm/resource.cpp b/scumm/resource.cpp
index 4ddc571c7a..4a08d7518b 100644
--- a/scumm/resource.cpp
+++ b/scumm/resource.cpp
@@ -37,6 +37,14 @@
namespace Scumm {
+enum {
+ RF_LOCK = 0x80,
+ RF_USAGE = 0x7F,
+ RF_USAGE_MAX = RF_USAGE
+};
+
+
+
extern const char *resTypeFromId(int id);
static uint16 newTag2Old(uint32 newTag);
@@ -877,7 +885,8 @@ void ResourceManager::nukeResource(int type, int idx) {
assert(idx >= 0 && idx < num[type]);
- if ((ptr = address[type][idx]) != NULL) {
+ ptr = address[type][idx];
+ if (ptr != NULL) {
debugC(DEBUG_RESOURCE, "nukeResource(%s,%d)", resTypeFromId(type), idx);
address[type][idx] = 0;
flags[type][idx] = 0;
@@ -923,6 +932,12 @@ void ResourceManager::unlock(int type, int i) {
flags[type][i] &= ~RF_LOCK;
}
+bool ResourceManager::isLocked(int type, int i) const {
+ if (!validateResource("Unlocking", type, i))
+ return false;
+ return (flags[type][i] & RF_LOCK) != 0;
+}
+
bool ScummEngine::isResourceInUse(int type, int i) const {
if (!res.validateResource("isResourceInUse", type, i))
return false;
diff --git a/scumm/resource.h b/scumm/resource.h
index 289494aa7c..e9aa8f6531 100644
--- a/scumm/resource.h
+++ b/scumm/resource.h
@@ -30,13 +30,6 @@ enum {
OF_STATE_SHL = 4
};
-enum {
- RF_LOCK = 0x80,
- RF_USAGE = 0x7F,
- RF_USAGE_MAX = RF_USAGE
-};
-
-
class ResourceIterator {
uint32 _size;
uint32 _pos;
diff --git a/scumm/saveload.cpp b/scumm/saveload.cpp
index 4e329e101e..935b03d05d 100644
--- a/scumm/saveload.cpp
+++ b/scumm/saveload.cpp
@@ -238,7 +238,6 @@ bool ScummEngine::loadState(int slot, bool compat) {
if (i != rtTemp && i != rtBuffer && (i != rtSound || _saveSound || !compat))
for (j = 0; j < res.num[i]; j++) {
res.nukeResource(i, j);
- res.flags[i][j] = 0;
}
initScummVars();
@@ -1135,7 +1134,7 @@ void ScummEngine::saveOrLoad(Serializer *s, uint32 savegameVersion) {
if (s->isSaving()) {
for (i = rtFirst; i <= rtLast; i++)
for (j = 1; j < res.num[i]; j++) {
- if (res.flags[i][j] & RF_LOCK) {
+ if (res.isLocked(i, j)) {
s->saveByte(i);
s->saveUint16(j);
}
@@ -1144,7 +1143,7 @@ void ScummEngine::saveOrLoad(Serializer *s, uint32 savegameVersion) {
} else {
while ((i = s->loadByte()) != 0xFF) {
j = s->loadUint16();
- res.flags[i][j] |= RF_LOCK;
+ res.lock(i, j);
}
}
diff --git a/scumm/scumm.h b/scumm/scumm.h
index b2e9177cab..c353612ed2 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -160,6 +160,13 @@ enum {
DEBUG_SMUSH = 1 << 10 // Track SMUSH
};
+/**
+ * Internal header for any memory block allocated by the resource manager.
+ *
+ * @todo Hide MemBlkHeader; no code outside the resource manager should
+ * have to use it, ever. Currently script code needs it to detect whether
+ * some scripts have moved (in fetchScriptByte()).
+ */
struct MemBlkHeader {
uint32 size;
};
@@ -167,38 +174,6 @@ struct MemBlkHeader {
struct VerbSlot;
struct ObjectData;
-struct V2MouseoverBox {
- Common::Rect rect;
- byte color;
- byte hicolor;
-};
-
-enum ResTypes {
- rtFirst = 1,
- rtRoom = 1,
- rtScript = 2,
- rtCostume = 3,
- rtSound = 4,
- rtInventory = 5,
- rtCharset = 6,
- rtString = 7,
- rtVerb = 8,
- rtActorName = 9,
- rtBuffer = 10,
- rtScaleTable = 11,
- rtTemp = 12,
- rtFlObject = 13,
- rtMatrix = 14,
- rtBox = 15,
- rtObjectName = 16,
- rtRoomScripts = 17,
- rtRoomImage = 18,
- rtImage = 19,
- rtTalkie = 20,
- rtLast = 20,
- rtNumTypes = 21
-};
-
enum {
LIGHTMODE_dark = 0,
LIGHTMODE_actor_base = 1,
@@ -291,11 +266,6 @@ enum WhereIsObject {
WIO_FLOBJECT = 4
};
-struct LangIndexNode {
- char tag[12+1];
- int32 offset;
-};
-
struct AuxBlock {
bool visible;
Common::Rect r;
@@ -312,12 +282,39 @@ struct AuxEntry {
int subIndex;
};
+// TODO: Rename InfoStuff to something more descriptive
struct InfoStuff {
uint32 date;
uint16 time;
uint32 playtime;
};
+enum ResTypes {
+ rtFirst = 1,
+ rtRoom = 1,
+ rtScript = 2,
+ rtCostume = 3,
+ rtSound = 4,
+ rtInventory = 5,
+ rtCharset = 6,
+ rtString = 7,
+ rtVerb = 8,
+ rtActorName = 9,
+ rtBuffer = 10,
+ rtScaleTable = 11,
+ rtTemp = 12,
+ rtFlObject = 13,
+ rtMatrix = 14,
+ rtBox = 15,
+ rtObjectName = 16,
+ rtRoomScripts = 17,
+ rtRoomImage = 18,
+ rtImage = 19,
+ rtTalkie = 20,
+ rtLast = 20,
+ rtNumTypes = 21
+};
+
class ResourceManager {
friend class ScummDebugger;
friend class ScummEngine;
@@ -330,7 +327,9 @@ public:
uint32 tags[rtNumTypes];
const char *name[rtNumTypes];
byte **address[rtNumTypes];
+protected:
byte *flags[rtNumTypes];
+public:
byte *roomno[rtNumTypes];
uint32 *roomoffs[rtNumTypes];
uint32 *globsize[rtNumTypes];
@@ -347,17 +346,20 @@ public:
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);
+ bool isLocked(int type, int i) const;
void setResourceCounter(int type, int index, byte flag);
void increaseResourceCounter();
void resourceStats();
void expireResources(uint32 size);
+
+protected:
+ bool validateResource(const char *str, int type, int index) const;
};
class ScummEngine : public Engine {
diff --git a/scumm/string.cpp b/scumm/string.cpp
index 3cd7777adf..539dfb1be1 100644
--- a/scumm/string.cpp
+++ b/scumm/string.cpp
@@ -860,8 +860,8 @@ void ScummEngine_v6::removeBlastTexts() {
#ifndef DISABLE_SCUMM_7_8
int indexCompare(const void *p1, const void *p2) {
- const LangIndexNode *i1 = (const LangIndexNode *) p1;
- const LangIndexNode *i2 = (const LangIndexNode *) p2;
+ const ScummEngine_v7::LangIndexNode *i1 = (const ScummEngine_v7::LangIndexNode *) p1;
+ const ScummEngine_v7::LangIndexNode *i2 = (const ScummEngine_v7::LangIndexNode *) p2;
return strcmp(i1->tag, i2->tag);
}