diff options
Diffstat (limited to 'engines/scumm/resource.h')
-rw-r--r-- | engines/scumm/resource.h | 185 |
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 |