[Scummvm-cvs-logs] CVS: scummvm/scumm script.cpp,1.15,1.16 script_v5.cpp,1.2,1.3 script_v6.cpp,1.4,1.5 scumm.h,1.83,1.84 scummvm.cpp,1.98,1.99 vars.cpp,1.4,1.5

Max Horn fingolfin at users.sourceforge.net
Mon Dec 16 04:13:02 CET 2002


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv15778

Modified Files:
	script.cpp script_v5.cpp script_v6.cpp scumm.h scummvm.cpp 
	vars.cpp 
Log Message:
refactoring: use inheritance to mode the relations between the various engine versions. E.g. the V6 opcodes are now in Scumm_v6, the V5 opcodes in Scumm_v5 (from which we now derive v2-v4. which is a bit odd - maybe we should move the v5 opcodes to Scumm_v3 ?)

Index: script.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- script.cpp	9 Dec 2002 01:27:39 -0000	1.15
+++ script.cpp	16 Dec 2002 12:12:31 -0000	1.16
@@ -277,17 +277,37 @@
 /* Execute a script - Read opcode, and execute it from the table */
 void Scumm::executeScript()
 {
-
-	OpcodeProc op;
 	while (_currentScript != 0xFF) {
 		_opcode = fetchScriptByte();
 		_scriptPointerStart = _scriptPointer;
 		vm.slot[_currentScript].didexec = 1;
-		debug(8, "Script %d: [%X] %s()", vm.slot[_currentScript].number, _opcode, _opcodes[_opcode].desc);
-		op = getOpcode(_opcode);
-		(this->*op) ();
+		debug(8, "Script %d: [%X] %s()", vm.slot[_currentScript].number, _opcode, getOpcodeDesc(_opcode));
+		executeOpcode(_opcode);
 	}
-CHECK_HEAP}
+	CHECK_HEAP;
+}
+
+void Scumm_v5::executeOpcode(int i)
+{
+	OpcodeProcV5 op = _opcodesV5[i].proc;
+	(this->*op) ();
+}
+
+const char *Scumm_v5::getOpcodeDesc(int i)
+{
+	return _opcodesV5[i].desc;
+}
+
+void Scumm_v6::executeOpcode(int i)
+{
+	OpcodeProcV6 op = _opcodesV6[i].proc;
+	(this->*op) ();
+}
+
+const char *Scumm_v6::getOpcodeDesc(int i)
+{
+	return _opcodesV6[i].desc;
+}
 
 byte Scumm::fetchScriptByte()
 {
@@ -468,6 +488,20 @@
 	writeVar(_resultVarNumber, value);
 }
 
+void Scumm::push(int a)
+{
+	assert(_scummStackPos >= 0 && (unsigned int)_scummStackPos <= ARRAYSIZE(_scummStack));
+	_scummStack[_scummStackPos++] = a;
+}
+
+int Scumm::pop()
+{
+	if ((_scummStackPos < 1) || ((unsigned int)_scummStackPos > ARRAYSIZE(_scummStack))) {
+		error("No items on stack to pop() for %s (0x%X) at [%d-%d]\n", getOpcodeDesc(_opcode), _opcode, _roomResource, vm.slot[_currentScript].number);
+	}
+
+	return _scummStack[--_scummStackPos];
+}
 void Scumm::drawBox(int x, int y, int x2, int y2, int color)
 {
 	int top, bottom, count;
@@ -864,23 +898,6 @@
 	else
 		return verboffs + READ_LE_UINT16(verbptr + 1);
 }
-
-
-void Scumm::push(int a)
-{
-	assert(_scummStackPos >= 0 && (unsigned int)_scummStackPos <= ARRAYSIZE(_scummStack));
-	_scummStack[_scummStackPos++] = a;
-}
-
-int Scumm::pop()
-{
-	if ((_scummStackPos < 1) || ((unsigned int)_scummStackPos > ARRAYSIZE(_scummStack))) {
-		error("No items on stack to pop() for %s (0x%X) at [%d-%d]\n", _opcodes[_opcode].desc, _opcode, _roomResource, vm.slot[_currentScript].number);
-	}
-
-	return _scummStack[--_scummStackPos];
-}
-
 
 void Scumm::endCutscene()
 {

Index: script_v5.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v5.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- script_v5.cpp	13 Dec 2002 16:44:00 -0000	1.2
+++ script_v5.cpp	16 Dec 2002 12:12:31 -0000	1.3
@@ -26,11 +26,11 @@
 #include "verbs.h"
 #include "scumm/sound.h"
 
-#define OPCODE(x)	{ &Scumm::x, #x }
+#define OPCODE(x)	{ &Scumm_v5::x, #x }
 
-void Scumm::setupOpcodes_V5()
+void Scumm_v5::setupOpcodes()
 {
-	static const OpcodeEntry opcodes[256] = {
+	static const OpcodeEntryV5 opcodes[256] = {
 		/* 00 */
 		OPCODE(o5_stopObjectCode),
 		OPCODE(o5_putActor),
@@ -353,15 +353,15 @@
 		OPCODE(o5_drawBox)
 	};
 
-	_opcodes = opcodes;
+	_opcodesV5 = opcodes;
 }
 
-void Scumm::o5_actorFollowCamera()
+void Scumm_v5::o5_actorFollowCamera()
 {
 	actorFollowCamera(getVarOrDirectByte(0x80));
 }
 
-void Scumm::o5_actorFromPos()
+void Scumm_v5::o5_actorFromPos()
 {
 	int x, y;
 	getResultPos();
@@ -370,7 +370,7 @@
 	setResult(getActorFromPos(x, y));
 }
 
-void Scumm::o5_actorSet()
+void Scumm_v5::o5_actorSet()
 {
 	static const byte convertTable[20] =
 		{ 1, 0, 0, 2, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20 };
@@ -508,7 +508,7 @@
 	}
 }
 
-void Scumm::o5_setClass()
+void Scumm_v5::o5_setClass()
 {
 	int obj = getVarOrDirectWord(0x80);
 	int newClass;
@@ -530,7 +530,7 @@
 	}
 }
 
-void Scumm::o5_add()
+void Scumm_v5::o5_add()
 {
 	int a;
 	getResultPos();
@@ -538,7 +538,7 @@
 	setResult(readVar(_resultVarNumber) + a);
 }
 
-void Scumm::o5_and()
+void Scumm_v5::o5_and()
 {
 	int a;
 	getResultPos();
@@ -546,7 +546,7 @@
 	setResult(readVar(_resultVarNumber) & a);
 }
 
-void Scumm::o5_animateActor()
+void Scumm_v5::o5_animateActor()
 {
 	int act = getVarOrDirectByte(0x80);
 	int anim = getVarOrDirectByte(0x40);
@@ -558,18 +558,18 @@
 	a->animateActor(anim);
 }
 
-void Scumm::o5_badOpcode()
+void Scumm_v5::o5_badOpcode()
 {
 	error("Scumm opcode %d illegal", _opcode);
 }
 
-void Scumm::o5_breakHere()
+void Scumm_v5::o5_breakHere()
 {
 	updateScriptPtr();
 	_currentScript = 0xFF;
 }
 
-void Scumm::o5_chainScript()
+void Scumm_v5::o5_chainScript()
 {
 	int16 vars[16];
 	int data;
@@ -588,7 +588,7 @@
 	runScript(data, vm.slot[cur].unk1, vm.slot[cur].unk2, vars);
 }
 
-void Scumm::o5_cursorCommand()
+void Scumm_v5::o5_cursorCommand()
 {
 	int i, j, k;
 	int16 table[16];
@@ -651,30 +651,30 @@
 	_vars[VAR_USERPUT] = _userPut;
 }
 
-void Scumm::o5_cutscene()
+void Scumm_v5::o5_cutscene()
 {
 	int16 args[16];
 	getWordVararg(args);
 	cutscene(args);
 }
 
-void Scumm::o5_endCutscene()
+void Scumm_v5::o5_endCutscene()
 {
 	endCutscene();
 }
 
-void Scumm::o5_debug()
+void Scumm_v5::o5_debug()
 {
 	getVarOrDirectWord(0x80);
 }
 
-void Scumm::o5_decrement()
+void Scumm_v5::o5_decrement()
 {
 	getResultPos();
 	setResult(readVar(_resultVarNumber) - 1);
 }
 
-void Scumm::o5_delay()
+void Scumm_v5::o5_delay()
 {
 	int delay = fetchScriptByte();
 	delay |= fetchScriptByte() << 8;
@@ -684,14 +684,14 @@
 	o5_breakHere();
 }
 
-void Scumm::o5_delayVariable()
+void Scumm_v5::o5_delayVariable()
 {
 	vm.slot[_currentScript].delay = readVar(fetchScriptWord());
 	vm.slot[_currentScript].status = 1;
 	o5_breakHere();
 }
 
-void Scumm::o5_divide()
+void Scumm_v5::o5_divide()
 {
 	int a;
 	getResultPos();
@@ -703,7 +703,7 @@
 		setResult(readVar(_resultVarNumber) / a);
 }
 
-void Scumm::o5_doSentence()
+void Scumm_v5::o5_doSentence()
 {
 	int a, b;
 	SentenceTab *st;
@@ -729,7 +729,7 @@
 	st->freezeCount = 0;
 }
 
-void Scumm::o5_drawBox()
+void Scumm_v5::o5_drawBox()
 {
 	int x, y, x2, y2, color;
 
@@ -744,7 +744,7 @@
 	drawBox(x, y, x2, y2, color);
 }
 
-void Scumm::o5_drawObject()
+void Scumm_v5::o5_drawObject()
 {
 	int state, obj, idx, i;
 	ObjectData *od;
@@ -801,13 +801,13 @@
 	putState(obj, state);
 }
 
-void Scumm::o5_dummy()
+void Scumm_v5::o5_dummy()
 {
 	/* nothing */
 }
 
 
-void Scumm::o5_expression()
+void Scumm_v5::o5_expression()
 {
 	int dst, i;
 
@@ -840,7 +840,7 @@
 			break;
 		case 6:										/* normal opcode */
 			_opcode = fetchScriptByte();
-			(this->*(getOpcode(_opcode))) ();
+			executeOpcode(_opcode);
 			push(_vars[0]);
 			break;
 		}
@@ -850,7 +850,7 @@
 	setResult(pop());
 }
 
-void Scumm::o5_faceActor()
+void Scumm_v5::o5_faceActor()
 {
 	int act, obj;
 	act = getVarOrDirectByte(0x80);
@@ -858,7 +858,7 @@
 	faceActorToObj(act, obj);
 }
 
-void Scumm::o5_findInventory()
+void Scumm_v5::o5_findInventory()
 {
 	int t;
 	getResultPos();
@@ -866,7 +866,7 @@
 	setResult(findInventory(t, getVarOrDirectByte(0x40)));
 }
 
-void Scumm::o5_findObject()
+void Scumm_v5::o5_findObject()
 {
 	int t;
 	getResultPos();
@@ -874,7 +874,7 @@
 	setResult(findObject(t, getVarOrDirectWord(0x40)));
 }
 
-void Scumm::o5_freezeScripts()
+void Scumm_v5::o5_freezeScripts()
 {
 	int scr = getVarOrDirectByte(0x80);
 
@@ -884,7 +884,7 @@
 		unfreezeScripts();
 }
 
-void Scumm::o5_getActorCostume()
+void Scumm_v5::o5_getActorCostume()
 {
 	int act;
 	Actor *a;
@@ -900,7 +900,7 @@
 	setResult(a->costume);
 }
 
-void Scumm::o5_getActorElevation()
+void Scumm_v5::o5_getActorElevation()
 {
 	int act;
 	Actor *a;
@@ -916,7 +916,7 @@
 	setResult(a->elevation);
 }
 
-void Scumm::o5_getActorFacing()
+void Scumm_v5::o5_getActorFacing()
 {
 	int act;
 	Actor *a;
@@ -932,7 +932,7 @@
 	setResult(newDirToOldDir (a->facing));
 }
 
-void Scumm::o5_getActorMoving()
+void Scumm_v5::o5_getActorMoving()
 {
 	int act;
 	Actor *a;
@@ -948,7 +948,7 @@
 	setResult(a->moving);
 }
 
-void Scumm::o5_getActorRoom()
+void Scumm_v5::o5_getActorRoom()
 {
 	int act;
 	Actor *a;
@@ -964,7 +964,7 @@
 	setResult(a->room);
 }
 
-void Scumm::o5_getActorScale()
+void Scumm_v5::o5_getActorScale()
 {
 	// INDY3 uses this opcode as a wait_for_actor();
 	if (_gameId == GID_INDY3_256) {
@@ -981,7 +981,7 @@
 	setResult(derefActorSafe(getVarOrDirectByte(0x80), "o5_getActorScale")->scalex);
 }
 
-void Scumm::o5_getActorWalkBox()
+void Scumm_v5::o5_getActorWalkBox()
 {
 	Actor *a;
 	getResultPos();
@@ -992,13 +992,13 @@
 		setResult(0);
 }
 
-void Scumm::o5_getActorWidth()
+void Scumm_v5::o5_getActorWidth()
 {
 	getResultPos();
 	setResult(derefActorSafe(getVarOrDirectByte(0x80), "o5_getActorWidth")->width);
 }
 
-void Scumm::o5_getActorX()
+void Scumm_v5::o5_getActorX()
 {
 	int a;
 	getResultPos();
@@ -1011,7 +1011,7 @@
 	setResult(getObjX(a));
 }
 
-void Scumm::o5_getActorY()
+void Scumm_v5::o5_getActorY()
 {
 	int a;
 	getResultPos();
@@ -1035,7 +1035,7 @@
 	setResult(getObjY(a));
 }
 
-void Scumm::o5_getAnimCounter()
+void Scumm_v5::o5_getAnimCounter()
 {
 	Actor *a;
 	getResultPos();
@@ -1048,7 +1048,7 @@
 		setResult(0);
 }
 
-void Scumm::o5_getClosestObjActor()
+void Scumm_v5::o5_getClosestObjActor()
 {
 	int obj;
 	int act;
@@ -1071,7 +1071,7 @@
 	setResult(closest_dist);
 }
 
-void Scumm::o5_getDist()
+void Scumm_v5::o5_getDist()
 {
 	int o1, o2;
 	int r;
@@ -1087,19 +1087,19 @@
 	setResult(r);
 }
 
-void Scumm::o5_getInventoryCount()
+void Scumm_v5::o5_getInventoryCount()
 {
 	getResultPos();
 	setResult(getInventoryCount(getVarOrDirectByte(0x80)));
 }
 
-void Scumm::o5_getObjectOwner()
+void Scumm_v5::o5_getObjectOwner()
 {
 	getResultPos();
 	setResult(getOwner(getVarOrDirectWord(0x80)));
 }
 
-void Scumm::o5_getObjectState()
+void Scumm_v5::o5_getObjectState()
 {
 	if (_features & GF_SMALL_HEADER) {
 		o5_ifState();
@@ -1109,7 +1109,7 @@
 	}
 }
 
-void Scumm::o5_ifState()
+void Scumm_v5::o5_ifState()
 {
 	int a = getVarOrDirectWord(0x80);
 	int b = getVarOrDirectByte(0x40);
@@ -1120,7 +1120,7 @@
 		ignoreScriptWord();
 }
 
-void Scumm::o5_ifNotState()
+void Scumm_v5::o5_ifNotState()
 {
 	int a = getVarOrDirectWord(0x80);
 	int b = getVarOrDirectByte(0x40);
@@ -1131,19 +1131,19 @@
 		ignoreScriptWord();
 }
 
-void Scumm::o5_getRandomNr()
+void Scumm_v5::o5_getRandomNr()
 {
 	getResultPos();
 	setResult(_rnd.getRandomNumber(getVarOrDirectByte(0x80)));
 }
 
-void Scumm::o5_getScriptRunning()
+void Scumm_v5::o5_getScriptRunning()
 {
 	getResultPos();
 	setResult(isScriptRunning(getVarOrDirectByte(0x80)));
 }
 
-void Scumm::o5_getVerbEntrypoint()
+void Scumm_v5::o5_getVerbEntrypoint()
 {
 	int a, b;
 	getResultPos();
@@ -1153,7 +1153,7 @@
 	setResult(getVerbEntrypoint(a, b));
 }
 
-void Scumm::o5_ifClassOfIs()
+void Scumm_v5::o5_ifClassOfIs()
 {
 	int act, cls, b = 0;
 	bool cond = true;
@@ -1177,13 +1177,13 @@
 		o5_jumpRelative();
 }
 
-void Scumm::o5_increment()
+void Scumm_v5::o5_increment()
 {
 	getResultPos();
 	setResult(readVar(_resultVarNumber) + 1);
 }
 
-void Scumm::o5_isActorInBox()
+void Scumm_v5::o5_isActorInBox()
 {
 	int box;
 	Actor *a;
@@ -1197,7 +1197,7 @@
 		ignoreScriptWord();
 }
 
-void Scumm::o5_isEqual()
+void Scumm_v5::o5_isEqual()
 {
 	int16 a, b;
 	int var;
@@ -1221,7 +1221,7 @@
 
 }
 
-void Scumm::o5_isGreater()
+void Scumm_v5::o5_isGreater()
 {
 	int16 a = readVar(fetchScriptWord());
 	int16 b = getVarOrDirectWord(0x80);
@@ -1231,7 +1231,7 @@
 		o5_jumpRelative();
 }
 
-void Scumm::o5_isGreaterEqual()
+void Scumm_v5::o5_isGreaterEqual()
 {
 	int16 a = readVar(fetchScriptWord());
 	int16 b = getVarOrDirectWord(0x80);
@@ -1241,7 +1241,7 @@
 		o5_jumpRelative();
 }
 
-void Scumm::o5_isLess()
+void Scumm_v5::o5_isLess()
 {
 	int16 a = readVar(fetchScriptWord());
 	int16 b = getVarOrDirectWord(0x80);
@@ -1252,7 +1252,7 @@
 		o5_jumpRelative();
 }
 
-void Scumm::o5_lessOrEqual()
+void Scumm_v5::o5_lessOrEqual()
 {
 	int16 a = readVar(fetchScriptWord());
 	int16 b = getVarOrDirectWord(0x80);
@@ -1262,7 +1262,7 @@
 		o5_jumpRelative();
 }
 
-void Scumm::o5_isNotEqual()
+void Scumm_v5::o5_isNotEqual()
 {
 	int16 a = readVar(fetchScriptWord());
 	int16 b = getVarOrDirectWord(0x80);
@@ -1272,7 +1272,7 @@
 		o5_jumpRelative();
 }
 
-void Scumm::o5_notEqualZero()
+void Scumm_v5::o5_notEqualZero()
 {
 	int a = readVar(fetchScriptWord());
 	if (a != 0)
@@ -1281,7 +1281,7 @@
 		o5_jumpRelative();
 }
 
-void Scumm::o5_equalZero()
+void Scumm_v5::o5_equalZero()
 {
 	int a = readVar(fetchScriptWord());
 	if (a == 0)
@@ -1290,7 +1290,7 @@
 		o5_jumpRelative();
 }
 
-void Scumm::o5_isSoundRunning()
+void Scumm_v5::o5_isSoundRunning()
 {
 	int snd;
 	getResultPos();
@@ -1300,12 +1300,12 @@
 	setResult(snd);
 }
 
-void Scumm::o5_jumpRelative()
+void Scumm_v5::o5_jumpRelative()
 {
 	_scriptPointer += (int16)fetchScriptWord();
 }
 
-void Scumm::o5_lights()
+void Scumm_v5::o5_lights()
 {
 	int a, b, c;
 
@@ -1322,7 +1322,7 @@
 	_fullRedraw = 1;
 }
 
-void Scumm::o5_loadRoom()
+void Scumm_v5::o5_loadRoom()
 {
 	int room;
 
@@ -1336,7 +1336,7 @@
 	_fullRedraw = 1;
 }
 
-void Scumm::o5_loadRoomWithEgo()
+void Scumm_v5::o5_loadRoomWithEgo()
 {
 	Actor *a;
 	int obj, room, x, y;
@@ -1367,7 +1367,7 @@
 	}
 }
 
-void Scumm::o5_matrixOps()
+void Scumm_v5::o5_matrixOps()
 {
 	int a, b;
 
@@ -1401,13 +1401,13 @@
 	}
 }
 
-void Scumm::o5_move()
+void Scumm_v5::o5_move()
 {
 	getResultPos();
 	setResult(getVarOrDirectWord(0x80));
 }
 
-void Scumm::o5_multiply()
+void Scumm_v5::o5_multiply()
 {
 	int a;
 	getResultPos();
@@ -1416,7 +1416,7 @@
 }
 
 
-void Scumm::o5_or()
+void Scumm_v5::o5_or()
 {
 	int a;
 	getResultPos();
@@ -1424,7 +1424,7 @@
 	setResult(readVar(_resultVarNumber) | a);
 }
 
-void Scumm::o5_overRide()
+void Scumm_v5::o5_overRide()
 {
 	if (fetchScriptByte() != 0)
 		beginOverride();
@@ -1432,12 +1432,12 @@
 		endOverride();
 }
 
-void Scumm::o5_panCameraTo()
+void Scumm_v5::o5_panCameraTo()
 {
 	panCameraTo(getVarOrDirectWord(0x80), 0);
 }
 
-void Scumm::o5_pickupObject()
+void Scumm_v5::o5_pickupObject()
 {
 	int obj, room;
 	if (_features & GF_OLD256) {
@@ -1458,19 +1458,19 @@
 	runHook(1);
 }
 
-void Scumm::o5_print()
+void Scumm_v5::o5_print()
 {
 	_actorToPrintStrFor = getVarOrDirectByte(0x80);
 	decodeParseString();
 }
 
-void Scumm::o5_printEgo()
+void Scumm_v5::o5_printEgo()
 {
 	_actorToPrintStrFor = (unsigned char)_vars[VAR_EGO];
 	decodeParseString();
 }
 
-void Scumm::o5_pseudoRoom()
+void Scumm_v5::o5_pseudoRoom()
 {
 	int i = fetchScriptByte(), j;
 	while ((j = fetchScriptByte()) != 0) {
@@ -1480,7 +1480,7 @@
 	}
 }
 
-void Scumm::o5_putActor()
+void Scumm_v5::o5_putActor()
 {
 	int x, y;
 	Actor *a;
@@ -1495,7 +1495,7 @@
 }
 
 
-void Scumm::o5_putActorAtObject()
+void Scumm_v5::o5_putActorAtObject()
 {
 	int obj, x, y;
 	Actor *a;
@@ -1511,7 +1511,7 @@
 	a->putActor(x, y, a->room);
 }
 
-void Scumm::o5_putActorInRoom()
+void Scumm_v5::o5_putActorInRoom()
 {
 	int room;
 	Actor *a;
@@ -1528,7 +1528,7 @@
 		a->putActor(0, 0, 0);
 }
 
-void Scumm::o5_quitPauseRestart()
+void Scumm_v5::o5_quitPauseRestart()
 {
 	switch (fetchScriptByte()) {
 	case 1:
@@ -1540,7 +1540,7 @@
 	}
 }
 
-void Scumm::o5_resourceRoutines()
+void Scumm_v5::o5_resourceRoutines()
 {
 	const ResTypes resType[4] = { rtScript, rtSound, rtCostume, rtRoom };
 	int resid = 0;
@@ -1662,7 +1662,7 @@
 	}
 }
 
-void Scumm::o5_roomOps()
+void Scumm_v5::o5_roomOps()
 {
 	int a = 0, b = 0, c, d, e;
 
@@ -1868,7 +1868,7 @@
 	}
 }
 
-void Scumm::o5_saveRestoreVerbs()
+void Scumm_v5::o5_saveRestoreVerbs()
 {
 	int a, b, c, slot, slot2;
 
@@ -1918,12 +1918,12 @@
 	}
 }
 
-void Scumm::o5_setCameraAt()
+void Scumm_v5::o5_setCameraAt()
 {
 	setCameraAtEx(getVarOrDirectWord(0x80));
 }
 
-void Scumm::o5_setObjectName()
+void Scumm_v5::o5_setObjectName()
 {
 	int obj = getVarOrDirectWord(0x80);
 	int size;
@@ -1978,7 +1978,7 @@
 	runHook(0);
 }
 
-void Scumm::o5_setOwnerOf()
+void Scumm_v5::o5_setOwnerOf()
 {
 	int obj, owner;
 
@@ -1988,7 +1988,7 @@
 	setOwnerOf(obj, owner);
 }
 
-void Scumm::o5_setState()
+void Scumm_v5::o5_setState()
 {
 	int obj, state;
 	obj = getVarOrDirectWord(0x80);
@@ -1999,7 +1999,7 @@
 		clearDrawObjectQueue();
 }
 
-void Scumm::o5_setVarRange()
+void Scumm_v5::o5_setVarRange()
 {
 	int a, b;
 
@@ -2016,7 +2016,7 @@
 	} while (--a);
 }
 
-void Scumm::o5_soundKludge()
+void Scumm_v5::o5_soundKludge()
 {
 	int16 items[15];
 	int i;
@@ -2041,12 +2041,12 @@
 	_sound->soundKludge(items);
 }
 
-void Scumm::o5_startMusic()
+void Scumm_v5::o5_startMusic()
 {
 	_sound->addSoundToQueue(getVarOrDirectByte(0x80));
 }
 
-void Scumm::o5_startObject()
+void Scumm_v5::o5_startObject()
 {
 	int obj, script;
 	int16 data[16];
@@ -2058,7 +2058,7 @@
 	runVerbCode(obj, script, 0, 0, data);
 }
 
-void Scumm::o5_startScript()
+void Scumm_v5::o5_startScript()
 {
 	int op, script;
 	int16 data[16];
@@ -2078,7 +2078,7 @@
 	runScript(script, a, b, data);
 }
 
-void Scumm::o5_startSound()
+void Scumm_v5::o5_startSound()
 {
 
 	_vars[VAR_MUSIC_FLAG] = 0;
@@ -2086,22 +2086,22 @@
 	_sound->addSoundToQueue(getVarOrDirectByte(0x80));
 }
 
-void Scumm::o5_stopMusic()
+void Scumm_v5::o5_stopMusic()
 {
 	_sound->stopAllSounds();
 }
 
-void Scumm::o5_stopObjectCode()
+void Scumm_v5::o5_stopObjectCode()
 {
 	stopObjectCode();
 }
 
-void Scumm::o5_stopObjectScript()
+void Scumm_v5::o5_stopObjectScript()
 {
 	stopObjectScript(getVarOrDirectWord(0x80));
 }
 
-void Scumm::o5_stopScript()
+void Scumm_v5::o5_stopScript()
 {
 	int script;
 
@@ -2112,12 +2112,12 @@
 		stopScriptNr(script);
 }
 
-void Scumm::o5_stopSound()
+void Scumm_v5::o5_stopSound()
 {
 	_sound->stopSound(getVarOrDirectByte(0x80));
 }
 
-void Scumm::o5_stringOps()
+void Scumm_v5::o5_stringOps()
 {
 	int a, b, c, i;
 	byte *ptr;
@@ -2173,7 +2173,7 @@
 	}
 }
 
-void Scumm::o5_subtract()
+void Scumm_v5::o5_subtract()
 {
 	int a;
 	getResultPos();
@@ -2181,7 +2181,7 @@
 	setResult(readVar(_resultVarNumber) - a);
 }
 
-void Scumm::o5_verbOps()
+void Scumm_v5::o5_verbOps()
 {
 	int verb, slot;
 	VerbSlot *vs;
@@ -2322,7 +2322,7 @@
 	verbMouseOver(0);
 }
 
-void Scumm::o5_wait()
+void Scumm_v5::o5_wait()
 {
 	byte *oldaddr;
 
@@ -2365,7 +2365,7 @@
 	o5_breakHere();
 }
 
-void Scumm::o5_walkActorTo()
+void Scumm_v5::o5_walkActorTo()
 {
 	int x, y;
 	Actor *a;
@@ -2375,7 +2375,7 @@
 	a->startWalkActor(x, y, -1);
 }
 
-void Scumm::o5_walkActorToActor()
+void Scumm_v5::o5_walkActorToActor()
 {
 	int b, x, y;
 	Actor *a, *a2;
@@ -2421,7 +2421,7 @@
 	a->startWalkActor(x, y, -1);
 }
 
-void Scumm::o5_walkActorToObject()
+void Scumm_v5::o5_walkActorToObject()
 {
 	int obj;
 	Actor *a;
@@ -2437,7 +2437,7 @@
 	}
 }
 
-int Scumm::getWordVararg(int16 *ptr)
+int Scumm_v5::getWordVararg(int16 *ptr)
 {
 	int i;
 
@@ -2451,21 +2451,21 @@
 	return i;
 }
 
-int Scumm::getVarOrDirectWord(byte mask)
+int Scumm_v5::getVarOrDirectWord(byte mask)
 {
 	if (_opcode & mask)
 		return readVar(fetchScriptWord());
 	return (int16)fetchScriptWord();
 }
 
-int Scumm::getVarOrDirectByte(byte mask)
+int Scumm_v5::getVarOrDirectByte(byte mask)
 {
 	if (_opcode & mask)
 		return readVar(fetchScriptWord());
 	return fetchScriptByte();
 }
 
-void Scumm::decodeParseString()
+void Scumm_v5::decodeParseString()
 {
 	int textSlot;
 
@@ -2572,7 +2572,7 @@
 	_string[textSlot].t_charset = _string[textSlot].charset;
 }
 
-void Scumm::o5_oldRoomEffect()
+void Scumm_v5::o5_oldRoomEffect()
 {
 	int a;
 
@@ -2588,7 +2588,7 @@
 	}
 }
 
-void Scumm::o5_pickupObjectOld()
+void Scumm_v5::o5_pickupObjectOld()
 {
 	int obj = getVarOrDirectWord(0x80);
 

Index: script_v6.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v6.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- script_v6.cpp	15 Dec 2002 20:53:11 -0000	1.4
+++ script_v6.cpp	16 Dec 2002 12:12:31 -0000	1.5
@@ -35,11 +35,11 @@
 #include "dialogs.h"		// FIXME: This is just for the FT-INSANE warning. 
 				// Remove when INSANE is implemented
 
-#define OPCODE(x)	{ &Scumm::x, #x }
+#define OPCODE(x)	{ &Scumm_v6::x, #x }
 
-void Scumm::setupOpcodes_V6()
+void Scumm_v6::setupOpcodes()
 {
-	static const OpcodeEntry opcodes[256] = {
+	static const OpcodeEntryV6 opcodes[256] = {
[...1210 lines suppressed...]
 	Actor *a;
 
@@ -2854,7 +2854,7 @@
 	push(a->layer);
 }
 
-void Scumm::o6_unknownCD() {
+void Scumm_v6::o6_unknownCD() {
 	// Full Throttle: FIXME
 	//		  Opcode is used when placing the bunny into the
 	//		  mine field. Some kind of drawBlastObject() wrapper
@@ -2866,7 +2866,7 @@
 	warning("o6_unknownCD: stub(%d, %d, %d, %d)", a, b, c, d);
 }
 
-void Scumm::decodeParseString2(int m, int n)
+void Scumm_v6::decodeParseString2(int m, int n)
 {
 	byte b;
 

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -d -r1.83 -r1.84
--- scumm.h	15 Dec 2002 23:40:37 -0000	1.83
+++ scumm.h	16 Dec 2002 12:12:31 -0000	1.84
@@ -34,6 +34,8 @@
 class Dialog;
 class ConsoleDialog;
 class Scumm;
+class Scumm_v5;
+class Scumm_v6;
 class IMuse;
 class IMuseDigital;
 class Actor;
@@ -43,10 +45,16 @@
 class Serializer;
 struct FindObjectInRoom;
 
-typedef void (Scumm::*OpcodeProc)();
+typedef void (Scumm_v5::*OpcodeProcV5)();
+typedef void (Scumm_v6::*OpcodeProcV6)();
 
-struct OpcodeEntry {
-	OpcodeProc proc;
+struct OpcodeEntryV5 {
+	OpcodeProcV5 proc;
+	const char *desc;
+};
+
+struct OpcodeEntryV6 {
+	OpcodeProcV6 proc;
 	const char *desc;
 };
 
@@ -413,8 +421,7 @@
 	/* Not sure where this stuff goes */
 	byte isMaskActiveAt(int l, int t, int r, int b, byte *mem);
 	void startScene(int room, Actor *a, int b);
-	void setupScummVarsOld();	// Both of these will simply be one
-	void setupScummVarsNew();	// 'setupScummVars' in each Scumm_Vx
+	virtual void setupScummVars();
 	byte *_objectOwnerTable, *_objectRoomTable, *_objectStateTable;
 	byte _numObjectsInRoom;
 	int8 _userPut;
@@ -454,12 +461,14 @@
 	byte *_scriptPointer, *_scriptOrgPointer, *_scriptPointerStart;
 	byte _opcode, _numNestedScripts, _currentScript;
 	uint16 _curExecScript;
-	const OpcodeEntry *_opcodes;
 	byte **_lastCodePtr;
 	int _resultVarNumber, _scummStackPos;
 	int16 _localParamList[16],  _scummStack[150];
 	
-	OpcodeProc getOpcode(int i) { return _opcodes[i].proc; }
+	virtual void setupOpcodes() = 0;
+	virtual void executeOpcode(int i) = 0;
+	virtual const char *getOpcodeDesc(int i) = 0;
+
 	void initializeLocals(int slot, int16 *vars);
 	int	getScriptSlot();
 	void runScript(int script, int a, int b, int16 *lvarptr);
@@ -473,14 +482,12 @@
 	int fetchScriptWord();
 	void ignoreScriptWord() { fetchScriptWord(); }
 	void ignoreScriptByte() { fetchScriptByte(); }
-	int getVarOrDirectWord(byte mask);
-	int getVarOrDirectByte(byte mask);
 	void getResultPos();
 	void setResult(int result);
-	int readVar(uint var);
-	void writeVar(uint var, int value);
 	void push(int a);
 	int pop();
+	int readVar(uint var);
+	void writeVar(uint var, int value);
 	void runHook(int i);
 	bool isScriptInUse(int script);
 	int getStringLen(byte *ptr);
@@ -488,9 +495,6 @@
 	void freezeScripts(int scr);
 	void unfreezeScripts();
 	void runAllScripts();
-	void setupOpcodes_V5();
-	void setupOpcodes_V6();	
-	//void setupOpcodes_V8();	
 	void cutscene(int16 *args);
 	void endCutscene();
 	void exitCutscene();
@@ -507,10 +511,7 @@
 	void arrayop_1(int a, byte *ptr);
 	void copyString(byte *dst, byte *src, int len);
 	void doSentence(int c, int b, int a);
-	int popRoomAndObj(int *room);
-	int getWordVararg(int16 *ptr);
-	void decodeParseString();
-	void decodeParseString2(int a, int b);
+	void setStringVars(int i);
 
 	/* Script VM or Object class? */
 	void stopObjectCode();
@@ -937,6 +938,152 @@
 	uint32 fileReadDword() { return _fileHandle.readUint32BE(); }
 #endif
 
+	/* Scumm Vars */
+	byte VAR_EGO;
+	byte VAR_CAMERA_POS_X;
+	byte VAR_HAVE_MSG;
+	byte VAR_ROOM;
+	byte VAR_OVERRIDE;
+	byte VAR_MACHINE_SPEED;
+	byte VAR_ME;
+	byte VAR_NUM_ACTOR;
+	byte VAR_CURRENT_LIGHTS;
+	byte VAR_CURRENTDRIVE;
+	byte VAR_TMR_1;
+	byte VAR_TMR_2;
+	byte VAR_TMR_3;
+	byte VAR_MUSIC_FLAG;
+	byte VAR_ACTOR_RANGE_MIN;
+	byte VAR_ACTOR_RANGE_MAX;
+	byte VAR_CAMERA_MIN_X;
+	byte VAR_CAMERA_MAX_X;
+	byte VAR_TIMER_NEXT;
+	byte VAR_VIRT_MOUSE_X;
+	byte VAR_VIRT_MOUSE_Y;
+	byte VAR_ROOM_RESOURCE;
+	byte VAR_LAST_SOUND;
+	byte VAR_CUTSCENEEXIT_KEY;
+	byte VAR_OPTIONS_KEY;
+	byte VAR_TALK_ACTOR;
+	byte VAR_CAMERA_FAST_X;
+	byte VAR_SCROLL_SCRIPT;
+	byte VAR_ENTRY_SCRIPT;
+	byte VAR_ENTRY_SCRIPT2;
+	byte VAR_EXIT_SCRIPT;
+	byte VAR_EXIT_SCRIPT2;
+	byte VAR_VERB_SCRIPT;
+	byte VAR_SENTENCE_SCRIPT;
+	byte VAR_HOOK_SCRIPT;
+	byte VAR_CUTSCENE_START_SCRIPT;
+	byte VAR_CUTSCENE_END_SCRIPT;
+	byte VAR_CHARINC;
+	byte VAR_WALKTO_OBJ;
+	byte VAR_DEBUGMODE;
+	byte VAR_HEAPSPACE;
+	byte VAR_RESTART_KEY;
+	byte VAR_PAUSE_KEY;
+	byte VAR_MOUSE_X;
+	byte VAR_MOUSE_Y;
+	byte VAR_TIMER;
+	byte VAR_TMR_4;
+	byte VAR_SOUNDCARD;
+	byte VAR_VIDEOMODE;
+	byte VAR_SAVELOADDIALOG_KEY;
+	byte VAR_FIXEDDISK;
+	byte VAR_CURSORSTATE;
+	byte VAR_USERPUT;
+	byte VAR_SOUNDRESULT;
+	byte VAR_TALKSTOP_KEY;
+	byte VAR_59;
+	
+	byte VAR_SOUNDPARAM;
+	byte VAR_SOUNDPARAM2;
+	byte VAR_SOUNDPARAM3;
+	byte VAR_MOUSEPRESENT;
+	byte VAR_PERFORMANCE_1;
+	byte VAR_PERFORMANCE_2;
+	byte VAR_ROOM_FLAG;
+	byte VAR_GAME_LOADED;
+	byte VAR_NEW_ROOM;
+	byte VAR_VERSION;
+
+	byte VAR_V5_DRAWFLAGS;
+	byte VAR_MI1_TIMER;
+	byte VAR_V5_OBJECT_LO;
+	byte VAR_V5_OBJECT_HI;
+	byte VAR_V5_TALK_STRING_Y;
+	byte VAR_V5_CHARFLAG;
+
+	byte VAR_V6_SCREEN_WIDTH;
+	byte VAR_V6_SCREEN_HEIGHT;
+	byte VAR_V6_EMSSPACE;
+	byte VAR_V6_RANDOM_NR;
+
+	byte VAR_STRING2DRAW;
+	byte VAR_CAMERA_POS_Y;
+
+	byte VAR_CAMERA_MIN_Y;
+	byte VAR_CAMERA_MAX_Y;
+	byte VAR_CAMERA_THRESHOLD_X;
+	byte VAR_CAMERA_THRESHOLD_Y;
+	byte VAR_CAMERA_SPEED_X;
+	byte VAR_CAMERA_SPEED_Y;
+	byte VAR_CAMERA_ACCEL_X;
+	byte VAR_CAMERA_ACCEL_Y;
+
+	byte VAR_CAMERA_DEST_X;
+
+	byte VAR_CAMERA_DEST_Y;
+
+	byte VAR_CAMERA_FOLLOWED_ACTOR;
+
+	byte VAR_LEFTBTN_DOWN;
+	byte VAR_RIGHTBTN_DOWN;
+	byte VAR_LEFTBTN_HOLD;
+	byte VAR_RIGHTBTN_HOLD;
+
+	byte VAR_UNK_SCRIPT;
+	byte VAR_UNK_SCRIPT_2;
+
+	byte VAR_DEFAULT_TALK_DELAY;
+	byte VAR_CHARSET_MASK;
+
+	byte VAR_CUSTOMSCALETABLE;
+	byte VAR_VIDEONAME;
+	byte VAR_V6_SOUNDMODE;
+
+	void launch();
+
+	Scumm(GameDetector *detector, OSystem *syst);
+	virtual ~Scumm();
+
+	void go();
+
+	void waitForTimer(int msec_delay);
+
+	void updateCursor();
+	void animateCursor();
+	void updatePalette();
+};
+
+class Scumm_v5 : public Scumm
+{
+protected:
+	const OpcodeEntryV5 *_opcodesV5;
+	
+public:
+	Scumm_v5(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
+
+protected:
+	virtual void setupOpcodes();
+	virtual void executeOpcode(int i);
+	virtual const char *getOpcodeDesc(int i);
+
+	void decodeParseString();
+	int getWordVararg(int16 *ptr);
+	int getVarOrDirectWord(byte mask);
+	int getVarOrDirectByte(byte mask);
+
 	/* Version 5 script opcodes */
 	void o5_actorFollowCamera();
 	void o5_actorFromPos();
@@ -1043,12 +1190,57 @@
 	void o5_walkActorToObject();
     void o5_oldRoomEffect();
 	void o5_pickupObjectOld();
+};
 
-	/* Version 6 script opcodes */
+// FIXME - subclassing V2 from Scumm_v5 is a hack: V2 should have its own opcode table
+class Scumm_v2 : public Scumm_v5
+{
+public:
+	Scumm_v2(GameDetector *detector, OSystem *syst) : Scumm_v5(detector, syst) {}
+
+	virtual void readIndexFile();
+};
+
+// FIXME - maybe we should move the opcodes from v5 to v3, and change the inheritance 
+// accordingly - that would be more logical I guess. However, if you do so, take care
+// of preserving the right readIndexFile / loadCharset !!!
+class Scumm_v3 : public Scumm_v5
+{
+public:
+	Scumm_v3(GameDetector *detector, OSystem *syst) : Scumm_v5(detector, syst) {}
+
+	void readIndexFile();
+	virtual void loadCharset(int no);
+};
+
+class Scumm_v4 : public Scumm_v3
+{
+public:
+	Scumm_v4(GameDetector *detector, OSystem *syst) : Scumm_v3(detector, syst) {}
+
+	void loadCharset(int no);
+};
+
+class Scumm_v6 : public Scumm
+{
+protected:
+	const OpcodeEntryV6 *_opcodesV6;
+	
+public:
+	Scumm_v6(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
+
+protected:
+	virtual void setupOpcodes();
+
+	virtual void executeOpcode(int i);
+	virtual const char *getOpcodeDesc(int i);
+
+	int popRoomAndObj(int *room);
+
+	void decodeParseString2(int a, int b);
 	int getStackList(int16 *args, uint maxnum);
-	void setStringVars(int i);
-	void unkMiscOp9();
 
+	/* Version 6 script opcodes */
 	void o6_setBlastObjectWindow();
 	void o6_pushByte();
 	void o6_pushWord();
@@ -1180,6 +1372,7 @@
 	void o6_talkActor();
 	void o6_talkEgo();
 	void o6_dim();
+	void o6_dummy();
 	void o6_runVerbCodeQuick();
 	void o6_runScriptQuick();
 	void o6_dim2();
@@ -1187,7 +1380,6 @@
 	void o6_distObjectObject();
 	void o6_distObjectPt();
 	void o6_distPtPt();
-	void o6_dummy_stacklist();
 	void o6_miscOps();
 	void o6_delayFrames();
 	void o6_pickOneOf();
@@ -1201,177 +1393,15 @@
 	void o6_unknownCD();
 	void o6_bor();
 	void o6_band();
-	// void o7_userfaceOps();
-
-	/* Scumm Vars */
-	byte VAR_EGO;
-	byte VAR_CAMERA_POS_X;
-	byte VAR_HAVE_MSG;
-	byte VAR_ROOM;
-	byte VAR_OVERRIDE;
-	byte VAR_MACHINE_SPEED;
-	byte VAR_ME;
-	byte VAR_NUM_ACTOR;
-	byte VAR_CURRENT_LIGHTS;
-	byte VAR_CURRENTDRIVE;
-	byte VAR_TMR_1;
-	byte VAR_TMR_2;
-	byte VAR_TMR_3;
-	byte VAR_MUSIC_FLAG;
-	byte VAR_ACTOR_RANGE_MIN;
-	byte VAR_ACTOR_RANGE_MAX;
-	byte VAR_CAMERA_MIN_X;
-	byte VAR_CAMERA_MAX_X;
-	byte VAR_TIMER_NEXT;
-	byte VAR_VIRT_MOUSE_X;
-	byte VAR_VIRT_MOUSE_Y;
-	byte VAR_ROOM_RESOURCE;
-	byte VAR_LAST_SOUND;
-	byte VAR_CUTSCENEEXIT_KEY;
-	byte VAR_OPTIONS_KEY;
-	byte VAR_TALK_ACTOR;
-	byte VAR_CAMERA_FAST_X;
-	byte VAR_SCROLL_SCRIPT;
-	byte VAR_ENTRY_SCRIPT;
-	byte VAR_ENTRY_SCRIPT2;
-	byte VAR_EXIT_SCRIPT;
-	byte VAR_EXIT_SCRIPT2;
-	byte VAR_VERB_SCRIPT;
-	byte VAR_SENTENCE_SCRIPT;
-	byte VAR_HOOK_SCRIPT;
-	byte VAR_CUTSCENE_START_SCRIPT;
-	byte VAR_CUTSCENE_END_SCRIPT;
-	byte VAR_CHARINC;
-	byte VAR_WALKTO_OBJ;
-	byte VAR_DEBUGMODE;
-	byte VAR_HEAPSPACE;
-	byte VAR_RESTART_KEY;
-	byte VAR_PAUSE_KEY;
-	byte VAR_MOUSE_X;
-	byte VAR_MOUSE_Y;
-	byte VAR_TIMER;
-	byte VAR_TMR_4;
-	byte VAR_SOUNDCARD;
-	byte VAR_VIDEOMODE;
-	byte VAR_SAVELOADDIALOG_KEY;
-	byte VAR_FIXEDDISK;
-	byte VAR_CURSORSTATE;
-	byte VAR_USERPUT;
-	byte VAR_SOUNDRESULT;
-	byte VAR_TALKSTOP_KEY;
-	byte VAR_59;
-	
-	byte VAR_SOUNDPARAM;
-	byte VAR_SOUNDPARAM2;
-	byte VAR_SOUNDPARAM3;
-	byte VAR_MOUSEPRESENT;
-	byte VAR_PERFORMANCE_1;
-	byte VAR_PERFORMANCE_2;
-	byte VAR_ROOM_FLAG;
-	byte VAR_GAME_LOADED;
-	byte VAR_NEW_ROOM;
-	byte VAR_VERSION;
-
-	byte VAR_V5_DRAWFLAGS;
-	byte VAR_MI1_TIMER;
-	byte VAR_V5_OBJECT_LO;
-	byte VAR_V5_OBJECT_HI;
-	byte VAR_V5_TALK_STRING_Y;
-	byte VAR_V5_CHARFLAG;
-
-	byte VAR_V6_SCREEN_WIDTH;
-	byte VAR_V6_SCREEN_HEIGHT;
-	byte VAR_V6_EMSSPACE;
-	byte VAR_V6_RANDOM_NR;
-
-	byte VAR_STRING2DRAW;
-	byte VAR_CAMERA_POS_Y;
-
-	byte VAR_CAMERA_MIN_Y;
-	byte VAR_CAMERA_MAX_Y;
-	byte VAR_CAMERA_THRESHOLD_X;
-	byte VAR_CAMERA_THRESHOLD_Y;
-	byte VAR_CAMERA_SPEED_X;
-	byte VAR_CAMERA_SPEED_Y;
-	byte VAR_CAMERA_ACCEL_X;
-	byte VAR_CAMERA_ACCEL_Y;
-
-	byte VAR_CAMERA_DEST_X;
-
-	byte VAR_CAMERA_DEST_Y;
-
-	byte VAR_CAMERA_FOLLOWED_ACTOR;
-
-	byte VAR_LEFTBTN_DOWN;
-	byte VAR_RIGHTBTN_DOWN;
-	byte VAR_LEFTBTN_HOLD;
-	byte VAR_RIGHTBTN_HOLD;
-
-	byte VAR_UNK_SCRIPT;
-	byte VAR_UNK_SCRIPT_2;
-
-	byte VAR_DEFAULT_TALK_DELAY;
-	byte VAR_CHARSET_MASK;
-
-	byte VAR_CUSTOMSCALETABLE;
-	byte VAR_VIDEONAME;
-	byte VAR_V6_SOUNDMODE;
-
-	void launch();
-
-	Scumm(GameDetector *detector, OSystem *syst);
-	virtual ~Scumm();
-
-	void go();
-
-	void waitForTimer(int msec_delay);
-
-	void updateCursor();
-	void animateCursor();
-	void updatePalette();
-};
-
-class Scumm_v2 : public Scumm
-{
-public:
-	Scumm_v2(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
-
-	virtual void readIndexFile();
-};
-
-class Scumm_v3 : public Scumm
-{
-public:
-	Scumm_v3(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
-
-	void readIndexFile();
-	virtual void loadCharset(int no);
 };
 
-class Scumm_v4 : public Scumm_v3
-{
-public:
-	Scumm_v4(GameDetector *detector, OSystem *syst) : Scumm_v3(detector, syst) {}
-
-	void loadCharset(int no);
-};
-
-class Scumm_v5 : public Scumm
-{
-public:
-	Scumm_v5(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
-};
-
-class Scumm_v6 : public Scumm
+class Scumm_v7 : public Scumm_v6
 {
 public:
-	Scumm_v6(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
-};
+	Scumm_v7(GameDetector *detector, OSystem *syst) : Scumm_v6(detector, syst) {}
 
-class Scumm_v7 : public Scumm
-{
-public:
-	Scumm_v7(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
+protected:
+	virtual void setupScummVars();
 };
 
 // This is a constant lookup table of reverse bit masks

Index: scummvm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scummvm.cpp,v
retrieving revision 1.98
retrieving revision 1.99
diff -u -d -r1.98 -r1.99
--- scummvm.cpp	16 Dec 2002 06:21:08 -0000	1.98
+++ scummvm.cpp	16 Dec 2002 12:12:31 -0000	1.99
@@ -1224,11 +1224,6 @@
 	st->charset = st->t_charset;
 }
 
-void Scumm::unkMiscOp9()
-{
-	warning("stub unkMiscOp9()");
-}
-
 void Scumm::startManiac()
 {
 	warning("stub startManiac()");
@@ -1535,10 +1530,7 @@
 	allocResTypeData(rtBuffer, MKID('NONE'), 10, "buffer", 0);
 	initVirtScreen(0, 0, 0, _realWidth, _realHeight, false, false);
 
-	if (_features & GF_AFTER_V7)
-		setupScummVarsNew();
-	else
-		setupScummVarsOld();
+	setupScummVars();
 
 	if ((_features & GF_AFTER_V7) || (_gameId == GID_SAMNMAX))
 		NUM_ACTORS = 30;
@@ -1559,10 +1551,7 @@
 
 	readIndexFile();
 
-	if (_features & GF_AFTER_V6)
-		setupOpcodes_V6();
-	else
-		setupOpcodes_V5();
+	setupOpcodes();
 
 	scummInit();
 

Index: vars.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/vars.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- vars.cpp	15 Dec 2002 20:16:43 -0000	1.4
+++ vars.cpp	16 Dec 2002 12:12:31 -0000	1.5
@@ -24,9 +24,8 @@
 #include "stdafx.h"
 #include "scumm.h"
 
-void Scumm::setupScummVarsOld()
+void Scumm::setupScummVars()
 {
-
 	VAR_EGO = 1;
 	VAR_CAMERA_POS_X = 2;
 	VAR_HAVE_MSG = 3;
@@ -112,7 +111,7 @@
 }
 
 
-void Scumm::setupScummVarsNew()
+void Scumm_v7::setupScummVars()
 {
 	VAR_MOUSE_X = 1;
 	VAR_MOUSE_Y = 2;





More information about the Scummvm-git-logs mailing list