diff options
author | Max Horn | 2003-05-20 20:42:28 +0000 |
---|---|---|
committer | Max Horn | 2003-05-20 20:42:28 +0000 |
commit | 1a394aa3c764c8a50def5bb9d8aa1342d962fbdd (patch) | |
tree | fc456ba99a56a6b594cc4817807a59531af2ecd2 /scumm/script.cpp | |
parent | 410f8b48264ed9fd02f0d18d462d74a67688f9fa (diff) | |
download | scummvm-rg350-1a394aa3c764c8a50def5bb9d8aa1342d962fbdd.tar.gz scummvm-rg350-1a394aa3c764c8a50def5bb9d8aa1342d962fbdd.tar.bz2 scummvm-rg350-1a394aa3c764c8a50def5bb9d8aa1342d962fbdd.zip |
added enum's for the known actor/object claasses; extended putClass/getClass to translate the X/Y flip classes; made code use the new enum's; some other cleanup
svn-id: r7753
Diffstat (limited to 'scumm/script.cpp')
-rw-r--r-- | scumm/script.cpp | 230 |
1 files changed, 115 insertions, 115 deletions
diff --git a/scumm/script.cpp b/scumm/script.cpp index 0c7a2c437b..476a5f1662 100644 --- a/scumm/script.cpp +++ b/scumm/script.cpp @@ -76,6 +76,121 @@ void Scumm::runScript(int script, bool freezeResistant, bool recursive, int *lva runScriptNested(slot); } +void Scumm::runVerbCode(int object, int entry, bool freezeResistant, bool recursive, int *vars) { + ScriptSlot *s; + uint32 obcd; + int slot, where, offs; + + if (!object) + return; + + if (!recursive) + stopObjectScript(object); + + where = whereIsObject(object); + + if (where == WIO_NOT_FOUND) { + warning("Code for object %d not in room %d", object, _roomResource); + return; + } + + obcd = getOBCDOffs(object); + slot = getScriptSlot(); + + offs = getVerbEntrypoint(object, entry); + if (offs == 0) + return; + + s = &vm.slot[slot]; + s->number = object; + s->offs = obcd + offs; + s->status = ssRunning; + s->where = where; + s->freezeResistant = freezeResistant; + s->recursive = recursive; + s->freezeCount = 0; + s->delayFrameCount = 0; + + initializeLocals(slot, vars); + + runScriptNested(slot); +} + +void Scumm::initializeLocals(int slot, int *vars) { + int i; + if (!vars) { + for (i = 0; i < 16; i++) + vm.localvar[slot][i] = 0; + } else { + for (i = 0; i < 16; i++) + vm.localvar[slot][i] = vars[i]; + } +} + +int Scumm::getVerbEntrypoint(int obj, int entry) { + byte *objptr, *verbptr; + int verboffs; + + if (whereIsObject(obj) == WIO_NOT_FOUND) + return 0; + + objptr = getOBCDFromObject(obj); + assert(objptr); + + if (_features & GF_AFTER_V2) + verbptr = objptr + 15; + else if (_features & GF_OLD_BUNDLE) + verbptr = objptr + 17; + else if (_features & GF_SMALL_HEADER) + verbptr = objptr + 19; + else + verbptr = findResource(MKID('VERB'), objptr); + + assert(verbptr); + + verboffs = verbptr - objptr; + + if (!(_features & GF_SMALL_HEADER)) + verbptr += _resourceHeaderSize; + + if (_features & GF_AFTER_V8) { + uint32 *ptr = (uint32 *)verbptr; + uint32 verb; + do { + verb = READ_LE_UINT32(ptr); + if (!verb) + return 0; + if (verb == (uint32)entry || verb == 0xFFFFFFFF) + break; + ptr += 2; + } while (1); + return verboffs + 8 + READ_LE_UINT32(ptr + 1); + } if (_features & GF_AFTER_V2) { + do { + if (!*verbptr) + return 0; + if (*verbptr == entry || *verbptr == 0xFF) + break; + verbptr += 2; + } while (1); + + return *(verbptr + 1); + } else { + do { + if (!*verbptr) + return 0; + if (*verbptr == entry || *verbptr == 0xFF) + break; + verbptr += 3; + } while (1); + + if (_features & GF_SMALL_HEADER) + return READ_LE_UINT16(verbptr + 1); + else + return verboffs + READ_LE_UINT16(verbptr + 1); + } +} + /* Stop script 'script' */ void Scumm::stopScriptNr(int script) { ScriptSlot *ss; @@ -794,121 +909,6 @@ void Scumm::decreaseScriptDelay(int amount) { } } -void Scumm::runVerbCode(int object, int entry, bool freezeResistant, bool recursive, int *vars) { - ScriptSlot *s; - uint32 obcd; - int slot, where, offs; - - if (!object) - return; - - if (!recursive) - stopObjectScript(object); - - where = whereIsObject(object); - - if (where == WIO_NOT_FOUND) { - warning("Code for object %d not in room %d", object, _roomResource); - return; - } - - obcd = getOBCDOffs(object); - slot = getScriptSlot(); - - offs = getVerbEntrypoint(object, entry); - if (offs == 0) - return; - - s = &vm.slot[slot]; - s->number = object; - s->offs = obcd + offs; - s->status = ssRunning; - s->where = where; - s->freezeResistant = freezeResistant; - s->recursive = recursive; - s->freezeCount = 0; - s->delayFrameCount = 0; - - initializeLocals(slot, vars); - - runScriptNested(slot); -} - -void Scumm::initializeLocals(int slot, int *vars) { - int i; - if (!vars) { - for (i = 0; i < 16; i++) - vm.localvar[slot][i] = 0; - } else { - for (i = 0; i < 16; i++) - vm.localvar[slot][i] = vars[i]; - } -} - -int Scumm::getVerbEntrypoint(int obj, int entry) { - byte *objptr, *verbptr; - int verboffs; - - if (whereIsObject(obj) == WIO_NOT_FOUND) - return 0; - - objptr = getOBCDFromObject(obj); - assert(objptr); - - if (_features & GF_AFTER_V2) - verbptr = objptr + 15; - else if (_features & GF_OLD_BUNDLE) - verbptr = objptr + 17; - else if (_features & GF_SMALL_HEADER) - verbptr = objptr + 19; - else - verbptr = findResource(MKID('VERB'), objptr); - - assert(verbptr); - - verboffs = verbptr - objptr; - - if (!(_features & GF_SMALL_HEADER)) - verbptr += _resourceHeaderSize; - - if (_features & GF_AFTER_V8) { - uint32 *ptr = (uint32 *)verbptr; - uint32 verb; - do { - verb = READ_LE_UINT32(ptr); - if (!verb) - return 0; - if (verb == (uint32)entry || verb == 0xFFFFFFFF) - break; - ptr += 2; - } while (1); - return verboffs + 8 + READ_LE_UINT32(ptr + 1); - } if (_features & GF_AFTER_V2) { - do { - if (!*verbptr) - return 0; - if (*verbptr == entry || *verbptr == 0xFF) - break; - verbptr += 2; - } while (1); - - return *(verbptr + 1); - } else { - do { - if (!*verbptr) - return 0; - if (*verbptr == entry || *verbptr == 0xFF) - break; - verbptr += 3; - } while (1); - - if (_features & GF_SMALL_HEADER) - return READ_LE_UINT16(verbptr + 1); - else - return verboffs + READ_LE_UINT16(verbptr + 1); - } -} - bool Scumm::isScriptRunning(int script) { int i; ScriptSlot *ss = vm.slot; |