aboutsummaryrefslogtreecommitdiff
path: root/engines/cine
diff options
context:
space:
mode:
authorTorbjörn Andersson2006-04-08 13:20:40 +0000
committerTorbjörn Andersson2006-04-08 13:20:40 +0000
commit986dce3a7dc4353a51fcc2abba744b4372d72610 (patch)
treee514e5ed48e4d4e9180341ac8044767fbd02e127 /engines/cine
parent453e69b6c2156ec8e84ff99a4f0fa3841362c06a (diff)
downloadscummvm-rg350-986dce3a7dc4353a51fcc2abba744b4372d72610.tar.gz
scummvm-rg350-986dce3a7dc4353a51fcc2abba744b4372d72610.tar.bz2
scummvm-rg350-986dce3a7dc4353a51fcc2abba744b4372d72610.zip
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
Diffstat (limited to 'engines/cine')
-rw-r--r--engines/cine/cine.cpp2
-rw-r--r--engines/cine/script.cpp2340
-rw-r--r--engines/cine/script.h115
3 files changed, 1371 insertions, 1086 deletions
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