scummvm/engines/tsage/resources.h
2011-02-14 20:37:27 +11:00

137 lines
3.5 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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: https://scummvm-misc.svn.sourceforge.net/svnroot/scummvm-misc/trunk/engines/tsage/resources.h $
* $Id: resources.h 145 2011-01-08 11:41:39Z dreammaster $
*
*/
#ifndef RING_RESOURCES_H
#define RING_RESOURCES_H
#include "common/scummsys.h"
#include "common/file.h"
#include "common/list.h"
#include "common/str.h"
#include "common/str-array.h"
#include "common/util.h"
#include "graphics/surface.h"
namespace tSage {
// Magic number used by original game to identify valid memory blocks
const uint32 MEMORY_ENTRY_ID = 0xE11DA722;
const int MEMORY_POOL_SIZE = 1000;
enum ResourceType { RES_LIBRARY, RES_STRIP, RES_IMAGE, RES_PALETTE, RES_VISAGE, RES_SOUND, RES_MESSAGE,
RES_FONT, RES_POINTER, RES_BANK, RES_SND_DRIVER, RES_PRIORITY, RES_CONTROL, RES_WALKRGNS,
RES_BITMAP, RES_SAVE, RES_SEQUENCE };
struct MemoryHeader {
uint32 id;
int16 index;
int lockCtr;
int criticalCtr;
uint8 tag;
uint32 size;
};
struct SectionEntry {
ResourceType resType;
uint16 resNum;
uint32 fileOffset;
};
struct ResourceEntry {
uint16 id;
bool isCompressed;
uint32 fileOffset;
uint32 size;
uint32 uncompressedSize;
};
typedef Common::List<ResourceEntry> ResourceList;
class SectionList: public Common::List<SectionEntry> {
public:
uint32 fileOffset;
};
class MemoryManager {
private:
MemoryHeader **_memoryPool;
public:
MemoryManager();
~MemoryManager();
uint16 allocate(uint32 size);
byte *allocate2(uint32 size);
byte *lock(uint32 handle);
int indexOf(const byte *p);
void deallocate(const byte *p);
void deallocate(uint16 handle) { assert("TODO"); }
uint32 getSize(const byte *p);
void incLocks(const byte *p);
};
class BitReader {
private:
Common::ReadStream &_stream;
uint8 _remainder, _bitsLeft;
byte readByte() { return _stream.eos() ? 0 : _stream.readByte(); }
public:
BitReader(Common::ReadStream &s): _stream(s) {
numBits = 9;
_remainder = 0;
_bitsLeft = 0;
}
uint16 readToken();
int numBits;
};
class RlbManager {
private:
Common::StringArray _resStrings;
MemoryManager &_memoryManager;
private:
Common::File _file;
ResourceList _resources;
SectionList _sections;
void loadSection(uint32 fileOffset);
void loadIndex();
public:
RlbManager(MemoryManager &memManager, const Common::String filename);
~RlbManager();
byte *getResource(uint16 id, bool suppressErrors = false);
byte *getResource(ResourceType resType, uint16 resNum, uint16 rlbNum, bool suppressErrors = false);
void getPalette(int paletteNum, uint8 *palData, uint *startNum, uint *numEntries);
byte *getSubResource(int resNum, int rlbNum, int index, uint *size);
Common::String getMessage(int resNum, int lineNum);
};
} // end of namespace tSage
#endif