diff options
author | Walter van Niftrik | 2009-06-07 19:15:55 +0000 |
---|---|---|
committer | Walter van Niftrik | 2009-06-07 19:15:55 +0000 |
commit | a6ed05740f1f46639f38ccf0afb9c444564cc84f (patch) | |
tree | 310b79a435f54f2d8e22555234ccb33f62848969 /engines/sci/engine | |
parent | 4dd29a5985a4190f99446865209850a40f12e2e4 (diff) | |
download | scummvm-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.cpp | 18 | ||||
-rw-r--r-- | engines/sci/engine/kernel.cpp | 8 | ||||
-rw-r--r-- | engines/sci/engine/kscripts.cpp | 49 | ||||
-rw-r--r-- | engines/sci/engine/ksound.cpp | 57 | ||||
-rw-r--r-- | engines/sci/engine/kstring.cpp | 4 | ||||
-rw-r--r-- | engines/sci/engine/message.cpp | 4 | ||||
-rw-r--r-- | engines/sci/engine/savegame.cpp | 4 | ||||
-rw-r--r-- | engines/sci/engine/script.cpp | 2 | ||||
-rw-r--r-- | engines/sci/engine/seg_manager.cpp | 4 | ||||
-rw-r--r-- | engines/sci/engine/vm.cpp | 4 |
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); |