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

eriktorbjorn at users.sourceforge.net eriktorbjorn at users.sourceforge.net
Fri Apr 7 23:49:00 CEST 2006


Revision: 21679
Author:   eriktorbjorn
Date:     2006-04-07 23:47:58 -0700 (Fri, 07 Apr 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=21679&view=rev

Log Message:
-----------
Added helper functions getNextByte(), getNextWord() and getNextString() to make
the opcode decoder a bit easier to read. The same change could be made to
decompileScript() as well, but I have a feeling that this function should be
made a standalone tool instead. Particularly considering how much memory it
currently uses.

Modified Paths:
--------------
    scummvm/trunk/engines/cine/script.cpp
Modified: scummvm/trunk/engines/cine/script.cpp
===================================================================
--- scummvm/trunk/engines/cine/script.cpp	2006-04-08 00:28:36 UTC (rev 21678)
+++ scummvm/trunk/engines/cine/script.cpp	2006-04-08 06:47:58 UTC (rev 21679)
@@ -34,6 +34,27 @@
 
 namespace Cine {
 
+byte *_currentScriptPtr;
+uint16 _currentPosition;
+
+byte getNextByte() {
+	byte val = *(_currentScriptPtr + _currentPosition);
+	_currentPosition++;
+	return val;
+}
+
+uint16 getNextWord() {
+	uint16 val = READ_BE_UINT16(_currentScriptPtr + _currentPosition);
+	_currentPosition += 2;
+	return val;
+}
+
+const char *getNextString() {
+	const char *val = (const char *)(_currentScriptPtr + _currentPosition);
+	_currentPosition += strlen(val);
+	return val;
+}
+
 void addGfxElementA0(int16 param1, int16 param2) {
 	overlayHeadElement *currentHead = &overlayHead;
 	overlayHeadElement *tempHead = currentHead;
@@ -617,9 +638,7 @@
 }
 
 void executeScript(prcLinkedListStruct *scriptElement, uint16 params) {
-	byte *currentScriptPtr;
 	uint16 closeScript;
-	uint16 currentPosition;
 
 	assert(scriptElement);
 
@@ -627,22 +646,20 @@
 		return;
 	}
 
-	currentScriptPtr = scriptElement->scriptPtr;
+	assert(scriptElement->scriptPtr);
 
-	assert(currentScriptPtr);
+	// 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.
 
-	currentPosition = scriptElement->scriptPosition;
+	_currentScriptPtr = scriptElement->scriptPtr;
+	_currentPosition = scriptElement->scriptPosition;
+
 	closeScript = 0;
 
 	while (!closeScript) {
-		uint16 currentLine;
-		uint16 opcode;
+		uint16 currentLine = _currentPosition;
+		byte opcode = getNextByte();
 
-		currentLine = currentPosition;
-
-		opcode = *(currentScriptPtr + currentPosition);
-		currentPosition++;
-
 		//printf("Op: %X\n", opcode - 1);
 
 		// Future Wars:       opcodes 0x00 - 0x7B
@@ -660,19 +677,10 @@
 			}
 		case 0x0:	// OP_modifyObjectParam
 			{
-				byte objIdx;
-				byte paramIdx;
-				int16 newValue;
+				byte objIdx = getNextByte();
+				byte paramIdx = getNextByte();
+				int16 newValue = getNextWord();
 
-				objIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				paramIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				newValue = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				DEBUG_SCRIPT(currentLine, "modifyObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue);
 
 				modifyObjectParam(objIdx, paramIdx, newValue);
@@ -681,19 +689,10 @@
 			}
 		case 0x1:	// OP_getObjectParam
 			{
-				byte objIdx;
-				byte paramIdx;
-				byte newValue;
+				byte objIdx = getNextByte();
+				byte paramIdx = getNextByte();
+				byte newValue = getNextByte();
 
-				objIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				paramIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				newValue = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "getObjectParam(objIdx:%d,paramIdx:%d,var:%d)", objIdx, paramIdx, newValue);
 
 				scriptElement->localVars[newValue] = getObjectParam(objIdx, paramIdx);
@@ -702,19 +701,10 @@
 			}
 		case 0x2:	// OP_addObjectParam
 			{
-				byte objIdx;
-				byte paramIdx;
-				int16 newValue;
+				byte objIdx = getNextByte();
+				byte paramIdx = getNextByte();
+				int16 newValue = getNextWord();
 
-				objIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				paramIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				newValue = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				DEBUG_SCRIPT(currentLine, "addObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue);
 
 				addObjectParam(objIdx, paramIdx, newValue);
@@ -723,19 +713,10 @@
 			}
 		case 0x3:	// OP_subObjectParam
 			{
-				byte objIdx;
-				byte paramIdx;
-				int16 newValue;
+				byte objIdx = getNextByte();
+				byte paramIdx = getNextByte();
+				int16 newValue = getNextWord();
 
-				objIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				paramIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				newValue = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				DEBUG_SCRIPT(currentLine, "subObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", objIdx, paramIdx, newValue);
 
 				subObjectParam(objIdx, paramIdx, newValue);
@@ -754,19 +735,10 @@
 			}
 		case 0x6:	// OP_compareObjectParam
 			{
-				byte objIdx;
-				byte param1;
-				int16 param2;
+				byte objIdx = getNextByte();
+				byte param1 = getNextByte();
+				int16 param2 = getNextWord();
 
-				objIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				param1 = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				param2 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				DEBUG_SCRIPT(currentLine, "compareObjectParam(objIdx:%d,type:%d,value:%d)", objIdx, param1, param2);
 
 				scriptElement->compareResult = compareObjectParam(objIdx, param1, param2);
@@ -775,27 +747,12 @@
 			}
 		case 0x7:	// OP_setupObject
 			{
-				byte objIdx;
-				int16 param1;
-				int16 param2;
-				int16 param3;
-				int16 param4;
+				byte objIdx = getNextByte();
+				int16 param1 = getNextWord();
+				int16 param2 = getNextWord();
+				int16 param3 = getNextWord();
+				int16 param4 = getNextWord();
 
-				objIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				param1 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param2 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param3 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param4 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				DEBUG_SCRIPT(currentLine, "setupObject(objIdx:%d,%d,%d,%d,%d)", objIdx, param1, param2, param3, param4);
 
 				setupObject(objIdx, param1, param2, param3, param4);
@@ -804,27 +761,12 @@
 			}
 		case 0x8:	// OP_checkCollision
 			{
-				byte objIdx;
-				int16 param1;
-				int16 param2;
-				int16 param3;
-				int16 param4;
+				byte objIdx = getNextByte();
+				int16 param1 = getNextWord();
+				int16 param2 = getNextWord();
+				int16 param3 = getNextWord();
+				int16 param4 = getNextWord();
 
-				objIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				param1 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param2 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param3 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param4 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				DEBUG_SCRIPT(currentLine, "checkCollision(objIdx:%d,%d,%d,%d,%d)", objIdx, param1, param2, param3, param4);
 
 				scriptElement->compareResult = checkCollision(objIdx, param1, param2, param3, param4);
@@ -833,21 +775,12 @@
 			}
 		case 0x9:	// OP_loadVar
 			{
-				byte varIdx;
-				byte varType;
+				byte varIdx = getNextByte();
+				byte varType = getNextByte();
 
-				varIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				varType = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				if (varType) {
-					byte dataIdx;
+					byte dataIdx = getNextByte();
 
-					dataIdx = *(currentScriptPtr + currentPosition);
-					currentPosition++;
-
 					switch (varType) {
 					case 1:
 						{
@@ -903,11 +836,8 @@
 						}
 					}
 				} else {
-					int16 newData;
+					int16 newData = getNextWord();
 
-					newData = READ_BE_UINT16(currentScriptPtr + currentPosition);
-					currentPosition += 2;
-
 					DEBUG_SCRIPT(currentLine, "var[%d] = %d", varIdx, newData);
 
 					scriptElement->localVars[varIdx] = newData;
@@ -916,153 +846,96 @@
 			}
 		case 0xA:	// OP_addVar
 			{
-				byte param1;
-				byte type;
+				byte varIdx = getNextByte();
+				byte varType = getNextByte();
 
-				param1 = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				if (varType) {
+					byte dataIdx = getNextByte();
 
-				type = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+					DEBUG_SCRIPT(currentLine, "var[%d] += var[%d]", varIdx, dataIdx);
 
-				if (type) {
-					byte param2;
-
-					param2 = *(currentScriptPtr + currentPosition);
-					currentPosition++;
-
-					DEBUG_SCRIPT(currentLine, "var[%d] += var[%d]", param1, param2);
-
-					scriptElement->localVars[param1] += scriptElement->localVars[param2];
+					scriptElement->localVars[varIdx] += scriptElement->localVars[dataIdx];
 				} else {
-					int16 param2;
+					int16 newData = getNextWord();
 
-					param2 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-					currentPosition += 2;
+					DEBUG_SCRIPT(currentLine, "var[%d] += %d", varIdx, newData);
 
-					DEBUG_SCRIPT(currentLine, "var[%d] += %d", param1, param2);
-
-					scriptElement->localVars[param1] += param2;
+					scriptElement->localVars[varIdx] += newData;
 				}
 
 				break;
 			}
 		case 0xB:	// OP_subVar
 			{
-				byte param1;
-				byte type;
+				byte varIdx = getNextByte();
+				byte varType = getNextByte();
 
-				param1 = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				if (varType) {
+					byte dataIdx = getNextByte();
 
-				type = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+					DEBUG_SCRIPT(currentLine, "var[%d] -= var[%d]", varIdx, dataIdx);
 
-				if (type) {
-					byte param2;
-
-					param2 = *(currentScriptPtr + currentPosition);
-					currentPosition++;
-
-					DEBUG_SCRIPT(currentLine, "var[%d] -= var[%d]", param1, param2);
-
-					scriptElement->localVars[param1] = scriptElement->localVars[param1] - scriptElement->localVars[param2];
+					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] - scriptElement->localVars[dataIdx];
 				} else {
-					int16 param2;
+					int16 newData = getNextWord();
 
-					param2 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-					currentPosition += 2;
+					DEBUG_SCRIPT(currentLine, "var[%d] -= %d", varIdx, newData);
 
-					DEBUG_SCRIPT(currentLine, "var[%d] -= %d", param1, param2);
-
-					scriptElement->localVars[param1] = scriptElement->localVars[param1] - param2;
+					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] - newData;
 				}
 
 				break;
 			}
 		case 0xC:	// OP_mulVar
 			{
-				byte param1;
-				byte type;
+				byte varIdx = getNextByte();
+				byte varType = getNextByte();
 
-				param1 = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				if (varType) {
+					byte dataIdx = getNextByte();
 
-				type = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+					DEBUG_SCRIPT(currentLine, "var[%d] *= var[%d]", varIdx, dataIdx);
 
-				if (type) {
-					byte param2;
-
-					param2 = *(currentScriptPtr + currentPosition);
-					currentPosition++;
-
-					DEBUG_SCRIPT(currentLine, "var[%d] *= var[%d]", param1, param2);
-
-					scriptElement->localVars[param1] = scriptElement->localVars[param1] * scriptElement->localVars[param2];
+					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] * scriptElement->localVars[dataIdx];
 				} else {
-					int16 param2;
+					int16 newData = getNextWord();
 
-					param2 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-					currentPosition += 2;
+					DEBUG_SCRIPT(currentLine, "var[%d] *= %d", varIdx, newData);
 
-					DEBUG_SCRIPT(currentLine, "var[%d] *= %d", param1, param2);
-
-					scriptElement->localVars[param1] = scriptElement->localVars[param1] * param2;
+					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] * newData;
 				}
 
 				break;
 			}
 		case 0xD:	// OP_divVar
 			{
-				byte param1;
-				byte type;
+				byte varIdx = getNextByte();
+				byte varType = getNextByte();
 
-				param1 = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				if (varType) {
+					byte dataIdx = getNextByte();
 
-				type = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+					DEBUG_SCRIPT(currentLine, "var[%d] /= var[%d]", varIdx, dataIdx);
 
-				if (type) {
-					byte param2;
-
-					param2 = *(currentScriptPtr + currentPosition);
-					currentPosition++;
-
-					DEBUG_SCRIPT(currentLine, "var[%d] /= var[%d]", param1, param2);
-
-					scriptElement->localVars[param1] = scriptElement->localVars[param1] / scriptElement->localVars[param2];
+					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] / scriptElement->localVars[dataIdx];
 				} else {
-					int16 param2;
+					int16 newData = getNextWord();
 
-					param2 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-					currentPosition += 2;
+					DEBUG_SCRIPT(currentLine, "var[%d] /= %d", varIdx, newData);
 
-					DEBUG_SCRIPT(currentLine, "var[%d] /= %d", param1, param2);
-
-					scriptElement->localVars[param1] = scriptElement->localVars[param1] / param2;
+					scriptElement->localVars[varIdx] = scriptElement->localVars[varIdx] / newData;
 				}
 
 				break;
 			}
 		case 0xE:	// OP_compareVar
 			{
-				byte varIdx;
-				byte varType;
+				byte varIdx = getNextByte();
+				byte varType = getNextByte();
 
-				varIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				varType = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				if (varType) {
-					byte value;
+					byte value = getNextByte();
 
-					value = *(currentScriptPtr + currentPosition);
-					currentPosition++;
-
 					// printf("Val: %d\n", value);
 
 					if (varType == 1) {
@@ -1080,11 +953,8 @@
 						scriptElement->compareResult = compareVars(scriptElement->localVars[varIdx], globalVars[value]);
 					}
 				} else {
-					int16 value;
+					int16 value = getNextWord();
 
-					value = READ_BE_UINT16(currentScriptPtr + currentPosition);
-					currentPosition += 2;
-
 					DEBUG_SCRIPT(currentLine, "compare var[%d] and %d", varIdx, value);
 
 					scriptElement->compareResult = compareVars(scriptElement->localVars[varIdx], value);
@@ -1094,19 +964,10 @@
 			}
 		case 0xF:	// OP_modifyObjectParam2
 			{
-				byte objIdx;
-				byte paramIdx;
-				byte newValue;
+				byte objIdx = getNextByte();
+				byte paramIdx = getNextByte();
+				byte newValue = getNextByte();
 
-				objIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				paramIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				newValue = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "modifyObjectParam2(objIdx:%d,paramIdx:%d,var[%d])", objIdx, paramIdx, newValue);
 
 				modifyObjectParam(objIdx, paramIdx, scriptElement->localVars[newValue]);
@@ -1115,11 +976,8 @@
 			}
 		case 0x13:	// OP_loadV7Element (OP_loadMask0?)
 			{
-				byte param;
+				byte param = getNextByte();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "addSpriteOverlay(%d)", param);
 
 				loadOverlayElement(param, 0);
@@ -1128,11 +986,8 @@
 			}
 		case 0x14:	// OP_unloadMask0
 			{
-				byte param;
+				byte param = getNextByte();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "removeSpriteOverlay(%d)", param);
 
 				freeOverlay(param, 0);
@@ -1141,11 +996,8 @@
 			}
 		case 0x15:
 			{
-				byte param;
+				byte param = getNextByte();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "addToBGList(%d)", param);
 
 				addToBGList(param);
@@ -1154,11 +1006,8 @@
 			}
 		case 0x16:	// OP_loadMask1
 			{
-				byte param;
+				byte param = getNextByte();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "addOverlay1(%d)", param);
 
 				loadOverlayElement(param, 1);
@@ -1167,11 +1016,8 @@
 			}
 		case 0x17:	// OP_unloadMask1
 			{
-				byte param;
+				byte param = getNextByte();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "removeOverlay1(%d)", param);
 
 				freeOverlay(param, 1);
@@ -1180,11 +1026,8 @@
 			}
 		case 0x18:	// OP_loadMask4
 			{
-				byte param;
+				byte param = getNextByte();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "addOverlayType4(%d)", param);
 
 				loadOverlayElement(param, 4);
@@ -1193,11 +1036,8 @@
 			}
 		case 0x19:	// OP_unloadMask4
 			{
-				byte param;
+				byte param = getNextByte();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "removeSpriteOverlay4(%d)", param);
 
 				freeOverlay(param, 4);
@@ -1206,11 +1046,8 @@
 			}
 		case 0x1A:
 			{
-				byte param;
+				byte param = getNextByte();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "op1A(%d) -> TODO !", param);
 
 				addSpriteFilledToBGList(param);
@@ -1225,42 +1062,33 @@
 			}
 		case 0x1D:	// OP_label
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "label(%d)", labelIdx);
 
-				scriptElement->stack[labelIdx] = currentPosition;
+				scriptElement->stack[labelIdx] = _currentPosition;
 
 				break;
 			}
 		case 0x1E:	// OP_goto
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "goto label(%d)", labelIdx);
 
 				assert(scriptElement->stack[labelIdx] != -1);
-				currentPosition = scriptElement->stack[labelIdx];
+				_currentPosition = scriptElement->stack[labelIdx];
 
 				break;
 			}
 		case 0x1F:	// OP_gotoIfSup
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				if ((scriptElement->compareResult & 2) && !(scriptElement->compareResult & 1)) {
 					DEBUG_SCRIPT(currentLine, "if(>) goto %d (true)", labelIdx);
 					assert(scriptElement->stack[labelIdx] != -1);
-					currentPosition = scriptElement->stack[labelIdx];
+					_currentPosition = scriptElement->stack[labelIdx];
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(>) goto %d (false)", labelIdx);
 				}
@@ -1269,15 +1097,12 @@
 			}
 		case 0x20:	// OP_gotoIfSupEqu
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				if (scriptElement->compareResult & 2 || scriptElement->compareResult & 1) {
 					DEBUG_SCRIPT(currentLine, "if(>=) goto %d (true)", labelIdx);
 					assert(scriptElement->stack[labelIdx] != -1);
-					currentPosition = scriptElement->stack[labelIdx];
+					_currentPosition = scriptElement->stack[labelIdx];
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(>=) goto %d (false)",
 					    labelIdx);
@@ -1287,15 +1112,12 @@
 			}
 		case 0x21:	// OP_gotoIfInf
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				if ((scriptElement->compareResult & 4) && !(scriptElement->compareResult & 1)) {
 					DEBUG_SCRIPT(currentLine, "if(<) goto %d (true)", labelIdx);
 					assert(scriptElement->stack[labelIdx] != -1);
-					currentPosition = scriptElement->stack[labelIdx];
+					_currentPosition = scriptElement->stack[labelIdx];
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(<) goto %d (false)", labelIdx);
 				}
@@ -1304,15 +1126,12 @@
 			}
 		case 0x22:	// OP_gotoIfInfEqu
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				if ((scriptElement->compareResult & 4) || (scriptElement->compareResult & 1)) {
 					DEBUG_SCRIPT(currentLine, "if(<=) goto %d (true)", labelIdx);
 					assert(scriptElement->stack[labelIdx] != -1);
-					currentPosition = scriptElement->stack[labelIdx];
+					_currentPosition = scriptElement->stack[labelIdx];
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(<=) goto %d (false)", labelIdx);
 				}
@@ -1321,15 +1140,12 @@
 			}
 		case 0x23:	// OP_gotoIfEqu
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				if (scriptElement->compareResult & 1) {
 					DEBUG_SCRIPT(currentLine, "if(==) goto %d (true)", labelIdx);
 					assert(scriptElement->stack[labelIdx] != -1);
-					currentPosition = scriptElement->stack[labelIdx];
+					_currentPosition = scriptElement->stack[labelIdx];
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(==) goto %d (false)", labelIdx);
 				}
@@ -1338,15 +1154,12 @@
 			}
 		case 0x24:	// OP_gotoIfDiff
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				if (!(scriptElement->compareResult & 1)) {
 					DEBUG_SCRIPT(currentLine, "if(!=) goto %d (true)", labelIdx);
 					assert(scriptElement->stack[labelIdx] != -1);
-					currentPosition = scriptElement->stack[labelIdx];
+					_currentPosition = scriptElement->stack[labelIdx];
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(!=) goto %d (false)", labelIdx);
 				}
@@ -1360,21 +1173,15 @@
 			}
 		case 0x26:	// OP_loop
 			{
-				byte varIdx;
-				byte labelIdx;
+				byte varIdx = getNextByte();
+				byte labelIdx = getNextByte();
 
-				varIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				scriptElement->localVars[varIdx]--;
 
 				if (scriptElement->localVars[varIdx] >= 0) {
 					DEBUG_SCRIPT(currentLine, "loop(var[%]) goto %d (continue)", varIdx, labelIdx);
 					assert(scriptElement->stack[labelIdx] != -1);
-					currentPosition = scriptElement->stack[labelIdx];
+					_currentPosition = scriptElement->stack[labelIdx];
 				} else {
 					DEBUG_SCRIPT(currentLine, "loop(var[%]) goto %d (stop)", varIdx, labelIdx);
 				}
@@ -1383,11 +1190,8 @@
 			}
 		case 0x31:	// OP_startScript (OP_startGlobalScript?)
 			{
-				byte param;
+				byte param = getNextByte();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				assert(param < NUM_MAX_SCRIPT);
 
 				DEBUG_SCRIPT(currentLine, "startScript(%d)", param);
@@ -1397,11 +1201,8 @@
 			}
 		case 0x32:	// OP_endGlobalScript
 			{
-				byte scriptIdx;
+				byte scriptIdx = getNextByte();
 
-				scriptIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "stopGlobalScript(%d)", scriptIdx);
 
 				stopGlobalScript(scriptIdx);
@@ -1409,46 +1210,43 @@
 			}
 		case 0x3B:	// OP_loadResource (OP_loadAnim?)
 			{
-				DEBUG_SCRIPT(currentLine, "loadResource(\"%s\")", currentScriptPtr + currentPosition);
+				const char *param = getNextString();
 
-				loadResource((const char *)(currentScriptPtr + currentPosition));
+				DEBUG_SCRIPT(currentLine, "loadResource(\"%s\")", param);
 
-				currentPosition += strlen((const char *)(currentScriptPtr + currentPosition));
-
+				loadResource(param);
 				break;
 			}
 		case 0x3C:	// OP_loadBg
 			{
-				DEBUG_SCRIPT(currentLine, "loadBg(\"%s\")", currentScriptPtr + currentPosition);
+				const char *param = getNextString();
 
-				loadBg((const char *)(currentScriptPtr + currentPosition));
+				DEBUG_SCRIPT(currentLine, "loadBg(\"%s\")", param);
 
-				currentPosition += strlen((const char *)(currentScriptPtr + currentPosition));
-
+				loadBg(param);
 				closeEngine7();
-
 				bgVar0 = 0;
 
 				break;
 			}
 		case 0x3D:	// OP_loadCt
 			{
-				DEBUG_SCRIPT(currentLine, "loadCt(\"%s\")", currentScriptPtr + currentPosition);
+				const char *param = getNextString();
 
-				loadCt((const char *)(currentScriptPtr + currentPosition));
+				DEBUG_SCRIPT(currentLine, "loadCt(\"%s\")", param);
 
-				currentPosition += strlen((const char *)(currentScriptPtr + currentPosition));
-
+				loadCt(param);
 				break;
 			}
 		case 0x3F:	// OP_loadPart
 			{
-				DEBUG_SCRIPT(currentLine, "loadPart(\"%s\")", currentScriptPtr + currentPosition);
+				const char *param = getNextString();
 
+				DEBUG_SCRIPT(currentLine, "loadPart(\"%s\")", param);
+
 				if (gameType == Cine::GID_FW)
-					loadPart((const char *)(currentScriptPtr + currentPosition));
+					loadPart(param);
 
-				currentPosition += strlen((const char *)(currentScriptPtr + currentPosition));
 				break;
 			}
 		case 0x40:	// OP_closePart
@@ -1456,46 +1254,42 @@
 				DEBUG_SCRIPT(currentLine, "closePart");
 
 				closePart();
-
 				break;
 			}
 		case 0x41:	// OP_loadData (OP_loadNewPrcName?)
 			{
-				byte param;
+				byte param1 = getNextByte();
+				const char *param2 = getNextString();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				assert(param1 <= 3);
 
-				assert(param <= 3);
-
-				switch (param) {
+				switch (param1) {
 				case 0:
 					{
-						DEBUG_SCRIPT(currentLine, "loadPrc(\"%s\")", currentScriptPtr + currentPosition);
-						strcpy(newPrcName, (const char *)(currentScriptPtr + currentPosition));
+						DEBUG_SCRIPT(currentLine, "loadPrc(\"%s\")", param2);
+						strcpy(newPrcName, param2);
 						break;
 					}
 				case 1:
 					{
-						DEBUG_SCRIPT(currentLine, "loadRel(\"%s\")", currentScriptPtr + currentPosition);
-						strcpy(newRelName, (const char *)(currentScriptPtr + currentPosition));
+						DEBUG_SCRIPT(currentLine, "loadRel(\"%s\")", param2);
+						strcpy(newRelName, param2);
 						break;
 					}
 				case 2:
 					{
-						DEBUG_SCRIPT(currentLine, "loadObject(\"%s\")", currentScriptPtr + currentPosition);
-						strcpy(newObjectName, (const char *)(currentScriptPtr + currentPosition));
+						DEBUG_SCRIPT(currentLine, "loadObject(\"%s\")", param2);
+						strcpy(newObjectName, param2);
 						break;
 					}
 				case 3:
 					{
-						DEBUG_SCRIPT(currentLine, "loadMsg(\"%s\")", currentScriptPtr + currentPosition);
-						strcpy(newMsgName, (const char *)(currentScriptPtr + currentPosition));
+						DEBUG_SCRIPT(currentLine, "loadMsg(\"%s\")", param2);
+						strcpy(newMsgName, param2);
 						break;
 					}
 				}
 
-				currentPosition += strlen((const char *)(currentScriptPtr + currentPosition)) + 1;
 				break;
 			}
 		case 0x42:	// OP_requestCheckPendingDataLoad
@@ -1525,27 +1319,12 @@
 			}
 		case 0x47:	// OP_transformPaletteRange
 			{
-				byte startColor;
-				byte numColor;
-				uint16 r;
-				uint16 g;
-				uint16 b;
+				byte startColor = getNextByte();
+				byte numColor = getNextByte();
+				uint16 r = getNextWord();
+				uint16 g = getNextWord();
+				uint16 b = getNextWord();
 
-				startColor = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				numColor = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				r = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				g = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				b = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				DEBUG_SCRIPT(currentLine, "transformPaletteRange(from:%d,numIdx:%d,r:%d,g:%d,b:%d) -> unimplemented", startColor, numColor, r, g, b);
 
 				transformPaletteRange(startColor, numColor, r, g, b);
@@ -1554,8 +1333,7 @@
 			}
 		case 0x49:	// OP_setDefaultMenuColor2
 			{
-				defaultMenuBoxColor2 = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				defaultMenuBoxColor2 = getNextByte();
 
 				DEBUG_SCRIPT(currentLine, "setDefaultMenuColor2(%d)", defaultMenuBoxColor2);
 
@@ -1563,19 +1341,10 @@
 			}
 		case 0x4A:
 			{
-				byte a;
-				byte b;
-				byte c;
+				byte a = getNextByte();
+				byte b = getNextByte();
+				byte c = getNextByte();
 
-				a = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				b = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				c = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "palRotate(%d,%d,%d)", a, b, c);
 
 				palRotate(a, b, c);
@@ -1585,7 +1354,7 @@
 			{
 				DEBUG_SCRIPT(currentLine, "break");
 
-				scriptElement->scriptPosition = currentPosition;
+				scriptElement->scriptPosition = _currentPosition;
 				closeScript = 1;
 				break;
 			}
@@ -1600,32 +1369,16 @@
 				}
 
 				closeScript = 1;
-
 				break;
 			}
 		case 0x51:	// OP_message
 			{
-				byte param1;
-				uint16 param2;
-				uint16 param3;
-				uint16 param4;
-				uint16 param5;
+				byte param1 = getNextByte();
+				uint16 param2 = getNextWord();
+				uint16 param3 = getNextWord();
+				uint16 param4 = getNextWord();
+				uint16 param5 = getNextWord();
 
-				param1 = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				param2 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param3 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param4 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param5 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				DEBUG_SCRIPT(currentLine, "message(%d,%d,%d,%d,%d)", param1, param2, param3, param4, param5);
 
 				addMessage(param1, param2, param3, param4, param5);
@@ -1634,77 +1387,53 @@
 			}
 		case 0x52:	// OP_loadGlobalVar
 			{
-				byte idx;
-				byte type;
+				byte varIdx = getNextByte();
+				byte varType = getNextByte();
 
-				idx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				if (varType) {
+					byte dataIdx = getNextByte();
 
-				type = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+					if (varType == 1) {
+						DEBUG_SCRIPT(currentLine, "globalVars[%d] = var[%d]", varIdx, dataIdx);
 
-				if (type) {
-					byte idx2;
-
-					idx2 = *(currentScriptPtr + currentPosition);
-					currentPosition++;
-
-					if (type == 1) {
-						DEBUG_SCRIPT(currentLine, "globalVars[%d] = var[%d]", idx, idx2);
-
-						globalVars[idx] = scriptElement->localVars[idx2];
+						globalVars[varIdx] = scriptElement->localVars[dataIdx];
 					} else {
-						DEBUG_SCRIPT(currentLine, "globalVars[%d] = globalVars[%d]", idx, idx2);
+						DEBUG_SCRIPT(currentLine, "globalVars[%d] = globalVars[%d]", varIdx, dataIdx);
 
-						globalVars[idx] = globalVars[idx2];
+						globalVars[varIdx] = globalVars[dataIdx];
 					}
 				} else {
-					uint16 newData;
+					uint16 newData = getNextWord();
 
-					newData = READ_BE_UINT16(currentScriptPtr + currentPosition);
-					currentPosition += 2;
+					DEBUG_SCRIPT(currentLine, "globalVars[%d] = %d", varIdx, newData);
 
-					DEBUG_SCRIPT(currentLine, "globalVars[%d] = %d", idx, newData);
-
-					globalVars[idx] = newData;
+					globalVars[varIdx] = newData;
 				}
 
 				break;
 			}
 		case 0x53:	// OP_compareGlobalVar
 			{
-				byte idx;
-				byte type;
+				byte varIdx = getNextByte();
+				byte varType = getNextByte();
 
-				idx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				if (varType) {
+					byte value = getNextByte();
 
-				type = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+					DEBUG_SCRIPT(currentLine, "compare globalVars[%d] and var[%d]", varIdx, value);
 
-				if (type) {
-					byte b;
-
-					b = *(currentScriptPtr + currentPosition);
-					currentPosition++;
-
-					DEBUG_SCRIPT(currentLine, "compare globalVars[%d] and var[%d]", idx, b);
-
-					scriptElement->compareResult = compareVars(globalVars[idx], scriptElement->localVars[b]);
+					scriptElement->compareResult = compareVars(globalVars[varIdx], scriptElement->localVars[value]);
 				} else {
-					uint16 newData;
+					uint16 newData = getNextWord();
 
-					newData = READ_BE_UINT16(currentScriptPtr + currentPosition);
-					currentPosition += 2;
-
 					DEBUG_SCRIPT(currentLine,
 					    "compare globalVars[%d] and %d",
-					    idx, newData);
+					    varIdx, newData);
 
-					if (idx == 255 && (gameType == Cine::GID_FW)) {	// TODO: fix
+					if (varIdx == 255 && (gameType == Cine::GID_FW)) {	// TODO: fix
 						scriptElement->compareResult = 1;
 					} else {
-						scriptElement->compareResult = compareVars(globalVars[idx], newData);
+						scriptElement->compareResult = compareVars(globalVars[varIdx], newData);
 					}
 				}
 
@@ -1712,22 +1441,16 @@
 			}
 		case 0x59:	// OP_declareFunctionName
 			{
-				DEBUG_SCRIPT(currentLine, "comment(%s)", currentScriptPtr + currentPosition);
+				const char *param = getNextString();
 
-				currentPosition += strlen((const char *)(currentScriptPtr + currentPosition));
+				DEBUG_SCRIPT(currentLine, "comment(%s)", param);
 				break;
 			}
 		case 0x5A:	// OP_freePartRange
 			{
-				byte startIdx;
-				byte numIdx;
+				byte startIdx = getNextByte();
+				byte numIdx = getNextByte();
 
-				startIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				numIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				assert(startIdx + numIdx <= NUM_MAX_ANIMDATA);
 
 				DEBUG_SCRIPT(currentLine, "freePartRange(%d,%d)", startIdx, numIdx);
@@ -1768,15 +1491,9 @@
 			}
 		case 0x66:	// OP_setZoneDataEntry
 			{
-				byte zoneIdx;
-				uint16 var;
+				byte zoneIdx = getNextByte();
+				uint16 var = getNextWord();
 
-				zoneIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				var = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				DEBUG_SCRIPT(currentLine, "setZone[%d] = %d", zoneIdx, var);
 
 				zoneData[zoneIdx] = var;
@@ -1790,8 +1507,7 @@
 			}
 		case 0x68:	// OP_setDefaultMenuColor
 			{
-				defaultMenuBoxColor = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				defaultMenuBoxColor = getNextByte();
 
 				DEBUG_SCRIPT(currentLine, "setDefaultMenuColor(%d)", defaultMenuBoxColor2);
 
@@ -1813,11 +1529,8 @@
 			}
 		case 0x6B:	// OP_changeDataDisk
 			{
-				byte newDisk;
+				byte newDisk = getNextByte();
 
-				newDisk = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "changeDataDisk(%d)", newDisk);
 
 				checkDataDisk(newDisk);
@@ -1825,9 +1538,10 @@
 			}
 		case 0x6D:	// OP_loadMusic
 			{
-				DEBUG_SCRIPT(currentLine, "loadMusic(%s)", currentScriptPtr + currentPosition);
-				g_sfxPlayer->load((const char *)(currentScriptPtr + currentPosition));
-				currentPosition += strlen((const char *)(currentScriptPtr + currentPosition)) + 1;
+				const char *param = getNextString();
+
+				DEBUG_SCRIPT(currentLine, "loadMusic(%s)", param);
+				g_sfxPlayer->load(param);
 				break;
 			}
 		case 0x6E:	// OP_playMusic
@@ -1867,28 +1581,16 @@
 		case 0x78:	// OP_playSample
 			{
 				DEBUG_SCRIPT(currentLine, "playSample()");
-				byte anim, channel;
-				int16 volume;
-				uint16 flag;
 
-				anim = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				byte anim = getNextByte();
+				byte channel = getNextByte();
 
-				channel = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				getNextWord();
+				getNextByte();
 
-				/* unused */
-				currentPosition += 2;
+				int16 volume = getNextWord();
+				uint16 flag = getNextWord();
 
-				/* unused */
-				currentPosition++;
-
-				volume = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				flag = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				if (volume > 63)
 					volume = 63;
 				if (volume < 0)
@@ -1901,7 +1603,7 @@
 					if (volume < 50) {
 						volume = 50;
 					}
-						
+
 					g_sfxPlayer->stop();
 					
 					if (flag == 0xFFFF) {
@@ -1914,70 +1616,39 @@
 			}
 		case 0x79:	// OP_allowSystemMenu
 			{
-				var22 = *(currentScriptPtr + currentPosition);
+				var22 = getNextByte();
 
 				DEBUG_SCRIPT(currentLine, "OP79 load var22 to %d -> TODO", var22);
-
-				currentPosition++;
 				break;
 			}
 		case 0x7A:	// OP_loadMask5
 			{
-				byte param;
+				byte param = getNextByte();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "addOverlay5(%d)", param);
 
 				loadOverlayElement(param, 5);
-
 				break;
 			}
 		case 0x7B:	// OP_unloadMask5
 			{
-				byte param;
+				byte param = getNextByte();
 
-				param = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "freeOverlay5(%d)", param);
 
 				freeOverlay(param, 5);
-
 				break;
 			}
 		case 0x7F:
 			{
-				byte param1;
-				byte param2;
-				byte param3;
-				byte param4;
-				uint16 param5;
-				uint16 param6;
-				uint16 param7;
+				byte param1 = getNextByte();
+				byte param2 = getNextByte();
+				byte param3 = getNextByte();
+				byte param4 = getNextByte();
+				uint16 param5 = getNextWord();
+				uint16 param6 = getNextWord();
+				uint16 param7 = getNextWord();
 
-				param1 = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				param2 = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				param3 = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				param4 = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				param5 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param6 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param7 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				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);
@@ -1986,19 +1657,12 @@
 			}
 		case 0x80:
 			{
-				byte a;
-				byte b;
+				byte a = getNextByte();
+				byte b = getNextByte();
 
-				a = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				b = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "removeSeq(%d,%d) -> TODO", a, b);
 
 				removeSeq(a, 0, b);
-
 				break;
 			}
 		case 0x81:
@@ -2013,15 +1677,9 @@
 			}
 		case 0x83:
 			{
-				byte a;
-				byte b;
+				byte a = getNextByte();
+				byte b = getNextByte();
 
-				a = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
-				b = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				DEBUG_SCRIPT(currentLine, "OP83(%d,%d) -> TODO", a, b);
 
 				if (isSeqRunning(a, 0, b)) {
@@ -2033,16 +1691,13 @@
 			}
 		case 0x84:	// OP_gotoIfSup nearest
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				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,
+					_currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr, _currentPosition, labelIdx,
 									scriptTable[scriptElement->scriptIdx].size);
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(>) goto nearest %d (false)", labelIdx);
@@ -2052,15 +1707,12 @@
 			}
 		case 0x85:	// OP_gotoIfSupEqu nearest
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				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,
+					_currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr, _currentPosition, labelIdx,
 								    scriptTable[scriptElement->scriptIdx].size);
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(>=) goto nearest %d (false)", labelIdx);
@@ -2070,16 +1722,13 @@
 			}
 		case 0x86:	// OP_gotoIfInf nearest
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				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);
+					_currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr,
+									_currentPosition, labelIdx, scriptTable[scriptElement->scriptIdx].size);
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(<) goto nearest %d (false)", labelIdx);
 				}
@@ -2088,16 +1737,13 @@
 			}
 		case 0x87:	// OP_gotoIfInfEqu nearest
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				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);
+					_currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr,
+								    _currentPosition, labelIdx, scriptTable[scriptElement->scriptIdx].size);
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(<=) goto nearest %d (false)", labelIdx);
 				}
@@ -2106,16 +1752,13 @@
 			}
 		case 0x88:	// OP_gotoIfEqu nearest
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				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);
+					_currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr,
+								    _currentPosition, labelIdx, scriptTable[scriptElement->scriptIdx].size);
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(==) goto nearest %d (false)", labelIdx);
 				}
@@ -2124,16 +1767,13 @@
 			}
 		case 0x89:	// OP_gotoIfDiff nearest
 			{
-				byte labelIdx;
+				byte labelIdx = getNextByte();
 
-				labelIdx = *(currentScriptPtr + currentPosition);
-				currentPosition++;
-
 				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);
+					_currentPosition = computeScriptStackFromScript(scriptElement->scriptPtr,
+								    _currentPosition, labelIdx, scriptTable[scriptElement->scriptIdx].size);
 				} else {
 					DEBUG_SCRIPT(currentLine, "if(!=) goto nearest %d (false)", labelIdx);
 				}
@@ -2142,22 +1782,20 @@
 			}
 		case 0x8B:
 			{
-				byte temp = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				byte param = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "startObjectScript(%d,%d)", temp, currentScriptPtr + currentPosition);
+				DEBUG_SCRIPT(currentLine, "startObjectScript(%d)", param);
 
-				runObjectScript(temp);
+				runObjectScript(param);
 				break;
 			}
 		case 0x8C:
 			{
-				byte temp = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				byte param = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "startObjectScript(%d,%d)", temp, currentScriptPtr + currentPosition);
+				DEBUG_SCRIPT(currentLine, "stopObjectScript(%d)", param);
 
-				stopObjectScript(temp);
+				stopObjectScript(param);
 				break;
 			}
 		case 0x8D:
@@ -2167,65 +1805,58 @@
 			}
 		case 0x8E:
 			{
-				byte temp = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				byte param1 = getNextWord();
+				const char *param2 = getNextString();
 
-				DEBUG_SCRIPT(currentLine, "addBackground(%s,%d)", currentScriptPtr + currentPosition, temp);
+				DEBUG_SCRIPT(currentLine, "addBackground(%s,%d)", param2, param1);
 
-				addBackground((const char *)(currentScriptPtr + currentPosition), temp);
-
-				currentPosition += strlen((const char *)(currentScriptPtr + currentPosition));
+				addBackground(param2, param1);
 				break;
 			}
 		case 0x8F:
 			{
-				byte temp = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				byte param = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "removeBackground(%d)", temp);
+				DEBUG_SCRIPT(currentLine, "removeBackground(%d)", param);
 
-				assert(temp);
-				if (additionalBgTable[temp]) {
-					free(additionalBgTable[temp]);
-					additionalBgTable[temp] = NULL;
+				assert(param);
+				if (additionalBgTable[param]) {
+					free(additionalBgTable[param]);
+					additionalBgTable[param] = NULL;
 				}
 
-				if (currentAdditionalBgIdx == temp) {
+				if (currentAdditionalBgIdx == param) {
 					currentAdditionalBgIdx = 0;
 				}
 
-				if (currentAdditionalBgIdx2 == temp) {
+				if (currentAdditionalBgIdx2 == param) {
 					currentAdditionalBgIdx2 = 0;
 				}
 
-				strcpy(currentBgName[temp], "");
+				strcpy(currentBgName[param], "");
 
 				break;
 			}
 		case 0x90:
 			{
-				byte temp = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				byte param1 = getNextByte();
+				const char *param2 = getNextString();
 
-				DEBUG_SCRIPT(currentLine, "loadABS(%d,%s)", temp, currentScriptPtr + currentPosition);
+				DEBUG_SCRIPT(currentLine, "loadABS(%d,%s)", param1, param2);
 
-				loadAbs((const char *)(currentScriptPtr + currentPosition), temp);
-
-				currentPosition += strlen((const char *)(currentScriptPtr + currentPosition));
-
+				loadAbs(param2, param1);
 				break;
 			}
 		case 0x91:
 			{
-				byte temp = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				byte param = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "useBg(%d)", temp);
+				DEBUG_SCRIPT(currentLine, "useBg(%d)", param);
 
-				assert(temp <= 8);
+				assert(param <= 8);
 
-				if (additionalBgTable[temp]) {
-					currentAdditionalBgIdx = temp;
+				if (additionalBgTable[param]) {
+					currentAdditionalBgIdx = param;
 					//if (adBgVar0 == 0) {
 					//	adBgVar1 = 1;
 					//}
@@ -2254,40 +1885,30 @@
 			}
 		case 0x9D:
 			{
-				byte temp = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				byte param = getNextByte();
 
-				DEBUG_SCRIPT(currentLine, "useBgScroll(%d)", temp);
+				DEBUG_SCRIPT(currentLine, "useBgScroll(%d)", param);
 
-				assert(temp <= 8);
+				assert(param <= 8);
 
-				if (additionalBgTable[temp]) {
-					currentAdditionalBgIdx2 = temp;
+				if (additionalBgTable[param]) {
+					currentAdditionalBgIdx2 = param;
 				}
 				break;
 			}
 		case 0x9E:
 			{
-				byte type;
+				byte param1 = getNextByte();
 
-				type = *(currentScriptPtr + currentPosition);
-				currentPosition++;
+				if (param1) {
+					byte param2 = getNextByte();
 
-				if (type) {
-					byte param2;
-
-					param2 = *(currentScriptPtr + currentPosition);
-					currentPosition++;
-
 					DEBUG_SCRIPT(currentLine, "additionalBgVScroll = var[%d]", param2);
 
 					additionalBgVScroll = scriptElement->localVars[param2];
 				} else {
-					uint16 param2;
+					uint16 param2 = getNextWord();
 
-					param2 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-					currentPosition += 2;
-
 					DEBUG_SCRIPT(currentLine, "additionalBgVScroll = %d", param2);
 
 					additionalBgVScroll = param2;
@@ -2302,15 +1923,9 @@
 			}
 		case 0xA0:
 			{
-				uint16 param1;
-				uint16 param2;
+				uint16 param1 = getNextWord();
+				uint16 param2 = getNextWord();
 
-				param1 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
-				param2 = READ_BE_UINT16(currentScriptPtr + currentPosition);
-				currentPosition += 2;
-
 				DEBUG_SCRIPT(currentLine, "addGfxElementA0(%d,%d)", param1, param2);
 
 				addGfxElementA0(param1, param2);
@@ -2319,19 +1934,19 @@
 		case 0xA1:
 			{
 				warning("STUB: Opcode 0xA1");
-				currentPosition += 4;
+				_currentPosition += 4;
 				break;
 			}
 		case 0xA2:
 			{
 				warning("STUB: Opcode 0xA2");
-				currentPosition += 4;
+				_currentPosition += 4;
 				break;
 			}
 		case 0xA3:
 			{
 				warning("STUB: Opcode 0xA3");
-				currentPosition += 4;
+				_currentPosition += 4;
 				break;
 			}
 		case 0xA4:


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