aboutsummaryrefslogtreecommitdiff
path: root/engines/cine/script.cpp
diff options
context:
space:
mode:
authorGregory Montoir2007-05-14 21:52:06 +0000
committerGregory Montoir2007-05-14 21:52:06 +0000
commit97e6e4aea894e6ea89f70e96aec0e1922e735637 (patch)
treee8056499a70587799eb454f35a737430d18fbade /engines/cine/script.cpp
parent13f2b1fd636326ddd3164d8c098297f4d385b419 (diff)
downloadscummvm-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/cine/script.cpp')
-rw-r--r--engines/cine/script.cpp894
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);
}
}
}