[Scummvm-cvs-logs] SF.net SVN: scummvm: [21693] scummvm/trunk/engines/cine

eriktorbjorn at users.sourceforge.net eriktorbjorn at users.sourceforge.net
Sat Apr 8 06:21:03 CEST 2006


Revision: 21693
Author:   eriktorbjorn
Date:     2006-04-08 06:20:40 -0700 (Sat, 08 Apr 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=21693&view=rev

Log Message:
-----------
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.

Modified Paths:
--------------
    scummvm/trunk/engines/cine/cine.cpp
    scummvm/trunk/engines/cine/script.cpp
    scummvm/trunk/engines/cine/script.h
Modified: scummvm/trunk/engines/cine/cine.cpp
===================================================================
--- scummvm/trunk/engines/cine/cine.cpp	2006-04-08 12:41:02 UTC (rev 21692)
+++ scummvm/trunk/engines/cine/cine.cpp	2006-04-08 13:20:40 UTC (rev 21693)
@@ -188,6 +188,8 @@
 static void initialize() {
 	uint16 i;
 
+	setupOpcodes();
+
 	initLanguage(Common::parseLanguage(ConfMan.get("language")));
 	init_video();
 

Modified: scummvm/trunk/engines/cine/script.cpp
===================================================================
--- scummvm/trunk/engines/cine/script.cpp	2006-04-08 12:41:02 UTC (rev 21692)
+++ scummvm/trunk/engines/cine/script.cpp	2006-04-08 13:20:40 UTC (rev 21693)
@@ -34,9 +34,403 @@
 
 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);
 	_currentPosition++;
@@ -637,1337 +1031,1111 @@
 	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);
+
+	modifyObjectParam(objIdx, paramIdx, newValue);
+}
+
+void o1_getObjectParam() {
+	byte objIdx = getNextByte();
+	byte paramIdx = getNextByte();
+	byte newValue = getNextByte();
+
+	DEBUG_SCRIPT(_currentLine, "getObjectParam(objIdx:%d,paramIdx:%d,var:%d)", objIdx, paramIdx, newValue);
+
+	_currentScriptElement->localVars[newValue] = getObjectParam(objIdx, paramIdx);
+}
+
+void o1_addObjectParam() {
+	byte objIdx = getNextByte();
+	byte paramIdx = getNextByte();
+	int16 newValue = getNextWord();
+
+	DEBUG_SCRIPT(_currentLine, "addObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue);
+
+	addObjectParam(objIdx, paramIdx, newValue);
+}
+
+void o1_subObjectParam() {
+	byte objIdx = getNextByte();
+	byte paramIdx = getNextByte();
+	int16 newValue = getNextWord();
+
+	DEBUG_SCRIPT(_currentLine, "subObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue);
+
+	subObjectParam(objIdx, paramIdx, newValue);
+}
+
+void o1_add2ObjectParam() {
+	warning("STUB: o1_add2ObjectParam()");
+}
+
+void o1_sub2ObjectParam() {
+	warning("STUB: o1_sub2ObjectParam()");
+}
+
+void o1_compareObjectParam() {
+	byte objIdx = getNextByte();
+	byte param1 = getNextByte();
+	int16 param2 = getNextWord();
+
+	DEBUG_SCRIPT(_currentLine, "compareObjectParam(objIdx:%d,type:%d,value:%d)", objIdx, param1, param2);
+
+	_currentScriptElement->compareResult = compareObjectParam(objIdx, param1, param2);
+}
+
+void o1_setupObject() {
+	byte objIdx = getNextByte();
+	int16 param1 = getNextWord();
+	int16 param2 = getNextWord();
+	int16 param3 = getNextWord();
+	int16 param4 = getNextWord();
+
+	DEBUG_SCRIPT(_currentLine, "setupObject(objIdx:%d,%d,%d,%d,%d)", objIdx, param1, param2, param3, param4);
+
+	setupObject(objIdx, param1, param2, param3, param4);
+}
+
+void o1_checkCollision() {
+	byte objIdx = getNextByte();
+	int16 param1 = getNextWord();
+	int16 param2 = getNextWord();
+	int16 param3 = getNextWord();
+	int16 param4 = getNextWord();
+
+	DEBUG_SCRIPT(_currentLine, "checkCollision(objIdx:%d,%d,%d,%d,%d)", objIdx, param1, param2, param3, param4);
+
+	_currentScriptElement->compareResult = checkCollision(objIdx, param1, param2, param3, param4);
+}
+
+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();
+
+		DEBUG_SCRIPT(_currentLine, "var[%d] = %d", varIdx, newData);
+		_currentScriptElement->localVars[varIdx] = newData;
 	}
+}
 
-	assert(scriptElement->scriptPtr);
+void o1_addVar() {
+	byte varIdx = getNextByte();
+	byte varType = getNextByte();
 
-	// 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.
+	if (varType) {
+		byte dataIdx = getNextByte();
 
-	_currentScriptPtr = scriptElement->scriptPtr;
-	_currentPosition = scriptElement->scriptPosition;
+		DEBUG_SCRIPT(_currentLine, "var[%d] += var[%d]", varIdx, dataIdx);
+		_currentScriptElement->localVars[varIdx] += _currentScriptElement->localVars[dataIdx];
+	} else {
+		int16 newData = getNextWord();
 
-	closeScript = 0;
+		DEBUG_SCRIPT(_currentLine, "var[%d] += %d", varIdx, newData);
+		_currentScriptElement->localVars[varIdx] += newData;
+	}
+}
 
-	while (!closeScript) {
-		uint16 currentLine = _currentPosition;
-		byte opcode = getNextByte();
+void o1_subVar() {
+	byte varIdx = getNextByte();
+	byte varType = getNextByte();
 
-		//printf("Op: %X\n", opcode - 1);
+	if (varType) {
+		byte dataIdx = getNextByte();
 
-		// 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
+		DEBUG_SCRIPT(_currentLine, "var[%d] -= var[%d]", varIdx, dataIdx);
+		_currentScriptElement->localVars[varIdx] -= _currentScriptElement->localVars[dataIdx];
+	} else {
+		int16 newData = getNextWord();
 
-		switch (opcode - 1) {
-		case -1:
-			{
-				break;
-			}
-		case 0x0:	// OP_modifyObjectParam
-			{
-				byte objIdx = getNextByte();
-				byte paramIdx = getNextByte();
-				int16 newValue = getNextWord();
+		DEBUG_SCRIPT(_currentLine, "var[%d] -= %d", varIdx, newData);
+		_currentScriptElement->localVars[varIdx] -= newData;
+	}
+}
 
-				DEBUG_SCRIPT(currentLine, "modifyObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue);
+void o1_mulVar() {
+	byte varIdx = getNextByte();
+	byte varType = getNextByte();
 
-				modifyObjectParam(objIdx, paramIdx, newValue);
+	if (varType) {
+		byte dataIdx = getNextByte();
 
-				break;
-			}
-		case 0x1:	// OP_getObjectParam
-			{
-				byte objIdx = getNextByte();
-				byte paramIdx = getNextByte();
-				byte newValue = getNextByte();
+		DEBUG_SCRIPT(_currentLine, "var[%d] *= var[%d]", varIdx, dataIdx);
+		_currentScriptElement->localVars[varIdx] *= _currentScriptElement->localVars[dataIdx];
+	} else {
+		int16 newData = getNextWord();
 
-				DEBUG_SCRIPT(currentLine, "getObjectParam(objIdx:%d,paramIdx:%d,var:%d)", objIdx, paramIdx, newValue);
+		DEBUG_SCRIPT(_currentLine, "var[%d] *= %d", varIdx, newData);
+		_currentScriptElement->localVars[varIdx] *= newData;
+	}
+}
 
-				scriptElement->localVars[newValue] = getObjectParam(objIdx, paramIdx);
+void o1_divVar() {
+	byte varIdx = getNextByte();
+	byte varType = getNextByte();
 
-				break;
-			}
-		case 0x2:	// OP_addObjectParam
-			{
-				byte objIdx = getNextByte();
-				byte paramIdx = getNextByte();
-				int16 newValue = getNextWord();
+	if (varType) {
+		byte dataIdx = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "addObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue);
+		DEBUG_SCRIPT(_currentLine, "var[%d] /= var[%d]", varIdx, dataIdx);
+		_currentScriptElement->localVars[varIdx] /= _currentScriptElement->localVars[dataIdx];
+	} else {
+		int16 newData = getNextWord();
 
-				addObjectParam(objIdx, paramIdx, newValue);
+		DEBUG_SCRIPT(_currentLine, "var[%d] /= %d", varIdx, newData);
+		_currentScriptElement->localVars[varIdx] /= newData;
+	}
+}
 
-				break;
-			}
-		case 0x3:	// OP_subObjectParam
-			{
-				byte objIdx = getNextByte();
-				byte paramIdx = getNextByte();
-				int16 newValue = getNextWord();
+void o1_compareVar() {
+	byte varIdx = getNextByte();
+	byte varType = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "subObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue);
+	if (varType) {
+		byte dataIdx = getNextByte();
 
-				subObjectParam(objIdx, paramIdx, newValue);
+		// printf("Val: %d\n", dataIdx);
 
-				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();
+		if (varType == 1) {
+			assert(varIdx < 50);
+			assert(dataIdx < 50);
 
-				DEBUG_SCRIPT(currentLine, "compareObjectParam(objIdx:%d,type:%d,value:%d)", objIdx, param1, param2);
+			DEBUG_SCRIPT(_currentLine, "compare var[%d] and var[%d]", varIdx, dataIdx);
 
-				scriptElement->compareResult = compareObjectParam(objIdx, param1, param2);
+			_currentScriptElement->compareResult = compareVars(_currentScriptElement->localVars[varIdx], _currentScriptElement->localVars[dataIdx]);
+		} else if (varType == 2) {
+			DEBUG_SCRIPT(_currentLine, "compare var[%d] and globalVar[%d]", varIdx, dataIdx);
 
-				break;
-			}
-		case 0x7:	// OP_setupObject
-			{
-				byte objIdx = getNextByte();
-				int16 param1 = getNextWord();
-				int16 param2 = getNextWord();
-				int16 param3 = getNextWord();
-				int16 param4 = getNextWord();
+			assert(varIdx < 50);
 
-				DEBUG_SCRIPT(currentLine, "setupObject(objIdx:%d,%d,%d,%d,%d)", objIdx, param1, param2, param3, param4);
+			_currentScriptElement->compareResult = compareVars(_currentScriptElement->localVars[varIdx], globalVars[dataIdx]);
+		}
+	} else {
+		int16 value = getNextWord();
 
-				setupObject(objIdx, param1, param2, param3, param4);
+		DEBUG_SCRIPT(_currentLine, "compare var[%d] and %d", varIdx, value);
+		_currentScriptElement->compareResult = compareVars(_currentScriptElement->localVars[varIdx], value);
+	}
+}
 
-				break;
-			}
-		case 0x8:	// OP_checkCollision
-			{
-				byte objIdx = getNextByte();
-				int16 param1 = getNextWord();
-				int16 param2 = getNextWord();
-				int16 param3 = getNextWord();
-				int16 param4 = getNextWord();
+void o1_modifyObjectParam2() {
+	byte objIdx = getNextByte();
+	byte paramIdx = getNextByte();
+	byte newValue = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "checkCollision(objIdx:%d,%d,%d,%d,%d)", objIdx, param1, param2, param3, param4);
+	DEBUG_SCRIPT(_currentLine, "modifyObjectParam2(objIdx:%d,paramIdx:%d,var[%d])", objIdx, paramIdx, newValue);
 
-				scriptElement->compareResult = checkCollision(objIdx, param1, param2, param3, param4);
+	modifyObjectParam(objIdx, paramIdx, _currentScriptElement->localVars[newValue]);
+}
 
-				break;
-			}
-		case 0x9:	// OP_loadVar
-			{
-				byte varIdx = getNextByte();
-				byte varType = getNextByte();
+void o1_loadMask0() {
+	// OP_loadV7Element
+	byte param = getNextByte();
 
-				if (varType) {
-					byte dataIdx = getNextByte();
+	DEBUG_SCRIPT(_currentLine, "addSpriteOverlay(%d)", param);
+	loadOverlayElement(param, 0);
+}
 
-					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;
+void o1_unloadMask0() {
+	byte param = getNextByte();
 
-							DEBUG_SCRIPT(currentLine, "var[%d] = mouseX", varIdx, dataIdx);
-							getMouseData(mouseUpdateStatus, &dummyU16, (uint16 *)&var, (uint16 *)&dummyU16);
-							scriptElement->localVars[varIdx] = var;
-							break;
-						}
-					case 4:
-						{
-							int16 var;
+	DEBUG_SCRIPT(_currentLine, "removeSpriteOverlay(%d)", param);
+	freeOverlay(param, 0);
+}
 
-							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();
+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] = newData;
-				}
-				break;
-			}
-		case 0xA:	// OP_addVar
-			{
-				byte varIdx = getNextByte();
-				byte varType = getNextByte();
+void o1_loadMask1() {
+	byte param = getNextByte();
 
-				if (varType) {
-					byte dataIdx = getNextByte();
+	DEBUG_SCRIPT(_currentLine, "addOverlay1(%d)", param);
+	loadOverlayElement(param, 1);
+}
 
-					DEBUG_SCRIPT(currentLine, "var[%d] += var[%d]", varIdx, dataIdx);
+void o1_unloadMask1() {
+	byte param = getNextByte();
 
-					scriptElement->localVars[varIdx] += scriptElement->localVars[dataIdx];
-				} else {
-					int16 newData = getNextWord();
+	DEBUG_SCRIPT(_currentLine, "removeOverlay1(%d)", param);
+	freeOverlay(param, 1);
+}
 
-					DEBUG_SCRIPT(currentLine, "var[%d] += %d", varIdx, newData);
+void o1_loadMask4() {
+	byte param = getNextByte();
 
-					scriptElement->localVars[varIdx] += newData;
-				}
+	DEBUG_SCRIPT(_currentLine, "addOverlayType4(%d)", param);
+	loadOverlayElement(param, 4);
+}
 
-				break;
-			}
-		case 0xB:	// OP_subVar
-			{
-				byte varIdx = getNextByte();
-				byte varType = getNextByte();
+void o1_unloadMask4() {
+	byte param = getNextByte();
 
-				if (varType) {
-					byte dataIdx = getNextByte();
+	DEBUG_SCRIPT(_currentLine, "removeSpriteOverlay4(%d)", param);
+	freeOverlay(param, 4);
+}
 
-					DEBUG_SCRIPT(currentLine, "var[%d] -= var[%d]", varIdx, dataIdx);
+void o1_addSpriteFilledToBgList() {
+	byte param = getNextByte();
 
-					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] - scriptElement->localVars[dataIdx];
-				} else {
-					int16 newData = getNextWord();
+	DEBUG_SCRIPT(_currentLine, "op1A(%d) -> TODO !", param);
+	addSpriteFilledToBGList(param);
+}
 
-					DEBUG_SCRIPT(currentLine, "var[%d] -= %d", varIdx, newData);
+void o1_op1B() {
+	DEBUG_SCRIPT(_currentLine, "closeEngine7");
+	closeEngine7();
+}
 
-					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] - newData;
-				}
+void o1_label() {
+	byte labelIdx = getNextByte();
 
-				break;
-			}
-		case 0xC:	// OP_mulVar
-			{
-				byte varIdx = getNextByte();
-				byte varType = getNextByte();
+	DEBUG_SCRIPT(_currentLine, "label(%d)", labelIdx);
+	_currentScriptElement->stack[labelIdx] = _currentPosition;
+}
 
-				if (varType) {
-					byte dataIdx = getNextByte();
+void o1_goto() {
+	byte labelIdx = getNextByte();
 
-					DEBUG_SCRIPT(currentLine, "var[%d] *= var[%d]", varIdx, dataIdx);
+	assert(_currentScriptElement->stack[labelIdx] != -1);
 
-					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] * scriptElement->localVars[dataIdx];
-				} else {
-					int16 newData = getNextWord();
+	DEBUG_SCRIPT(_currentLine, "goto label(%d)", labelIdx);
+	_currentPosition = _currentScriptElement->stack[labelIdx];
+}
 
-					DEBUG_SCRIPT(currentLine, "var[%d] *= %d", varIdx, newData);
+void o1_gotoIfSup() {
+	byte labelIdx = getNextByte();
 
-					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] * newData;
-				}
+	if ((_currentScriptElement->compareResult & 2) && !(_currentScriptElement->compareResult & 1)) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-				break;
-			}
-		case 0xD:	// OP_divVar
-			{
-				byte varIdx = getNextByte();
-				byte varType = getNextByte();
+		DEBUG_SCRIPT(_currentLine, "if(>) goto %d (true)", labelIdx);
+		_currentPosition = _currentScriptElement->stack[labelIdx];
+	} else {
+		DEBUG_SCRIPT(_currentLine, "if(>) goto %d (false)", labelIdx);
+	}
+}
 
-				if (varType) {
-					byte dataIdx = getNextByte();
+void o1_gotoIfSupEqu() {
+	byte labelIdx = getNextByte();
 
-					DEBUG_SCRIPT(currentLine, "var[%d] /= var[%d]", varIdx, dataIdx);
+	if ((_currentScriptElement->compareResult & 2) || (_currentScriptElement->compareResult & 1)) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] / scriptElement->localVars[dataIdx];
-				} else {
-					int16 newData = getNextWord();
+		DEBUG_SCRIPT(_currentLine, "if(>=) goto %d (true)", labelIdx);
+		_currentPosition = _currentScriptElement->stack[labelIdx];
+	} else {
+		DEBUG_SCRIPT(_currentLine, "if(>=) goto %d (false)", labelIdx);
+	}
+}
 
-					DEBUG_SCRIPT(currentLine, "var[%d] /= %d", varIdx, newData);
+void o1_gotoIfInf() {
+	byte labelIdx = getNextByte();
 
-					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] / newData;
-				}
+	if ((_currentScriptElement->compareResult & 4) && !(_currentScriptElement->compareResult & 1)) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-				break;
-			}
-		case 0xE:	// OP_compareVar
-			{
-				byte varIdx = getNextByte();
-				byte varType = getNextByte();
+		DEBUG_SCRIPT(_currentLine, "if(<) goto %d (true)", labelIdx);
+		_currentPosition = _currentScriptElement->stack[labelIdx];
+	} else {
+		DEBUG_SCRIPT(_currentLine, "if(<) goto %d (false)", labelIdx);
+	}
+}
 
-				if (varType) {
-					byte value = getNextByte();
+void o1_gotoIfInfEqu() {
+	byte labelIdx = getNextByte();
 
-					// printf("Val: %d\n", value);
+	if ((_currentScriptElement->compareResult & 4) || (_currentScriptElement->compareResult & 1)) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-					if (varType == 1) {
-						DEBUG_SCRIPT(currentLine, "compare var[%d] and var[%d]", varIdx, value);
+		DEBUG_SCRIPT(_currentLine, "if(<=) goto %d (true)", labelIdx);
+		_currentPosition = _currentScriptElement->stack[labelIdx];
+	} else {
+		DEBUG_SCRIPT(_currentLine, "if(<=) goto %d (false)", labelIdx);
+	}
+}
 
-						assert(varIdx < 50);
-						assert(value < 50);
+void o1_gotoIfEqu() {
+	byte labelIdx = getNextByte();
 
-						scriptElement->compareResult = compareVars(scriptElement->localVars[varIdx], scriptElement->localVars[value]);
-					} else if (varType == 2) {
-						DEBUG_SCRIPT(currentLine, "compare var[%d] and globalVar[%d]", varIdx, value);
+	if (_currentScriptElement->compareResult & 1) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-						assert(varIdx < 50);
+		DEBUG_SCRIPT(_currentLine, "if(==) goto %d (true)", labelIdx);
+		_currentPosition = _currentScriptElement->stack[labelIdx];
+	} else {
+		DEBUG_SCRIPT(_currentLine, "if(==) goto %d (false)", labelIdx);
+	}
+}
 
-						scriptElement->compareResult = compareVars(scriptElement->localVars[varIdx], globalVars[value]);
-					}
-				} else {
-					int16 value = getNextWord();
+void o1_gotoIfDiff() {
+	byte labelIdx = getNextByte();
 
-					DEBUG_SCRIPT(currentLine, "compare var[%d] and %d", varIdx, value);
+	if (!(_currentScriptElement->compareResult & 1)) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-					scriptElement->compareResult = compareVars(scriptElement->localVars[varIdx], value);
-				}
+		DEBUG_SCRIPT(_currentLine, "if(!=) goto %d (true)", labelIdx);
+		_currentPosition = _currentScriptElement->stack[labelIdx];
+	} else {
+		DEBUG_SCRIPT(_currentLine, "if(!=) goto %d (false)", labelIdx);
+	}
+}
 
-				break;
-			}
-		case 0xF:	// OP_modifyObjectParam2
-			{
-				byte objIdx = getNextByte();
-				byte paramIdx = getNextByte();
-				byte newValue = getNextByte();
+void o1_removeLabel() {
+	warning("STUB: o1_removeLabel()");
+}
 
-				DEBUG_SCRIPT(currentLine, "modifyObjectParam2(objIdx:%d,paramIdx:%d,var[%d])", objIdx, paramIdx, newValue);
+void o1_loop() {
+	byte varIdx = getNextByte();
+	byte labelIdx = getNextByte();
 
-				modifyObjectParam(objIdx, paramIdx, scriptElement->localVars[newValue]);
+	_currentScriptElement->localVars[varIdx]--;
 
-				break;
-			}
-		case 0x13:	// OP_loadV7Element (OP_loadMask0?)
-			{
-				byte param = getNextByte();
+	if (_currentScriptElement->localVars[varIdx] >= 0) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-				DEBUG_SCRIPT(currentLine, "addSpriteOverlay(%d)", param);
+		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);
+	}
+}
 
-				loadOverlayElement(param, 0);
+void o1_startGlobalScript() {
+	// OP_startScript
+	byte param = getNextByte();
 
-				break;
-			}
-		case 0x14:	// OP_unloadMask0
-			{
-				byte param = getNextByte();
+	assert(param < NUM_MAX_SCRIPT);
 
-				DEBUG_SCRIPT(currentLine, "removeSpriteOverlay(%d)", param);
+	DEBUG_SCRIPT(_currentLine, "startScript(%d)", param);
+	addScriptToList0(param);
+}
 
-				freeOverlay(param, 0);
+void o1_endGlobalScript() {
+	byte scriptIdx = getNextByte();
 
-				break;
-			}
-		case 0x15:
-			{
-				byte param = getNextByte();
+	DEBUG_SCRIPT(_currentLine, "stopGlobalScript(%d)", scriptIdx);
+	stopGlobalScript(scriptIdx);
+}
 
-				DEBUG_SCRIPT(currentLine, "addToBGList(%d)", param);
+void o1_loadAnim() {
+	// OP_loadResource
+	const char *param = getNextString();
 
-				addToBGList(param);
+	DEBUG_SCRIPT(_currentLine, "loadResource(\"%s\")", param);
+	loadResource(param);
+}
 
-				break;
-			}
-		case 0x16:	// OP_loadMask1
-			{
-				byte param = getNextByte();
+void o1_loadBg() {
+	const char *param = getNextString();
 
-				DEBUG_SCRIPT(currentLine, "addOverlay1(%d)", param);
+	DEBUG_SCRIPT(_currentLine, "loadBg(\"%s\")", param);
 
-				loadOverlayElement(param, 1);
+	loadBg(param);
+	closeEngine7();
+	bgVar0 = 0;
+}
 
-				break;
-			}
-		case 0x17:	// OP_unloadMask1
-			{
-				byte param = getNextByte();
+void o1_loadCt() {
+	const char *param = getNextString();
 
-				DEBUG_SCRIPT(currentLine, "removeOverlay1(%d)", param);
+	DEBUG_SCRIPT(_currentLine, "loadCt(\"%s\")", param);
+	loadCt(param);
+}
 
-				freeOverlay(param, 1);
+void o1_loadPart() {
+	const char *param = getNextString();
 
-				break;
-			}
-		case 0x18:	// OP_loadMask4
-			{
-				byte param = getNextByte();
+	DEBUG_SCRIPT(_currentLine, "loadPart(\"%s\")", param);
+	loadPart(param);
+}
 
-				DEBUG_SCRIPT(currentLine, "addOverlayType4(%d)", param);
+void o1_closePart() {
+	DEBUG_SCRIPT(_currentLine, "closePart");
+	closePart();
+}
 
-				loadOverlayElement(param, 4);
+void o1_loadNewPrcName() {
+	// OP_loadData
+	byte param1 = getNextByte();
+	const char *param2 = getNextString();
 
-				break;
-			}
-		case 0x19:	// OP_unloadMask4
-			{
-				byte param = getNextByte();
+	assert(param1 <= 3);
 
-				DEBUG_SCRIPT(currentLine, "removeSpriteOverlay4(%d)", param);
+	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;
+	}
+}
 
-				freeOverlay(param, 4);
+void o1_requestCheckPendingDataLoad() {
+	DEBUG_SCRIPT(_currentLine, "request data load");
+	checkForPendingDataLoadSwitch = 1;
+}
 
-				break;
-			}
-		case 0x1A:
-			{
-				byte param = getNextByte();
+void o1_blitAndFade() {
+	DEBUG_SCRIPT(_currentLine, "request fadein");
+	// TODO: use real code
 
-				DEBUG_SCRIPT(currentLine, "op1A(%d) -> TODO !", param);
+	memcpy(c_palette, tempPalette, sizeof(uint16) * 16);
+	drawOverlays();
+	flip();
 
-				addSpriteFilledToBGList(param);
+	fadeRequired = 1;
+}
 
-				break;
-			}
-		case 0x1B:
-			{
-				DEBUG_SCRIPT(currentLine, "closeEngine7");
-				closeEngine7();
-				break;
-			}
-		case 0x1D:	// OP_label
-			{
-				byte labelIdx = getNextByte();
+void o1_fadeToBlack() {
+	DEBUG_SCRIPT(_currentLine, "request fadeout");
+	//fadeToBlack();
+	warning("STUB: o1_fadeToBlack()");
+}
 
-				DEBUG_SCRIPT(currentLine, "label(%d)", labelIdx);
+void o1_transformPaletteRange() {
+	byte startColor = getNextByte();
+	byte numColor = getNextByte();
+	uint16 r = getNextWord();
+	uint16 g = getNextWord();
+	uint16 b = getNextWord();
 
-				scriptElement->stack[labelIdx] = _currentPosition;
+	DEBUG_SCRIPT(_currentLine, "transformPaletteRange(from:%d,numIdx:%d,r:%d,g:%d,b:%d) -> unimplemented", startColor, numColor, r, g, b);
 
-				break;
-			}
-		case 0x1E:	// OP_goto
-			{
-				byte labelIdx = getNextByte();
+	transformPaletteRange(startColor, numColor, r, g, b);
+}
 
-				DEBUG_SCRIPT(currentLine, "goto label(%d)", labelIdx);
+void o1_setDefaultMenuColor2() {
+	byte param = getNextByte();
 
-				assert(scriptElement->stack[labelIdx] != -1);
-				_currentPosition = scriptElement->stack[labelIdx];
+	DEBUG_SCRIPT(_currentLine, "setDefaultMenuColor2(%d)", param);
+	defaultMenuBoxColor2 = param;
+}
 
-				break;
-			}
-		case 0x1F:	// OP_gotoIfSup
-			{
-				byte labelIdx = getNextByte();
+void o1_palRotate() {
+	byte a = getNextByte();
+	byte b = getNextByte();
+	byte c = getNextByte();
 
-				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, "palRotate(%d,%d,%d)", a, b, c);
+	palRotate(a, b, c);
+}
 
-				break;
-			}
-		case 0x20:	// OP_gotoIfSupEqu
-			{
-				byte labelIdx = getNextByte();
+void o1_break() {
+	DEBUG_SCRIPT(_currentLine, "break");
 
-				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);
-				}
+	_currentScriptElement->scriptPosition = _currentPosition;
+	_closeScript = 1;
+}
 
-				break;
-			}
-		case 0x21:	// OP_gotoIfInf
-			{
-				byte labelIdx = getNextByte();
+void o1_endScript() {
+	DEBUG_SCRIPT(_currentLine, "endScript");
 
-				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);
-				}
+	if (_currentScriptParams == 0) {
+		endScript0(_currentScriptElement->scriptIdx);
+	} else {
+		endScript1(_currentScriptElement->scriptIdx);
+	}
 
-				break;
-			}
-		case 0x22:	// OP_gotoIfInfEqu
-			{
-				byte labelIdx = getNextByte();
+	_closeScript = 1;
+}
 
-				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_message() {
+	byte param1 = getNextByte();
+	uint16 param2 = getNextWord();
+	uint16 param3 = getNextWord();
+	uint16 param4 = getNextWord();
+	uint16 param5 = getNextWord();
 
-				break;
-			}
-		case 0x23:	// OP_gotoIfEqu
-			{
-				byte labelIdx = getNextByte();
+	DEBUG_SCRIPT(_currentLine, "message(%d,%d,%d,%d,%d)", param1, param2, param3, param4, param5);
 
-				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);
-				}
+	addMessage(param1, param2, param3, param4, param5);
+}
 
-				break;
-			}
-		case 0x24:	// OP_gotoIfDiff
-			{
-				byte labelIdx = getNextByte();
+void o1_loadGlobalVar() {
+	byte varIdx = getNextByte();
+	byte varType = getNextByte();
 
-				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);
-				}
+	if (varType) {
+		byte dataIdx = getNextByte();
 
-				break;
-			}
-		case 0x25:	// OP_removeLabel
-			{
-				warning("STUB: Opcode 0x25");
-				break;
-			}
-		case 0x26:	// OP_loop
-			{
-				byte varIdx = getNextByte();
-				byte labelIdx = getNextByte();
+		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();
 
-				scriptElement->localVars[varIdx]--;
+		DEBUG_SCRIPT(_currentLine, "globalVars[%d] = %d", varIdx, newData);
+		globalVars[varIdx] = newData;
+	}
+}
 
-				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_compareGlobalVar() {
+	byte varIdx = getNextByte();
+	byte varType = getNextByte();
 
-				break;
-			}
-		case 0x31:	// OP_startScript (OP_startGlobalScript?)
-			{
-				byte param = getNextByte();
+	if (varType) {
+		byte value = getNextByte();
 
-				assert(param < NUM_MAX_SCRIPT);
+		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, "startScript(%d)", param);
+		DEBUG_SCRIPT(_currentLine, "compare globalVars[%d] and %d", varIdx, newData);
 
-				addScriptToList0(param);
-				break;
-			}
-		case 0x32:	// OP_endGlobalScript
-			{
-				byte scriptIdx = getNextByte();
+		if (varIdx == 255 && (gameType == Cine::GID_FW)) {	// TODO: fix
+			_currentScriptElement->compareResult = 1;
+		} else {
+			_currentScriptElement->compareResult = compareVars(globalVars[varIdx], newData);
+		}
+	}
+}
 
-				DEBUG_SCRIPT(currentLine, "stopGlobalScript(%d)", scriptIdx);
+void o1_declareFunctionName() {
+	const char *param = getNextString();
 
-				stopGlobalScript(scriptIdx);
-				break;
-			}
-		case 0x3B:	// OP_loadResource (OP_loadAnim?)
-			{
-				const char *param = getNextString();
+	DEBUG_SCRIPT(_currentLine, "comment(%s)", param);
+}
 
-				DEBUG_SCRIPT(currentLine, "loadResource(\"%s\")", param);
+void o1_freePartRange() {
+	byte startIdx = getNextByte();
+	byte numIdx = getNextByte();
 
-				loadResource(param);
-				break;
-			}
-		case 0x3C:	// OP_loadBg
-			{
-				const char *param = getNextString();
+	assert(startIdx + numIdx <= NUM_MAX_ANIMDATA);
 
-				DEBUG_SCRIPT(currentLine, "loadBg(\"%s\")", param);
+	DEBUG_SCRIPT(_currentLine, "freePartRange(%d,%d)", startIdx, numIdx);
+	freePartRange(startIdx, numIdx);
+}
 
-				loadBg(param);
-				closeEngine7();
-				bgVar0 = 0;
+void o1_unloadAllMasks() {
+	DEBUG_SCRIPT(_currentLine, "unloadAllMasks()");
+	unloadAllMasks();
+}
 
-				break;
-			}
-		case 0x3D:	// OP_loadCt
-			{
-				const char *param = getNextString();
+void o1_op63() {
+	warning("STUB: o1_op63()");
+}
 
-				DEBUG_SCRIPT(currentLine, "loadCt(\"%s\")", param);
+void o1_op64() {
+	warning("STUB: o1_op64()");
+}
 
-				loadCt(param);
-				break;
-			}
-		case 0x3F:	// OP_loadPart
-			{
-				const char *param = getNextString();
+void o1_initializeZoneData() {
+	DEBUG_SCRIPT(_currentLine, "initializeZoneData()");
 
-				DEBUG_SCRIPT(currentLine, "loadPart(\"%s\")", param);
+	for (int i = 0; i < NUM_MAX_ZONE; i++) {
+		zoneData[i] = i;
+	}
+}
 
-				if (gameType == Cine::GID_FW)
-					loadPart(param);
+void o1_setZoneDataEntry() {
+	byte zoneIdx = getNextByte();
+	uint16 var = getNextWord();
 
-				break;
-			}
-		case 0x40:	// OP_closePart
-			{
-				DEBUG_SCRIPT(currentLine, "closePart");
+	DEBUG_SCRIPT(_currentLine, "setZone[%d] = %d", zoneIdx, var);
+	zoneData[zoneIdx] = var;
+}
 
-				closePart();
-				break;
-			}
-		case 0x41:	// OP_loadData (OP_loadNewPrcName?)
-			{
-				byte param1 = getNextByte();
-				const char *param2 = getNextString();
+void o1_getZoneDataEntry() {
+	warning("STUB: o1_getZoneDataEntry()");
+}
 
-				assert(param1 <= 3);
+void o1_setDefaultMenuColor() {
+	byte param = 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;
-					}
-				}
+	DEBUG_SCRIPT(_currentLine, "setDefaultMenuColor(%d)", param);
+	defaultMenuBoxColor = param;
+}
 
-				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
+void o1_allowPlayerInput() {
+	DEBUG_SCRIPT(_currentLine, "allowPlayerInput()");
+	allowPlayerInput = 1;
+}
 
-				memcpy(c_palette, tempPalette, sizeof(uint16) * 16);
-				drawOverlays();
-				flip();
+void o1_disallowPlayerInput() {
+	DEBUG_SCRIPT(_currentLine, "dissallowPlayerInput()");
+	allowPlayerInput = 0;
+}
 
-				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();
+void o1_changeDataDisk() {
+	byte newDisk = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "transformPaletteRange(from:%d,numIdx:%d,r:%d,g:%d,b:%d) -> unimplemented", startColor, numColor, r, g, b);
+	DEBUG_SCRIPT(_currentLine, "changeDataDisk(%d)", newDisk);
+	checkDataDisk(newDisk);
+}
 
-				transformPaletteRange(startColor, numColor, r, g, b);
+void o1_loadMusic() {
+	const char *param = getNextString();
 
-				break;
-			}
-		case 0x49:	// OP_setDefaultMenuColor2
-			{
-				defaultMenuBoxColor2 = getNextByte();
+	DEBUG_SCRIPT(_currentLine, "loadMusic(%s)", param);
+	g_sfxPlayer->load(param);
+}
 
-				DEBUG_SCRIPT(currentLine, "setDefaultMenuColor2(%d)", defaultMenuBoxColor2);
+void o1_playMusic() {
+	DEBUG_SCRIPT(_currentLine, "playMusic()");
+	g_sfxPlayer->play();
+}
 
-				break;
-			}
-		case 0x4A:
-			{
-				byte a = getNextByte();
-				byte b = getNextByte();
-				byte c = getNextByte();
+void o1_fadeOutMusic() {
+	DEBUG_SCRIPT(_currentLine, "fadeOutMusic()");
+	g_sfxPlayer->fadeOut();
+}
 
-				DEBUG_SCRIPT(currentLine, "palRotate(%d,%d,%d)", a, b, c);
+void o1_stopSample() {
+	DEBUG_SCRIPT(_currentLine, "stopSample()");
+	g_sfxPlayer->stop();
+}
 
-				palRotate(a, b, c);
-				break;
-			}
-		case 0x4F:	// OP_break;
-			{
-				DEBUG_SCRIPT(currentLine, "break");
+void o1_op71() {
+	warning("STUB: o1_op71()");
+}
 
-				scriptElement->scriptPosition = _currentPosition;
-				closeScript = 1;
-				break;
-			}
-		case 0x50:	// OP_endScript
-			{
-				DEBUG_SCRIPT(currentLine, "endScript");
+void o1_op72() {
+	warning("STUB: o1_op72()");
+}
 
-				if (params == 0) {
-					endScript0(scriptElement->scriptIdx);
-				} else {
-					endScript1(scriptElement->scriptIdx);
-				}
+void o1_op73() {
+	warning("STUB: o1_op73()");
+}
 
-				closeScript = 1;
-				break;
-			}
-		case 0x51:	// OP_message
-			{
-				byte param1 = getNextByte();
-				uint16 param2 = getNextWord();
-				uint16 param3 = getNextWord();
-				uint16 param4 = getNextWord();
-				uint16 param5 = getNextWord();
+void o1_playSample() {
+	DEBUG_SCRIPT(_currentLine, "playSample()");
 
-				DEBUG_SCRIPT(currentLine, "message(%d,%d,%d,%d,%d)", param1, param2, param3, param4, param5);
+	byte anim = getNextByte();
+	byte channel = getNextByte();
 
-				addMessage(param1, param2, param3, param4, param5);
+	getNextWord();
+	getNextByte();
 
-				break;
-			}
-		case 0x52:	// OP_loadGlobalVar
-			{
-				byte varIdx = getNextByte();
-				byte varType = getNextByte();
+	int16 volume = getNextWord();
+	uint16 flag = getNextWord();
 
-				if (varType) {
-					byte dataIdx = getNextByte();
+	if (volume > 63)
+		volume = 63;
+	if (volume < 0)
+		volume = 63;
 
-					if (varType == 1) {
-						DEBUG_SCRIPT(currentLine, "globalVars[%d] = var[%d]", varIdx, dataIdx);
+	if (animDataTable[anim].ptr1) {
+		if (channel >= 10) {
+			channel -= 10;
+		}
+		if (volume < 50) {
+			volume = 50;
+		}
 
-						globalVars[varIdx] = scriptElement->localVars[dataIdx];
-					} else {
-						DEBUG_SCRIPT(currentLine, "globalVars[%d] = globalVars[%d]", varIdx, dataIdx);
+		g_sfxPlayer->stop();
+					
+		if (flag == 0xFFFF) {
+			g_soundDriver->playSound(animDataTable[anim].ptr1, channel, volume);
+		} else {
+			g_soundDriver->resetChannel(channel);
+		}
+	}
+}
 
-						globalVars[varIdx] = globalVars[dataIdx];
-					}
-				} else {
-					uint16 newData = getNextWord();
+void o1_allowSystemMenu() {
+	byte param = getNextByte();
 
-					DEBUG_SCRIPT(currentLine, "globalVars[%d] = %d", varIdx, newData);
+	DEBUG_SCRIPT(_currentLine, "OP79 load var22 to %d -> TODO", param);
+	var22 = param;
+}
 
-					globalVars[varIdx] = newData;
-				}
+void o1_loadMask5() {
+	byte param = getNextByte();
 
-				break;
-			}
-		case 0x53:	// OP_compareGlobalVar
-			{
-				byte varIdx = getNextByte();
-				byte varType = getNextByte();
+	DEBUG_SCRIPT(_currentLine, "addOverlay5(%d)", param);
+	loadOverlayElement(param, 5);
+}
 
-				if (varType) {
-					byte value = getNextByte();
+void o1_unloadMask5() {
+	byte param = getNextByte();
 
-					DEBUG_SCRIPT(currentLine, "compare globalVars[%d] and var[%d]", varIdx, value);
+	DEBUG_SCRIPT(_currentLine, "freeOverlay5(%d)", param);
+	freeOverlay(param, 5);
+}
 
-					scriptElement->compareResult = compareVars(globalVars[varIdx], scriptElement->localVars[value]);
-				} else {
-					uint16 newData = getNextWord();
+// ------------------------------------------------------------------------
+// OPERATION STEALTH opcodes
+// ------------------------------------------------------------------------
 
-					DEBUG_SCRIPT(currentLine,
-					    "compare globalVars[%d] and %d",
-					    varIdx, newData);
+void o2_loadPart() {
+	const char *param = getNextString();
 
-					if (varIdx == 255 && (gameType == Cine::GID_FW)) {	// TODO: fix
-						scriptElement->compareResult = 1;
-					} else {
-						scriptElement->compareResult = compareVars(globalVars[varIdx], newData);
-					}
-				}
+	DEBUG_SCRIPT(_currentLine, "loadPart(\"%s\")", param);
+}
 
-				break;
-			}
-		case 0x59:	// OP_declareFunctionName
-			{
-				const char *param = getNextString();
+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, "comment(%s)", param);
-				break;
-			}
-		case 0x5A:	// OP_freePartRange
-			{
-				byte startIdx = getNextByte();
-				byte numIdx = getNextByte();
+	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);
+}
 
-				assert(startIdx + numIdx <= NUM_MAX_ANIMDATA);
+void o2_removeSeq() {
+	byte a = getNextByte();
+	byte b = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "freePartRange(%d,%d)", startIdx, numIdx);
+	DEBUG_SCRIPT(_currentLine, "removeSeq(%d,%d) -> TODO", a, b);
+	removeSeq(a, 0, b);
+}
 
-				freePartRange(startIdx, numIdx);
+void o2_op81() {
+	warning("STUB: o2_op81()");
+}
 
-				break;
-			}
-		case 0x5B:	// OP_unloadAllMasks
-			{
-				DEBUG_SCRIPT(currentLine, "unloadAllMasks()");
+void o2_op82() {
+	warning("STUB: o2_op82()");
+}
 
-				unloadAllMasks();
+void o2_isSeqRunning() {
+	byte a = getNextByte();
+	byte b = getNextByte();
 
-				break;
-			}
-		case 0x63:
-			{
-				warning("STUB: Opcode 0x63");
-				break;
-			}
-		case 0x64:
-			{
-				warning("STUB: Opcode 0x64");
-				break;
-			}
-		case 0x65:	// OP_initializeZoneData
-			{
-				byte i;
+	DEBUG_SCRIPT(_currentLine, "OP83(%d,%d) -> TODO", a, b);
 
-				DEBUG_SCRIPT(currentLine, "initializeZoneData()");
+	if (isSeqRunning(a, 0, b)) {
+		_currentScriptElement->compareResult = 1;
+	} else {
+		_currentScriptElement->compareResult = 0;
+	}
+}
 
-				for (i = 0; i < NUM_MAX_ZONE; i++) {
-					zoneData[i] = i;
-				}
+void o2_gotoIfSupNearest() {
+	byte labelIdx = getNextByte();
 
-				break;
-			}
-		case 0x66:	// OP_setZoneDataEntry
-			{
-				byte zoneIdx = getNextByte();
-				uint16 var = getNextWord();
+	if ((_currentScriptElement->compareResult & 2) && !(_currentScriptElement->compareResult & 1)) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-				DEBUG_SCRIPT(currentLine, "setZone[%d] = %d", zoneIdx, var);
+		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);
+	}
+}
 
-				zoneData[zoneIdx] = var;
+void o2_gotoIfSupEquNearest() {
+	byte labelIdx = getNextByte();
 
-				break;
-			}
-		case 0x67:	// OP_getZoneDataEntry
-			{
-				warning("STUB: Opcode 0x67");
-				break;
-			}
-		case 0x68:	// OP_setDefaultMenuColor
-			{
-				defaultMenuBoxColor = getNextByte();
+	if ((_currentScriptElement->compareResult & 2) || (_currentScriptElement->compareResult & 1)) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-				DEBUG_SCRIPT(currentLine, "setDefaultMenuColor(%d)", defaultMenuBoxColor2);
+		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 0x69:	// OP_allowPlayerInput
-			{
-				DEBUG_SCRIPT(currentLine, "allowPlayerInput()");
+void o2_gotoIfInfNearest() {
+	byte labelIdx = getNextByte();
 
-				allowPlayerInput = 1;
-				break;
-			}
-		case 0x6A:	// OP_dissallowPlayerInput
-			{
-				DEBUG_SCRIPT(currentLine, "dissallowPlayerInput()");
+	if ((_currentScriptElement->compareResult & 4) && !(_currentScriptElement->compareResult & 1)) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-				allowPlayerInput = 0;
-				break;
-			}
-		case 0x6B:	// OP_changeDataDisk
-			{
-				byte newDisk = 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, "changeDataDisk(%d)", newDisk);
+void o2_gotoIfInfEquNearest() {
+	byte labelIdx = getNextByte();
 
-				checkDataDisk(newDisk);
-				break;
-			}
-		case 0x6D:	// OP_loadMusic
-			{
-				const char *param = getNextString();
+	if ((_currentScriptElement->compareResult & 4) || (_currentScriptElement->compareResult & 1)) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-				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()");
+		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);
+	}
+}
 
-				byte anim = getNextByte();
-				byte channel = getNextByte();
+void o2_gotoIfEquNearest() {
+	byte labelIdx = getNextByte();
 
-				getNextWord();
-				getNextByte();
+	if (_currentScriptElement->compareResult & 1) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-				int16 volume = getNextWord();
-				uint16 flag = getNextWord();
+		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 (volume > 63)
-					volume = 63;
-				if (volume < 0)
-					volume = 63;
+void o2_gotoIfDiffNearest() {
+	byte labelIdx = getNextByte();
 
-				if (animDataTable[anim].ptr1) {
-					if (channel >= 10) {
-						channel -= 10;
-					}
-					if (volume < 50) {
-						volume = 50;
-					}
+	if (!(_currentScriptElement->compareResult & 1)) {
+		assert(_currentScriptElement->stack[labelIdx] != -1);
 
-					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();
+		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, "OP79 load var22 to %d -> TODO", var22);
-				break;
-			}
-		case 0x7A:	// OP_loadMask5
-			{
-				byte param = getNextByte();
+void o2_startObjectScript() {
+	byte param = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "addOverlay5(%d)", param);
+	DEBUG_SCRIPT(_currentLine, "startObjectScript(%d)", param);
+	runObjectScript(param);
+}
 
-				loadOverlayElement(param, 5);
-				break;
-			}
-		case 0x7B:	// OP_unloadMask5
-			{
-				byte param = getNextByte();
+void o2_stopObjectScript() {
+	byte param = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "freeOverlay5(%d)", param);
+	DEBUG_SCRIPT(_currentLine, "stopObjectScript(%d)", param);
+	stopObjectScript(param);
+}
 
-				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_op8D() {
+	warning("STUB: o2_op8D()");
+}
 
-				DEBUG_SCRIPT(currentLine, "addSeqListElement(%d,%d,%d,%d,%d)", param1, param2, param3, param4, param5, param6, param7);
+void o2_addBackground() {
+	byte param1 = getNextWord();
+	const char *param2 = getNextString();
 
-				addSeqListElement(param1, 0, param2, param3, param4, param5, param6, 0, param7);
+	DEBUG_SCRIPT(_currentLine, "addBackground(%s,%d)", param2, param1);
+	addBackground(param2, param1);
+}
 
-				break;
-			}
-		case 0x80:
-			{
-				byte a = getNextByte();
-				byte b = getNextByte();
+void o2_removeBackground() {
+	byte param = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "removeSeq(%d,%d) -> TODO", a, b);
+	assert(param);
 
-				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, "removeBackground(%d)", param);
 
-				DEBUG_SCRIPT(currentLine, "OP83(%d,%d) -> TODO", a, b);
+	if (additionalBgTable[param]) {
+		free(additionalBgTable[param]);
+		additionalBgTable[param] = NULL;
+	}
 
-				if (isSeqRunning(a, 0, b)) {
-					scriptElement->compareResult = 1;
-				} else {
-					scriptElement->compareResult = 0;
-				}
-				break;
-			}
-		case 0x84:	// OP_gotoIfSup nearest
-			{
-				byte labelIdx = getNextByte();
+	if (currentAdditionalBgIdx == param) {
+		currentAdditionalBgIdx = 0;
+	}
 
-				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 (currentAdditionalBgIdx2 == param) {
+		currentAdditionalBgIdx2 = 0;
+	}
 
-				break;
-			}
-		case 0x85:	// OP_gotoIfSupEqu nearest
-			{
-				byte labelIdx = getNextByte();
+	strcpy(currentBgName[param], "");
+}
 
-				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);
-				}
+void o2_loadAbs() {
+	byte param1 = getNextByte();
+	const char *param2 = getNextString();
 
-				break;
-			}
-		case 0x86:	// OP_gotoIfInf nearest
-			{
-				byte labelIdx = getNextByte();
+	DEBUG_SCRIPT(_currentLine, "loadABS(%d,%s)", param1, param2);
+	loadAbs(param2, param1);
+}
 
-				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_loadBg() {
+	byte param = getNextByte();
 
-				break;
-			}
-		case 0x87:	// OP_gotoIfInfEqu nearest
-			{
-				byte labelIdx = getNextByte();
+	assert(param <= 8);
 
-				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, "useBg(%d)", param);
 
-				break;
-			}
-		case 0x88:	// OP_gotoIfEqu nearest
-			{
-				byte labelIdx = getNextByte();
+	if (additionalBgTable[param]) {
+		currentAdditionalBgIdx = param;
+		//if (adBgVar0 == 0) {
+		//	adBgVar1 = 1;
+		//}
+	}
+}
 
-				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_op95() {
+	warning("STUB: o2_op95()");
+}
 
-				break;
-			}
-		case 0x89:	// OP_gotoIfDiff nearest
-			{
-				byte labelIdx = getNextByte();
+void o2_wasZoneChecked() {
+	warning("STUB: o2_wasZoneChecked()");
+}
 
-				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_op9B() {
+	warning("STUB: o2_9B()");
+}
 
-				break;
-			}
-		case 0x8B:
-			{
-				byte param = getNextByte();
+void o2_op9C() {
+	warning("STUB: o2_9C()");
+}
 
-				DEBUG_SCRIPT(currentLine, "startObjectScript(%d)", param);
+void o2_useBgScroll() {
+	byte param = getNextByte();
 
-				runObjectScript(param);
-				break;
-			}
-		case 0x8C:
-			{
-				byte param = getNextByte();
+	assert(param <= 8);
 
-				DEBUG_SCRIPT(currentLine, "stopObjectScript(%d)", param);
+	DEBUG_SCRIPT(_currentLine, "useBgScroll(%d)", param);
 
-				stopObjectScript(param);
-				break;
-			}
-		case 0x8D:
-			{
-				warning("STUB: Opcode 0x8D");
-				break;
-			}
-		case 0x8E:
-			{
-				byte param1 = getNextWord();
-				const char *param2 = getNextString();
+	if (additionalBgTable[param]) {
+		currentAdditionalBgIdx2 = param;
+	}
+}
 
-				DEBUG_SCRIPT(currentLine, "addBackground(%s,%d)", param2, param1);
+void o2_setAdditionalBgVScroll() {
+	byte param1 = getNextByte();
 
-				addBackground(param2, param1);
-				break;
-			}
-		case 0x8F:
-			{
-				byte param = getNextByte();
+	if (param1) {
+		byte param2 = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "removeBackground(%d)", param);
+		DEBUG_SCRIPT(_currentLine, "additionalBgVScroll = var[%d]", param2);
+		additionalBgVScroll = _currentScriptElement->localVars[param2];
+	} else {
+		uint16 param2 = getNextWord();
 
-				assert(param);
-				if (additionalBgTable[param]) {
-					free(additionalBgTable[param]);
-					additionalBgTable[param] = NULL;
-				}
+		DEBUG_SCRIPT(_currentLine, "additionalBgVScroll = %d", param2);
+		additionalBgVScroll = param2;
+	}
+}
 
-				if (currentAdditionalBgIdx == param) {
-					currentAdditionalBgIdx = 0;
-				}
+void o2_op9F() {
+	warning("o2_op9F()");
+}
 
-				if (currentAdditionalBgIdx2 == param) {
-					currentAdditionalBgIdx2 = 0;
-				}
+void o2_addGfxElementA0() {
+	uint16 param1 = getNextWord();
+	uint16 param2 = getNextWord();
 
-				strcpy(currentBgName[param], "");
+	DEBUG_SCRIPT(_currentLine, "addGfxElementA0(%d,%d)", param1, param2);
+	addGfxElementA0(param1, param2);
+}
 
-				break;
-			}
-		case 0x90:
-			{
-				byte param1 = getNextByte();
-				const char *param2 = getNextString();
+void o2_opA1() {
+	_currentPosition += 4;
+	warning("STUB: o2_opA1()");
+}
 
-				DEBUG_SCRIPT(currentLine, "loadABS(%d,%s)", param1, param2);
+void o2_opA2() {
+	_currentPosition += 4;
+	warning("STUB: o2_opA2()");
+}
 
-				loadAbs(param2, param1);
-				break;
-			}
-		case 0x91:
-			{
-				byte param = getNextByte();
+void o2_opA3() {
+	_currentPosition += 4;
+	warning("STUB: o2_opA3()");
+}
 
-				DEBUG_SCRIPT(currentLine, "useBg(%d)", param);
+void o2_opA4() {
+	warning("STUB: o2_opA4()");
+}
 
-				assert(param <= 8);
+void o2_opA5() {
+	warning("STUB: o2_opA5()");
+}
 
-				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();
+void o2_opA9() {
+	warning("STUB: o2_opA9()");
+}
 
-				DEBUG_SCRIPT(currentLine, "useBgScroll(%d)", param);
+// ------------------------------------------------------------------------
 
-				assert(param <= 8);
+void executeScript(prcLinkedListStruct *scriptElement, uint16 params) {
+	assert(scriptElement);
 
-				if (additionalBgTable[param]) {
-					currentAdditionalBgIdx2 = param;
-				}
-				break;
-			}
-		case 0x9E:
-			{
-				byte param1 = getNextByte();
+	if (scriptElement->scriptIdx == -1) {
+		return;
+	}
 
-				if (param1) {
-					byte param2 = getNextByte();
+	assert(scriptElement->scriptPtr);
 
-					DEBUG_SCRIPT(currentLine, "additionalBgVScroll = var[%d]", param2);
+	_currentScriptElement = scriptElement;
+	_currentScriptParams = params;
+	_currentScriptPtr = scriptElement->scriptPtr;
+	_currentPosition = scriptElement->scriptPosition;
 
-					additionalBgVScroll = scriptElement->localVars[param2];
-				} else {
-					uint16 param2 = getNextWord();
+	_closeScript = 0;
 
-					DEBUG_SCRIPT(currentLine, "additionalBgVScroll = %d", param2);
+	while (!_closeScript) {
+		_currentLine = _currentPosition;
 
-					additionalBgVScroll = param2;
-				}
+		byte opcode = getNextByte();
 
-				break;
-			}
-		case 0x9F:
-			{
-				warning("STUB: Opcode 0x9F");
-				break;
-			}
-		case 0xA0:
-			{
-				uint16 param1 = getNextWord();
-				uint16 param2 = getNextWord();
+		//printf("Op: %X\n", opcode - 1);
 
-				DEBUG_SCRIPT(currentLine, "addGfxElementA0(%d,%d)", param1, param2);
-
-				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 (opcode) {
+			if (opcode < _numOpcodes && _opcodeTable[opcode - 1])
+				(_opcodeTable[opcode - 1]) ();
+			else
 				error("Unsupported opcode %X", opcode - 1);
-			}
 		}
 	}
 }

Modified: scummvm/trunk/engines/cine/script.h
===================================================================
--- scummvm/trunk/engines/cine/script.h	2006-04-08 12:41:02 UTC (rev 21692)
+++ scummvm/trunk/engines/cine/script.h	2006-04-08 13:20:40 UTC (rev 21693)
@@ -39,6 +39,8 @@
 
 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 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


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.





More information about the Scummvm-git-logs mailing list