aboutsummaryrefslogtreecommitdiff
path: root/engines/scumm/resource.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/scumm/resource.h')
-rw-r--r--engines/scumm/resource.h185
1 files changed, 182 insertions, 3 deletions
diff --git a/engines/scumm/resource.h b/engines/scumm/resource.h
index a14b7173a2..e8b0c1eaae 100644
--- a/engines/scumm/resource.h
+++ b/engines/scumm/resource.h
@@ -17,14 +17,14 @@
* 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$
*/
#ifndef SCUMM_RESOURCE_H
#define SCUMM_RESOURCE_H
+#include "common/array.h"
+#include "scumm/scumm.h" // for ResType
+
namespace Scumm {
enum {
@@ -44,6 +44,185 @@ public:
const byte *findNext(uint32 tag);
};
+enum {
+ RES_INVALID_OFFSET = 0xFFFFFFFF
+};
+
+class ScummEngine;
+
+/**
+ * The mode of a resource type indicates whether the resource can be restored
+ * from the game data files or not.
+ * This affects for example whether the resource is stored in savestates.
+ *
+ * Note that we treat sound resources somewhat differently: On the one hand,
+ * these behave mostly like a kStaticResTypeMode res type. However, when we
+ * create a savestate, we do save *some* information about them: Namely, which
+ * sound resources are loaded in memory at the time the save is made. And when
+ * loading, we invoke ensureResourceLoaded() for each sound resource that was
+ * marked in this way.
+ */
+enum ResTypeMode {
+ kDynamicResTypeMode = 0, ///!< Resource is generated during runtime and may change
+ kStaticResTypeMode = 1, ///!< Resource comes from data files, does not change
+ kSoundResTypeMode = 2 ///!< Resource comes from data files, but may change
+};
+
+/**
+ * The 'resource manager' class. Currently doesn't really deserve to be called
+ * a 'class', at least until somebody gets around to OOfying this more.
+ */
+class ResourceManager {
+ //friend class ScummDebugger;
+ //friend class ScummEngine;
+protected:
+ ScummEngine *_vm;
+
+public:
+ class Resource {
+ public:
+ /**
+ * Pointer to the data contained in this resource
+ */
+ byte *_address;
+
+ /**
+ * Size of this resource, i.e. of the data contained in it.
+ */
+ uint32 _size;
+
+ protected:
+ /**
+ * The uppermost bit indicates whether the resources is locked.
+ * The lower 7 bits contain a counter. This counter measures roughly
+ * how old the resource is; it starts out with a count of 1 and can go
+ * as high as 127. When memory falls low resp. when the engine decides
+ * that it should throw out some unused stuff, then it begins by
+ * removing the resources with the highest counter (excluding locked
+ * resources and resources that are known to be in use).
+ */
+ byte _flags;
+
+ /**
+ * The status of the resource. Currently only one bit is used, which
+ * indicates whether the resource is modified.
+ */
+ byte _status;
+
+ public:
+ /**
+ * The id of the room (resp. the disk) the resource is contained in.
+ */
+ byte _roomno;
+
+ /**
+ * The offset (in bytes) where the data for this resources can be found
+ * in the game data file(s), relative to the start of the room the
+ * resource is contained in.
+ *
+ * A value of RES_INVALID_OFFSET indicates a resources that is not contained
+ * in the game data files.
+ */
+ uint32 _roomoffs;
+
+ public:
+ Resource();
+ ~Resource();
+
+ void nuke();
+
+ inline void setResourceCounter(byte counter);
+ inline byte getResourceCounter() const;
+
+ void lock();
+ void unlock();
+ bool isLocked() const;
+
+ void setModified();
+ bool isModified() const;
+ };
+
+ /**
+ * This struct represents a resource type and all resource of that type.
+ */
+ class ResTypeData : public Common::Array<Resource> {
+ friend class ResourceManager;
+ public:
+ /**
+ * The mode of this res type.
+ */
+ ResTypeMode _mode;
+
+ /**
+ * The 4-byte tag or chunk type associated to this resource type, if any.
+ * Only applies to resources that are loaded from the game data files.
+ * This value is only used for debugging purposes.
+ */
+ uint32 _tag;
+
+ public:
+ ResTypeData();
+ ~ResTypeData();
+ };
+ ResTypeData _types[rtLast + 1];
+
+protected:
+ uint32 _allocatedSize;
+ uint32 _maxHeapThreshold, _minHeapThreshold;
+ byte _expireCounter;
+
+public:
+ ResourceManager(ScummEngine *vm);
+ ~ResourceManager();
+
+ void setHeapThreshold(int min, int max);
+
+ void allocResTypeData(ResType type, uint32 tag, int num, ResTypeMode mode);
+ void freeResources();
+
+ byte *createResource(ResType type, ResId idx, uint32 size);
+ void nukeResource(ResType type, ResId idx);
+
+// inline Resource &getRes(ResType type, ResId idx) { return _types[type][idx]; }
+// inline const Resource &getRes(ResType type, ResId idx) const { return _types[type][idx]; }
+
+ bool isResourceLoaded(ResType type, ResId idx) const;
+
+ void lock(ResType type, ResId idx);
+ void unlock(ResType type, ResId idx);
+ bool isLocked(ResType type, ResId idx) const;
+
+ void setModified(ResType type, ResId idx);
+ bool isModified(ResType type, ResId idx) const;
+
+ /**
+ * This method increments the _expireCounter, and if it overflows (which happens
+ * after at most 256 calls), it calls increaseResourceCounter.
+ * It is invoked in the engine's main loop ScummEngine::scummLoop().
+ */
+ void increaseExpireCounter();
+
+ /**
+ * Update the specified resource's counter.
+ */
+ void setResourceCounter(ResType type, ResId idx, byte counter);
+
+ /**
+ * Increment the counter of all unlocked loaded resources.
+ * The maximal count is 255.
+ * This is called by increaseExpireCounter and expireResources,
+ * but also by ScummEngine::startScene.
+ */
+ void increaseResourceCounters();
+
+ void resourceStats();
+
+//protected:
+ bool validateResource(const char *str, ResType type, ResId idx) const;
+protected:
+ void expireResources(uint32 size);
+};
+
} // End of namespace Scumm
#endif