aboutsummaryrefslogtreecommitdiff
path: root/resource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'resource.cpp')
-rw-r--r--resource.cpp46
1 files changed, 30 insertions, 16 deletions
diff --git a/resource.cpp b/resource.cpp
index 4c71656532..7927c24b51 100644
--- a/resource.cpp
+++ b/resource.cpp
@@ -457,16 +457,17 @@ int Scumm::loadResource(int type, int index) {
}
int Scumm::readSoundResource(int type, int index) {
- uint32 resStart, size, tag, size2, basetag;
- byte *ptr;
+ uint32 pos, total_size, size, tag,basetag;
int i;
+ int pri, best_pri;
+ uint32 best_size, best_offs;
debug(9, "readSoundResource(%d,%d)", type, index);
- resStart = 0;
+ pos = 0;
basetag = fileReadDwordLE();
- size = fileReadDwordBE();
+ total_size = fileReadDwordBE();
#if defined(SAMNMAX) || defined(FULL_THROTTLE)
if (basetag == MKID('MIDI')) {
@@ -475,23 +476,36 @@ int Scumm::readSoundResource(int type, int index) {
return 1;
}
#else
- while (size>resStart) {
+ while (pos < total_size) {
tag = fileReadDword();
- size2 = fileReadDwordBE();
-
- resStart += size2 + 8;
+ size = fileReadDwordBE() + 8;
+ pos += size;
- for (i=0,ptr=_soundTagTable; i<_numSoundTags; i++,ptr+=4) {
-/* endian OK, tags are in native format */
- if (READ_UINT32_UNALIGNED(ptr) == tag) {
- fileSeek(_fileHandle, -8, SEEK_CUR);
- fileRead(_fileHandle,createResource(type, index, size2+8), size2+8);
- return 1;
- }
+ switch(tag) {
+#ifdef USE_ADLIB
+ case MKID('ADL '): pri = 10; break;
+#else
+ case MKID('ROL '): pri = 1; break;
+ case MKID('GMD '): pri = 2; break;
+#endif
+ default: pri = -1;
}
- fileSeek(_fileHandle, size2, SEEK_CUR);
+ if (pri > best_pri) {
+ best_pri = pri;
+ best_size = size;
+ best_offs = filePos(_fileHandle);
+ }
+
+ fileSeek(_fileHandle, size - 8, SEEK_CUR);
+ }
+
+ if (best_pri != -1) {
+ fileSeek(_fileHandle, best_offs - 8, SEEK_SET);
+ fileRead(_fileHandle,createResource(type, index, best_size), best_size);
+ return 1;
}
+
#endif
res.roomoffs[type][index] = 0xFFFFFFFF;
return 0;