diff options
author | Gregory Montoir | 2007-05-14 21:52:06 +0000 |
---|---|---|
committer | Gregory Montoir | 2007-05-14 21:52:06 +0000 |
commit | 97e6e4aea894e6ea89f70e96aec0e1922e735637 (patch) | |
tree | e8056499a70587799eb454f35a737430d18fbade /engines | |
parent | 13f2b1fd636326ddd3164d8c098297f4d385b419 (diff) | |
download | scummvm-rg350-97e6e4aea894e6ea89f70e96aec0e1922e735637.tar.gz scummvm-rg350-97e6e4aea894e6ea89f70e96aec0e1922e735637.tar.bz2 scummvm-rg350-97e6e4aea894e6ea89f70e96aec0e1922e735637.zip |
this should fix script label offsets computation for OS
svn-id: r26841
Diffstat (limited to 'engines')
-rw-r--r-- | engines/cine/script.cpp | 894 |
1 files changed, 359 insertions, 535 deletions
diff --git a/engines/cine/script.cpp b/engines/cine/script.cpp index bff7344bf7..fb4a681e16 100644 --- a/engines/cine/script.cpp +++ b/engines/cine/script.cpp @@ -41,385 +41,389 @@ uint16 _currentPosition; uint16 _currentLine; uint16 _closeScript; -typedef void (*OpcodeProc) (); -const OpcodeProc *_opcodeTable; +struct Opcode { + void (*proc)(); + const char *args; +}; + +const Opcode *_opcodeTable; int _numOpcodes; void setupOpcodes() { - static const OpcodeProc opcodeTableFW[] = { + static const Opcode opcodeTableFW[] = { /* 00 */ - o1_modifyObjectParam, - o1_getObjectParam, - o1_addObjectParam, - o1_subObjectParam, + { o1_modifyObjectParam, "bbw" }, + { o1_getObjectParam, "bbb" }, + { o1_addObjectParam, "bbw" }, + { o1_subObjectParam, "bbw" }, /* 04 */ - o1_add2ObjectParam, - o1_sub2ObjectParam, - o1_compareObjectParam, - o1_setupObject, + { o1_add2ObjectParam, "bbw" }, + { o1_sub2ObjectParam, "bbw" }, + { o1_compareObjectParam, "bbw" }, + { o1_setupObject, "bwwww" }, /* 08 */ - o1_checkCollision, - o1_loadVar, - o1_addVar, - o1_subVar, + { o1_checkCollision, "bwwww" }, + { o1_loadVar, "bc" }, + { o1_addVar, "bc" }, + { o1_subVar, "bc" }, /* 0C */ - o1_mulVar, - o1_divVar, - o1_compareVar, - o1_modifyObjectParam2, + { o1_mulVar, "bc" }, + { o1_divVar, "bc" }, + { o1_compareVar, "bc" }, + { o1_modifyObjectParam2, "bbb" }, /* 10 */ - NULL, - NULL, - NULL, - o1_loadMask0, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { o1_loadMask0, "b" }, /* 14 */ - o1_unloadMask0, - o1_addToBgList, - o1_loadMask1, - o1_unloadMask1, + { o1_unloadMask0, "b" }, + { o1_addToBgList, "b" }, + { o1_loadMask1, "b" }, + { o1_unloadMask1, "b" }, /* 18 */ - o1_loadMask4, - o1_unloadMask4, - o1_addSpriteFilledToBgList, - o1_op1B, + { o1_loadMask4, "b" }, + { o1_unloadMask4, "b" }, + { o1_addSpriteFilledToBgList, "b" }, + { o1_op1B, "" }, /* 1C */ - NULL, - o1_label, - o1_goto, - o1_gotoIfSup, + { 0, 0 }, + { o1_label, "l" }, + { o1_goto, "b" }, + { o1_gotoIfSup, "b" }, /* 20 */ - o1_gotoIfSupEqu, - o1_gotoIfInf, - o1_gotoIfInfEqu, - o1_gotoIfEqu, + { o1_gotoIfSupEqu, "b" }, + { o1_gotoIfInf, "b" }, + { o1_gotoIfInfEqu, "b" }, + { o1_gotoIfEqu, "b" }, /* 24 */ - o1_gotoIfDiff, - o1_removeLabel, - o1_loop, - NULL, + { o1_gotoIfDiff, "b" }, + { o1_removeLabel, "b" }, + { o1_loop, "bb" }, + { 0, 0 }, /* 28 */ - NULL, - NULL, - NULL, - NULL, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, /* 2C */ - NULL, - NULL, - NULL, - NULL, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, /* 30 */ - NULL, - o1_startGlobalScript, - o1_endGlobalScript, - NULL, + { 0, 0 }, + { o1_startGlobalScript, "b" }, + { o1_endGlobalScript, "b" }, + { 0, 0 }, /* 34 */ - NULL, - NULL, - NULL, - NULL, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, /* 38 */ - NULL, - NULL, - NULL, - o1_loadAnim, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { o1_loadAnim, "s" }, /* 3C */ - o1_loadBg, - o1_loadCt, - NULL, - o1_loadPart, + { o1_loadBg, "s" }, + { o1_loadCt, "s" }, + { 0, 0 }, + { o1_loadPart, "s" }, /* 40 */ - o1_closePart, - o1_loadNewPrcName, - o1_requestCheckPendingDataLoad, - NULL, + { o1_closePart, "" }, + { o1_loadNewPrcName, "bs" }, + { o1_requestCheckPendingDataLoad, "" }, + { 0, 0 }, /* 44 */ - NULL, - o1_blitAndFade, - o1_fadeToBlack, - o1_transformPaletteRange, + { 0, 0 }, + { o1_blitAndFade, "" }, + { o1_fadeToBlack, "" }, + { o1_transformPaletteRange, "bbwww" }, /* 48 */ - NULL, - o1_setDefaultMenuColor2, - o1_palRotate, - NULL, + { 0, 0 }, + { o1_setDefaultMenuColor2, "b" }, + { o1_palRotate, "bbb" }, + { 0, 0 }, /* 4C */ - NULL, - NULL, - NULL, - o1_break, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { o1_break, "" }, /* 50 */ - o1_endScript, - o1_message, - o1_loadGlobalVar, - o1_compareGlobalVar, + { o1_endScript, "x" }, + { o1_message, "bwwww" }, + { o1_loadGlobalVar, "bc" }, + { o1_compareGlobalVar, "bc" }, /* 54 */ - NULL, - NULL, - NULL, - NULL, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, /* 58 */ - NULL, - o1_declareFunctionName, - o1_freePartRange, - o1_unloadAllMasks, + { 0, 0 }, + { o1_declareFunctionName, "s" }, + { o1_freePartRange, "bb" }, + { o1_unloadAllMasks, "" }, // 5C */ - NULL, - NULL, - NULL, - NULL, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, /* 60 */ - NULL, - NULL, - NULL, - o1_op63, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { o1_op63, "wwww" }, /* 64 */ - o1_op64, - o1_initializeZoneData, - o1_setZoneDataEntry, - o1_getZoneDataEntry, + { o1_op64, "" }, + { o1_initializeZoneData, "" }, + { o1_setZoneDataEntry, "bw" }, + { o1_getZoneDataEntry, "bb" }, /* 68 */ - o1_setDefaultMenuColor, - o1_allowPlayerInput, - o1_disallowPlayerInput, - o1_changeDataDisk, + { o1_setDefaultMenuColor, "b" }, + { o1_allowPlayerInput, "" }, + { o1_disallowPlayerInput, "" }, + { o1_changeDataDisk, "b" }, /* 6C */ - NULL, - o1_loadMusic, - o1_playMusic, - o1_fadeOutMusic, + { 0, 0 }, + { o1_loadMusic, "s" }, + { o1_playMusic, "" }, + { o1_fadeOutMusic, "" }, /* 70 */ - o1_stopSample, - o1_op71, - o1_op72, - o1_op73, + { o1_stopSample, "" }, + { o1_op71, "bw" }, + { o1_op72, "wbw" }, + { o1_op73, "wbw" }, /* 74 */ - NULL, - NULL, - NULL, - o1_playSample, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { o1_playSample, "bbwbww" }, /* 78 */ - o1_playSample, - o1_disableSystemMenu, - o1_loadMask5, - o1_unloadMask5 + { o1_playSample, "bbwbww" }, + { o1_disableSystemMenu, "b" }, + { o1_loadMask5, "b" }, + { o1_unloadMask5, "b" } }; // TODO: We need to verify the Operation Stealth opcodes. - static const OpcodeProc opcodeTableOS[] = { + static const Opcode opcodeTableOS[] = { /* 00 */ - o1_modifyObjectParam, - o1_getObjectParam, - o1_addObjectParam, - o1_subObjectParam, + { o1_modifyObjectParam, "bbw" }, + { o1_getObjectParam, "bbb" }, + { o1_addObjectParam, "bbw" }, + { o1_subObjectParam, "bbw" }, /* 04 */ - o1_add2ObjectParam, - o1_sub2ObjectParam, - o1_compareObjectParam, - o1_setupObject, + { o1_add2ObjectParam, "bbw" }, + { o1_sub2ObjectParam, "bbw" }, + { o1_compareObjectParam, "bbw" }, + { o1_setupObject, "bwwww" }, /* 08 */ - o1_checkCollision, - o1_loadVar, - o1_addVar, - o1_subVar, + { o1_checkCollision, "bwwww" }, + { o1_loadVar, "bc" }, + { o1_addVar, "bc" }, + { o1_subVar, "bc" }, /* 0C */ - o1_mulVar, - o1_divVar, - o1_compareVar, - o1_modifyObjectParam2, + { o1_mulVar, "bc" }, + { o1_divVar, "bc" }, + { o1_compareVar, "bc" }, + { o1_modifyObjectParam2, "bbb" }, /* 10 */ - NULL, - NULL, - NULL, - o1_loadMask0, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { o1_loadMask0, "b" }, /* 14 */ - o1_unloadMask0, - o1_addToBgList, - o1_loadMask1, - o1_unloadMask1, + { o1_unloadMask0, "b" }, + { o1_addToBgList, "b" }, + { o1_loadMask1, "b" }, + { o1_unloadMask1, "b" }, /* 18 */ - o1_loadMask4, - o1_unloadMask4, - o1_addSpriteFilledToBgList, - o1_op1B, + { o1_loadMask4, "b" }, + { o1_unloadMask4, "b" }, + { o1_addSpriteFilledToBgList, "b" }, + { o1_op1B, "" }, /* 1C */ - NULL, - o1_label, - o1_goto, - o1_gotoIfSup, + { 0, 0 }, + { o1_label, "l" }, + { o1_goto, "b" }, + { o1_gotoIfSup, "b" }, /* 20 */ - o1_gotoIfSupEqu, - o1_gotoIfInf, - o1_gotoIfInfEqu, - o1_gotoIfEqu, + { o1_gotoIfSupEqu, "b" }, + { o1_gotoIfInf, "b" }, + { o1_gotoIfInfEqu, "b" }, + { o1_gotoIfEqu, "b" }, /* 24 */ - o1_gotoIfDiff, - o1_removeLabel, - o1_loop, - NULL, + { o1_gotoIfDiff, "b" }, + { o1_removeLabel, "b" }, + { o1_loop, "bb" }, + { 0, 0 }, /* 28 */ - NULL, - NULL, - NULL, - NULL, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, /* 2C */ - NULL, - NULL, - NULL, - NULL, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, /* 30 */ - NULL, - o1_startGlobalScript, - o1_endGlobalScript, - NULL, + { 0, 0 }, + { o1_startGlobalScript, "b" }, + { o1_endGlobalScript, "b" }, + { 0, 0 }, /* 34 */ - NULL, - NULL, - NULL, - NULL, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, /* 38 */ - NULL, - NULL, - NULL, - o1_loadAnim, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { o1_loadAnim, "s" }, /* 3C */ - o1_loadBg, - o1_loadCt, - NULL, - o2_loadPart, + { o1_loadBg, "s" }, + { o1_loadCt, "s" }, + { 0, 0 }, + { o2_loadPart, "s" }, /* 40 */ - NULL, - o1_loadNewPrcName, - o1_requestCheckPendingDataLoad, - NULL, + { 0, 0 }, + { o1_loadNewPrcName, "bs" }, + { o1_requestCheckPendingDataLoad, "" }, + { 0, 0 }, /* 44 */ - NULL, - o1_blitAndFade, - o1_fadeToBlack, - o1_transformPaletteRange, + { 0, 0 }, + { o1_blitAndFade, "" }, + { o1_fadeToBlack, "" }, + { o1_transformPaletteRange, "bbwww" }, /* 48 */ - NULL, - o1_setDefaultMenuColor2, - o1_palRotate, - NULL, + { 0, 0 }, + { o1_setDefaultMenuColor2, "b" }, + { o1_palRotate, "bbb" }, + { 0, 0 }, /* 4C */ - NULL, - NULL, - NULL, - o1_break, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { o1_break, "" }, /* 50 */ - o1_endScript, - o1_message, - o1_loadGlobalVar, - o1_compareGlobalVar, + { o1_endScript, "x" }, + { o1_message, "bwwww" }, + { o1_loadGlobalVar, "bc" }, + { o1_compareGlobalVar, "bc" }, /* 54 */ - NULL, - NULL, - NULL, - NULL, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, /* 58 */ - NULL, - o1_declareFunctionName, - o1_freePartRange, - o1_unloadAllMasks, + { 0, 0 }, + { o1_declareFunctionName, "s" }, + { o1_freePartRange, "bb" }, + { o1_unloadAllMasks, "" }, // 5C */ - NULL, - NULL, - NULL, - NULL, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, /* 60 */ - NULL, - NULL, - NULL, - o1_op63, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { o1_op63, "wwww" }, /* 64 */ - o1_op64, - o1_initializeZoneData, - o1_setZoneDataEntry, - o1_getZoneDataEntry, + { o1_op64, "" }, + { o1_initializeZoneData, "" }, + { o1_setZoneDataEntry, "bw" }, + { o1_getZoneDataEntry, "bb" }, /* 68 */ - o1_setDefaultMenuColor, - o1_allowPlayerInput, - o1_disallowPlayerInput, - o1_changeDataDisk, + { o1_setDefaultMenuColor, "b" }, + { o1_allowPlayerInput, "" }, + { o1_disallowPlayerInput, "" }, + { o1_changeDataDisk, "b" }, /* 6C */ - NULL, - o1_loadMusic, - o1_playMusic, - o1_fadeOutMusic, + { 0, 0 }, + { o1_loadMusic, "s" }, + { o1_playMusic, "" }, + { o1_fadeOutMusic, "" }, /* 70 */ - o1_stopSample, - o1_op71, - o1_op72, - o1_op72, + { o1_stopSample, "" }, + { o1_op71, "bw" }, + { o1_op72, "wbw" }, + { o1_op72, "wbw" }, /* 74 */ - NULL, - NULL, - NULL, - o2_playSample, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { o2_playSample, "bbwbww" }, /* 78 */ - o2_playSampleAlt, - o1_disableSystemMenu, - o1_loadMask5, - o1_unloadMask5, + { o2_playSampleAlt, "bbwbww" }, + { o1_disableSystemMenu, "b" }, + { o1_loadMask5, "b" }, + { o1_unloadMask5, "b" }, /* 7C */ - NULL, - NULL, - NULL, - o2_addSeqListElement, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { o2_addSeqListElement, "bbbbwww" }, /* 80 */ - o2_removeSeq, - o2_op81, - o2_op82, - o2_isSeqRunning, + { o2_removeSeq, "bb" }, + { o2_op81, "" }, + { o2_op82, "bbw" }, + { o2_isSeqRunning, "bb" }, /* 84 */ - o2_gotoIfSupNearest, - o2_gotoIfSupEquNearest, - o2_gotoIfInfNearest, - o2_gotoIfInfEquNearest, + { o2_gotoIfSupNearest, "b" }, + { o2_gotoIfSupEquNearest, "b" }, + { o2_gotoIfInfNearest, "b" }, + { o2_gotoIfInfEquNearest, "b" }, /* 88 */ - o2_gotoIfEquNearest, - o2_gotoIfDiffNearest, - NULL, - o2_startObjectScript, + { o2_gotoIfEquNearest, "b" }, + { o2_gotoIfDiffNearest, "b" }, + { 0, 0 }, + { o2_startObjectScript, "b" }, /* 8C */ - o2_stopObjectScript, - o2_op8D, - o2_addBackground, - o2_removeBackground, + { o2_stopObjectScript, "b" }, + { o2_op8D, "wwwwwwww" }, + { o2_addBackground, "bs" }, + { o2_removeBackground, "b" }, /* 90 */ - o2_loadAbs, - o2_loadBg, - NULL, - NULL, + { o2_loadAbs, "bs" }, + { o2_loadBg, "b" }, + { 0, 0 }, + { 0, 0 }, /* 94 */ - NULL, - o1_changeDataDisk, - NULL, - NULL, + { 0, 0 }, + { o1_changeDataDisk, "b" }, + { 0, 0 }, + { 0, 0 }, /* 98 */ - NULL, - NULL, - o2_wasZoneChecked, - o2_op9B, + { 0, 0 }, + { 0, 0 }, + { o2_wasZoneChecked, "" }, + { o2_op9B, "wwwwwwww" }, /* 9C */ - o2_op9C, - o2_useBgScroll, - o2_setAdditionalBgVScroll, - o2_op9F, + { o2_op9C, "wwww" }, + { o2_useBgScroll, "b" }, + { o2_setAdditionalBgVScroll, "c" }, + { o2_op9F, "ww" }, /* A0 */ - o2_addGfxElementA0, - o2_opA1, - o2_opA2, - o2_opA3, + { o2_addGfxElementA0, "ww" }, + { o2_opA1, "ww" }, + { o2_opA2, "ww" }, + { o2_opA3, "ww" }, /* A4 */ - o2_loadMask22, - o2_unloadMask22, - NULL, - NULL, + { o2_loadMask22, "b" }, + { o2_unloadMask22, "b" }, + { 0, 0 }, + { 0, 0 }, /* A8 */ - NULL, - o1_changeDataDisk + { 0, 0 }, + { o1_changeDataDisk, "b" } }; if (g_cine->getGameType() == Cine::GType_FW) { @@ -545,269 +549,76 @@ void stopGlobalScript(uint16 scriptIdx) { currentHead->scriptIdx = -1; } -uint16 computeScriptStackSub(byte mode, byte *scriptPtr, int16 *stackPtr, uint16 scriptSize, byte param1, uint16 startOffset) { - byte *localScriptPtr = scriptPtr; - uint16 exitScript; - uint16 i; +uint16 computeScriptStackSub(bool computeAllLabels, byte *scriptPtr, int16 *stackPtr, uint16 scriptSize, byte labelIndex, uint16 startOffset) { uint16 position; - uint16 di; - assert(scriptPtr); - assert(stackPtr); - - if (mode == 1) { - for (i = 0; i < SCRIPT_STACK_SIZE; i++) { + if (computeAllLabels) { + for (int i = 0; i < SCRIPT_STACK_SIZE; i++) { stackPtr[i] = -1; } - position = 0; } else { position = startOffset; } - - exitScript = 0; - - do { - uint16 opcode = *(localScriptPtr + position); + while (position < scriptSize) { + uint8 opcode = scriptPtr[position]; position++; - - //printf("Opcode: %X\n",opcode-1); - - switch (opcode - 1) { - case -1: - case 0x1B: - { - break; - } - case 0x89: - case 0x32: - case 0x7A: - case 0x91: - case 0x9D: - case 0x8F: - case 0x7B: - case 0x8C: - case 0x8B: - case 0x85: - case 0x86: - case 0x84: - case 0x88: - { + if (opcode == 0) { + continue; + } + if (!_opcodeTable[opcode - 1].args) { + warning("Undefined opcode 0x%02X in computeScriptStackSub", opcode - 1); + continue; + } + for (const char *p = _opcodeTable[opcode - 1].args; *p; ++p) { + switch (*p) { + case 'b': // byte position++; break; - } - case 0x80: - case 0x83: - case 0x26: - { + case 'w': // word position += 2; break; - } - case 0xF: - case 0x1: - case 0x66: - case 0x4A: - { - position += 3; - break; - } - case 0x0: - case 0x2: - case 0x3: - case 0x4: - case 0x5: - case 0x6: - case 0xA0: - case 0xA1: - case 0xA2: - case 0xA3: - { - position += 4; - break; - } - case 0x9: - case 0xA: - case 0xB: - case 0xC: - case 0xD: - case 0xE: - case 0x52: - case 0x53: - { - byte param; - position++; - - param = *(localScriptPtr + position); - position++; - - if (param) { + case 'c': { // byte != 0 ? byte : word + uint8 test = scriptPtr[position]; position++; - } else { - position += 2; + if (test) { + position++; + } else { + position += 2; + } } break; - } - case 0x9E: - { - byte param; - - param = *(localScriptPtr + position); - position++; - - if (param) { + case 'l': { // label + uint8 index = scriptPtr[position]; position++; - } else { - position += 2; - } - break; - } - case 0x82: - { - position += 7; - break; - } - case 0x47: - { - position += 8; - break; - } - case 0x51: - case 0x7: - case 0x77: - case 0x78: - case 0x8: - { - position += 9; - break; - } - case 0x7F: - { - position += 10; - break; - } - case 0x1D: - { - di = *(localScriptPtr + position); - position++; - - if (mode == 1) { - stackPtr[di] = position; - } else { - if (param1 == di) { - return position; + if (computeAllLabels) { + stackPtr[index] = position; + } else { + if (labelIndex == index) { + return position; + } } } - - break; - } - case 0x59: - case 0x3B: - case 0x3C: - case 0x3D: - case OP_loadPart: // skipString - case 0x6D: - case 0x8E: - { - do { - position++; - } while (*(localScriptPtr + position)); break; - } - case 0x90: - case OP_loadNewPrcName: //skipVarAndString - { - di = *(localScriptPtr + position); - position++; - + case 's': // string do { position++; - } while (*(localScriptPtr + position)); - - break; - } - case 0x46: - case 0x65: - case 0x4F: - case 0x40: - case 0x6A: - case 0x69: - case 0x45: - case 0x6E: - case 0x6F: - case 0x70: - { - break; - } - case 0x1E: - case 0x1F: - case 0x20: - case 0x21: - case 0x22: - case 0x23: - case 0x24: - case 0x25: - case 0x68: - case 0x49: - case 0x31: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - case 0x18: - case 0x19: - case 0x1A: - { - position++; - break; - } - case 0x5A: - { - position += 2; - break; - } - case 0x5B: - { - break; - } - case OP_changeDataDisk: // skipVar - case OP_79: - { - di = *(localScriptPtr + position); - position++; - - break; - } - case OP_endScript: // end - { - exitScript = 1; - break; - } - case OP_requestCheckPendingDataLoad: // nop - { + } while (scriptPtr[position] != 0); break; + case 'x': // exit script + return position; } - default: - { - error("Unsupported opcode %X in computeScriptStack", opcode - 1); - } - } - - if (position > scriptSize) { - exitScript = 1; } - - } while (!exitScript); - + } return position; } void computeScriptStack(byte *scriptPtr, int16 *stackPtr, uint16 scriptSize) { - computeScriptStackSub(1, scriptPtr, stackPtr, scriptSize, 0, 0); + computeScriptStackSub(true, scriptPtr, stackPtr, scriptSize, 0, 0); } uint16 computeScriptStackFromScript(byte *scriptPtr, uint16 currentPosition, uint16 labelIdx, uint16 scriptSize) { - return computeScriptStackSub(0, scriptPtr, (int16 *)&dummyU16, (uint16)scriptSize, labelIdx, currentPosition); + return computeScriptStackSub(false, scriptPtr, (int16 *)&dummyU16, (uint16)scriptSize, labelIdx, currentPosition); } void palRotate(byte a, byte b, byte c) { @@ -1024,10 +835,16 @@ void o1_subObjectParam() { } void o1_add2ObjectParam() { + getNextByte(); + getNextByte(); + getNextWord(); warning("STUB: o1_add2ObjectParam()"); } void o1_sub2ObjectParam() { + getNextByte(); + getNextByte(); + getNextWord(); warning("STUB: o1_sub2ObjectParam()"); } @@ -1379,7 +1196,6 @@ void o1_gotoIfDiff() { } void o1_removeLabel() { - // TODO: verify this byte labelIdx = getNextByte(); debugC(5, kCineDebugScript, "Line: %d: removeLabel(%d)", _currentLine, labelIdx); @@ -1659,7 +1475,10 @@ void o1_setZoneDataEntry() { } void o1_getZoneDataEntry() { - warning("STUB: o1_getZoneDataEntry()"); + byte zoneIdx = getNextByte(); + byte var = getNextByte(); + + _currentScriptElement->localVars[var] = zoneData[zoneIdx]; } void o1_setDefaultMenuColor() { @@ -1858,7 +1677,12 @@ void o2_loadPart() { void o2_playSample() { if (g_cine->getPlatform() == Common::kPlatformAmiga || g_cine->getPlatform() == Common::kPlatformAtariST) { // no-op in these versions - _currentPosition += 9; + getNextByte(); + getNextByte(); + getNextWord(); + getNextByte(); + getNextWord(); + getNextWord(); return; } o1_playSample(); @@ -2216,10 +2040,10 @@ void executeScript(prcLinkedListStruct *scriptElement, uint16 params) { byte opcode = getNextByte(); if (opcode && opcode < _numOpcodes) { - if (_opcodeTable[opcode - 1]) - (_opcodeTable[opcode - 1]) (); + if (_opcodeTable[opcode - 1].proc) + (_opcodeTable[opcode - 1].proc) (); else - warning("Undefined opcode 0x%02X", opcode - 1); + warning("Undefined opcode 0x%02X in executeScript", opcode - 1); } } } |