From 986dce3a7dc4353a51fcc2abba744b4372d72610 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Sat, 8 Apr 2006 13:20:40 +0000 Subject: Split the opcodes into individual functions. This could easily cause regressions, but hopefully not too many. While doing this, I noticed I had gotten at least one of the stubs I added recently wrong. That's hopefully fixed now. svn-id: r21693 --- engines/cine/cine.cpp | 2 + engines/cine/script.cpp | 2340 +++++++++++++++++++++++++---------------------- engines/cine/script.h | 115 +++ 3 files changed, 1371 insertions(+), 1086 deletions(-) (limited to 'engines/cine') diff --git a/engines/cine/cine.cpp b/engines/cine/cine.cpp index d36ab79eeb..e4be764e2c 100644 --- a/engines/cine/cine.cpp +++ b/engines/cine/cine.cpp @@ -188,6 +188,8 @@ int gameType; static void initialize() { uint16 i; + setupOpcodes(); + initLanguage(Common::parseLanguage(ConfMan.get("language"))); init_video(); diff --git a/engines/cine/script.cpp b/engines/cine/script.cpp index 487a7d2f39..b5df2312c5 100644 --- a/engines/cine/script.cpp +++ b/engines/cine/script.cpp @@ -34,8 +34,402 @@ namespace Cine { +prcLinkedListStruct *_currentScriptElement; byte *_currentScriptPtr; +uint16 _currentScriptParams; uint16 _currentPosition; +uint16 _currentLine; +uint16 _closeScript; + +typedef void (*OpcodeProc) (); +const OpcodeProc *_opcodeTable; +int _numOpcodes; + +void setupOpcodes() { + static const OpcodeProc opcodeTableFW[] = { + /* 00 */ + o1_modifyObjectParam, + o1_getObjectParam, + o1_addObjectParam, + o1_subObjectParam, + /* 04 */ + o1_add2ObjectParam, + o1_sub2ObjectParam, + o1_compareObjectParam, + o1_setupObject, + /* 08 */ + o1_checkCollision, + o1_loadVar, + o1_addVar, + o1_subVar, + /* 0C */ + o1_mulVar, + o1_divVar, + o1_compareVar, + o1_modifyObjectParam2, + /* 10 */ + NULL, + NULL, + NULL, + o1_loadMask0, + /* 14 */ + o1_unloadMask0, + o1_addToBgList, + o1_loadMask1, + o1_unloadMask1, + /* 18 */ + o1_loadMask4, + o1_unloadMask4, + o1_addSpriteFilledToBgList, + o1_op1B, + /* 1C */ + NULL, + o1_label, + o1_goto, + o1_gotoIfSup, + /* 20 */ + o1_gotoIfSupEqu, + o1_gotoIfInf, + o1_gotoIfInfEqu, + o1_gotoIfEqu, + /* 24 */ + o1_gotoIfDiff, + o1_removeLabel, + o1_loop, + NULL, + /* 28 */ + NULL, + NULL, + NULL, + NULL, + /* 2C */ + NULL, + NULL, + NULL, + NULL, + /* 30 */ + NULL, + o1_startGlobalScript, + o1_endGlobalScript, + NULL, + /* 34 */ + NULL, + NULL, + NULL, + NULL, + /* 38 */ + NULL, + NULL, + NULL, + o1_loadAnim, + /* 3C */ + o1_loadBg, + o1_loadCt, + NULL, + o1_loadPart, + /* 40 */ + o1_closePart, + o1_loadNewPrcName, + o1_requestCheckPendingDataLoad, + NULL, + /* 44 */ + NULL, + o1_blitAndFade, + o1_fadeToBlack, + o1_transformPaletteRange, + /* 48 */ + NULL, + o1_setDefaultMenuColor2, + o1_palRotate, + NULL, + /* 4C */ + NULL, + NULL, + NULL, + o1_break, + /* 50 */ + o1_endScript, + o1_message, + o1_loadGlobalVar, + o1_compareGlobalVar, + /* 54 */ + NULL, + NULL, + NULL, + NULL, + /* 58 */ + NULL, + o1_declareFunctionName, + o1_freePartRange, + o1_unloadAllMasks, + // 5C */ + NULL, + NULL, + NULL, + NULL, + /* 60 */ + NULL, + NULL, + NULL, + o1_op63, + /* 64 */ + o1_op64, + o1_initializeZoneData, + o1_setZoneDataEntry, + o1_getZoneDataEntry, + /* 68 */ + o1_setDefaultMenuColor, + o1_allowPlayerInput, + o1_disallowPlayerInput, + o1_changeDataDisk, + /* 6C */ + NULL, + o1_loadMusic, + o1_playMusic, + o1_fadeOutMusic, + /* 70 */ + o1_stopSample, + o1_op71, + o1_op72, + o1_op73, + /* 74 */ + NULL, + NULL, + NULL, + o1_playSample, + /* 78 */ + o1_playSample, + o1_allowSystemMenu, + o1_loadMask5, + o1_unloadMask5 + }; + + // TODO: We need to verify the Operation Stealth opcodes. + + static const OpcodeProc opcodeTableOS[] = { + /* 00 */ + o1_modifyObjectParam, + o1_getObjectParam, + o1_addObjectParam, + o1_subObjectParam, + /* 04 */ + o1_add2ObjectParam, + o1_sub2ObjectParam, + o1_compareObjectParam, + o1_setupObject, + /* 08 */ + o1_checkCollision, + o1_loadVar, + o1_addVar, + o1_subVar, + /* 0C */ + o1_mulVar, + o1_divVar, + o1_compareVar, + o1_modifyObjectParam2, + /* 10 */ + NULL, + NULL, + NULL, + o1_loadMask0, + /* 14 */ + o1_unloadMask0, + o1_addToBgList, + o1_loadMask1, + o1_unloadMask1, + /* 18 */ + o1_loadMask4, + o1_unloadMask4, + o1_addSpriteFilledToBgList, + o1_op1B, + /* 1C */ + NULL, + o1_label, + o1_goto, + o1_gotoIfSup, + /* 20 */ + o1_gotoIfSupEqu, + o1_gotoIfInf, + o1_gotoIfInfEqu, + o1_gotoIfEqu, + /* 24 */ + o1_gotoIfDiff, + o1_removeLabel, + o1_loop, + NULL, + /* 28 */ + NULL, + NULL, + NULL, + NULL, + /* 2C */ + NULL, + NULL, + NULL, + NULL, + /* 30 */ + NULL, + o1_startGlobalScript, + o1_endGlobalScript, + NULL, + /* 34 */ + NULL, + NULL, + NULL, + NULL, + /* 38 */ + NULL, + NULL, + NULL, + o1_loadAnim, + /* 3C */ + o1_loadBg, + o1_loadCt, + NULL, + o2_loadPart, + /* 40 */ + NULL, + o1_loadNewPrcName, + o1_requestCheckPendingDataLoad, + NULL, + /* 44 */ + NULL, + o1_blitAndFade, + o1_fadeToBlack, + o1_transformPaletteRange, + /* 48 */ + NULL, + o1_setDefaultMenuColor2, + o1_palRotate, + NULL, + /* 4C */ + NULL, + NULL, + NULL, + o1_break, + /* 50 */ + o1_endScript, + o1_message, + o1_loadGlobalVar, + o1_compareGlobalVar, + /* 54 */ + NULL, + NULL, + NULL, + NULL, + /* 58 */ + NULL, + o1_declareFunctionName, + o1_freePartRange, + o1_unloadAllMasks, + // 5C */ + NULL, + NULL, + NULL, + NULL, + /* 60 */ + NULL, + NULL, + NULL, + o1_op63, + /* 64 */ + o1_op64, + o1_initializeZoneData, + o1_setZoneDataEntry, + o1_getZoneDataEntry, + /* 68 */ + o1_setDefaultMenuColor, + o1_allowPlayerInput, + o1_disallowPlayerInput, + o1_changeDataDisk, + /* 6C */ + NULL, + o1_loadMusic, + o1_playMusic, + o1_fadeOutMusic, + /* 70 */ + o1_stopSample, + o1_op71, + o1_op72, + o1_op73, + /* 74 */ + NULL, + NULL, + NULL, + o1_playSample, + /* 78 */ + o1_playSample, + o1_allowSystemMenu, + o1_loadMask5, + o1_unloadMask5, + /* 7C */ + NULL, + NULL, + NULL, + o2_addSeqListElement, + /* 80 */ + o2_removeSeq, + o2_op81, + o2_op82, + o2_isSeqRunning, + /* 84 */ + o2_gotoIfSupNearest, + o2_gotoIfSupEquNearest, + o2_gotoIfInfNearest, + o2_gotoIfInfEquNearest, + /* 88 */ + o2_gotoIfEquNearest, + o2_gotoIfDiffNearest, + NULL, + o2_startObjectScript, + /* 8C */ + o2_stopObjectScript, + o2_op8D, + o2_addBackground, + o2_removeBackground, + /* 90 */ + o2_loadAbs, + o2_loadBg, + NULL, + NULL, + /* 94 */ + NULL, + o2_op95, + NULL, + NULL, + /* 98 */ + NULL, + NULL, + o2_wasZoneChecked, + o2_op9B, + /* 9C */ + o2_op9C, + o2_useBgScroll, + o2_setAdditionalBgVScroll, + o2_op9F, + /* A0 */ + o2_addGfxElementA0, + o2_opA1, + o2_opA2, + o2_opA3, + /* A4 */ + o2_opA4, + o2_opA5, + NULL, + NULL, + /* A8 */ + NULL, + o2_opA9 + }; + + if (gameType == Cine::GID_FW) { + _opcodeTable = opcodeTableFW; + _numOpcodes = ARRAYSIZE(opcodeTableFW); + } else { + _opcodeTable = opcodeTableOS; + _numOpcodes = ARRAYSIZE(opcodeTableOS); + } +} byte getNextByte() { byte val = *(_currentScriptPtr + _currentPosition); @@ -637,1337 +1031,1111 @@ uint16 compareVars(int16 a, int16 b) { return flag; } -void executeScript(prcLinkedListStruct *scriptElement, uint16 params) { - uint16 closeScript; +// ------------------------------------------------------------------------ +// FUTURE WARS opcodes +// ------------------------------------------------------------------------ - assert(scriptElement); +void o1_modifyObjectParam() { + byte objIdx = getNextByte(); + byte paramIdx = getNextByte(); + int16 newValue = getNextWord(); - if (scriptElement->scriptIdx == -1) { - return; - } + DEBUG_SCRIPT(_currentLine, "modifyObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue); - assert(scriptElement->scriptPtr); + modifyObjectParam(objIdx, paramIdx, newValue); +} - // Used to be local variables, but as far as I can tell there's no - // recursion that can mess things up when making them global. +void o1_getObjectParam() { + byte objIdx = getNextByte(); + byte paramIdx = getNextByte(); + byte newValue = getNextByte(); - _currentScriptPtr = scriptElement->scriptPtr; - _currentPosition = scriptElement->scriptPosition; + DEBUG_SCRIPT(_currentLine, "getObjectParam(objIdx:%d,paramIdx:%d,var:%d)", objIdx, paramIdx, newValue); - closeScript = 0; + _currentScriptElement->localVars[newValue] = getObjectParam(objIdx, paramIdx); +} - while (!closeScript) { - uint16 currentLine = _currentPosition; - byte opcode = getNextByte(); +void o1_addObjectParam() { + byte objIdx = getNextByte(); + byte paramIdx = getNextByte(); + int16 newValue = getNextWord(); - //printf("Op: %X\n", opcode - 1); + DEBUG_SCRIPT(_currentLine, "addObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue); - // Future Wars: opcodes 0x00 - 0x7B - // Operation Stealth: opcodes 0x00 - 0xB6 - // - // Both opcode tables have plenty of holes in them, though. - // - // 0x40: Future Wars only - // 0x48: Future Wars only + addObjectParam(objIdx, paramIdx, newValue); +} - switch (opcode - 1) { - case -1: - { - break; - } - case 0x0: // OP_modifyObjectParam - { - byte objIdx = getNextByte(); - byte paramIdx = getNextByte(); - int16 newValue = getNextWord(); +void o1_subObjectParam() { + byte objIdx = getNextByte(); + byte paramIdx = getNextByte(); + int16 newValue = getNextWord(); - DEBUG_SCRIPT(currentLine, "modifyObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue); + DEBUG_SCRIPT(_currentLine, "subObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue); - modifyObjectParam(objIdx, paramIdx, newValue); + subObjectParam(objIdx, paramIdx, newValue); +} - break; - } - case 0x1: // OP_getObjectParam - { - byte objIdx = getNextByte(); - byte paramIdx = getNextByte(); - byte newValue = getNextByte(); +void o1_add2ObjectParam() { + warning("STUB: o1_add2ObjectParam()"); +} - DEBUG_SCRIPT(currentLine, "getObjectParam(objIdx:%d,paramIdx:%d,var:%d)", objIdx, paramIdx, newValue); +void o1_sub2ObjectParam() { + warning("STUB: o1_sub2ObjectParam()"); +} - scriptElement->localVars[newValue] = getObjectParam(objIdx, paramIdx); +void o1_compareObjectParam() { + byte objIdx = getNextByte(); + byte param1 = getNextByte(); + int16 param2 = getNextWord(); - break; - } - case 0x2: // OP_addObjectParam - { - byte objIdx = getNextByte(); - byte paramIdx = getNextByte(); - int16 newValue = getNextWord(); + DEBUG_SCRIPT(_currentLine, "compareObjectParam(objIdx:%d,type:%d,value:%d)", objIdx, param1, param2); - DEBUG_SCRIPT(currentLine, "addObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue); + _currentScriptElement->compareResult = compareObjectParam(objIdx, param1, param2); +} - addObjectParam(objIdx, paramIdx, newValue); +void o1_setupObject() { + byte objIdx = getNextByte(); + int16 param1 = getNextWord(); + int16 param2 = getNextWord(); + int16 param3 = getNextWord(); + int16 param4 = getNextWord(); - break; - } - case 0x3: // OP_subObjectParam - { - byte objIdx = getNextByte(); - byte paramIdx = getNextByte(); - int16 newValue = getNextWord(); + DEBUG_SCRIPT(_currentLine, "setupObject(objIdx:%d,%d,%d,%d,%d)", objIdx, param1, param2, param3, param4); - DEBUG_SCRIPT(currentLine, "subObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue); + setupObject(objIdx, param1, param2, param3, param4); +} - subObjectParam(objIdx, paramIdx, newValue); +void o1_checkCollision() { + byte objIdx = getNextByte(); + int16 param1 = getNextWord(); + int16 param2 = getNextWord(); + int16 param3 = getNextWord(); + int16 param4 = getNextWord(); - break; - } - case 0x4: // OP_add2ObjectParam - { - warning("STUB: Opcode 0x4\n"); - break; - } - case 0x5: // OP_sub2ObjectParam - { - warning("STUB: Opcode 0x5\n"); - break; - } - case 0x6: // OP_compareObjectParam - { - byte objIdx = getNextByte(); - byte param1 = getNextByte(); - int16 param2 = getNextWord(); + DEBUG_SCRIPT(_currentLine, "checkCollision(objIdx:%d,%d,%d,%d,%d)", objIdx, param1, param2, param3, param4); - DEBUG_SCRIPT(currentLine, "compareObjectParam(objIdx:%d,type:%d,value:%d)", objIdx, param1, param2); + _currentScriptElement->compareResult = checkCollision(objIdx, param1, param2, param3, param4); +} - scriptElement->compareResult = compareObjectParam(objIdx, param1, param2); +void o1_loadVar() { + byte varIdx = getNextByte(); + byte varType = getNextByte(); + + if (varType) { + byte dataIdx = getNextByte(); + int16 var; + + switch (varType) { + case 1: + DEBUG_SCRIPT(_currentLine, "var[%d] = var[%d]", varIdx, dataIdx); + _currentScriptElement->localVars[varIdx] = _currentScriptElement->localVars[dataIdx]; + break; + case 2: + DEBUG_SCRIPT(_currentLine, "var[%d] = globalVars[%d]", varIdx, dataIdx); + _currentScriptElement->localVars[varIdx] = globalVars[dataIdx]; + break; + case 3: + DEBUG_SCRIPT(_currentLine, "var[%d] = mouseX", varIdx, dataIdx); + getMouseData(mouseUpdateStatus, &dummyU16, (uint16 *)&var, (uint16 *)&dummyU16); + _currentScriptElement->localVars[varIdx] = var; + break; + case 4: + DEBUG_SCRIPT(_currentLine, "var[%d] = mouseY", varIdx, dataIdx); + getMouseData(mouseUpdateStatus, &dummyU16, (uint16 *)&dummyU16, (uint16 *)&var); + _currentScriptElement->localVars[varIdx] = var; + break; + case 5: + DEBUG_SCRIPT(_currentLine, "var[%d] = rand mod %d", varIdx, dataIdx); + _currentScriptElement->localVars[varIdx] = rand() % dataIdx; + break; + case 8: + DEBUG_SCRIPT(_currentLine, "var[%d] = file[%d].packedSize", varIdx, dataIdx); + _currentScriptElement->localVars[varIdx] = partBuffer[dataIdx].packedSize; + break; + case 9: + DEBUG_SCRIPT(_currentLine, "var[%d] = file[%d].unpackedSize", varIdx, dataIdx); + _currentScriptElement->localVars[varIdx] = partBuffer[dataIdx].unpackedSize; + break; + default: + error("executeScript: o1_loadVar: Unknown variable type %d", varType); + } + } else { + int16 newData = getNextWord(); - break; - } - case 0x7: // OP_setupObject - { - byte objIdx = getNextByte(); - int16 param1 = getNextWord(); - int16 param2 = getNextWord(); - int16 param3 = getNextWord(); - int16 param4 = getNextWord(); + DEBUG_SCRIPT(_currentLine, "var[%d] = %d", varIdx, newData); + _currentScriptElement->localVars[varIdx] = newData; + } +} - DEBUG_SCRIPT(currentLine, "setupObject(objIdx:%d,%d,%d,%d,%d)", objIdx, param1, param2, param3, param4); +void o1_addVar() { + byte varIdx = getNextByte(); + byte varType = getNextByte(); - setupObject(objIdx, param1, param2, param3, param4); + if (varType) { + byte dataIdx = getNextByte(); - break; - } - case 0x8: // OP_checkCollision - { - byte objIdx = getNextByte(); - int16 param1 = getNextWord(); - int16 param2 = getNextWord(); - int16 param3 = getNextWord(); - int16 param4 = getNextWord(); + DEBUG_SCRIPT(_currentLine, "var[%d] += var[%d]", varIdx, dataIdx); + _currentScriptElement->localVars[varIdx] += _currentScriptElement->localVars[dataIdx]; + } else { + int16 newData = getNextWord(); - DEBUG_SCRIPT(currentLine, "checkCollision(objIdx:%d,%d,%d,%d,%d)", objIdx, param1, param2, param3, param4); + DEBUG_SCRIPT(_currentLine, "var[%d] += %d", varIdx, newData); + _currentScriptElement->localVars[varIdx] += newData; + } +} - scriptElement->compareResult = checkCollision(objIdx, param1, param2, param3, param4); +void o1_subVar() { + byte varIdx = getNextByte(); + byte varType = getNextByte(); - break; - } - case 0x9: // OP_loadVar - { - byte varIdx = getNextByte(); - byte varType = getNextByte(); + if (varType) { + byte dataIdx = getNextByte(); - if (varType) { - byte dataIdx = getNextByte(); + DEBUG_SCRIPT(_currentLine, "var[%d] -= var[%d]", varIdx, dataIdx); + _currentScriptElement->localVars[varIdx] -= _currentScriptElement->localVars[dataIdx]; + } else { + int16 newData = getNextWord(); - switch (varType) { - case 1: - { - DEBUG_SCRIPT(currentLine, "var[%d] = var[%d]", varIdx, dataIdx); - scriptElement->localVars[varIdx] = scriptElement->localVars[dataIdx]; - break; - } - case 2: - { - DEBUG_SCRIPT(currentLine, "var[%d] = globalVars[%d]", varIdx, dataIdx); - scriptElement->localVars[varIdx] = globalVars[dataIdx]; - break; - } - case 3: - { - int16 var; + DEBUG_SCRIPT(_currentLine, "var[%d] -= %d", varIdx, newData); + _currentScriptElement->localVars[varIdx] -= newData; + } +} - DEBUG_SCRIPT(currentLine, "var[%d] = mouseX", varIdx, dataIdx); - getMouseData(mouseUpdateStatus, &dummyU16, (uint16 *)&var, (uint16 *)&dummyU16); - scriptElement->localVars[varIdx] = var; - break; - } - case 4: - { - int16 var; +void o1_mulVar() { + byte varIdx = getNextByte(); + byte varType = getNextByte(); - DEBUG_SCRIPT(currentLine, "var[%d] = mouseY", varIdx, dataIdx); - getMouseData(mouseUpdateStatus, &dummyU16, (uint16 *)&dummyU16, (uint16 *)&var); - scriptElement->localVars[varIdx] = var; - break; - } - case 5: - { - DEBUG_SCRIPT(currentLine, "var[%d] = rand mod %d", varIdx, dataIdx); - scriptElement->localVars[varIdx] = rand() % dataIdx; - break; - } - case 8: - { - DEBUG_SCRIPT(currentLine, "var[%d] = file[%d].packedSize", varIdx, dataIdx); - scriptElement->localVars[varIdx] = partBuffer[dataIdx].packedSize; - break; - } - case 9: - { - DEBUG_SCRIPT(currentLine, "var[%d] = file[%d].unpackedSize", varIdx, dataIdx); - scriptElement->localVars[varIdx] = partBuffer[dataIdx].unpackedSize; - break; - } - default: - { - error("executeScript: OP_loadVar: Unknown variable type %d", varType); - } - } - } else { - int16 newData = getNextWord(); + if (varType) { + byte dataIdx = getNextByte(); - DEBUG_SCRIPT(currentLine, "var[%d] = %d", varIdx, newData); + DEBUG_SCRIPT(_currentLine, "var[%d] *= var[%d]", varIdx, dataIdx); + _currentScriptElement->localVars[varIdx] *= _currentScriptElement->localVars[dataIdx]; + } else { + int16 newData = getNextWord(); - scriptElement->localVars[varIdx] = newData; - } - break; - } - case 0xA: // OP_addVar - { - byte varIdx = getNextByte(); - byte varType = getNextByte(); + DEBUG_SCRIPT(_currentLine, "var[%d] *= %d", varIdx, newData); + _currentScriptElement->localVars[varIdx] *= newData; + } +} - if (varType) { - byte dataIdx = getNextByte(); +void o1_divVar() { + byte varIdx = getNextByte(); + byte varType = getNextByte(); - DEBUG_SCRIPT(currentLine, "var[%d] += var[%d]", varIdx, dataIdx); + if (varType) { + byte dataIdx = getNextByte(); - scriptElement->localVars[varIdx] += scriptElement->localVars[dataIdx]; - } else { - int16 newData = getNextWord(); + DEBUG_SCRIPT(_currentLine, "var[%d] /= var[%d]", varIdx, dataIdx); + _currentScriptElement->localVars[varIdx] /= _currentScriptElement->localVars[dataIdx]; + } else { + int16 newData = getNextWord(); - DEBUG_SCRIPT(currentLine, "var[%d] += %d", varIdx, newData); + DEBUG_SCRIPT(_currentLine, "var[%d] /= %d", varIdx, newData); + _currentScriptElement->localVars[varIdx] /= newData; + } +} - scriptElement->localVars[varIdx] += newData; - } +void o1_compareVar() { + byte varIdx = getNextByte(); + byte varType = getNextByte(); - break; - } - case 0xB: // OP_subVar - { - byte varIdx = getNextByte(); - byte varType = getNextByte(); + if (varType) { + byte dataIdx = getNextByte(); - if (varType) { - byte dataIdx = getNextByte(); + // printf("Val: %d\n", dataIdx); - DEBUG_SCRIPT(currentLine, "var[%d] -= var[%d]", varIdx, dataIdx); + if (varType == 1) { + assert(varIdx < 50); + assert(dataIdx < 50); - scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] - scriptElement->localVars[dataIdx]; - } else { - int16 newData = getNextWord(); + DEBUG_SCRIPT(_currentLine, "compare var[%d] and var[%d]", varIdx, dataIdx); - DEBUG_SCRIPT(currentLine, "var[%d] -= %d", varIdx, newData); + _currentScriptElement->compareResult = compareVars(_currentScriptElement->localVars[varIdx], _currentScriptElement->localVars[dataIdx]); + } else if (varType == 2) { + DEBUG_SCRIPT(_currentLine, "compare var[%d] and globalVar[%d]", varIdx, dataIdx); - scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] - newData; - } + assert(varIdx < 50); - break; - } - case 0xC: // OP_mulVar - { - byte varIdx = getNextByte(); - byte varType = getNextByte(); + _currentScriptElement->compareResult = compareVars(_currentScriptElement->localVars[varIdx], globalVars[dataIdx]); + } + } else { + int16 value = getNextWord(); - if (varType) { - byte dataIdx = getNextByte(); + DEBUG_SCRIPT(_currentLine, "compare var[%d] and %d", varIdx, value); + _currentScriptElement->compareResult = compareVars(_currentScriptElement->localVars[varIdx], value); + } +} - DEBUG_SCRIPT(currentLine, "var[%d] *= var[%d]", varIdx, dataIdx); +void o1_modifyObjectParam2() { + byte objIdx = getNextByte(); + byte paramIdx = getNextByte(); + byte newValue = getNextByte(); - scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] * scriptElement->localVars[dataIdx]; - } else { - int16 newData = getNextWord(); + DEBUG_SCRIPT(_currentLine, "modifyObjectParam2(objIdx:%d,paramIdx:%d,var[%d])", objIdx, paramIdx, newValue); - DEBUG_SCRIPT(currentLine, "var[%d] *= %d", varIdx, newData); + modifyObjectParam(objIdx, paramIdx, _currentScriptElement->localVars[newValue]); +} - scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] * newData; - } +void o1_loadMask0() { + // OP_loadV7Element + byte param = getNextByte(); - break; - } - case 0xD: // OP_divVar - { - byte varIdx = getNextByte(); - byte varType = getNextByte(); + DEBUG_SCRIPT(_currentLine, "addSpriteOverlay(%d)", param); + loadOverlayElement(param, 0); +} - if (varType) { - byte dataIdx = getNextByte(); +void o1_unloadMask0() { + byte param = getNextByte(); - DEBUG_SCRIPT(currentLine, "var[%d] /= var[%d]", varIdx, dataIdx); + DEBUG_SCRIPT(_currentLine, "removeSpriteOverlay(%d)", param); + freeOverlay(param, 0); +} - scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] / scriptElement->localVars[dataIdx]; - } else { - int16 newData = getNextWord(); +void o1_addToBgList() { + byte param = getNextByte(); - DEBUG_SCRIPT(currentLine, "var[%d] /= %d", varIdx, newData); + DEBUG_SCRIPT(_currentLine, "addToBGList(%d)", param); + addToBGList(param); +} - scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] / newData; - } +void o1_loadMask1() { + byte param = getNextByte(); - break; - } - case 0xE: // OP_compareVar - { - byte varIdx = getNextByte(); - byte varType = getNextByte(); + DEBUG_SCRIPT(_currentLine, "addOverlay1(%d)", param); + loadOverlayElement(param, 1); +} - if (varType) { - byte value = getNextByte(); +void o1_unloadMask1() { + byte param = getNextByte(); - // printf("Val: %d\n", value); + DEBUG_SCRIPT(_currentLine, "removeOverlay1(%d)", param); + freeOverlay(param, 1); +} - if (varType == 1) { - DEBUG_SCRIPT(currentLine, "compare var[%d] and var[%d]", varIdx, value); +void o1_loadMask4() { + byte param = getNextByte(); - assert(varIdx < 50); - assert(value < 50); + DEBUG_SCRIPT(_currentLine, "addOverlayType4(%d)", param); + loadOverlayElement(param, 4); +} - scriptElement->compareResult = compareVars(scriptElement->localVars[varIdx], scriptElement->localVars[value]); - } else if (varType == 2) { - DEBUG_SCRIPT(currentLine, "compare var[%d] and globalVar[%d]", varIdx, value); +void o1_unloadMask4() { + byte param = getNextByte(); - assert(varIdx < 50); + DEBUG_SCRIPT(_currentLine, "removeSpriteOverlay4(%d)", param); + freeOverlay(param, 4); +} - scriptElement->compareResult = compareVars(scriptElement->localVars[varIdx], globalVars[value]); - } - } else { - int16 value = getNextWord(); +void o1_addSpriteFilledToBgList() { + byte param = getNextByte(); - DEBUG_SCRIPT(currentLine, "compare var[%d] and %d", varIdx, value); + DEBUG_SCRIPT(_currentLine, "op1A(%d) -> TODO !", param); + addSpriteFilledToBGList(param); +} - scriptElement->compareResult = compareVars(scriptElement->localVars[varIdx], value); - } +void o1_op1B() { + DEBUG_SCRIPT(_currentLine, "closeEngine7"); + closeEngine7(); +} - break; - } - case 0xF: // OP_modifyObjectParam2 - { - byte objIdx = getNextByte(); - byte paramIdx = getNextByte(); - byte newValue = getNextByte(); +void o1_label() { + byte labelIdx = getNextByte(); - DEBUG_SCRIPT(currentLine, "modifyObjectParam2(objIdx:%d,paramIdx:%d,var[%d])", objIdx, paramIdx, newValue); + DEBUG_SCRIPT(_currentLine, "label(%d)", labelIdx); + _currentScriptElement->stack[labelIdx] = _currentPosition; +} - modifyObjectParam(objIdx, paramIdx, scriptElement->localVars[newValue]); +void o1_goto() { + byte labelIdx = getNextByte(); - break; - } - case 0x13: // OP_loadV7Element (OP_loadMask0?) - { - byte param = getNextByte(); + assert(_currentScriptElement->stack[labelIdx] != -1); - DEBUG_SCRIPT(currentLine, "addSpriteOverlay(%d)", param); + DEBUG_SCRIPT(_currentLine, "goto label(%d)", labelIdx); + _currentPosition = _currentScriptElement->stack[labelIdx]; +} - loadOverlayElement(param, 0); +void o1_gotoIfSup() { + byte labelIdx = getNextByte(); - break; - } - case 0x14: // OP_unloadMask0 - { - byte param = getNextByte(); + if ((_currentScriptElement->compareResult & 2) && !(_currentScriptElement->compareResult & 1)) { + assert(_currentScriptElement->stack[labelIdx] != -1); - DEBUG_SCRIPT(currentLine, "removeSpriteOverlay(%d)", param); + DEBUG_SCRIPT(_currentLine, "if(>) goto %d (true)", labelIdx); + _currentPosition = _currentScriptElement->stack[labelIdx]; + } else { + DEBUG_SCRIPT(_currentLine, "if(>) goto %d (false)", labelIdx); + } +} - freeOverlay(param, 0); +void o1_gotoIfSupEqu() { + byte labelIdx = getNextByte(); - break; - } - case 0x15: - { - byte param = getNextByte(); + if ((_currentScriptElement->compareResult & 2) || (_currentScriptElement->compareResult & 1)) { + assert(_currentScriptElement->stack[labelIdx] != -1); - DEBUG_SCRIPT(currentLine, "addToBGList(%d)", param); + DEBUG_SCRIPT(_currentLine, "if(>=) goto %d (true)", labelIdx); + _currentPosition = _currentScriptElement->stack[labelIdx]; + } else { + DEBUG_SCRIPT(_currentLine, "if(>=) goto %d (false)", labelIdx); + } +} - addToBGList(param); +void o1_gotoIfInf() { + byte labelIdx = getNextByte(); - break; - } - case 0x16: // OP_loadMask1 - { - byte param = getNextByte(); + if ((_currentScriptElement->compareResult & 4) && !(_currentScriptElement->compareResult & 1)) { + assert(_currentScriptElement->stack[labelIdx] != -1); - DEBUG_SCRIPT(currentLine, "addOverlay1(%d)", param); + DEBUG_SCRIPT(_currentLine, "if(<) goto %d (true)", labelIdx); + _currentPosition = _currentScriptElement->stack[labelIdx]; + } else { + DEBUG_SCRIPT(_currentLine, "if(<) goto %d (false)", labelIdx); + } +} - loadOverlayElement(param, 1); +void o1_gotoIfInfEqu() { + byte labelIdx = getNextByte(); - break; - } - case 0x17: // OP_unloadMask1 - { - byte param = getNextByte(); + if ((_currentScriptElement->compareResult & 4) || (_currentScriptElement->compareResult & 1)) { + assert(_currentScriptElement->stack[labelIdx] != -1); - DEBUG_SCRIPT(currentLine, "removeOverlay1(%d)", param); + DEBUG_SCRIPT(_currentLine, "if(<=) goto %d (true)", labelIdx); + _currentPosition = _currentScriptElement->stack[labelIdx]; + } else { + DEBUG_SCRIPT(_currentLine, "if(<=) goto %d (false)", labelIdx); + } +} - freeOverlay(param, 1); +void o1_gotoIfEqu() { + byte labelIdx = getNextByte(); - break; - } - case 0x18: // OP_loadMask4 - { - byte param = getNextByte(); + if (_currentScriptElement->compareResult & 1) { + assert(_currentScriptElement->stack[labelIdx] != -1); - DEBUG_SCRIPT(currentLine, "addOverlayType4(%d)", param); + DEBUG_SCRIPT(_currentLine, "if(==) goto %d (true)", labelIdx); + _currentPosition = _currentScriptElement->stack[labelIdx]; + } else { + DEBUG_SCRIPT(_currentLine, "if(==) goto %d (false)", labelIdx); + } +} - loadOverlayElement(param, 4); +void o1_gotoIfDiff() { + byte labelIdx = getNextByte(); - break; - } - case 0x19: // OP_unloadMask4 - { - byte param = getNextByte(); + if (!(_currentScriptElement->compareResult & 1)) { + assert(_currentScriptElement->stack[labelIdx] != -1); - DEBUG_SCRIPT(currentLine, "removeSpriteOverlay4(%d)", param); + DEBUG_SCRIPT(_currentLine, "if(!=) goto %d (true)", labelIdx); + _currentPosition = _currentScriptElement->stack[labelIdx]; + } else { + DEBUG_SCRIPT(_currentLine, "if(!=) goto %d (false)", labelIdx); + } +} - freeOverlay(param, 4); +void o1_removeLabel() { + warning("STUB: o1_removeLabel()"); +} - break; - } - case 0x1A: - { - byte param = getNextByte(); +void o1_loop() { + byte varIdx = getNextByte(); + byte labelIdx = getNextByte(); - DEBUG_SCRIPT(currentLine, "op1A(%d) -> TODO !", param); + _currentScriptElement->localVars[varIdx]--; - addSpriteFilledToBGList(param); + if (_currentScriptElement->localVars[varIdx] >= 0) { + assert(_currentScriptElement->stack[labelIdx] != -1); - break; - } - case 0x1B: - { - DEBUG_SCRIPT(currentLine, "closeEngine7"); - closeEngine7(); - break; - } - case 0x1D: // OP_label - { - byte labelIdx = getNextByte(); + DEBUG_SCRIPT(_currentLine, "loop(var[%]) goto %d (continue)", varIdx, labelIdx); + _currentPosition = _currentScriptElement->stack[labelIdx]; + } else { + DEBUG_SCRIPT(_currentLine, "loop(var[%]) goto %d (stop)", varIdx, labelIdx); + } +} - DEBUG_SCRIPT(currentLine, "label(%d)", labelIdx); +void o1_startGlobalScript() { + // OP_startScript + byte param = getNextByte(); - scriptElement->stack[labelIdx] = _currentPosition; + assert(param < NUM_MAX_SCRIPT); - break; - } - case 0x1E: // OP_goto - { - byte labelIdx = getNextByte(); + DEBUG_SCRIPT(_currentLine, "startScript(%d)", param); + addScriptToList0(param); +} - DEBUG_SCRIPT(currentLine, "goto label(%d)", labelIdx); +void o1_endGlobalScript() { + byte scriptIdx = getNextByte(); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = scriptElement->stack[labelIdx]; + DEBUG_SCRIPT(_currentLine, "stopGlobalScript(%d)", scriptIdx); + stopGlobalScript(scriptIdx); +} - break; - } - case 0x1F: // OP_gotoIfSup - { - byte labelIdx = getNextByte(); +void o1_loadAnim() { + // OP_loadResource + const char *param = getNextString(); - if ((scriptElement->compareResult & 2) && !(scriptElement->compareResult & 1)) { - DEBUG_SCRIPT(currentLine, "if(>) goto %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = scriptElement->stack[labelIdx]; - } else { - DEBUG_SCRIPT(currentLine, "if(>) goto %d (false)", labelIdx); - } + DEBUG_SCRIPT(_currentLine, "loadResource(\"%s\")", param); + loadResource(param); +} - break; - } - case 0x20: // OP_gotoIfSupEqu - { - byte labelIdx = getNextByte(); +void o1_loadBg() { + const char *param = getNextString(); - if (scriptElement->compareResult & 2 || scriptElement->compareResult & 1) { - DEBUG_SCRIPT(currentLine, "if(>=) goto %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = scriptElement->stack[labelIdx]; - } else { - DEBUG_SCRIPT(currentLine, "if(>=) goto %d (false)", - labelIdx); - } + DEBUG_SCRIPT(_currentLine, "loadBg(\"%s\")", param); - break; - } - case 0x21: // OP_gotoIfInf - { - byte labelIdx = getNextByte(); + loadBg(param); + closeEngine7(); + bgVar0 = 0; +} - if ((scriptElement->compareResult & 4) && !(scriptElement->compareResult & 1)) { - DEBUG_SCRIPT(currentLine, "if(<) goto %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = scriptElement->stack[labelIdx]; - } else { - DEBUG_SCRIPT(currentLine, "if(<) goto %d (false)", labelIdx); - } +void o1_loadCt() { + const char *param = getNextString(); - break; - } - case 0x22: // OP_gotoIfInfEqu - { - byte labelIdx = getNextByte(); + DEBUG_SCRIPT(_currentLine, "loadCt(\"%s\")", param); + loadCt(param); +} - if ((scriptElement->compareResult & 4) || (scriptElement->compareResult & 1)) { - DEBUG_SCRIPT(currentLine, "if(<=) goto %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = scriptElement->stack[labelIdx]; - } else { - DEBUG_SCRIPT(currentLine, "if(<=) goto %d (false)", labelIdx); - } +void o1_loadPart() { + const char *param = getNextString(); - break; - } - case 0x23: // OP_gotoIfEqu - { - byte labelIdx = getNextByte(); + DEBUG_SCRIPT(_currentLine, "loadPart(\"%s\")", param); + loadPart(param); +} - if (scriptElement->compareResult & 1) { - DEBUG_SCRIPT(currentLine, "if(==) goto %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = scriptElement->stack[labelIdx]; - } else { - DEBUG_SCRIPT(currentLine, "if(==) goto %d (false)", labelIdx); - } +void o1_closePart() { + DEBUG_SCRIPT(_currentLine, "closePart"); + closePart(); +} - break; - } - case 0x24: // OP_gotoIfDiff - { - byte labelIdx = getNextByte(); +void o1_loadNewPrcName() { + // OP_loadData + byte param1 = getNextByte(); + const char *param2 = getNextString(); - if (!(scriptElement->compareResult & 1)) { - DEBUG_SCRIPT(currentLine, "if(!=) goto %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = scriptElement->stack[labelIdx]; - } else { - DEBUG_SCRIPT(currentLine, "if(!=) goto %d (false)", labelIdx); - } + assert(param1 <= 3); - break; - } - case 0x25: // OP_removeLabel - { - warning("STUB: Opcode 0x25"); - break; - } - case 0x26: // OP_loop - { - byte varIdx = getNextByte(); - byte labelIdx = getNextByte(); + switch (param1) { + case 0: + DEBUG_SCRIPT(_currentLine, "loadPrc(\"%s\")", param2); + strcpy(newPrcName, param2); + break; + case 1: + DEBUG_SCRIPT(_currentLine, "loadRel(\"%s\")", param2); + strcpy(newRelName, param2); + break; + case 2: + DEBUG_SCRIPT(_currentLine, "loadObject(\"%s\")", param2); + strcpy(newObjectName, param2); + break; + case 3: + DEBUG_SCRIPT(_currentLine, "loadMsg(\"%s\")", param2); + strcpy(newMsgName, param2); + break; + } +} - scriptElement->localVars[varIdx]--; +void o1_requestCheckPendingDataLoad() { + DEBUG_SCRIPT(_currentLine, "request data load"); + checkForPendingDataLoadSwitch = 1; +} - if (scriptElement->localVars[varIdx] >= 0) { - DEBUG_SCRIPT(currentLine, "loop(var[%]) goto %d (continue)", varIdx, labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = scriptElement->stack[labelIdx]; - } else { - DEBUG_SCRIPT(currentLine, "loop(var[%]) goto %d (stop)", varIdx, labelIdx); - } +void o1_blitAndFade() { + DEBUG_SCRIPT(_currentLine, "request fadein"); + // TODO: use real code - break; - } - case 0x31: // OP_startScript (OP_startGlobalScript?) - { - byte param = getNextByte(); + memcpy(c_palette, tempPalette, sizeof(uint16) * 16); + drawOverlays(); + flip(); - assert(param < NUM_MAX_SCRIPT); + fadeRequired = 1; +} - DEBUG_SCRIPT(currentLine, "startScript(%d)", param); +void o1_fadeToBlack() { + DEBUG_SCRIPT(_currentLine, "request fadeout"); + //fadeToBlack(); + warning("STUB: o1_fadeToBlack()"); +} - addScriptToList0(param); - break; - } - case 0x32: // OP_endGlobalScript - { - byte scriptIdx = getNextByte(); +void o1_transformPaletteRange() { + byte startColor = getNextByte(); + byte numColor = getNextByte(); + uint16 r = getNextWord(); + uint16 g = getNextWord(); + uint16 b = getNextWord(); - DEBUG_SCRIPT(currentLine, "stopGlobalScript(%d)", scriptIdx); + DEBUG_SCRIPT(_currentLine, "transformPaletteRange(from:%d,numIdx:%d,r:%d,g:%d,b:%d) -> unimplemented", startColor, numColor, r, g, b); - stopGlobalScript(scriptIdx); - break; - } - case 0x3B: // OP_loadResource (OP_loadAnim?) - { - const char *param = getNextString(); + transformPaletteRange(startColor, numColor, r, g, b); +} - DEBUG_SCRIPT(currentLine, "loadResource(\"%s\")", param); +void o1_setDefaultMenuColor2() { + byte param = getNextByte(); - loadResource(param); - break; - } - case 0x3C: // OP_loadBg - { - const char *param = getNextString(); + DEBUG_SCRIPT(_currentLine, "setDefaultMenuColor2(%d)", param); + defaultMenuBoxColor2 = param; +} - DEBUG_SCRIPT(currentLine, "loadBg(\"%s\")", param); +void o1_palRotate() { + byte a = getNextByte(); + byte b = getNextByte(); + byte c = getNextByte(); - loadBg(param); - closeEngine7(); - bgVar0 = 0; + DEBUG_SCRIPT(_currentLine, "palRotate(%d,%d,%d)", a, b, c); + palRotate(a, b, c); +} - break; - } - case 0x3D: // OP_loadCt - { - const char *param = getNextString(); +void o1_break() { + DEBUG_SCRIPT(_currentLine, "break"); - DEBUG_SCRIPT(currentLine, "loadCt(\"%s\")", param); + _currentScriptElement->scriptPosition = _currentPosition; + _closeScript = 1; +} - loadCt(param); - break; - } - case 0x3F: // OP_loadPart - { - const char *param = getNextString(); +void o1_endScript() { + DEBUG_SCRIPT(_currentLine, "endScript"); - DEBUG_SCRIPT(currentLine, "loadPart(\"%s\")", param); + if (_currentScriptParams == 0) { + endScript0(_currentScriptElement->scriptIdx); + } else { + endScript1(_currentScriptElement->scriptIdx); + } - if (gameType == Cine::GID_FW) - loadPart(param); + _closeScript = 1; +} - break; - } - case 0x40: // OP_closePart - { - DEBUG_SCRIPT(currentLine, "closePart"); +void o1_message() { + byte param1 = getNextByte(); + uint16 param2 = getNextWord(); + uint16 param3 = getNextWord(); + uint16 param4 = getNextWord(); + uint16 param5 = getNextWord(); - closePart(); - break; - } - case 0x41: // OP_loadData (OP_loadNewPrcName?) - { - byte param1 = getNextByte(); - const char *param2 = getNextString(); + DEBUG_SCRIPT(_currentLine, "message(%d,%d,%d,%d,%d)", param1, param2, param3, param4, param5); - assert(param1 <= 3); + addMessage(param1, param2, param3, param4, param5); +} - switch (param1) { - case 0: - { - DEBUG_SCRIPT(currentLine, "loadPrc(\"%s\")", param2); - strcpy(newPrcName, param2); - break; - } - case 1: - { - DEBUG_SCRIPT(currentLine, "loadRel(\"%s\")", param2); - strcpy(newRelName, param2); - break; - } - case 2: - { - DEBUG_SCRIPT(currentLine, "loadObject(\"%s\")", param2); - strcpy(newObjectName, param2); - break; - } - case 3: - { - DEBUG_SCRIPT(currentLine, "loadMsg(\"%s\")", param2); - strcpy(newMsgName, param2); - break; - } - } +void o1_loadGlobalVar() { + byte varIdx = getNextByte(); + byte varType = getNextByte(); - break; - } - case 0x42: // OP_requestCheckPendingDataLoad - { - DEBUG_SCRIPT(currentLine, "request data load"); - checkForPendingDataLoadSwitch = 1; - break; - } - case 0x45: // OP_blitAndFade - { - DEBUG_SCRIPT(currentLine, "request fadein"); - // TODO: use real code + if (varType) { + byte dataIdx = getNextByte(); - memcpy(c_palette, tempPalette, sizeof(uint16) * 16); - drawOverlays(); - flip(); + if (varType == 1) { + DEBUG_SCRIPT(_currentLine, "globalVars[%d] = var[%d]", varIdx, dataIdx); + globalVars[varIdx] = _currentScriptElement->localVars[dataIdx]; + } else { + DEBUG_SCRIPT(_currentLine, "globalVars[%d] = globalVars[%d]", varIdx, dataIdx); + globalVars[varIdx] = globalVars[dataIdx]; + } + } else { + uint16 newData = getNextWord(); - fadeRequired = 1; - break; - } - case 0x46: // OP_fadeToBlack - { - DEBUG_SCRIPT(currentLine, "request fadeout"); - //fadeToBlack(); - warning("STUB: Opcode 0x46"); - break; - } - case 0x47: // OP_transformPaletteRange - { - byte startColor = getNextByte(); - byte numColor = getNextByte(); - uint16 r = getNextWord(); - uint16 g = getNextWord(); - uint16 b = getNextWord(); + DEBUG_SCRIPT(_currentLine, "globalVars[%d] = %d", varIdx, newData); + globalVars[varIdx] = newData; + } +} - DEBUG_SCRIPT(currentLine, "transformPaletteRange(from:%d,numIdx:%d,r:%d,g:%d,b:%d) -> unimplemented", startColor, numColor, r, g, b); +void o1_compareGlobalVar() { + byte varIdx = getNextByte(); + byte varType = getNextByte(); - transformPaletteRange(startColor, numColor, r, g, b); + if (varType) { + byte value = getNextByte(); - break; - } - case 0x49: // OP_setDefaultMenuColor2 - { - defaultMenuBoxColor2 = getNextByte(); + DEBUG_SCRIPT(_currentLine, "compare globalVars[%d] and var[%d]", varIdx, value); + _currentScriptElement->compareResult = compareVars(globalVars[varIdx], _currentScriptElement->localVars[value]); + } else { + uint16 newData = getNextWord(); - DEBUG_SCRIPT(currentLine, "setDefaultMenuColor2(%d)", defaultMenuBoxColor2); + DEBUG_SCRIPT(_currentLine, "compare globalVars[%d] and %d", varIdx, newData); - break; - } - case 0x4A: - { - byte a = getNextByte(); - byte b = getNextByte(); - byte c = getNextByte(); + if (varIdx == 255 && (gameType == Cine::GID_FW)) { // TODO: fix + _currentScriptElement->compareResult = 1; + } else { + _currentScriptElement->compareResult = compareVars(globalVars[varIdx], newData); + } + } +} - DEBUG_SCRIPT(currentLine, "palRotate(%d,%d,%d)", a, b, c); +void o1_declareFunctionName() { + const char *param = getNextString(); - palRotate(a, b, c); - break; - } - case 0x4F: // OP_break; - { - DEBUG_SCRIPT(currentLine, "break"); + DEBUG_SCRIPT(_currentLine, "comment(%s)", param); +} - scriptElement->scriptPosition = _currentPosition; - closeScript = 1; - break; - } - case 0x50: // OP_endScript - { - DEBUG_SCRIPT(currentLine, "endScript"); +void o1_freePartRange() { + byte startIdx = getNextByte(); + byte numIdx = getNextByte(); - if (params == 0) { - endScript0(scriptElement->scriptIdx); - } else { - endScript1(scriptElement->scriptIdx); - } + assert(startIdx + numIdx <= NUM_MAX_ANIMDATA); - closeScript = 1; - break; - } - case 0x51: // OP_message - { - byte param1 = getNextByte(); - uint16 param2 = getNextWord(); - uint16 param3 = getNextWord(); - uint16 param4 = getNextWord(); - uint16 param5 = getNextWord(); + DEBUG_SCRIPT(_currentLine, "freePartRange(%d,%d)", startIdx, numIdx); + freePartRange(startIdx, numIdx); +} - DEBUG_SCRIPT(currentLine, "message(%d,%d,%d,%d,%d)", param1, param2, param3, param4, param5); +void o1_unloadAllMasks() { + DEBUG_SCRIPT(_currentLine, "unloadAllMasks()"); + unloadAllMasks(); +} - addMessage(param1, param2, param3, param4, param5); +void o1_op63() { + warning("STUB: o1_op63()"); +} - break; - } - case 0x52: // OP_loadGlobalVar - { - byte varIdx = getNextByte(); - byte varType = getNextByte(); +void o1_op64() { + warning("STUB: o1_op64()"); +} - if (varType) { - byte dataIdx = getNextByte(); +void o1_initializeZoneData() { + DEBUG_SCRIPT(_currentLine, "initializeZoneData()"); - if (varType == 1) { - DEBUG_SCRIPT(currentLine, "globalVars[%d] = var[%d]", varIdx, dataIdx); + for (int i = 0; i < NUM_MAX_ZONE; i++) { + zoneData[i] = i; + } +} - globalVars[varIdx] = scriptElement->localVars[dataIdx]; - } else { - DEBUG_SCRIPT(currentLine, "globalVars[%d] = globalVars[%d]", varIdx, dataIdx); +void o1_setZoneDataEntry() { + byte zoneIdx = getNextByte(); + uint16 var = getNextWord(); - globalVars[varIdx] = globalVars[dataIdx]; - } - } else { - uint16 newData = getNextWord(); + DEBUG_SCRIPT(_currentLine, "setZone[%d] = %d", zoneIdx, var); + zoneData[zoneIdx] = var; +} - DEBUG_SCRIPT(currentLine, "globalVars[%d] = %d", varIdx, newData); +void o1_getZoneDataEntry() { + warning("STUB: o1_getZoneDataEntry()"); +} - globalVars[varIdx] = newData; - } +void o1_setDefaultMenuColor() { + byte param = getNextByte(); - break; - } - case 0x53: // OP_compareGlobalVar - { - byte varIdx = getNextByte(); - byte varType = getNextByte(); + DEBUG_SCRIPT(_currentLine, "setDefaultMenuColor(%d)", param); + defaultMenuBoxColor = param; +} - if (varType) { - byte value = getNextByte(); +void o1_allowPlayerInput() { + DEBUG_SCRIPT(_currentLine, "allowPlayerInput()"); + allowPlayerInput = 1; +} - DEBUG_SCRIPT(currentLine, "compare globalVars[%d] and var[%d]", varIdx, value); +void o1_disallowPlayerInput() { + DEBUG_SCRIPT(_currentLine, "dissallowPlayerInput()"); + allowPlayerInput = 0; +} - scriptElement->compareResult = compareVars(globalVars[varIdx], scriptElement->localVars[value]); - } else { - uint16 newData = getNextWord(); +void o1_changeDataDisk() { + byte newDisk = getNextByte(); - DEBUG_SCRIPT(currentLine, - "compare globalVars[%d] and %d", - varIdx, newData); + DEBUG_SCRIPT(_currentLine, "changeDataDisk(%d)", newDisk); + checkDataDisk(newDisk); +} - if (varIdx == 255 && (gameType == Cine::GID_FW)) { // TODO: fix - scriptElement->compareResult = 1; - } else { - scriptElement->compareResult = compareVars(globalVars[varIdx], newData); - } - } +void o1_loadMusic() { + const char *param = getNextString(); - break; - } - case 0x59: // OP_declareFunctionName - { - const char *param = getNextString(); + DEBUG_SCRIPT(_currentLine, "loadMusic(%s)", param); + g_sfxPlayer->load(param); +} - DEBUG_SCRIPT(currentLine, "comment(%s)", param); - break; - } - case 0x5A: // OP_freePartRange - { - byte startIdx = getNextByte(); - byte numIdx = getNextByte(); +void o1_playMusic() { + DEBUG_SCRIPT(_currentLine, "playMusic()"); + g_sfxPlayer->play(); +} - assert(startIdx + numIdx <= NUM_MAX_ANIMDATA); +void o1_fadeOutMusic() { + DEBUG_SCRIPT(_currentLine, "fadeOutMusic()"); + g_sfxPlayer->fadeOut(); +} - DEBUG_SCRIPT(currentLine, "freePartRange(%d,%d)", startIdx, numIdx); +void o1_stopSample() { + DEBUG_SCRIPT(_currentLine, "stopSample()"); + g_sfxPlayer->stop(); +} - freePartRange(startIdx, numIdx); +void o1_op71() { + warning("STUB: o1_op71()"); +} - break; - } - case 0x5B: // OP_unloadAllMasks - { - DEBUG_SCRIPT(currentLine, "unloadAllMasks()"); +void o1_op72() { + warning("STUB: o1_op72()"); +} - unloadAllMasks(); +void o1_op73() { + warning("STUB: o1_op73()"); +} - break; - } - case 0x63: - { - warning("STUB: Opcode 0x63"); - break; - } - case 0x64: - { - warning("STUB: Opcode 0x64"); - break; - } - case 0x65: // OP_initializeZoneData - { - byte i; +void o1_playSample() { + DEBUG_SCRIPT(_currentLine, "playSample()"); - DEBUG_SCRIPT(currentLine, "initializeZoneData()"); + byte anim = getNextByte(); + byte channel = getNextByte(); - for (i = 0; i < NUM_MAX_ZONE; i++) { - zoneData[i] = i; - } + getNextWord(); + getNextByte(); - break; - } - case 0x66: // OP_setZoneDataEntry - { - byte zoneIdx = getNextByte(); - uint16 var = getNextWord(); + int16 volume = getNextWord(); + uint16 flag = getNextWord(); - DEBUG_SCRIPT(currentLine, "setZone[%d] = %d", zoneIdx, var); + if (volume > 63) + volume = 63; + if (volume < 0) + volume = 63; - zoneData[zoneIdx] = var; + if (animDataTable[anim].ptr1) { + if (channel >= 10) { + channel -= 10; + } + if (volume < 50) { + volume = 50; + } - break; - } - case 0x67: // OP_getZoneDataEntry - { - warning("STUB: Opcode 0x67"); - break; - } - case 0x68: // OP_setDefaultMenuColor - { - defaultMenuBoxColor = getNextByte(); + g_sfxPlayer->stop(); + + if (flag == 0xFFFF) { + g_soundDriver->playSound(animDataTable[anim].ptr1, channel, volume); + } else { + g_soundDriver->resetChannel(channel); + } + } +} - DEBUG_SCRIPT(currentLine, "setDefaultMenuColor(%d)", defaultMenuBoxColor2); +void o1_allowSystemMenu() { + byte param = getNextByte(); - break; - } - case 0x69: // OP_allowPlayerInput - { - DEBUG_SCRIPT(currentLine, "allowPlayerInput()"); + DEBUG_SCRIPT(_currentLine, "OP79 load var22 to %d -> TODO", param); + var22 = param; +} - allowPlayerInput = 1; - break; - } - case 0x6A: // OP_dissallowPlayerInput - { - DEBUG_SCRIPT(currentLine, "dissallowPlayerInput()"); +void o1_loadMask5() { + byte param = getNextByte(); - allowPlayerInput = 0; - break; - } - case 0x6B: // OP_changeDataDisk - { - byte newDisk = getNextByte(); + DEBUG_SCRIPT(_currentLine, "addOverlay5(%d)", param); + loadOverlayElement(param, 5); +} - DEBUG_SCRIPT(currentLine, "changeDataDisk(%d)", newDisk); +void o1_unloadMask5() { + byte param = getNextByte(); - checkDataDisk(newDisk); - break; - } - case 0x6D: // OP_loadMusic - { - const char *param = getNextString(); + DEBUG_SCRIPT(_currentLine, "freeOverlay5(%d)", param); + freeOverlay(param, 5); +} - DEBUG_SCRIPT(currentLine, "loadMusic(%s)", param); - g_sfxPlayer->load(param); - break; - } - case 0x6E: // OP_playMusic - { - DEBUG_SCRIPT(currentLine, "playMusic()"); - g_sfxPlayer->play(); - break; - } - case 0x6F: // OP_fadeOutMusic - { - DEBUG_SCRIPT(currentLine, "fadeOutMusic()"); - g_sfxPlayer->fadeOut(); - break; - } - case 0x70: // OP_stopSample - { - DEBUG_SCRIPT(currentLine, "stopSample()"); - g_sfxPlayer->stop(); - break; - } - case 0x71: - { - warning("STUB: Opcode 0x71"); - break; - } - case 0x72: - { - warning("STUB: Opcode 0x72"); - break; - } - case 0x73: - { - warning("STUB: Opcode 0x73"); - break; - } - case 0x77: // OP_playSample - case 0x78: // OP_playSample - { - DEBUG_SCRIPT(currentLine, "playSample()"); +// ------------------------------------------------------------------------ +// OPERATION STEALTH opcodes +// ------------------------------------------------------------------------ - byte anim = getNextByte(); - byte channel = getNextByte(); +void o2_loadPart() { + const char *param = getNextString(); - getNextWord(); - getNextByte(); + DEBUG_SCRIPT(_currentLine, "loadPart(\"%s\")", param); +} - int16 volume = getNextWord(); - uint16 flag = getNextWord(); +void o2_addSeqListElement() { + byte param1 = getNextByte(); + byte param2 = getNextByte(); + byte param3 = getNextByte(); + byte param4 = getNextByte(); + uint16 param5 = getNextWord(); + uint16 param6 = getNextWord(); + uint16 param7 = getNextWord(); + + DEBUG_SCRIPT(_currentLine, "addSeqListElement(%d,%d,%d,%d,%d)", param1, param2, param3, param4, param5, param6, param7); + addSeqListElement(param1, 0, param2, param3, param4, param5, param6, 0, param7); +} - if (volume > 63) - volume = 63; - if (volume < 0) - volume = 63; +void o2_removeSeq() { + byte a = getNextByte(); + byte b = getNextByte(); - if (animDataTable[anim].ptr1) { - if (channel >= 10) { - channel -= 10; - } - if (volume < 50) { - volume = 50; - } + DEBUG_SCRIPT(_currentLine, "removeSeq(%d,%d) -> TODO", a, b); + removeSeq(a, 0, b); +} - g_sfxPlayer->stop(); - - if (flag == 0xFFFF) { - g_soundDriver->playSound(animDataTable[anim].ptr1, channel, volume); - } else { - g_soundDriver->resetChannel(channel); - } - } - break; - } - case 0x79: // OP_allowSystemMenu - { - var22 = getNextByte(); +void o2_op81() { + warning("STUB: o2_op81()"); +} - DEBUG_SCRIPT(currentLine, "OP79 load var22 to %d -> TODO", var22); - break; - } - case 0x7A: // OP_loadMask5 - { - byte param = getNextByte(); +void o2_op82() { + warning("STUB: o2_op82()"); +} - DEBUG_SCRIPT(currentLine, "addOverlay5(%d)", param); +void o2_isSeqRunning() { + byte a = getNextByte(); + byte b = getNextByte(); - loadOverlayElement(param, 5); - break; - } - case 0x7B: // OP_unloadMask5 - { - byte param = getNextByte(); + DEBUG_SCRIPT(_currentLine, "OP83(%d,%d) -> TODO", a, b); - DEBUG_SCRIPT(currentLine, "freeOverlay5(%d)", param); + if (isSeqRunning(a, 0, b)) { + _currentScriptElement->compareResult = 1; + } else { + _currentScriptElement->compareResult = 0; + } +} - freeOverlay(param, 5); - break; - } - case 0x7F: - { - byte param1 = getNextByte(); - byte param2 = getNextByte(); - byte param3 = getNextByte(); - byte param4 = getNextByte(); - uint16 param5 = getNextWord(); - uint16 param6 = getNextWord(); - uint16 param7 = getNextWord(); +void o2_gotoIfSupNearest() { + byte labelIdx = getNextByte(); - DEBUG_SCRIPT(currentLine, "addSeqListElement(%d,%d,%d,%d,%d)", param1, param2, param3, param4, param5, param6, param7); + if ((_currentScriptElement->compareResult & 2) && !(_currentScriptElement->compareResult & 1)) { + assert(_currentScriptElement->stack[labelIdx] != -1); - addSeqListElement(param1, 0, param2, param3, param4, param5, param6, 0, param7); + DEBUG_SCRIPT(_currentLine, "if(>) goto nearest %d (true)", labelIdx); + _currentPosition = computeScriptStackFromScript(_currentScriptElement->scriptPtr, _currentPosition, labelIdx, scriptTable[_currentScriptElement->scriptIdx].size); + } else { + DEBUG_SCRIPT(_currentLine, "if(>) goto nearest %d (false)", labelIdx); + } +} - break; - } - case 0x80: - { - byte a = getNextByte(); - byte b = getNextByte(); +void o2_gotoIfSupEquNearest() { + byte labelIdx = getNextByte(); - DEBUG_SCRIPT(currentLine, "removeSeq(%d,%d) -> TODO", a, b); + if ((_currentScriptElement->compareResult & 2) || (_currentScriptElement->compareResult & 1)) { + assert(_currentScriptElement->stack[labelIdx] != -1); - removeSeq(a, 0, b); - break; - } - case 0x81: - { - warning("STUB: Opcode 0x81"); - break; - } - case 0x82: - { - warning("STUB: Opcode 0x82"); - break; - } - case 0x83: - { - byte a = getNextByte(); - byte b = getNextByte(); + DEBUG_SCRIPT(_currentLine, "if(>=) goto nearest %d (true)", labelIdx); + _currentPosition = computeScriptStackFromScript(_currentScriptElement->scriptPtr, _currentPosition, labelIdx, scriptTable[_currentScriptElement->scriptIdx].size); + } else { + DEBUG_SCRIPT(_currentLine, "if(>=) goto nearest %d (false)", labelIdx); + } +} - DEBUG_SCRIPT(currentLine, "OP83(%d,%d) -> TODO", a, b); +void o2_gotoIfInfNearest() { + byte labelIdx = getNextByte(); - if (isSeqRunning(a, 0, b)) { - scriptElement->compareResult = 1; - } else { - scriptElement->compareResult = 0; - } - break; - } - case 0x84: // OP_gotoIfSup nearest - { - byte labelIdx = getNextByte(); + if ((_currentScriptElement->compareResult & 4) && !(_currentScriptElement->compareResult & 1)) { + assert(_currentScriptElement->stack[labelIdx] != -1); - if ((scriptElement->compareResult & 2) - && !(scriptElement->compareResult & 1)) { - DEBUG_SCRIPT(currentLine, "if(>) goto nearest %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr, _currentPosition, labelIdx, - scriptTable[scriptElement->scriptIdx].size); - } else { - DEBUG_SCRIPT(currentLine, "if(>) goto nearest %d (false)", labelIdx); - } + DEBUG_SCRIPT(_currentLine, "if(<) goto nearest %d (true)", labelIdx); + _currentPosition = computeScriptStackFromScript(_currentScriptElement->scriptPtr, _currentPosition, labelIdx, scriptTable[_currentScriptElement->scriptIdx].size); + } else { + DEBUG_SCRIPT(_currentLine, "if(<) goto nearest %d (false)", labelIdx); + } +} - break; - } - case 0x85: // OP_gotoIfSupEqu nearest - { - byte labelIdx = getNextByte(); +void o2_gotoIfInfEquNearest() { + byte labelIdx = getNextByte(); - if (scriptElement->compareResult & 2 || scriptElement->compareResult & 1) { - DEBUG_SCRIPT(currentLine, "if(>=) goto nearest %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr, _currentPosition, labelIdx, - scriptTable[scriptElement->scriptIdx].size); - } else { - DEBUG_SCRIPT(currentLine, "if(>=) goto nearest %d (false)", labelIdx); - } + if ((_currentScriptElement->compareResult & 4) || (_currentScriptElement->compareResult & 1)) { + assert(_currentScriptElement->stack[labelIdx] != -1); - break; - } - case 0x86: // OP_gotoIfInf nearest - { - byte labelIdx = getNextByte(); + DEBUG_SCRIPT(_currentLine, "if(<=) goto nearest %d (true)", labelIdx); + _currentPosition = computeScriptStackFromScript(_currentScriptElement->scriptPtr, _currentPosition, labelIdx, scriptTable[_currentScriptElement->scriptIdx].size); + } else { + DEBUG_SCRIPT(_currentLine, "if(<=) goto nearest %d (false)", labelIdx); + } +} - if ((scriptElement->compareResult & 4) && !(scriptElement->compareResult & 1)) { - DEBUG_SCRIPT(currentLine, "if(<) goto nearest %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr, - _currentPosition, labelIdx, scriptTable[scriptElement->scriptIdx].size); - } else { - DEBUG_SCRIPT(currentLine, "if(<) goto nearest %d (false)", labelIdx); - } +void o2_gotoIfEquNearest() { + byte labelIdx = getNextByte(); - break; - } - case 0x87: // OP_gotoIfInfEqu nearest - { - byte labelIdx = getNextByte(); + if (_currentScriptElement->compareResult & 1) { + assert(_currentScriptElement->stack[labelIdx] != -1); - if ((scriptElement->compareResult & 4) || (scriptElement->compareResult & 1)) { - DEBUG_SCRIPT(currentLine, "if(<=) goto nearest %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr, - _currentPosition, labelIdx, scriptTable[scriptElement->scriptIdx].size); - } else { - DEBUG_SCRIPT(currentLine, "if(<=) goto nearest %d (false)", labelIdx); - } + DEBUG_SCRIPT(_currentLine, "if(==) goto nearest %d (true)", labelIdx); + _currentPosition = computeScriptStackFromScript(_currentScriptElement->scriptPtr, _currentPosition, labelIdx, scriptTable[_currentScriptElement->scriptIdx].size); + } else { + DEBUG_SCRIPT(_currentLine, "if(==) goto nearest %d (false)", labelIdx); + } +} - break; - } - case 0x88: // OP_gotoIfEqu nearest - { - byte labelIdx = getNextByte(); +void o2_gotoIfDiffNearest() { + byte labelIdx = getNextByte(); - if (scriptElement->compareResult & 1) { - DEBUG_SCRIPT(currentLine, "if(==) goto nearest %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr, - _currentPosition, labelIdx, scriptTable[scriptElement->scriptIdx].size); - } else { - DEBUG_SCRIPT(currentLine, "if(==) goto nearest %d (false)", labelIdx); - } + if (!(_currentScriptElement->compareResult & 1)) { + assert(_currentScriptElement->stack[labelIdx] != -1); - break; - } - case 0x89: // OP_gotoIfDiff nearest - { - byte labelIdx = getNextByte(); + DEBUG_SCRIPT(_currentLine, "if(!=) goto nearest %d (true)", labelIdx); + _currentPosition = computeScriptStackFromScript(_currentScriptElement->scriptPtr, _currentPosition, labelIdx, scriptTable[_currentScriptElement->scriptIdx].size); + } else { + DEBUG_SCRIPT(_currentLine, "if(!=) goto nearest %d (false)", labelIdx); + } +} - if (!(scriptElement->compareResult & 1)) { - DEBUG_SCRIPT(currentLine, "if(!=) goto nearest %d (true)", labelIdx); - assert(scriptElement->stack[labelIdx] != -1); - _currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr, - _currentPosition, labelIdx, scriptTable[scriptElement->scriptIdx].size); - } else { - DEBUG_SCRIPT(currentLine, "if(!=) goto nearest %d (false)", labelIdx); - } +void o2_startObjectScript() { + byte param = getNextByte(); - break; - } - case 0x8B: - { - byte param = getNextByte(); + DEBUG_SCRIPT(_currentLine, "startObjectScript(%d)", param); + runObjectScript(param); +} - DEBUG_SCRIPT(currentLine, "startObjectScript(%d)", param); +void o2_stopObjectScript() { + byte param = getNextByte(); - runObjectScript(param); - break; - } - case 0x8C: - { - byte param = getNextByte(); + DEBUG_SCRIPT(_currentLine, "stopObjectScript(%d)", param); + stopObjectScript(param); +} - DEBUG_SCRIPT(currentLine, "stopObjectScript(%d)", param); +void o2_op8D() { + warning("STUB: o2_op8D()"); +} - stopObjectScript(param); - break; - } - case 0x8D: - { - warning("STUB: Opcode 0x8D"); - break; - } - case 0x8E: - { - byte param1 = getNextWord(); - const char *param2 = getNextString(); +void o2_addBackground() { + byte param1 = getNextWord(); + const char *param2 = getNextString(); - DEBUG_SCRIPT(currentLine, "addBackground(%s,%d)", param2, param1); + DEBUG_SCRIPT(_currentLine, "addBackground(%s,%d)", param2, param1); + addBackground(param2, param1); +} - addBackground(param2, param1); - break; - } - case 0x8F: - { - byte param = getNextByte(); +void o2_removeBackground() { + byte param = getNextByte(); - DEBUG_SCRIPT(currentLine, "removeBackground(%d)", param); + assert(param); - assert(param); - if (additionalBgTable[param]) { - free(additionalBgTable[param]); - additionalBgTable[param] = NULL; - } + DEBUG_SCRIPT(_currentLine, "removeBackground(%d)", param); - if (currentAdditionalBgIdx == param) { - currentAdditionalBgIdx = 0; - } + if (additionalBgTable[param]) { + free(additionalBgTable[param]); + additionalBgTable[param] = NULL; + } - if (currentAdditionalBgIdx2 == param) { - currentAdditionalBgIdx2 = 0; - } + if (currentAdditionalBgIdx == param) { + currentAdditionalBgIdx = 0; + } - strcpy(currentBgName[param], ""); + if (currentAdditionalBgIdx2 == param) { + currentAdditionalBgIdx2 = 0; + } - break; - } - case 0x90: - { - byte param1 = getNextByte(); - const char *param2 = getNextString(); + strcpy(currentBgName[param], ""); +} - DEBUG_SCRIPT(currentLine, "loadABS(%d,%s)", param1, param2); +void o2_loadAbs() { + byte param1 = getNextByte(); + const char *param2 = getNextString(); - loadAbs(param2, param1); - break; - } - case 0x91: - { - byte param = getNextByte(); + DEBUG_SCRIPT(_currentLine, "loadABS(%d,%s)", param1, param2); + loadAbs(param2, param1); +} - DEBUG_SCRIPT(currentLine, "useBg(%d)", param); +void o2_loadBg() { + byte param = getNextByte(); - assert(param <= 8); + assert(param <= 8); - if (additionalBgTable[param]) { - currentAdditionalBgIdx = param; - //if (adBgVar0 == 0) { - // adBgVar1 = 1; - //} - } - break; - } - case 0x95: - { - warning("STUB: Opcode 0x95"); - break; - } - case 0x9A: // OP_wasZoneChecked - { - warning("STUB: Opcode 0x9A"); - break; - } - case 0x9B: - { - warning("STUB: Opcode 0x9B"); - break; - } - case 0x9C: - { - warning("STUB: Opcode 0x9C"); - break; - } - case 0x9D: - { - byte param = getNextByte(); + DEBUG_SCRIPT(_currentLine, "useBg(%d)", param); - DEBUG_SCRIPT(currentLine, "useBgScroll(%d)", param); + if (additionalBgTable[param]) { + currentAdditionalBgIdx = param; + //if (adBgVar0 == 0) { + // adBgVar1 = 1; + //} + } +} - assert(param <= 8); +void o2_op95() { + warning("STUB: o2_op95()"); +} - if (additionalBgTable[param]) { - currentAdditionalBgIdx2 = param; - } - break; - } - case 0x9E: - { - byte param1 = getNextByte(); +void o2_wasZoneChecked() { + warning("STUB: o2_wasZoneChecked()"); +} - if (param1) { - byte param2 = getNextByte(); +void o2_op9B() { + warning("STUB: o2_9B()"); +} - DEBUG_SCRIPT(currentLine, "additionalBgVScroll = var[%d]", param2); +void o2_op9C() { + warning("STUB: o2_9C()"); +} - additionalBgVScroll = scriptElement->localVars[param2]; - } else { - uint16 param2 = getNextWord(); +void o2_useBgScroll() { + byte param = getNextByte(); - DEBUG_SCRIPT(currentLine, "additionalBgVScroll = %d", param2); + assert(param <= 8); - additionalBgVScroll = param2; - } + DEBUG_SCRIPT(_currentLine, "useBgScroll(%d)", param); - break; - } - case 0x9F: - { - warning("STUB: Opcode 0x9F"); - break; - } - case 0xA0: - { - uint16 param1 = getNextWord(); - uint16 param2 = getNextWord(); + if (additionalBgTable[param]) { + currentAdditionalBgIdx2 = param; + } +} - DEBUG_SCRIPT(currentLine, "addGfxElementA0(%d,%d)", param1, param2); +void o2_setAdditionalBgVScroll() { + byte param1 = getNextByte(); - addGfxElementA0(param1, param2); - break; - } - case 0xA1: - { - warning("STUB: Opcode 0xA1"); - _currentPosition += 4; - break; - } - case 0xA2: - { - warning("STUB: Opcode 0xA2"); - _currentPosition += 4; - break; - } - case 0xA3: - { - warning("STUB: Opcode 0xA3"); - _currentPosition += 4; - break; - } - case 0xA4: - { - warning("STUB: Opcode 0xA4"); - break; - } - case 0xA5: - { - warning("STUB: Opcode 0xA5"); - break; - } - case 0xB6: - { - warning("STUB: Opcode 0xB6"); - break; - } - default: - { + if (param1) { + byte param2 = getNextByte(); + + DEBUG_SCRIPT(_currentLine, "additionalBgVScroll = var[%d]", param2); + additionalBgVScroll = _currentScriptElement->localVars[param2]; + } else { + uint16 param2 = getNextWord(); + + DEBUG_SCRIPT(_currentLine, "additionalBgVScroll = %d", param2); + additionalBgVScroll = param2; + } +} + +void o2_op9F() { + warning("o2_op9F()"); +} + +void o2_addGfxElementA0() { + uint16 param1 = getNextWord(); + uint16 param2 = getNextWord(); + + DEBUG_SCRIPT(_currentLine, "addGfxElementA0(%d,%d)", param1, param2); + addGfxElementA0(param1, param2); +} + +void o2_opA1() { + _currentPosition += 4; + warning("STUB: o2_opA1()"); +} + +void o2_opA2() { + _currentPosition += 4; + warning("STUB: o2_opA2()"); +} + +void o2_opA3() { + _currentPosition += 4; + warning("STUB: o2_opA3()"); +} + +void o2_opA4() { + warning("STUB: o2_opA4()"); +} + +void o2_opA5() { + warning("STUB: o2_opA5()"); +} + +void o2_opA9() { + warning("STUB: o2_opA9()"); +} + +// ------------------------------------------------------------------------ + +void executeScript(prcLinkedListStruct *scriptElement, uint16 params) { + assert(scriptElement); + + if (scriptElement->scriptIdx == -1) { + return; + } + + assert(scriptElement->scriptPtr); + + _currentScriptElement = scriptElement; + _currentScriptParams = params; + _currentScriptPtr = scriptElement->scriptPtr; + _currentPosition = scriptElement->scriptPosition; + + _closeScript = 0; + + while (!_closeScript) { + _currentLine = _currentPosition; + + byte opcode = getNextByte(); + + //printf("Op: %X\n", opcode - 1); + + if (opcode) { + if (opcode < _numOpcodes && _opcodeTable[opcode - 1]) + (_opcodeTable[opcode - 1]) (); + else error("Unsupported opcode %X", opcode - 1); - } } } } diff --git a/engines/cine/script.h b/engines/cine/script.h index 7063e6082b..37ed592d7a 100644 --- a/engines/cine/script.h +++ b/engines/cine/script.h @@ -39,6 +39,8 @@ struct scriptStruct { extern scriptStruct scriptTable[NUM_MAX_SCRIPT]; + void setupOpcodes(); + void computeScriptStack(byte *scriptPtr, int16 *stackPtr, uint16 scriptSize); void decompileScript(byte *scriptPtr, int16 *stackPtr, uint16 scriptSize, uint16 scriptIdx); void dumpScript(char *dumpName); @@ -62,6 +64,119 @@ void executeList0(void); void purgeList1(void); void purgeList0(void); +void o1_modifyObjectParam(); +void o1_getObjectParam(); +void o1_addObjectParam(); +void o1_subObjectParam(); +void o1_add2ObjectParam(); +void o1_sub2ObjectParam(); +void o1_compareObjectParam(); +void o1_setupObject(); +void o1_checkCollision(); +void o1_loadVar(); +void o1_addVar(); +void o1_subVar(); +void o1_mulVar(); +void o1_divVar(); +void o1_compareVar(); +void o1_modifyObjectParam2(); +void o1_loadMask0(); +void o1_unloadMask0(); +void o1_addToBgList(); +void o1_loadMask1(); +void o1_unloadMask1(); +void o1_loadMask4(); +void o1_unloadMask4(); +void o1_addSpriteFilledToBgList(); +void o1_op1B(); +void o1_label(); +void o1_goto(); +void o1_gotoIfSup(); +void o1_gotoIfSupEqu(); +void o1_gotoIfInf(); +void o1_gotoIfInfEqu(); +void o1_gotoIfEqu(); +void o1_gotoIfDiff(); +void o1_removeLabel(); +void o1_loop(); +void o1_startGlobalScript(); +void o1_endGlobalScript(); +void o1_loadAnim(); +void o1_loadBg(); +void o1_loadCt(); +void o1_loadPart(); +void o1_closePart(); +void o1_loadNewPrcName(); +void o1_requestCheckPendingDataLoad(); +void o1_blitAndFade(); +void o1_fadeToBlack(); +void o1_transformPaletteRange(); +void o1_setDefaultMenuColor2(); +void o1_palRotate(); +void o1_break(); +void o1_endScript(); +void o1_message(); +void o1_loadGlobalVar(); +void o1_compareGlobalVar(); +void o1_declareFunctionName(); +void o1_freePartRange(); +void o1_unloadAllMasks(); +void o1_op63(); +void o1_op64(); +void o1_initializeZoneData(); +void o1_setZoneDataEntry(); +void o1_getZoneDataEntry(); +void o1_setDefaultMenuColor(); +void o1_allowPlayerInput(); +void o1_disallowPlayerInput(); +void o1_changeDataDisk(); +void o1_loadMusic(); +void o1_playMusic(); +void o1_fadeOutMusic(); +void o1_stopSample(); +void o1_op71(); +void o1_op72(); +void o1_op73(); +void o1_playSample(); +void o1_playSample(); +void o1_allowSystemMenu(); +void o1_loadMask5(); +void o1_unloadMask5(); + +void o2_loadPart(); +void o2_addSeqListElement(); +void o2_removeSeq(); +void o2_op81(); +void o2_op82(); +void o2_isSeqRunning(); +void o2_gotoIfSupNearest(); +void o2_gotoIfSupEquNearest(); +void o2_gotoIfInfNearest(); +void o2_gotoIfInfEquNearest(); +void o2_gotoIfEquNearest(); +void o2_gotoIfDiffNearest(); +void o2_startObjectScript(); +void o2_stopObjectScript(); +void o2_op8D(); +void o2_addBackground(); +void o2_removeBackground(); +void o2_loadAbs(); +void o2_loadBg(); +void o2_op95(); +void o2_wasZoneChecked(); +void o2_op9B(); +void o2_op9C(); +void o2_useBgScroll(); +void o2_setAdditionalBgVScroll(); +void o2_op9F(); +void o2_addGfxElementA0(); +void o2_opA1(); +void o2_opA2(); +void o2_opA3(); +void o2_opA4(); +void o2_opA5(); +void o2_opA9(); + } // End of namespace Cine #endif -- cgit v1.2.3