aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
authorWalter van Niftrik2009-06-07 19:15:55 +0000
committerWalter van Niftrik2009-06-07 19:15:55 +0000
commita6ed05740f1f46639f38ccf0afb9c444564cc84f (patch)
tree310b79a435f54f2d8e22555234ccb33f62848969 /engines/sci/engine
parent4dd29a5985a4190f99446865209850a40f12e2e4 (diff)
downloadscummvm-rg350-a6ed05740f1f46639f38ccf0afb9c444564cc84f.tar.gz
scummvm-rg350-a6ed05740f1f46639f38ccf0afb9c444564cc84f.tar.bz2
scummvm-rg350-a6ed05740f1f46639f38ccf0afb9c444564cc84f.zip
SCI: Moved resource36 handling into resource manager.
svn-id: r41349
Diffstat (limited to 'engines/sci/engine')
-rw-r--r--engines/sci/engine/game.cpp18
-rw-r--r--engines/sci/engine/kernel.cpp8
-rw-r--r--engines/sci/engine/kscripts.cpp49
-rw-r--r--engines/sci/engine/ksound.cpp57
-rw-r--r--engines/sci/engine/kstring.cpp4
-rw-r--r--engines/sci/engine/message.cpp4
-rw-r--r--engines/sci/engine/savegame.cpp4
-rw-r--r--engines/sci/engine/script.cpp2
-rw-r--r--engines/sci/engine/seg_manager.cpp4
-rw-r--r--engines/sci/engine/vm.cpp4
10 files changed, 81 insertions, 73 deletions
diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp
index 5a250529cd..bbb29ada3b 100644
--- a/engines/sci/engine/game.cpp
+++ b/engines/sci/engine/game.cpp
@@ -64,13 +64,13 @@ int _reset_graphics_input(EngineState *s) {
s->gfx_state->gfxResMan->setStaticPalette(gfxr_read_pal1_amiga(file));
file.close();
} else {
- resource = s->resmgr->findResource(kResourceTypePalette, 999, 1);
+ resource = s->resmgr->findResource(ResourceId(kResourceTypePalette, 999), 1);
if (resource) {
if (s->_version < SCI_VERSION_1_1)
s->gfx_state->gfxResMan->setStaticPalette(gfxr_read_pal1(999, resource->data, resource->size));
else
s->gfx_state->gfxResMan->setStaticPalette(gfxr_read_pal11(999, resource->data, resource->size));
- s->resmgr->unlockResource(resource, 999, kResourceTypePalette);
+ s->resmgr->unlockResource(resource);
} else {
debug(2, "Couldn't find the default palette!");
}
@@ -96,7 +96,7 @@ int _reset_graphics_input(EngineState *s) {
font_nr = -1;
do {
- resource = s->resmgr->testResource(kResourceTypeFont, ++font_nr);
+ resource = s->resmgr->testResource(ResourceId(kResourceTypeFont, ++font_nr));
} while ((!resource) && (font_nr < sci_max_resource_nr[s->resmgr->_sciVersion]));
if (!resource) {
@@ -196,7 +196,7 @@ int create_class_table_sci11(EngineState *s) {
char *seeker_ptr;
int classnr;
- Resource *vocab996 = s->resmgr->findResource(kResourceTypeVocab, 996, 1);
+ Resource *vocab996 = s->resmgr->findResource(ResourceId(kResourceTypeVocab, 996), 1);
if (!vocab996)
s->_classtable.resize(20);
@@ -204,7 +204,7 @@ int create_class_table_sci11(EngineState *s) {
s->_classtable.resize(vocab996->size >> 2);
for (scriptnr = 0; scriptnr < 1000; scriptnr++) {
- Resource *heap = s->resmgr->findResource(kResourceTypeHeap, scriptnr, 0);
+ Resource *heap = s->resmgr->findResource(ResourceId(kResourceTypeHeap, scriptnr), 0);
if (heap) {
int global_vars = READ_LE_UINT16(heap->data + 2);
@@ -236,7 +236,7 @@ int create_class_table_sci11(EngineState *s) {
}
}
- s->resmgr->unlockResource(vocab996, 996, kResourceTypeVocab);
+ s->resmgr->unlockResource(vocab996);
vocab996 = NULL;
return 0;
}
@@ -247,7 +247,7 @@ static int create_class_table_sci0(EngineState *s) {
int classnr;
int magic_offset; // For strange scripts in older SCI versions
- Resource *vocab996 = s->resmgr->findResource(kResourceTypeVocab, 996, 1);
+ Resource *vocab996 = s->resmgr->findResource(ResourceId(kResourceTypeVocab, 996), 1);
if (!vocab996)
s->_classtable.resize(20);
@@ -256,7 +256,7 @@ static int create_class_table_sci0(EngineState *s) {
for (scriptnr = 0; scriptnr < 1000; scriptnr++) {
int objtype = 0;
- Resource *script = s->resmgr->findResource(kResourceTypeScript, scriptnr, 0);
+ Resource *script = s->resmgr->findResource(ResourceId(kResourceTypeScript, scriptnr), 0);
if (script) {
if (s->_flags & GF_SCI0_OLD)
@@ -318,7 +318,7 @@ static int create_class_table_sci0(EngineState *s) {
}
}
- s->resmgr->unlockResource(vocab996, 996, kResourceTypeVocab);
+ s->resmgr->unlockResource(vocab996);
vocab996 = NULL;
return 0;
}
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 3b998c7092..baf45d80c7 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -495,7 +495,7 @@ Kernel::~Kernel() {
bool Kernel::loadSelectorNames(bool isOldSci0) {
int count;
- Resource *r = _resmgr->findResource(kResourceTypeVocab, VOCAB_RESOURCE_SNAMES, 0);
+ Resource *r = _resmgr->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SNAMES), 0);
if (!r) // No such resource?
return false;
@@ -520,7 +520,7 @@ bool Kernel::loadSelectorNames(bool isOldSci0) {
bool Kernel::loadOpcodes() {
int count, i = 0;
- Resource* r = _resmgr->findResource(kResourceTypeVocab, VOCAB_RESOURCE_OPCODES, 0);
+ Resource* r = _resmgr->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_OPCODES), 0);
_opcodes.clear();
@@ -862,7 +862,7 @@ static void _vocab_get_knames0alt(const Resource *r, Common::StringList &names)
static void vocab_get_knames0(ResourceManager *resmgr, Common::StringList &names) {
int count, i, index = 2, empty_to_add = 1;
- Resource *r = resmgr->findResource(kResourceTypeVocab, VOCAB_RESOURCE_KNAMES, 0);
+ Resource *r = resmgr->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_KNAMES), 0);
if (!r) { // No kernel name table found? Fall back to default table
names.resize(SCI0_KNAMES_DEFAULT_ENTRIES_NR);
@@ -925,7 +925,7 @@ static void vocab_get_knames11(ResourceManager *resmgr, Common::StringList &name
*/
//unsigned int size = 64, pos = 3;
int len;
- Resource *r = resmgr->findResource(kResourceTypeVocab, VOCAB_RESOURCE_KNAMES, 0);
+ Resource *r = resmgr->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_KNAMES), 0);
if(r == NULL) // failed to open vocab.999 (happens with SCI1 demos)
return; // FIXME: should return a default table for this engine
const byte nCnt = *r->data;
diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp
index 2479696630..d82f8ff132 100644
--- a/engines/sci/engine/kscripts.cpp
+++ b/engines/sci/engine/kscripts.cpp
@@ -125,19 +125,27 @@ reg_t kLoad(EngineState *s, int funct_nr, int argc, reg_t *argv) {
}
reg_t kLock(EngineState *s, int funct_nr, int argc, reg_t *argv) {
- int restype = argv[0].toUint16() & 0x7f;
- int resnr = argv[1].toUint16();
int state = argc > 2 ? argv[2].toUint16() : 1;
+ ResourceType type = (ResourceType)(argv[0].toUint16() & 0x7f);
+ ResourceId id = ResourceId(type, argv[1].toUint16());
Resource *which;
switch (state) {
case 1 :
- s->resmgr->findResource((ResourceType)restype, resnr, 1);
+ s->resmgr->findResource(id, 1);
break;
case 0 :
- which = s->resmgr->findResource((ResourceType)restype, resnr, 0);
- s->resmgr->unlockResource(which, resnr, (ResourceType)restype);
+ which = s->resmgr->findResource(id, 0);
+
+ if (which)
+ s->resmgr->unlockResource(which);
+ else {
+ if (id.type == kResourceTypeInvalid)
+ warning("[Resmgr] Attempt to unlock resource %i of invalid type %i", id.number, type);
+ else
+ warning("[Resmgr] Attempt to unlock non-existant resource %s", id.toString().c_str());
+ }
break;
}
return s->r_acc;
@@ -155,26 +163,23 @@ reg_t kUnLoad(EngineState *s, int funct_nr, int argc, reg_t *argv) {
}
reg_t kResCheck(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+ Resource *res = NULL;
ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f);
- switch (restype) {
- case kResourceTypeAudio36:
- case kResourceTypeSync36: {
- assert(argc >= 6);
-
- uint module = argv[1].toUint16();
- uint noun = argv[2].toUint16();
- uint verb = argv[3].toUint16();
- uint cond = argv[4].toUint16();
- uint seq = argv[5].toUint16();
- warning("ResCheck: checking for currently unsupported %s resource: module %i; tuple (%i, %i, %i, %i)",
- getResourceTypeName(restype), module, noun, verb, cond, seq);
- return make_reg(0, 1);
- }
- default:
- Resource *res = s->resmgr->testResource(restype, argv[1].toUint16());
- return make_reg(0, res != NULL);
+ if ((restype == kResourceTypeAudio36) || (restype == kResourceTypeSync36)) {
+ if (argc >= 6) {
+ uint noun = argv[2].toUint16() & 0xff;
+ uint verb = argv[3].toUint16() & 0xff;
+ uint cond = argv[4].toUint16() & 0xff;
+ uint seq = argv[5].toUint16() & 0xff;
+
+ res = s->resmgr->testResource(ResourceId(restype, argv[1].toUint16(), noun, verb, cond, seq));
+ }
+ } else {
+ res = s->resmgr->testResource(ResourceId(restype, argv[1].toUint16()));
}
+
+ return make_reg(0, res != NULL);
}
reg_t kClone(EngineState *s, int funct_nr, int argc, reg_t *argv) {
diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp
index f899fa9a84..b742c93a52 100644
--- a/engines/sci/engine/ksound.cpp
+++ b/engines/sci/engine/ksound.cpp
@@ -123,7 +123,7 @@ enum AudioSyncCommands {
static void script_set_priority(EngineState *s, reg_t obj, int priority) {
int song_nr = GET_SEL32V(obj, number);
- Resource *song = s->resmgr->findResource(kResourceTypeSound, song_nr, 0);
+ Resource *song = s->resmgr->findResource(ResourceId(kResourceTypeSound, song_nr), 0);
int flags = GET_SEL32V(obj, flags);
if (priority == -1) {
@@ -140,7 +140,7 @@ static void script_set_priority(EngineState *s, reg_t obj, int priority) {
}
SongIterator *build_iterator(EngineState *s, int song_nr, SongIteratorType type, songit_id_t id) {
- Resource *song = s->resmgr->findResource(kResourceTypeSound, song_nr, 0);
+ Resource *song = s->resmgr->findResource(ResourceId(kResourceTypeSound, song_nr), 0);
if (!song)
return NULL;
@@ -503,7 +503,7 @@ reg_t kDoSound_SCI01(EngineState *s, int funct_nr, int argc, reg_t *argv) {
//int vol = GET_SEL32V(obj, vol);
//int pri = GET_SEL32V(obj, pri);
- if (obj.segment && (s->resmgr->testResource(kResourceTypeSound, number))) {
+ if (obj.segment && (s->resmgr->testResource(ResourceId(kResourceTypeSound, number)))) {
sciprintf("Initializing song number %d\n", number);
s->_sound.sfx_add_song(build_iterator(s, number, SCI_SONG_ITERATOR_TYPE_SCI1,
handle), 0, handle, number);
@@ -807,7 +807,7 @@ reg_t kDoSound_SCI1(EngineState *s, int funct_nr, int argc, reg_t *argv) {
}
if (!GET_SEL32V(obj, nodePtr) && obj.segment) {
- if (!s->resmgr->testResource(kResourceTypeSound, number)) {
+ if (!s->resmgr->testResource(ResourceId(kResourceTypeSound, number))) {
sciprintf("Could not open song number %d\n", number);
return NULL_REG;
}
@@ -837,7 +837,7 @@ reg_t kDoSound_SCI1(EngineState *s, int funct_nr, int argc, reg_t *argv) {
s->_sound.sfx_remove_song(handle);
}
- if (obj.segment && (s->resmgr->testResource(kResourceTypeSound, number))) {
+ if (obj.segment && (s->resmgr->testResource(ResourceId(kResourceTypeSound, number)))) {
sciprintf("Initializing song number %d\n", number);
s->_sound.sfx_add_song(build_iterator(s, number, SCI_SONG_ITERATOR_TYPE_SCI1,
handle), 0, handle, number);
@@ -991,15 +991,12 @@ reg_t kDoAudio(EngineState *s, int funct_nr, int argc, reg_t *argv) {
if (audioStream)
mixer->playInputStream(Audio::Mixer::kSpeechSoundType, s->_sound._audioResource->getAudioHandle(), audioStream);
} else if (argc == 6) { // SQ4CD or newer
- //uint32 volume = argv[1].toUint16();
// Make a BE number
uint32 audioNumber = (((argv[2].toUint16() & 0xFF) << 24) & 0xFF000000) |
(((argv[3].toUint16() & 0xFF) << 16) & 0x00FF0000) |
(((argv[4].toUint16() & 0xFF) << 8) & 0x0000FF00) |
( (argv[5].toUint16() & 0xFF) & 0x000000FF);
- printf("%d %d %d %d -> %d\n", argv[2].toUint16(), argv[3].toUint16(), argv[4].toUint16(), argv[5].toUint16(), audioNumber); // debugging
-
Audio::AudioStream *audioStream = s->_sound._audioResource->getAudioStream(audioNumber, argv[1].toUint16(), &sampleLen);
if (audioStream)
@@ -1042,28 +1039,34 @@ reg_t kDoAudio(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kDoSync(EngineState *s, int funct_nr, int argc, reg_t *argv) {
switch (argv[0].toUint16()) {
- case kSciAudioSyncStart:
- if (argc == 3) { // KQ5CD, KQ6 floppy
- if (s->_sound._soundSync) {
- s->resmgr->unlockResource(s->_sound._soundSync, s->_sound._soundSync->id.number, kResourceTypeSync);
- }
+ case kSciAudioSyncStart: {
+ ResourceId id;
+
+ if (s->_sound._soundSync)
+ s->resmgr->unlockResource(s->_sound._soundSync);
+
+ // Load sound sync resource and lock it
+ if (argc == 3) {
+ id = ResourceId(kResourceTypeSync, argv[2].toUint16());
+ } else if (argc == 7) {
+ id = ResourceId(kResourceTypeSync36, argv[2].toUint16(), argv[3].toUint16(), argv[4].toUint16(),
+ argv[5].toUint16(), argv[6].toUint16());
+ } else {
+ warning("kDoSync: Start called with an unknown number of parameters (%d)", argc);
+ return s->r_acc;
+ }
- // Load sound sync resource and lock it
- s->_sound._soundSync = (ResourceSync *)s->resmgr->findResource(kResourceTypeSync, argv[2].toUint16(), 1);
+ s->_sound._soundSync = (ResourceSync *)s->resmgr->findResource(id, 1);
- if (s->_sound._soundSync) {
- s->_sound._soundSync->startSync(s, argv[1]);
- } else {
- // Notify the scripts to stop sound sync
- PUT_SEL32V(argv[1], syncCue, -1);
- }
- } else if (argc == 7) { // SQ4CD or newer
- // TODO
- warning("kDoSync: Start called with new semantics - 6 parameters: %d %d %d %d %d %d", argv[1].toUint16(), argv[2].toUint16(), argv[3].toUint16(), argv[4].toUint16(), argv[5].toUint16(), argv[6].toUint16());
- } else { // Hopefully, this should never happen
- warning("kDoSync: Start called with an unknown number of parameters (%d)", argc);
+ if (s->_sound._soundSync) {
+ s->_sound._soundSync->startSync(s, argv[1]);
+ } else {
+ warning("DoSync: failed to find resource %s", id.toString().c_str());
+ // Notify the scripts to stop sound sync
+ PUT_SEL32V(argv[1], syncCue, -1);
}
break;
+ }
case kSciAudioSyncNext:
if (s->_sound._soundSync) {
s->_sound._soundSync->nextSync(s, argv[1]);
@@ -1072,7 +1075,7 @@ reg_t kDoSync(EngineState *s, int funct_nr, int argc, reg_t *argv) {
case kSciAudioSyncStop:
if (s->_sound._soundSync) {
s->_sound._soundSync->stopSync();
- s->resmgr->unlockResource(s->_sound._soundSync, s->_sound._soundSync->id.number, kResourceTypeSync);
+ s->resmgr->unlockResource(s->_sound._soundSync);
s->_sound._soundSync = NULL;
}
break;
diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp
index cb2f9ea07c..2a30a103b6 100644
--- a/engines/sci/engine/kstring.cpp
+++ b/engines/sci/engine/kstring.cpp
@@ -48,7 +48,7 @@ char *kernel_lookup_text(EngineState *s, reg_t address, int index) {
else {
int textlen;
int _index = index;
- textres = s->resmgr->findResource(kResourceTypeText, address.offset, 0);
+ textres = s->resmgr->findResource(ResourceId(kResourceTypeText, address.offset), 0);
if (!textres) {
error("text.%03d not found", address.offset);
@@ -646,7 +646,7 @@ reg_t kStrLen(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kGetFarText(EngineState *s, int funct_nr, int argc, reg_t *argv) {
- Resource *textres = s->resmgr->findResource(kResourceTypeText, argv[0].toUint16(), 0);
+ Resource *textres = s->resmgr->findResource(ResourceId(kResourceTypeText, argv[0].toUint16()), 0);
char *seeker;
int counter = argv[1].toUint16();
diff --git a/engines/sci/engine/message.cpp b/engines/sci/engine/message.cpp
index 4f5efa106c..c019f7a3bc 100644
--- a/engines/sci/engine/message.cpp
+++ b/engines/sci/engine/message.cpp
@@ -229,11 +229,11 @@ int MessageState::loadRes(ResourceManager *resmgr, int module, bool lock) {
}
// Otherwise, free the old resource
- resmgr->unlockResource(_currentResource, _module, kResourceTypeMessage);
+ resmgr->unlockResource(_currentResource);
_locked = false;
}
- _currentResource = resmgr->findResource(kResourceTypeMessage, module, lock);
+ _currentResource = resmgr->findResource(ResourceId(kResourceTypeMessage, module), lock);
if (_currentResource == NULL || _currentResource->data == NULL) {
warning("Message: failed to load %d.msg", module);
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index 8e3b8a5304..b04e5b144a 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -544,9 +544,9 @@ static void load_script(EngineState *s, SegmentId seg) {
scr->buf = (byte *)malloc(scr->buf_size);
assert(scr->buf);
- script = s->resmgr->findResource(kResourceTypeScript, scr->nr, 0);
+ script = s->resmgr->findResource(ResourceId(kResourceTypeScript, scr->nr), 0);
if (s->_version >= SCI_VERSION_1_1)
- heap = s->resmgr->findResource(kResourceTypeHeap, scr->nr, 0);
+ heap = s->resmgr->findResource(ResourceId(kResourceTypeHeap, scr->nr), 0);
memcpy(scr->buf, script->data, script->size);
if (s->seg_manager->isSci1_1)
diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp
index 74bbaa8854..a0bfdeddc9 100644
--- a/engines/sci/engine/script.cpp
+++ b/engines/sci/engine/script.cpp
@@ -295,7 +295,7 @@ void Kernel::dumpScriptClass(char *data, int seeker, int objsize) {
void Kernel::dissectScript(int scriptNumber, Vocabulary *vocab) {
int objectctr[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned int _seeker = 0;
- Resource *script = _resmgr->findResource(kResourceTypeScript, scriptNumber, 0);
+ Resource *script = _resmgr->findResource(ResourceId(kResourceTypeScript, scriptNumber), 0);
if (!script) {
sciprintf("Script not found!\n");
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index dcf7180501..98fbd8bad7 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -129,8 +129,8 @@ Script *SegManager::allocateScript(EngineState *s, int script_nr, SegmentId *seg
}
void SegManager::setScriptSize(Script &scr, EngineState *s, int script_nr) {
- Resource *script = s->resmgr->findResource(kResourceTypeScript, script_nr, 0);
- Resource *heap = s->resmgr->findResource(kResourceTypeHeap, script_nr, 0);
+ Resource *script = s->resmgr->findResource(ResourceId(kResourceTypeScript, script_nr), 0);
+ Resource *heap = s->resmgr->findResource(ResourceId(kResourceTypeHeap, script_nr), 0);
scr.script_size = script->size;
scr.heap_size = 0; // Set later
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index b01e5054af..f788629892 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -1609,9 +1609,9 @@ int script_instantiate_common(EngineState *s, int script_nr, Resource **script,
*was_new = 1;
- *script = s->resmgr->findResource(kResourceTypeScript, script_nr, 0);
+ *script = s->resmgr->findResource(ResourceId(kResourceTypeScript, script_nr), 0);
if (s->_version >= SCI_VERSION_1_1)
- *heap = s->resmgr->findResource(kResourceTypeHeap, script_nr, 0);
+ *heap = s->resmgr->findResource(ResourceId(kResourceTypeHeap, script_nr), 0);
if (!*script || (s->_version >= SCI_VERSION_1_1 && !heap)) {
sciprintf("Script 0x%x requested but not found\n", script_nr);