SCI: OOpify class ResourceId
svn-id: r49841
This commit is contained in:
parent
68eeef8f1a
commit
2b24a1a2ad
5 changed files with 70 additions and 61 deletions
|
@ -824,7 +824,7 @@ bool Console::cmdVerifyScripts(int argc, const char **argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Common::List<ResourceId> *resources = _engine->getResMan()->listResources(kResourceTypeScript);
|
Common::List<ResourceId> *resources = _engine->getResMan()->listResources(kResourceTypeScript);
|
||||||
sort(resources->begin(), resources->end(), ResourceIdLess());
|
Common::sort(resources->begin(), resources->end());
|
||||||
Common::List<ResourceId>::iterator itr = resources->begin();
|
Common::List<ResourceId>::iterator itr = resources->begin();
|
||||||
|
|
||||||
DebugPrintf("%d SCI1.1-SCI2.1 scripts found, performing sanity checks...\n", resources->size());
|
DebugPrintf("%d SCI1.1-SCI2.1 scripts found, performing sanity checks...\n", resources->size());
|
||||||
|
@ -833,15 +833,15 @@ bool Console::cmdVerifyScripts(int argc, const char **argv) {
|
||||||
while (itr != resources->end()) {
|
while (itr != resources->end()) {
|
||||||
script = _engine->getResMan()->findResource(*itr, false);
|
script = _engine->getResMan()->findResource(*itr, false);
|
||||||
if (!script)
|
if (!script)
|
||||||
DebugPrintf("Error: script %d couldn't be loaded\n", itr->number);
|
DebugPrintf("Error: script %d couldn't be loaded\n", itr->getNumber());
|
||||||
|
|
||||||
heap = _engine->getResMan()->findResource(ResourceId(kResourceTypeHeap, itr->number), false);
|
heap = _engine->getResMan()->findResource(ResourceId(kResourceTypeHeap, itr->getNumber()), false);
|
||||||
if (!heap)
|
if (!heap)
|
||||||
DebugPrintf("Error: script %d doesn't have a corresponding heap\n", itr->number);
|
DebugPrintf("Error: script %d doesn't have a corresponding heap\n", itr->getNumber());
|
||||||
|
|
||||||
if (script && heap && (script->size + heap->size > 65535))
|
if (script && heap && (script->size + heap->size > 65535))
|
||||||
DebugPrintf("Error: script and heap %d together are larger than 64KB (%d bytes)\n",
|
DebugPrintf("Error: script and heap %d together are larger than 64KB (%d bytes)\n",
|
||||||
itr->number, script->size + heap->size);
|
itr->getNumber(), script->size + heap->size);
|
||||||
|
|
||||||
++itr;
|
++itr;
|
||||||
}
|
}
|
||||||
|
@ -864,7 +864,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) {
|
||||||
parser->setMidiDriver(player);
|
parser->setMidiDriver(player);
|
||||||
|
|
||||||
Common::List<ResourceId> *resources = _engine->getResMan()->listResources(kResourceTypeSound);
|
Common::List<ResourceId> *resources = _engine->getResMan()->listResources(kResourceTypeSound);
|
||||||
sort(resources->begin(), resources->end(), ResourceIdLess());
|
Common::sort(resources->begin(), resources->end());
|
||||||
Common::List<ResourceId>::iterator itr = resources->begin();
|
Common::List<ResourceId>::iterator itr = resources->begin();
|
||||||
int instruments[128];
|
int instruments[128];
|
||||||
bool instrumentsSongs[128][1000];
|
bool instrumentsSongs[128][1000];
|
||||||
|
@ -885,12 +885,12 @@ bool Console::cmdShowInstruments(int argc, const char **argv) {
|
||||||
SoundResource *sound;
|
SoundResource *sound;
|
||||||
|
|
||||||
while (itr != resources->end()) {
|
while (itr != resources->end()) {
|
||||||
if (songNumber >= 0 && itr->number != songNumber) {
|
if (songNumber >= 0 && itr->getNumber() != songNumber) {
|
||||||
++itr;
|
++itr;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
sound = new SoundResource(itr->number, _engine->getResMan(), doSoundVersion);
|
sound = new SoundResource(itr->getNumber(), _engine->getResMan(), doSoundVersion);
|
||||||
int channelFilterMask = sound->getChannelFilterMask(player->getPlayId(), player->hasRhythmChannel());
|
int channelFilterMask = sound->getChannelFilterMask(player->getPlayId(), player->hasRhythmChannel());
|
||||||
SoundResource::Track *track = sound->getTrackByType(player->getPlayId());
|
SoundResource::Track *track = sound->getTrackByType(player->getPlayId());
|
||||||
if (track->digitalChannelNr != -1) {
|
if (track->digitalChannelNr != -1) {
|
||||||
|
@ -907,7 +907,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) {
|
||||||
bool endOfTrack = false;
|
bool endOfTrack = false;
|
||||||
bool firstOneShown = false;
|
bool firstOneShown = false;
|
||||||
|
|
||||||
DebugPrintf("Song %d: ", itr->number);
|
DebugPrintf("Song %d: ", itr->getNumber());
|
||||||
|
|
||||||
do {
|
do {
|
||||||
while (*channelData == 0xF8)
|
while (*channelData == 0xF8)
|
||||||
|
@ -937,7 +937,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) {
|
||||||
|
|
||||||
DebugPrintf(" %d", instrument);
|
DebugPrintf(" %d", instrument);
|
||||||
instruments[instrument]++;
|
instruments[instrument]++;
|
||||||
instrumentsSongs[instrument][itr->number] = true;
|
instrumentsSongs[instrument][itr->getNumber()] = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0xD:
|
case 0xD:
|
||||||
|
@ -1035,19 +1035,19 @@ bool Console::cmdList(int argc, const char **argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Common::List<ResourceId> *resources = _engine->getResMan()->listResources(res, number);
|
Common::List<ResourceId> *resources = _engine->getResMan()->listResources(res, number);
|
||||||
sort(resources->begin(), resources->end(), ResourceIdLess());
|
Common::sort(resources->begin(), resources->end());
|
||||||
Common::List<ResourceId>::iterator itr = resources->begin();
|
Common::List<ResourceId>::iterator itr = resources->begin();
|
||||||
|
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
while (itr != resources->end()) {
|
while (itr != resources->end()) {
|
||||||
if (number == -1) {
|
if (number == -1) {
|
||||||
DebugPrintf("%8i", itr->number);
|
DebugPrintf("%8i", itr->getNumber());
|
||||||
if (++cnt % 10 == 0)
|
if (++cnt % 10 == 0)
|
||||||
DebugPrintf("\n");
|
DebugPrintf("\n");
|
||||||
}
|
} else if (number == (int)itr->getNumber()) {
|
||||||
else if (number == (int)itr->number) {
|
const uint32 tuple = itr->getTuple();
|
||||||
DebugPrintf("(%3i, %3i, %3i, %3i) ", (itr->tuple >> 24) & 0xff, (itr->tuple >> 16) & 0xff,
|
DebugPrintf("(%3i, %3i, %3i, %3i) ", (tuple >> 24) & 0xff, (tuple >> 16) & 0xff,
|
||||||
(itr->tuple >> 8) & 0xff, itr->tuple & 0xff);
|
(tuple >> 8) & 0xff, tuple & 0xff);
|
||||||
if (++cnt % 4 == 0)
|
if (++cnt % 4 == 0)
|
||||||
DebugPrintf("\n");
|
DebugPrintf("\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,8 +61,8 @@ reg_t kLock(EngineState *s, int argc, reg_t *argv) {
|
||||||
if (which)
|
if (which)
|
||||||
g_sci->getResMan()->unlockResource(which);
|
g_sci->getResMan()->unlockResource(which);
|
||||||
else {
|
else {
|
||||||
if (id.type == kResourceTypeInvalid)
|
if (id.getType() == kResourceTypeInvalid)
|
||||||
warning("[resMan] Attempt to unlock resource %i of invalid type %i", id.number, type);
|
warning("[resMan] Attempt to unlock resource %i of invalid type %i", id.getNumber(), type);
|
||||||
else
|
else
|
||||||
warning("[resMan] Attempt to unlock non-existant resource %s", id.toString().c_str());
|
warning("[resMan] Attempt to unlock non-existant resource %s", id.toString().c_str());
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,7 +157,7 @@ void Resource::unalloc() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Resource::writeToStream(Common::WriteStream *stream) const {
|
void Resource::writeToStream(Common::WriteStream *stream) const {
|
||||||
stream->writeByte(_id.type | 0x80); // 0x80 is required by old sierra sci, otherwise it wont accept the patch file
|
stream->writeByte(getType() | 0x80); // 0x80 is required by old sierra sci, otherwise it wont accept the patch file
|
||||||
stream->writeByte(_headerSize);
|
stream->writeByte(_headerSize);
|
||||||
if (_headerSize > 0)
|
if (_headerSize > 0)
|
||||||
stream->write(_header, _headerSize);
|
stream->write(_header, _headerSize);
|
||||||
|
@ -334,10 +334,10 @@ void PatchResourceSource::loadResource(Resource *res) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacResourceForkResourceSource::loadResource(Resource *res) {
|
void MacResourceForkResourceSource::loadResource(Resource *res) {
|
||||||
Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->_id.type), res->_id.number);
|
Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->getType()), res->_id.getNumber());
|
||||||
|
|
||||||
if (!stream)
|
if (!stream)
|
||||||
error("Could not get Mac resource fork resource: %d %d", res->_id.type, res->_id.number);
|
error("Could not get Mac resource fork resource: %d %d", res->getType(), res->_id.getNumber());
|
||||||
|
|
||||||
int error = res->decompress(stream);
|
int error = res->decompress(stream);
|
||||||
if (error) {
|
if (error) {
|
||||||
|
@ -387,7 +387,7 @@ void AudioVolumeResourceSource::loadResource(Resource *res) {
|
||||||
mappingTable++;
|
mappingTable++;
|
||||||
compressedOffset = *mappingTable;
|
compressedOffset = *mappingTable;
|
||||||
// Go to next compressed offset and use that to calculate size of compressed sample
|
// Go to next compressed offset and use that to calculate size of compressed sample
|
||||||
switch (res->_id.type) {
|
switch (res->getType()) {
|
||||||
case kResourceTypeSync:
|
case kResourceTypeSync:
|
||||||
case kResourceTypeSync36:
|
case kResourceTypeSync36:
|
||||||
// we should already have a (valid) size
|
// we should already have a (valid) size
|
||||||
|
@ -405,7 +405,7 @@ void AudioVolumeResourceSource::loadResource(Resource *res) {
|
||||||
error("could not translate offset to compressed offset in audio volume");
|
error("could not translate offset to compressed offset in audio volume");
|
||||||
fileStream->seek(compressedOffset, SEEK_SET);
|
fileStream->seek(compressedOffset, SEEK_SET);
|
||||||
|
|
||||||
switch (res->_id.type) {
|
switch (res->getType()) {
|
||||||
case kResourceTypeAudio:
|
case kResourceTypeAudio:
|
||||||
case kResourceTypeAudio36:
|
case kResourceTypeAudio36:
|
||||||
// Directly read the stream, compressed audio wont have resource type id and header size for SCI1.1
|
// Directly read the stream, compressed audio wont have resource type id and header size for SCI1.1
|
||||||
|
@ -604,9 +604,9 @@ int ResourceManager::addInternalSources() {
|
||||||
Common::List<ResourceId>::iterator itr = resources->begin();
|
Common::List<ResourceId>::iterator itr = resources->begin();
|
||||||
|
|
||||||
while (itr != resources->end()) {
|
while (itr != resources->end()) {
|
||||||
ResourceSource *src = addSource(new IntMapResourceSource("MAP", itr->number));
|
ResourceSource *src = addSource(new IntMapResourceSource("MAP", itr->getNumber()));
|
||||||
|
|
||||||
if ((itr->number == 65535) && Common::File::exists("RESOURCE.SFX"))
|
if ((itr->getNumber() == 65535) && Common::File::exists("RESOURCE.SFX"))
|
||||||
addSource(new AudioVolumeResourceSource("RESOURCE.SFX", src, 0));
|
addSource(new AudioVolumeResourceSource("RESOURCE.SFX", src, 0));
|
||||||
else if (Common::File::exists("RESOURCE.AUD"))
|
else if (Common::File::exists("RESOURCE.AUD"))
|
||||||
addSource(new AudioVolumeResourceSource("RESOURCE.AUD", src, 0));
|
addSource(new AudioVolumeResourceSource("RESOURCE.AUD", src, 0));
|
||||||
|
@ -799,7 +799,7 @@ Common::List<ResourceId> *ResourceManager::listResources(ResourceType type, int
|
||||||
|
|
||||||
ResourceMap::iterator itr = _resMap.begin();
|
ResourceMap::iterator itr = _resMap.begin();
|
||||||
while (itr != _resMap.end()) {
|
while (itr != _resMap.end()) {
|
||||||
if ((itr->_value->_id.type == type) && ((mapNumber == -1) || (itr->_value->_id.number == mapNumber)))
|
if ((itr->_value->getType() == type) && ((mapNumber == -1) || (itr->_value->_id.getNumber() == mapNumber)))
|
||||||
resources->push_back(itr->_value->_id);
|
resources->push_back(itr->_value->_id);
|
||||||
++itr;
|
++itr;
|
||||||
}
|
}
|
||||||
|
@ -1220,7 +1220,7 @@ void ResourceManager::readResourcePatchesBase36() {
|
||||||
}
|
}
|
||||||
|
|
||||||
psrcPatch = new PatchResourceSource(name);
|
psrcPatch = new PatchResourceSource(name);
|
||||||
processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.tuple);
|
processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.getTuple());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1552,8 +1552,8 @@ int Resource::readResourceInfo(Common::SeekableReadStream *file,
|
||||||
case kResVersionSci11Mac:
|
case kResVersionSci11Mac:
|
||||||
// Doesn't store this data in the resource. Fortunately,
|
// Doesn't store this data in the resource. Fortunately,
|
||||||
// we already have this data.
|
// we already have this data.
|
||||||
type = _id.type;
|
type = getType();
|
||||||
number = _id.number;
|
number = _id.getNumber();
|
||||||
szPacked = file->size();
|
szPacked = file->size();
|
||||||
szUnpacked = file->size();
|
szUnpacked = file->size();
|
||||||
wCompression = 0;
|
wCompression = 0;
|
||||||
|
|
|
@ -114,55 +114,62 @@ class ResourceManager;
|
||||||
class ResourceSource;
|
class ResourceSource;
|
||||||
|
|
||||||
class ResourceId {
|
class ResourceId {
|
||||||
public:
|
static inline ResourceType fixupType(ResourceType type) {
|
||||||
ResourceType type;
|
if (type < kResourceTypeMacPict || type > kResourceTypeInvalid)
|
||||||
uint16 number;
|
return kResourceTypeInvalid;
|
||||||
uint32 tuple; // Only used for audio36 and sync36
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
ResourceId() : type(kResourceTypeInvalid), number(0), tuple(0) { }
|
ResourceType _type;
|
||||||
|
uint16 _number;
|
||||||
|
uint32 _tuple; // Only used for audio36 and sync36
|
||||||
|
|
||||||
|
public:
|
||||||
|
ResourceId() : _type(kResourceTypeInvalid), _number(0), _tuple(0) { }
|
||||||
|
|
||||||
ResourceId(ResourceType type_, uint16 number_, uint32 tuple_ = 0)
|
ResourceId(ResourceType type_, uint16 number_, uint32 tuple_ = 0)
|
||||||
: type(type_), number(number_), tuple(tuple_) {
|
: _type(fixupType(type_)), _number(number_), _tuple(tuple_) {
|
||||||
if (type < kResourceTypeMacPict || type > kResourceTypeInvalid)
|
|
||||||
type = kResourceTypeInvalid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ResourceId(ResourceType type_, uint16 number_, byte noun, byte verb, byte cond, byte seq)
|
ResourceId(ResourceType type_, uint16 number_, byte noun, byte verb, byte cond, byte seq)
|
||||||
: type(type_), number(number_) {
|
: _type(fixupType(type_)), _number(number_) {
|
||||||
tuple = (noun << 24) | (verb << 16) | (cond << 8) | seq;
|
_tuple = (noun << 24) | (verb << 16) | (cond << 8) | seq;
|
||||||
|
|
||||||
if ((type < kResourceTypeView) || (type > kResourceTypeInvalid))
|
|
||||||
type = kResourceTypeInvalid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Common::String toString() {
|
Common::String toString() const {
|
||||||
char buf[32];
|
char buf[32];
|
||||||
|
|
||||||
snprintf(buf, 32, "%s.%i", getResourceTypeName(type), number);
|
snprintf(buf, 32, "%s.%i", getResourceTypeName(_type), _number);
|
||||||
Common::String retStr = buf;
|
Common::String retStr = buf;
|
||||||
|
|
||||||
if (tuple != 0) {
|
if (_tuple != 0) {
|
||||||
snprintf(buf, 32, "(%i, %i, %i, %i)", tuple >> 24, (tuple >> 16) & 0xff, (tuple >> 8) & 0xff, tuple & 0xff);
|
snprintf(buf, 32, "(%i, %i, %i, %i)", _tuple >> 24, (_tuple >> 16) & 0xff, (_tuple >> 8) & 0xff, _tuple & 0xff);
|
||||||
retStr += buf;
|
retStr += buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
return retStr;
|
return retStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline ResourceType getType() const { return _type; }
|
||||||
|
inline uint16 getNumber() const { return _number; }
|
||||||
|
inline uint32 getTuple() const { return _tuple; }
|
||||||
|
|
||||||
|
inline uint hash() const {
|
||||||
|
return ((uint)((_type << 16) | _number)) ^ _tuple;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const ResourceId &other) const {
|
||||||
|
return (_type == other._type) && (_number == other._number) && (_tuple == other._tuple);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator<(const ResourceId &other) const {
|
||||||
|
return (_type < other._type) || ((_type == other._type) && (_number < other._number))
|
||||||
|
|| ((_type == other._type) && (_number == other._number) && (_tuple < other._tuple));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ResourceIdHash : public Common::UnaryFunction<ResourceId, uint> {
|
struct ResourceIdHash : public Common::UnaryFunction<ResourceId, uint> {
|
||||||
uint operator()(ResourceId val) const { return ((uint)((val.type << 16) | val.number)) ^ val.tuple; }
|
uint operator()(ResourceId val) const { return val.hash(); }
|
||||||
};
|
|
||||||
|
|
||||||
struct ResourceIdEqualTo : public Common::BinaryFunction<ResourceId, ResourceId, bool> {
|
|
||||||
bool operator()(const ResourceId &x, const ResourceId &y) const { return (x.type == y.type) && (x.number == y.number) && (x.tuple == y.tuple); }
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ResourceIdLess : public Common::BinaryFunction<ResourceId, ResourceId, bool> {
|
|
||||||
bool operator()(const ResourceId &x, const ResourceId &y) const {
|
|
||||||
return (x.type < y.type) || ((x.type == y.type) && (x.number < y.number))
|
|
||||||
|| ((x.type == y.type) && (x.number == y.number) && (x.tuple < y.tuple));
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Class for storing resources in memory */
|
/** Class for storing resources in memory */
|
||||||
|
@ -191,6 +198,8 @@ public:
|
||||||
byte *_header;
|
byte *_header;
|
||||||
uint32 _headerSize;
|
uint32 _headerSize;
|
||||||
|
|
||||||
|
inline ResourceType getType() const { return _id.getType(); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write the resource to the specified stream.
|
* Write the resource to the specified stream.
|
||||||
* This method is used only by the "dump" debugger command.
|
* This method is used only by the "dump" debugger command.
|
||||||
|
@ -213,7 +222,7 @@ protected:
|
||||||
int readResourceInfo(Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression);
|
int readResourceInfo(Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef Common::HashMap<ResourceId, Resource *, ResourceIdHash, ResourceIdEqualTo> ResourceMap;
|
typedef Common::HashMap<ResourceId, Resource *, ResourceIdHash> ResourceMap;
|
||||||
|
|
||||||
enum ResVersion {
|
enum ResVersion {
|
||||||
kResVersionUnknown,
|
kResVersionUnknown,
|
||||||
|
|
|
@ -100,8 +100,8 @@ bool Resource::loadFromAudioVolumeSCI11(Common::SeekableReadStream *file) {
|
||||||
file->seek(-4, SEEK_CUR);
|
file->seek(-4, SEEK_CUR);
|
||||||
|
|
||||||
ResourceType type = (ResourceType)(file->readByte() & 0x7f);
|
ResourceType type = (ResourceType)(file->readByte() & 0x7f);
|
||||||
if (((_id.type == kResourceTypeAudio || _id.type == kResourceTypeAudio36) && (type != kResourceTypeAudio))
|
if (((getType() == kResourceTypeAudio || getType() == kResourceTypeAudio36) && (type != kResourceTypeAudio))
|
||||||
|| ((_id.type == kResourceTypeSync || _id.type == kResourceTypeSync36) && (type != kResourceTypeSync))) {
|
|| ((getType() == kResourceTypeSync || getType() == kResourceTypeSync36) && (type != kResourceTypeSync))) {
|
||||||
warning("Resource type mismatch loading %s", _id.toString().c_str());
|
warning("Resource type mismatch loading %s", _id.toString().c_str());
|
||||||
unalloc();
|
unalloc();
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue