[Scummvm-cvs-logs] SF.net SVN: scummvm:[41601] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Wed Jun 17 06:15:45 CEST 2009


Revision: 41601
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41601&view=rev
Author:   drmccoy
Date:     2009-06-17 04:15:45 +0000 (Wed, 17 Jun 2009)

Log Message:
-----------
Changed opcodeDraw to be functor-based

Modified Paths:
--------------
    scummvm/trunk/engines/gob/inter.cpp
    scummvm/trunk/engines/gob/inter.h
    scummvm/trunk/engines/gob/inter_bargon.cpp
    scummvm/trunk/engines/gob/inter_fascin.cpp
    scummvm/trunk/engines/gob/inter_v1.cpp
    scummvm/trunk/engines/gob/inter_v2.cpp
    scummvm/trunk/engines/gob/inter_v3.cpp
    scummvm/trunk/engines/gob/inter_v4.cpp
    scummvm/trunk/engines/gob/inter_v5.cpp
    scummvm/trunk/engines/gob/inter_v6.cpp

Modified: scummvm/trunk/engines/gob/inter.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter.cpp	2009-06-17 03:14:22 UTC (rev 41600)
+++ scummvm/trunk/engines/gob/inter.cpp	2009-06-17 04:15:45 UTC (rev 41601)
@@ -67,6 +67,21 @@
 	delocateVars();
 }
 
+void Inter::NsetupOpcodes() {
+	setupOpcodesDraw();
+}
+
+void Inter::executeOpcodeDraw(byte i) {
+	if (_opcodesDraw[i].proc && _opcodesDraw[i].proc->isValid())
+		(*_opcodesDraw[i].proc)();
+	else
+		warning("unimplemented opcodeDraw: %d", i);
+}
+
+const char *Inter::getDescOpcodeDraw(byte i) {
+	return _opcodesDraw[i].desc;
+}
+
 void Inter::initControlVars(char full) {
 	*_nestLevel = 0;
 	*_breakFromLevel = -1;

Modified: scummvm/trunk/engines/gob/inter.h
===================================================================
--- scummvm/trunk/engines/gob/inter.h	2009-06-17 03:14:22 UTC (rev 41600)
+++ scummvm/trunk/engines/gob/inter.h	2009-06-17 04:15:45 UTC (rev 41601)
@@ -26,6 +26,8 @@
 #ifndef GOB_INTER_H
 #define GOB_INTER_H
 
+#include "common/func.h"
+
 #include "gob/goblin.h"
 #include "gob/variables.h"
 
@@ -34,6 +36,36 @@
 // This is to help devices with small memory (PDA, smartphones, ...)
 // to save abit of memory used by opcode names in the Scumm engine.
 #ifndef REDUCE_MEMORY_USAGE
+	#define _OPCODEDRAW(ver, x)  setProc(new Common::Functor0Mem<void, ver>(this, &ver::x), #x)
+#else
+	#define _OPCODEDRAW(ver, x)  setProc(new Common::Functor0Mem<void, ver>(this, &ver::x), "")
+#endif
+
+#define CLEAROPCODEDRAW(i) _opcodesDraw[i].setProc(0, 0);
+
+typedef Common::Functor0<void> OpcodeDraw;
+
+struct OpcodeDrawEntry : Common::NonCopyable {
+	OpcodeDraw *proc;
+	const char *desc;
+
+	OpcodeDrawEntry() : proc(0), desc(0) {}
+	~OpcodeDrawEntry() {
+		setProc(0, 0);
+	}
+
+	void setProc(OpcodeDraw *p, const char *d) {
+		if (proc != p) {
+			delete proc;
+			proc = p;
+		}
+		desc = d;
+	}
+};
+
+// This is to help devices with small memory (PDA, smartphones, ...)
+// to save abit of memory used by opcode names in the Scumm engine.
+#ifndef REDUCE_MEMORY_USAGE
 # define _OPCODE(ver, x)  { &ver::x, #x }
 #else
 # define _OPCODE(ver, x)  { &ver::x, "" }
@@ -85,6 +117,8 @@
 		Goblin::Gob_Object *objDesc;
 	};
 
+	OpcodeDrawEntry _opcodesDraw[256];
+
 	bool _break;
 
 	int16 _animPalLowIndex[8];
@@ -99,11 +133,16 @@
 
 	GobEngine *_vm;
 
+	void NsetupOpcodes();
+	void executeOpcodeDraw(byte i);
+
+	const char *getDescOpcodeDraw(byte i);
+
+	virtual void setupOpcodesDraw() = 0;
+
 	virtual void setupOpcodes() = 0;
-	virtual void executeDrawOpcode(byte i) = 0;
 	virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams &params) = 0;
 	virtual void executeGoblinOpcode(int i, OpGobParams &params) = 0;
-	virtual const char *getOpcodeDrawDesc(byte i) = 0;
 	virtual const char *getOpcodeFuncDesc(byte i, byte j) = 0;
 	virtual const char *getOpcodeGoblinDesc(int i) = 0;
 
@@ -123,13 +162,8 @@
 	virtual void animPalette();
 
 protected:
-	typedef void (Inter_v1::*OpcodeDrawProcV1)();
 	typedef bool (Inter_v1::*OpcodeFuncProcV1)(OpFuncParams &);
 	typedef void (Inter_v1::*OpcodeGoblinProcV1)(OpGobParams &);
-	struct OpcodeDrawEntryV1 {
-		OpcodeDrawProcV1 proc;
-		const char *desc;
-	};
 	struct OpcodeFuncEntryV1 {
 		OpcodeFuncProcV1 proc;
 		const char *desc;
@@ -138,16 +172,15 @@
 		OpcodeGoblinProcV1 proc;
 		const char *desc;
 	};
-	const OpcodeDrawEntryV1 *_opcodesDrawV1;
 	const OpcodeFuncEntryV1 *_opcodesFuncV1;
 	const OpcodeGoblinEntryV1 *_opcodesGoblinV1;
 	static const int _goblinFuncLookUp[][2];
 
+	virtual void setupOpcodesDraw();
+
 	virtual void setupOpcodes();
-	virtual void executeDrawOpcode(byte i);
 	virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams &params);
 	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeDrawDesc(byte i);
 	virtual const char *getOpcodeFuncDesc(byte i, byte j);
 	virtual const char *getOpcodeGoblinDesc(int i);
 
@@ -318,13 +351,8 @@
 	virtual void animPalette();
 
 protected:
-	typedef void (Inter_v2::*OpcodeDrawProcV2)();
 	typedef bool (Inter_v2::*OpcodeFuncProcV2)(OpFuncParams &);
 	typedef void (Inter_v2::*OpcodeGoblinProcV2)(OpGobParams &);
-	struct OpcodeDrawEntryV2 {
-		OpcodeDrawProcV2 proc;
-		const char *desc;
-	};
 	struct OpcodeFuncEntryV2 {
 		OpcodeFuncProcV2 proc;
 		const char *desc;
@@ -333,16 +361,15 @@
 		OpcodeGoblinProcV2 proc;
 		const char *desc;
 	};
-	const OpcodeDrawEntryV2 *_opcodesDrawV2;
 	const OpcodeFuncEntryV2 *_opcodesFuncV2;
 	const OpcodeGoblinEntryV2 *_opcodesGoblinV2;
 	static const int _goblinFuncLookUp[][2];
 
+	virtual void setupOpcodesDraw();
+
 	virtual void setupOpcodes();
-	virtual void executeDrawOpcode(byte i);
 	virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams &params);
 	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeDrawDesc(byte i);
 	virtual const char *getOpcodeFuncDesc(byte i, byte j);
 	virtual const char *getOpcodeGoblinDesc(int i);
 
@@ -410,13 +437,8 @@
 	virtual ~Inter_Bargon() {}
 
 protected:
-	typedef void (Inter_Bargon::*OpcodeDrawProcBargon)();
 	typedef bool (Inter_Bargon::*OpcodeFuncProcBargon)(OpFuncParams &);
 	typedef void (Inter_Bargon::*OpcodeGoblinProcBargon)(OpGobParams &);
-	struct OpcodeDrawEntryBargon {
-		OpcodeDrawProcBargon proc;
-		const char *desc;
-	};
 	struct OpcodeFuncEntryBargon {
 		OpcodeFuncProcBargon proc;
 		const char *desc;
@@ -425,16 +447,15 @@
 		OpcodeGoblinProcBargon proc;
 		const char *desc;
 	};
-	const OpcodeDrawEntryBargon *_opcodesDrawBargon;
 	const OpcodeFuncEntryBargon *_opcodesFuncBargon;
 	const OpcodeGoblinEntryBargon *_opcodesGoblinBargon;
 	static const int _goblinFuncLookUp[][2];
 
+	virtual void setupOpcodesDraw();
+
 	virtual void setupOpcodes();
-	virtual void executeDrawOpcode(byte i);
 	virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams &params);
 	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeDrawDesc(byte i);
 	virtual const char *getOpcodeFuncDesc(byte i, byte j);
 	virtual const char *getOpcodeGoblinDesc(int i);
 
@@ -456,13 +477,8 @@
 	virtual ~Inter_Fascination() {}
 
 protected:
-	typedef void (Inter_Fascination::*OpcodeDrawProcFascination)();
 	typedef bool (Inter_Fascination::*OpcodeFuncProcFascination)(OpFuncParams &);
 	typedef void (Inter_Fascination::*OpcodeGoblinProcFascination)(OpGobParams &);
-	struct OpcodeDrawEntryFascination {
-		OpcodeDrawProcFascination proc;
-		const char *desc;
-	};
 	struct OpcodeFuncEntryFascination {
 		OpcodeFuncProcFascination proc;
 		const char *desc;
@@ -471,16 +487,15 @@
 		OpcodeGoblinProcFascination proc;
 		const char *desc;
 	};
-	const OpcodeDrawEntryFascination *_opcodesDrawFascination;
 	const OpcodeFuncEntryFascination *_opcodesFuncFascination;
 	const OpcodeGoblinEntryFascination *_opcodesGoblinFascination;
 	static const int _goblinFuncLookUp[][2];
 
+	virtual void setupOpcodesDraw();
+
 	virtual void setupOpcodes();
-	virtual void executeDrawOpcode(byte i);
 	virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams &params);
 	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeDrawDesc(byte i);
 	virtual const char *getOpcodeFuncDesc(byte i, byte j);
 	virtual const char *getOpcodeGoblinDesc(int i);
 
@@ -517,13 +532,8 @@
 	virtual ~Inter_v3() {}
 
 protected:
-	typedef void (Inter_v3::*OpcodeDrawProcV3)();
 	typedef bool (Inter_v3::*OpcodeFuncProcV3)(OpFuncParams &);
 	typedef void (Inter_v3::*OpcodeGoblinProcV3)(OpGobParams &);
-	struct OpcodeDrawEntryV3 {
-		OpcodeDrawProcV3 proc;
-		const char *desc;
-	};
 	struct OpcodeFuncEntryV3 {
 		OpcodeFuncProcV3 proc;
 		const char *desc;
@@ -532,16 +542,15 @@
 		OpcodeGoblinProcV3 proc;
 		const char *desc;
 	};
-	const OpcodeDrawEntryV3 *_opcodesDrawV3;
 	const OpcodeFuncEntryV3 *_opcodesFuncV3;
 	const OpcodeGoblinEntryV3 *_opcodesGoblinV3;
 	static const int _goblinFuncLookUp[][2];
 
+	virtual void setupOpcodesDraw();
+
 	virtual void setupOpcodes();
-	virtual void executeDrawOpcode(byte i);
 	virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams &params);
 	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeDrawDesc(byte i);
 	virtual const char *getOpcodeFuncDesc(byte i, byte j);
 	virtual const char *getOpcodeGoblinDesc(int i);
 
@@ -560,13 +569,8 @@
 	virtual ~Inter_v4() {}
 
 protected:
-	typedef void (Inter_v4::*OpcodeDrawProcV4)();
 	typedef bool (Inter_v4::*OpcodeFuncProcV4)(OpFuncParams &);
 	typedef void (Inter_v4::*OpcodeGoblinProcV4)(OpGobParams &);
-	struct OpcodeDrawEntryV4 {
-		OpcodeDrawProcV4 proc;
-		const char *desc;
-	};
 	struct OpcodeFuncEntryV4 {
 		OpcodeFuncProcV4 proc;
 		const char *desc;
@@ -575,16 +579,15 @@
 		OpcodeGoblinProcV4 proc;
 		const char *desc;
 	};
-	const OpcodeDrawEntryV4 *_opcodesDrawV4;
 	const OpcodeFuncEntryV4 *_opcodesFuncV4;
 	const OpcodeGoblinEntryV4 *_opcodesGoblinV4;
 	static const int _goblinFuncLookUp[][2];
 
+	virtual void setupOpcodesDraw();
+
 	virtual void setupOpcodes();
-	virtual void executeDrawOpcode(byte i);
 	virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams &params);
 	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeDrawDesc(byte i);
 	virtual const char *getOpcodeFuncDesc(byte i, byte j);
 	virtual const char *getOpcodeGoblinDesc(int i);
 
@@ -598,13 +601,8 @@
 	virtual ~Inter_v5() {}
 
 protected:
-	typedef void (Inter_v5::*OpcodeDrawProcV5)();
 	typedef bool (Inter_v5::*OpcodeFuncProcV5)(OpFuncParams &);
 	typedef void (Inter_v5::*OpcodeGoblinProcV5)(OpGobParams &);
-	struct OpcodeDrawEntryV5 {
-		OpcodeDrawProcV5 proc;
-		const char *desc;
-	};
 	struct OpcodeFuncEntryV5 {
 		OpcodeFuncProcV5 proc;
 		const char *desc;
@@ -613,16 +611,15 @@
 		OpcodeGoblinProcV5 proc;
 		const char *desc;
 	};
-	const OpcodeDrawEntryV5 *_opcodesDrawV5;
 	const OpcodeFuncEntryV5 *_opcodesFuncV5;
 	const OpcodeGoblinEntryV5 *_opcodesGoblinV5;
 	static const int _goblinFuncLookUp[][2];
 
+	virtual void setupOpcodesDraw();
+
 	virtual void setupOpcodes();
-	virtual void executeDrawOpcode(byte i);
 	virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams &params);
 	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeDrawDesc(byte i);
 	virtual const char *getOpcodeFuncDesc(byte i, byte j);
 	virtual const char *getOpcodeGoblinDesc(int i);
 
@@ -657,13 +654,8 @@
 	virtual ~Inter_v6() {}
 
 protected:
-	typedef void (Inter_v6::*OpcodeDrawProcV6)();
 	typedef bool (Inter_v6::*OpcodeFuncProcV6)(OpFuncParams &);
 	typedef void (Inter_v6::*OpcodeGoblinProcV6)(OpGobParams &);
-	struct OpcodeDrawEntryV6 {
-		OpcodeDrawProcV6 proc;
-		const char *desc;
-	};
 	struct OpcodeFuncEntryV6 {
 		OpcodeFuncProcV6 proc;
 		const char *desc;
@@ -672,18 +664,17 @@
 		OpcodeGoblinProcV6 proc;
 		const char *desc;
 	};
-	const OpcodeDrawEntryV6 *_opcodesDrawV6;
 	const OpcodeFuncEntryV6 *_opcodesFuncV6;
 	const OpcodeGoblinEntryV6 *_opcodesGoblinV6;
 	static const int _goblinFuncLookUp[][2];
 
+	virtual void setupOpcodesDraw();
+	
 	bool _gotFirstPalette;
 
 	virtual void setupOpcodes();
-	virtual void executeDrawOpcode(byte i);
 	virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams &params);
 	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeDrawDesc(byte i);
 	virtual const char *getOpcodeFuncDesc(byte i, byte j);
 	virtual const char *getOpcodeGoblinDesc(int i);
 

Modified: scummvm/trunk/engines/gob/inter_bargon.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_bargon.cpp	2009-06-17 03:14:22 UTC (rev 41600)
+++ scummvm/trunk/engines/gob/inter_bargon.cpp	2009-06-17 04:15:45 UTC (rev 41601)
@@ -40,6 +40,7 @@
 namespace Gob {
 
 #define OPCODE(x) _OPCODE(Inter_Bargon, x)
+#define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(Inter_Bargon, x)
 
 const int Inter_Bargon::_goblinFuncLookUp[][2] = {
 	{1, 0},
@@ -117,332 +118,14 @@
 
 Inter_Bargon::Inter_Bargon(GobEngine *vm) : Inter_v2(vm) {
 	setupOpcodes();
+	NsetupOpcodes();
 }
 
-void Inter_Bargon::setupOpcodes() {
-	static const OpcodeDrawEntryBargon opcodesDraw[256] = {
-		/* 00 */
-		OPCODE(o1_loadMult),
-		OPCODE(o2_playMult),
-		OPCODE(o1_freeMultKeys),
-		{0, ""},
-		/* 04 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		OPCODE(o1_initCursor),
-		/* 08 */
-		OPCODE(o1_initCursorAnim),
-		OPCODE(o1_clearCursorAnim),
-		OPCODE(o2_setRenderFlags),
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		OPCODE(o1_loadAnim),
-		OPCODE(o1_freeAnim),
-		OPCODE(o1_updateAnim),
-		OPCODE(o2_multSub),
-		/* 14 */
-		OPCODE(o2_initMult),
-		OPCODE(o1_freeMult),
-		OPCODE(o1_animate),
-		OPCODE(o2_loadMultObject),
-		/* 18 */
-		OPCODE(o1_getAnimLayerInfo),
-		OPCODE(o1_getObjAnimSize),
-		OPCODE(o1_loadStatic),
-		OPCODE(o1_freeStatic),
-		/* 1C */
-		OPCODE(o2_renderStatic),
-		OPCODE(o2_loadCurLayer),
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		OPCODE(o2_playCDTrack),
-		OPCODE(o2_waitCDTrackEnd),
-		OPCODE(o2_stopCD),
-		OPCODE(o2_readLIC),
-		/* 24 */
-		OPCODE(o2_freeLIC),
-		OPCODE(o2_getCDTrackPos),
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		OPCODE(o2_loadFontToSprite),
-		OPCODE(o1_freeFontToSprite),
-		{0, ""},
-		{0, ""},
-		/* 34 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 38 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 3C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 40 */
-		OPCODE(o2_totSub),
-		OPCODE(o2_switchTotSub),
-		OPCODE(o2_pushVars),
-		OPCODE(o2_popVars),
-		/* 44 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 48 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 4C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 50 */
-		OPCODE(o2_loadMapObjects),
-		OPCODE(o2_freeGoblins),
-		OPCODE(o2_moveGoblin),
-		OPCODE(o2_writeGoblinPos),
-		/* 54 */
-		OPCODE(o2_stopGoblin),
-		OPCODE(o2_setGoblinState),
-		OPCODE(o2_placeGoblin),
-		{0, ""},
-		/* 58 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 5C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 60 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 64 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 68 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 6C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 70 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 74 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 78 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 7C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 80 */
-		OPCODE(o2_initScreen),
-		OPCODE(o2_scroll),
-		OPCODE(o2_setScrollOffset),
-		OPCODE(o2_playImd),
-		/* 84 */
-		OPCODE(o2_getImdInfo),
-		OPCODE(o2_openItk),
-		OPCODE(o2_closeItk),
-		OPCODE(o2_setImdFrontSurf),
-		/* 88 */
-		OPCODE(o2_resetImdFrontSurf),
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 8C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 90 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 94 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 98 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 9C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* AC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* BC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* CC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* DC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* EC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* FC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""}
-	};
+void Inter_Bargon::setupOpcodesDraw() {
+	Inter_v2::setupOpcodesDraw();
+}
 
+void Inter_Bargon::setupOpcodes() {
 	static const OpcodeFuncEntryBargon opcodesFunc[80] = {
 		/* 00 */
 		OPCODE(o1_callSub),
@@ -638,23 +321,10 @@
 		{0, ""},
 	};
 
-	_opcodesDrawBargon = opcodesDraw;
 	_opcodesFuncBargon = opcodesFunc;
 	_opcodesGoblinBargon = opcodesGoblin;
 }
 
-void Inter_Bargon::executeDrawOpcode(byte i) {
-	debugC(1, kDebugDrawOp, "opcodeDraw %d [0x%X] (%s)",
-			i, i, getOpcodeDrawDesc(i));
-
-	OpcodeDrawProcBargon op = _opcodesDrawBargon[i].proc;
-
-	if (op == 0)
-		warning("unimplemented opcodeDraw: %d", i);
-	else
-		(this->*op) ();
-}
-
 bool Inter_Bargon::executeFuncOpcode(byte i, byte j, OpFuncParams &params) {
 	debugC(1, kDebugFuncOp, "opcodeFunc %d.%d [0x%X.0x%X] (%s)",
 			i, j, i, j, getOpcodeFuncDesc(i, j));
@@ -697,10 +367,6 @@
 		(this->*op) (params);
 }
 
-const char *Inter_Bargon::getOpcodeDrawDesc(byte i) {
-	return _opcodesDrawBargon[i].desc;
-}
-
 const char *Inter_Bargon::getOpcodeFuncDesc(byte i, byte j) {
 	if ((i > 4) || (j > 15))
 		return "";

Modified: scummvm/trunk/engines/gob/inter_fascin.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_fascin.cpp	2009-06-17 03:14:22 UTC (rev 41600)
+++ scummvm/trunk/engines/gob/inter_fascin.cpp	2009-06-17 04:15:45 UTC (rev 41601)
@@ -41,6 +41,7 @@
 namespace Gob {
 
 #define OPCODE(x) _OPCODE(Inter_Fascination, x)
+#define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(Inter_Fascination, x)
 
 const int Inter_Fascination::_goblinFuncLookUp[][2] = {
 	{1, 0},
@@ -62,332 +63,44 @@
 
 Inter_Fascination::Inter_Fascination(GobEngine *vm) : Inter_v2(vm) {
 	setupOpcodes();
+	NsetupOpcodes();
 }
 
-void Inter_Fascination::setupOpcodes() {
-	static const OpcodeDrawEntryFascination opcodesDraw[256] = {
-		/* 00 */
-		OPCODE(o1_loadMult),
-		OPCODE(o2_playMult),
-		OPCODE(o1_freeMultKeys),
-		OPCODE(oFascin_cdUnknown3),
-		/* 04 */
-		OPCODE(oFascin_cdUnknown4),
-		OPCODE(oFascin_cdUnknown5),
-		OPCODE(oFascin_cdUnknown6),
-		OPCODE(o1_initCursor),
-		/* 08 */
-		OPCODE(o1_initCursorAnim),
-		OPCODE(o1_clearCursorAnim),
-		OPCODE(oFascin_setRenderFlags),
-		OPCODE(oFascin_cdUnknown11),
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		OPCODE(o1_loadAnim),
-		OPCODE(o1_freeAnim),
-		OPCODE(o1_updateAnim),
-		OPCODE(o2_multSub),
-		/* 14 */
-		OPCODE(o2_initMult),
-		OPCODE(o1_freeMult),
-		OPCODE(o1_animate),
-		OPCODE(o2_loadMultObject),
-		/* 18 */
-		OPCODE(o1_getAnimLayerInfo),
-		OPCODE(o1_getObjAnimSize),
-		OPCODE(o1_loadStatic),
-		OPCODE(o1_freeStatic),
-		/* 1C */
-		OPCODE(o2_renderStatic),
-		OPCODE(o2_loadCurLayer),
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		OPCODE(o2_playCDTrack),
-		OPCODE(o2_waitCDTrackEnd),
-		OPCODE(o2_stopCD),
-		OPCODE(o2_readLIC),
-		/* 24 */
-		OPCODE(o2_freeLIC),
-		OPCODE(o2_getCDTrackPos),
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		OPCODE(o2_loadFontToSprite),
-		OPCODE(o1_freeFontToSprite),
-		{0, ""},
-		{0, ""},
-		/* 34 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 38 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 3C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 40 */
-		OPCODE(o2_totSub),
-		OPCODE(o2_switchTotSub),
-		OPCODE(o2_pushVars),
-		OPCODE(o2_popVars),
-		/* 44 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 48 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 4C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 50 */
-		{0, ""},//OPCODE(o2_loadMapObjects),
-		{0, ""},//OPCODE(o2_freeGoblins),
-		{0, ""},//OPCODE(o2_moveGoblin),
-		{0, ""},//OPCODE(o2_writeGoblinPos),
-		/* 54 */
-		{0, ""},//OPCODE(o2_stopGoblin),
-		{0, ""},//OPCODE(o2_setGoblinState),
-		{0, ""},//OPCODE(o2_placeGoblin),
-		{0, ""},
-		/* 58 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 5C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 60 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 64 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 68 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 6C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 70 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 74 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 78 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 7C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 80 */
-		{0, ""},//OPCODE(o2_initScreen),
-		{0, ""},//OPCODE(o2_scroll),
-		{0, ""},//OPCODE(o2_setScrollOffset),
-		{0, ""},//OPCODE(o2_playImd),
-		/* 84 */
-		{0, ""},//OPCODE(o2_getImdInfo),
-		{0, ""},//OPCODE(o2_openItk),
-		{0, ""},//OPCODE(o2_closeItk),
-		{0, ""},//OPCODE(o2_setImdFrontSurf),
-		/* 88 */
-		{0, ""},//OPCODE(o2_resetImdFrontSurf),
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 8C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 90 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 94 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 98 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 9C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* AC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* BC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* CC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* DC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* EC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* FC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""}
-	};
+void Inter_Fascination::setupOpcodesDraw() {
+	Inter_v2::setupOpcodesDraw();
 
+	OPCODEDRAW(0x03, oFascin_cdUnknown3);
+
+	OPCODEDRAW(0x04, oFascin_cdUnknown4);
+	OPCODEDRAW(0x05, oFascin_cdUnknown5);
+	OPCODEDRAW(0x06, oFascin_cdUnknown6);
+
+	OPCODEDRAW(0x0A, oFascin_setRenderFlags);
+	OPCODEDRAW(0x0B, oFascin_cdUnknown11);
+
+	CLEAROPCODEDRAW(0x50);
+	CLEAROPCODEDRAW(0x51);
+	CLEAROPCODEDRAW(0x52);
+	CLEAROPCODEDRAW(0x53);
+
+	CLEAROPCODEDRAW(0x54);
+	CLEAROPCODEDRAW(0x55);
+	CLEAROPCODEDRAW(0x56);
+
+	CLEAROPCODEDRAW(0x80);
+	CLEAROPCODEDRAW(0x81);
+	CLEAROPCODEDRAW(0x82);
+	CLEAROPCODEDRAW(0x83);
+
+	CLEAROPCODEDRAW(0x84);
+	CLEAROPCODEDRAW(0x85);
+	CLEAROPCODEDRAW(0x86);
+	CLEAROPCODEDRAW(0x87);
+
+	CLEAROPCODEDRAW(0x88);
+}
+
+void Inter_Fascination::setupOpcodes() {
 	static const OpcodeFuncEntryFascination opcodesFunc[80] = {
 		/* 00 */
 		OPCODE(o1_callSub),
@@ -513,23 +226,10 @@
 		OPCODE(oFascin_geUnknown1002), //to be replaced by o2_stopProtracker when protrackerPlay is fixed
 	};
 
-	_opcodesDrawFascination = opcodesDraw;
 	_opcodesFuncFascination = opcodesFunc;
 	_opcodesGoblinFascination = opcodesGoblin;
 }
 
-void Inter_Fascination::executeDrawOpcode(byte i) {
-	debugC(1, kDebugDrawOp, "opcodeDraw %d [0x%X] (%s)",
-			i, i, getOpcodeDrawDesc(i));
-
-	OpcodeDrawProcFascination op = _opcodesDrawFascination[i].proc;
-
-	if (op == 0)
-		warning("Not yet implemented Fascination opcodeDraw: %d", i);
-	else
-		(this->*op) ();
-}
-
 void Inter_Fascination::oFascin_geUnknown0(OpGobParams &params) {
 	warning("Fascination Unknown GE Function 0");
 	warning("funcPlayImd with parameter : 'tirb.imd'");
@@ -717,10 +417,6 @@
 		(this->*op) (params);
 }
 
-const char *Inter_Fascination::getOpcodeDrawDesc(byte i) {
-	return _opcodesDrawFascination[i].desc;
-}
-
 const char *Inter_Fascination::getOpcodeFuncDesc(byte i, byte j) {
 	if ((i > 4) || (j > 15))
 		return "";

Modified: scummvm/trunk/engines/gob/inter_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v1.cpp	2009-06-17 03:14:22 UTC (rev 41600)
+++ scummvm/trunk/engines/gob/inter_v1.cpp	2009-06-17 04:15:45 UTC (rev 41601)
@@ -47,6 +47,7 @@
 namespace Gob {
 
 #define OPCODE(x) _OPCODE(Inter_v1, x)
+#define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(Inter_v1, x)
 
 const int Inter_v1::_goblinFuncLookUp[][2] = {
 	{1, 0},
@@ -124,332 +125,46 @@
 
 Inter_v1::Inter_v1(GobEngine *vm) : Inter(vm) {
 	setupOpcodes();
+	NsetupOpcodes();
 }
 
-void Inter_v1::setupOpcodes() {
-	static const OpcodeDrawEntryV1 opcodesDraw[256] = {
-		/* 00 */
-		OPCODE(o1_loadMult),
-		OPCODE(o1_playMult),
-		OPCODE(o1_freeMultKeys),
-		{0, ""},
-		/* 04 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		OPCODE(o1_initCursor),
-		/* 08 */
-		OPCODE(o1_initCursorAnim),
-		OPCODE(o1_clearCursorAnim),
-		OPCODE(o1_setRenderFlags),
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		OPCODE(o1_loadAnim),
-		OPCODE(o1_freeAnim),
-		OPCODE(o1_updateAnim),
-		{0, ""},
-		/* 14 */
-		OPCODE(o1_initMult),
-		OPCODE(o1_freeMult),
-		OPCODE(o1_animate),
-		OPCODE(o1_loadMultObject),
-		/* 18 */
-		OPCODE(o1_getAnimLayerInfo),
-		OPCODE(o1_getObjAnimSize),
-		OPCODE(o1_loadStatic),
-		OPCODE(o1_freeStatic),
-		/* 1C */
-		OPCODE(o1_renderStatic),
-		OPCODE(o1_loadCurLayer),
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		OPCODE(o1_playCDTrack),
-		OPCODE(o1_getCDTrackPos),
-		OPCODE(o1_stopCD),
-		{0, ""},
-		/* 24 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		OPCODE(o1_loadFontToSprite),
-		OPCODE(o1_freeFontToSprite),
-		{0, ""},
-		{0, ""},
-		/* 34 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 38 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 3C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 40 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 44 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 48 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 4C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 50 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 54 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 58 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 5C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 60 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 64 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 68 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 6C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 70 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 74 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 78 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 7C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 80 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 84 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 88 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 8C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 90 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 94 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 98 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 9C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* AC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* BC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* CC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* DC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* EC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* FC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""}
-	};
+void Inter_v1::setupOpcodesDraw() {
+	OPCODEDRAW(0x00, o1_loadMult);
+	OPCODEDRAW(0x01, o1_playMult);
+	OPCODEDRAW(0x02, o1_freeMultKeys);
 
+	OPCODEDRAW(0x07, o1_initCursor);
+
+	OPCODEDRAW(0x08, o1_initCursorAnim);
+	OPCODEDRAW(0x09, o1_clearCursorAnim);
+	OPCODEDRAW(0x0A, o1_setRenderFlags);
+
+	OPCODEDRAW(0x10, o1_loadAnim);
+	OPCODEDRAW(0x11, o1_freeAnim);
+	OPCODEDRAW(0x12, o1_updateAnim);
+
+	OPCODEDRAW(0x14, o1_initMult);
+	OPCODEDRAW(0x15, o1_freeMult);
+	OPCODEDRAW(0x16, o1_animate);
+	OPCODEDRAW(0x17, o1_loadMultObject);
+
+	OPCODEDRAW(0x18, o1_getAnimLayerInfo);
+	OPCODEDRAW(0x19, o1_getObjAnimSize);
+	OPCODEDRAW(0x1A, o1_loadStatic);
+	OPCODEDRAW(0x1B, o1_freeStatic);
+
+	OPCODEDRAW(0x1C, o1_renderStatic);
+	OPCODEDRAW(0x1D, o1_loadCurLayer);
+
+	OPCODEDRAW(0x20, o1_playCDTrack);
+	OPCODEDRAW(0x21, o1_getCDTrackPos);
+	OPCODEDRAW(0x22, o1_stopCD);
+
+	OPCODEDRAW(0x30, o1_loadFontToSprite);
+	OPCODEDRAW(0x31, o1_freeFontToSprite);
+}
+
+void Inter_v1::setupOpcodes() {
 	static const OpcodeFuncEntryV1 opcodesFunc[80] = {
 		/* 00 */
 		OPCODE(o1_callSub),
@@ -645,23 +360,10 @@
 		OPCODE(o1_initGoblin)
 	};
 
-	_opcodesDrawV1 = opcodesDraw;
 	_opcodesFuncV1 = opcodesFunc;
 	_opcodesGoblinV1 = opcodesGoblin;
 }
 
-void Inter_v1::executeDrawOpcode(byte i) {
-	debugC(1, kDebugDrawOp, "opcodeDraw %d [0x%X] (%s)",
-			i, i, getOpcodeDrawDesc(i));
-
-	OpcodeDrawProcV1 op = _opcodesDrawV1[i].proc;
-
-	if (op == 0)
-		warning("unimplemented opcodeDraw: %d", i);
-	else
-		(this->*op) ();
-}
-
 bool Inter_v1::executeFuncOpcode(byte i, byte j, OpFuncParams &params) {
 	debugC(1, kDebugFuncOp, "opcodeFunc %d.%d [0x%X.0x%X] (%s)",
 			i, j, i, j, getOpcodeFuncDesc(i, j));
@@ -701,10 +403,6 @@
 		(this->*op) (params);
 }
 
-const char *Inter_v1::getOpcodeDrawDesc(byte i) {
-	return _opcodesDrawV1[i].desc;
-}
-
 const char *Inter_v1::getOpcodeFuncDesc(byte i, byte j) {
 	if ((i > 4) || (j > 15))
 		return "";
@@ -1720,7 +1418,7 @@
 
 	cmd = *_vm->_global->_inter_execPtr++;
 
-	executeDrawOpcode(cmd);
+	executeOpcodeDraw(cmd);
 
 	return false;
 }

Modified: scummvm/trunk/engines/gob/inter_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v2.cpp	2009-06-17 03:14:22 UTC (rev 41600)
+++ scummvm/trunk/engines/gob/inter_v2.cpp	2009-06-17 04:15:45 UTC (rev 41601)
@@ -49,6 +49,7 @@
 namespace Gob {
 
 #define OPCODE(x) _OPCODE(Inter_v2, x)
+#define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(Inter_v2, x)
 
 const int Inter_v2::_goblinFuncLookUp[][2] = {
 	{0, 0},
@@ -97,332 +98,64 @@
 
 Inter_v2::Inter_v2(GobEngine *vm) : Inter_v1(vm) {
 	setupOpcodes();
+	NsetupOpcodes();
 }
 
-void Inter_v2::setupOpcodes() {
-	static const OpcodeDrawEntryV2 opcodesDraw[256] = {
-		/* 00 */
-		OPCODE(o1_loadMult),
-		OPCODE(o2_playMult),
-		OPCODE(o2_freeMultKeys),
-		{0, ""},
-		/* 04 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		OPCODE(o1_initCursor),
-		/* 08 */
-		OPCODE(o1_initCursorAnim),
-		OPCODE(o1_clearCursorAnim),
-		OPCODE(o2_setRenderFlags),
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		OPCODE(o1_loadAnim),
-		OPCODE(o1_freeAnim),
-		OPCODE(o1_updateAnim),
-		OPCODE(o2_multSub),
-		/* 14 */
-		OPCODE(o2_initMult),
-		OPCODE(o1_freeMult),
-		OPCODE(o1_animate),
-		OPCODE(o2_loadMultObject),
-		/* 18 */
-		OPCODE(o1_getAnimLayerInfo),
-		OPCODE(o1_getObjAnimSize),
-		OPCODE(o1_loadStatic),
-		OPCODE(o1_freeStatic),
-		/* 1C */
-		OPCODE(o2_renderStatic),
-		OPCODE(o2_loadCurLayer),
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		OPCODE(o2_playCDTrack),
-		OPCODE(o2_waitCDTrackEnd),
-		OPCODE(o2_stopCD),
-		OPCODE(o2_readLIC),
-		/* 24 */
-		OPCODE(o2_freeLIC),
-		OPCODE(o2_getCDTrackPos),
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		OPCODE(o2_loadFontToSprite),
-		OPCODE(o1_freeFontToSprite),
-		{0, ""},
-		{0, ""},
-		/* 34 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 38 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 3C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 40 */
-		OPCODE(o2_totSub),
-		OPCODE(o2_switchTotSub),
-		OPCODE(o2_pushVars),
-		OPCODE(o2_popVars),
-		/* 44 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 48 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 4C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 50 */
-		OPCODE(o2_loadMapObjects),
-		OPCODE(o2_freeGoblins),
-		OPCODE(o2_moveGoblin),
-		OPCODE(o2_writeGoblinPos),
-		/* 54 */
-		OPCODE(o2_stopGoblin),
-		OPCODE(o2_setGoblinState),
-		OPCODE(o2_placeGoblin),
-		{0, ""},
-		/* 58 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 5C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 60 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 64 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 68 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 6C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 70 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 74 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 78 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 7C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 80 */
-		OPCODE(o2_initScreen),
-		OPCODE(o2_scroll),
-		OPCODE(o2_setScrollOffset),
-		OPCODE(o2_playImd),
-		/* 84 */
-		OPCODE(o2_getImdInfo),
-		OPCODE(o2_openItk),
-		OPCODE(o2_closeItk),
-		OPCODE(o2_setImdFrontSurf),
-		/* 88 */
-		OPCODE(o2_resetImdFrontSurf),
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 8C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 90 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 94 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 98 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 9C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* AC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* BC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* CC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* DC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* EC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* FC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""}
-	};
+void Inter_v2::setupOpcodesDraw() {
+	Inter_v1::setupOpcodesDraw();
 
+	OPCODEDRAW(0x01, o2_playMult);
+	OPCODEDRAW(0x02, o2_freeMultKeys);
+
+	OPCODEDRAW(0x0A, o2_setRenderFlags);
+
+	OPCODEDRAW(0x13, o2_multSub);
+
+	OPCODEDRAW(0x14, o2_initMult);
+
+	OPCODEDRAW(0x17, o2_loadMultObject);
+
+	OPCODEDRAW(0x1C, o2_renderStatic);
+	OPCODEDRAW(0x1D, o2_loadCurLayer);
+
+	OPCODEDRAW(0x20, o2_playCDTrack);
+	OPCODEDRAW(0x21, o2_waitCDTrackEnd);
+	OPCODEDRAW(0x22, o2_stopCD);
+	OPCODEDRAW(0x23, o2_readLIC);
+
+	OPCODEDRAW(0x24, o2_freeLIC);
+	OPCODEDRAW(0x25, o2_getCDTrackPos);
+
+	OPCODEDRAW(0x30, o2_loadFontToSprite);
+
+	OPCODEDRAW(0x40, o2_totSub);
+	OPCODEDRAW(0x41, o2_switchTotSub);
+	OPCODEDRAW(0x42, o2_pushVars);
+	OPCODEDRAW(0x43, o2_popVars);
+
+	OPCODEDRAW(0x50, o2_loadMapObjects);
+	OPCODEDRAW(0x51, o2_freeGoblins);
+	OPCODEDRAW(0x52, o2_moveGoblin);
+	OPCODEDRAW(0x53, o2_writeGoblinPos);
+
+	OPCODEDRAW(0x54, o2_stopGoblin);
+	OPCODEDRAW(0x55, o2_setGoblinState);
+	OPCODEDRAW(0x56, o2_placeGoblin);
+
+	OPCODEDRAW(0x80, o2_initScreen);
+	OPCODEDRAW(0x81, o2_scroll);
+	OPCODEDRAW(0x82, o2_setScrollOffset);
+	OPCODEDRAW(0x83, o2_playImd);
+
+	OPCODEDRAW(0x84, o2_getImdInfo);
+	OPCODEDRAW(0x85, o2_openItk);
+	OPCODEDRAW(0x86, o2_closeItk);
+	OPCODEDRAW(0x87, o2_setImdFrontSurf);
+
+	OPCODEDRAW(0x88, o2_resetImdFrontSurf);
+}
+
+void Inter_v2::setupOpcodes() {
 	static const OpcodeFuncEntryV2 opcodesFunc[80] = {
 		/* 00 */
 		OPCODE(o1_callSub),
@@ -618,23 +351,10 @@
 		{0, ""},
 	};
 
-	_opcodesDrawV2 = opcodesDraw;
 	_opcodesFuncV2 = opcodesFunc;
 	_opcodesGoblinV2 = opcodesGoblin;
 }
 
-void Inter_v2::executeDrawOpcode(byte i) {
-	debugC(1, kDebugDrawOp, "opcodeDraw %d [0x%X] (%s)",
-		i, i, getOpcodeDrawDesc(i));
-
-	OpcodeDrawProcV2 op = _opcodesDrawV2[i].proc;
-
-	if (op == 0)
-		warning("unimplemented opcodeDraw: %d", i);
-	else
-		(this->*op) ();
-}
-
 bool Inter_v2::executeFuncOpcode(byte i, byte j, OpFuncParams &params) {
 	debugC(1, kDebugFuncOp, "opcodeFunc %d.%d [0x%X.0x%X] (%s)",
 		i, j, i, j, getOpcodeFuncDesc(i, j));
@@ -676,10 +396,6 @@
 		(this->*op) (params);
 }
 
-const char *Inter_v2::getOpcodeDrawDesc(byte i) {
-	return _opcodesDrawV2[i].desc;
-}
-
 const char *Inter_v2::getOpcodeFuncDesc(byte i, byte j) {
 	if ((i > 4) || (j > 15))
 		return "";

Modified: scummvm/trunk/engines/gob/inter_v3.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v3.cpp	2009-06-17 03:14:22 UTC (rev 41600)
+++ scummvm/trunk/engines/gob/inter_v3.cpp	2009-06-17 04:15:45 UTC (rev 41601)
@@ -37,6 +37,7 @@
 namespace Gob {
 
 #define OPCODE(x) _OPCODE(Inter_v3, x)
+#define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(Inter_v3, x)
 
 const int Inter_v3::_goblinFuncLookUp[][2] = {
 	{0, 0},
@@ -114,332 +115,14 @@
 
 Inter_v3::Inter_v3(GobEngine *vm) : Inter_v2(vm) {
 	setupOpcodes();
+	NsetupOpcodes();
 }
 
-void Inter_v3::setupOpcodes() {
-	static const OpcodeDrawEntryV3 opcodesDraw[256] = {
-		/* 00 */
-		OPCODE(o1_loadMult),
-		OPCODE(o2_playMult),
-		OPCODE(o2_freeMultKeys),
-		{0, ""},
-		/* 04 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		OPCODE(o1_initCursor),
-		/* 08 */
-		OPCODE(o1_initCursorAnim),
-		OPCODE(o1_clearCursorAnim),
-		OPCODE(o2_setRenderFlags),
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		OPCODE(o1_loadAnim),
-		OPCODE(o1_freeAnim),
-		OPCODE(o1_updateAnim),
-		OPCODE(o2_multSub),
-		/* 14 */
-		OPCODE(o2_initMult),
-		OPCODE(o1_freeMult),
-		OPCODE(o1_animate),
-		OPCODE(o2_loadMultObject),
-		/* 18 */
-		OPCODE(o1_getAnimLayerInfo),
-		OPCODE(o1_getObjAnimSize),
-		OPCODE(o1_loadStatic),
-		OPCODE(o1_freeStatic),
-		/* 1C */
-		OPCODE(o2_renderStatic),
-		OPCODE(o2_loadCurLayer),
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		OPCODE(o2_playCDTrack),
-		OPCODE(o2_waitCDTrackEnd),
-		OPCODE(o2_stopCD),
-		OPCODE(o2_readLIC),
-		/* 24 */
-		OPCODE(o2_freeLIC),
-		OPCODE(o2_getCDTrackPos),
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		OPCODE(o2_loadFontToSprite),
-		OPCODE(o1_freeFontToSprite),
-		{0, ""},
-		{0, ""},
-		/* 34 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 38 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 3C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 40 */
-		OPCODE(o2_totSub),
-		OPCODE(o2_switchTotSub),
-		OPCODE(o2_pushVars),
-		OPCODE(o2_popVars),
-		/* 44 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 48 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 4C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 50 */
-		OPCODE(o2_loadMapObjects),
-		OPCODE(o2_freeGoblins),
-		OPCODE(o2_moveGoblin),
-		OPCODE(o2_writeGoblinPos),
-		/* 54 */
-		OPCODE(o2_stopGoblin),
-		OPCODE(o2_setGoblinState),
-		OPCODE(o2_placeGoblin),
-		{0, ""},
-		/* 58 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 5C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 60 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 64 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 68 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 6C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 70 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 74 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 78 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 7C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 80 */
-		OPCODE(o2_initScreen),
-		OPCODE(o2_scroll),
-		OPCODE(o2_setScrollOffset),
-		OPCODE(o2_playImd),
-		/* 84 */
-		OPCODE(o2_getImdInfo),
-		OPCODE(o2_openItk),
-		OPCODE(o2_closeItk),
-		OPCODE(o2_setImdFrontSurf),
-		/* 88 */
-		OPCODE(o2_resetImdFrontSurf),
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 8C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 90 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 94 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 98 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 9C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* AC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* BC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* CC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* DC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* EC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* FC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""}
-	};
+void Inter_v3::setupOpcodesDraw() {
+	Inter_v2::setupOpcodesDraw();
+}
 
+void Inter_v3::setupOpcodes() {
 	static const OpcodeFuncEntryV3 opcodesFunc[80] = {
 		/* 00 */
 		OPCODE(o1_callSub),
@@ -635,23 +318,10 @@
 		{0, ""},
 	};
 
-	_opcodesDrawV3 = opcodesDraw;
 	_opcodesFuncV3 = opcodesFunc;
 	_opcodesGoblinV3 = opcodesGoblin;
 }
 
-void Inter_v3::executeDrawOpcode(byte i) {
-	debugC(1, kDebugDrawOp, "opcodeDraw %d [0x%X] (%s)",
-		i, i, getOpcodeDrawDesc(i));
-
-	OpcodeDrawProcV3 op = _opcodesDrawV3[i].proc;
-
-	if (op == 0)
-		warning("unimplemented opcodeDraw: %d", i);
-	else
-		(this->*op) ();
-}
-
 bool Inter_v3::executeFuncOpcode(byte i, byte j, OpFuncParams &params) {
 	debugC(1, kDebugFuncOp, "opcodeFunc %d.%d [0x%X.0x%X] (%s)",
 		i, j, i, j, getOpcodeFuncDesc(i, j));
@@ -693,10 +363,6 @@
 		(this->*op) (params);
 }
 
-const char *Inter_v3::getOpcodeDrawDesc(byte i) {
-	return _opcodesDrawV3[i].desc;
-}
-
 const char *Inter_v3::getOpcodeFuncDesc(byte i, byte j) {
 	if ((i > 4) || (j > 15))
 		return "";

Modified: scummvm/trunk/engines/gob/inter_v4.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v4.cpp	2009-06-17 03:14:22 UTC (rev 41600)
+++ scummvm/trunk/engines/gob/inter_v4.cpp	2009-06-17 04:15:45 UTC (rev 41601)
@@ -39,6 +39,7 @@
 namespace Gob {
 
 #define OPCODE(x) _OPCODE(Inter_v4, x)
+#define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(Inter_v4, x)
 
 const int Inter_v4::_goblinFuncLookUp[][2] = {
 	{0, 0},
@@ -116,332 +117,17 @@
 
 Inter_v4::Inter_v4(GobEngine *vm) : Inter_v3(vm) {
 	setupOpcodes();
+	NsetupOpcodes();
 }
 
-void Inter_v4::setupOpcodes() {
-	static const OpcodeDrawEntryV4 opcodesDraw[256] = {
-		/* 00 */
-		OPCODE(o1_loadMult),
-		OPCODE(o2_playMult),
-		OPCODE(o2_freeMultKeys),
-		{0, ""},
-		/* 04 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		OPCODE(o1_initCursor),
-		/* 08 */
-		OPCODE(o1_initCursorAnim),
-		OPCODE(o1_clearCursorAnim),
-		OPCODE(o2_setRenderFlags),
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		OPCODE(o1_loadAnim),
-		OPCODE(o1_freeAnim),
-		OPCODE(o1_updateAnim),
-		OPCODE(o2_multSub),
-		/* 14 */
-		OPCODE(o2_initMult),
-		OPCODE(o1_freeMult),
-		OPCODE(o1_animate),
-		OPCODE(o2_loadMultObject),
-		/* 18 */
-		OPCODE(o1_getAnimLayerInfo),
-		OPCODE(o1_getObjAnimSize),
-		OPCODE(o1_loadStatic),
-		OPCODE(o1_freeStatic),
-		/* 1C */
-		OPCODE(o2_renderStatic),
-		OPCODE(o2_loadCurLayer),
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		OPCODE(o2_playCDTrack),
-		OPCODE(o2_waitCDTrackEnd),
-		OPCODE(o2_stopCD),
-		OPCODE(o2_readLIC),
-		/* 24 */
-		OPCODE(o2_freeLIC),
-		OPCODE(o2_getCDTrackPos),
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		OPCODE(o2_loadFontToSprite),
-		OPCODE(o1_freeFontToSprite),
-		{0, ""},
-		{0, ""},
-		/* 34 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 38 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 3C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 40 */
-		OPCODE(o2_totSub),
-		OPCODE(o2_switchTotSub),
-		OPCODE(o2_pushVars),
-		OPCODE(o2_popVars),
-		/* 44 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 48 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 4C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 50 */
-		OPCODE(o2_loadMapObjects),
-		OPCODE(o2_freeGoblins),
-		OPCODE(o2_moveGoblin),
-		OPCODE(o2_writeGoblinPos),
-		/* 54 */
-		OPCODE(o2_stopGoblin),
-		OPCODE(o2_setGoblinState),
-		OPCODE(o2_placeGoblin),
-		{0, ""},
-		/* 58 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 5C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 60 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 64 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 68 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 6C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 70 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 74 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 78 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 7C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 80 */
-		OPCODE(o4_initScreen),
-		OPCODE(o2_scroll),
-		OPCODE(o2_setScrollOffset),
-		OPCODE(o4_playVmdOrMusic),
-		/* 84 */
-		OPCODE(o2_getImdInfo),
-		OPCODE(o2_openItk),
-		OPCODE(o2_closeItk),
-		OPCODE(o2_setImdFrontSurf),
-		/* 88 */
-		OPCODE(o2_resetImdFrontSurf),
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 8C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 90 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 94 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 98 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 9C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* AC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* BC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* CC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* DC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* EC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* FC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""}
-	};
+void Inter_v4::setupOpcodesDraw() {
+	Inter_v3::setupOpcodesDraw();
 
+	OPCODEDRAW(0x80, o4_initScreen);
+	OPCODEDRAW(0x83, o4_playVmdOrMusic);
+}
+
+void Inter_v4::setupOpcodes() {
 	static const OpcodeFuncEntryV4 opcodesFunc[80] = {
 		/* 00 */
 		OPCODE(o1_callSub),
@@ -637,23 +323,10 @@
 		{0, ""},
 	};
 
-	_opcodesDrawV4 = opcodesDraw;
 	_opcodesFuncV4 = opcodesFunc;
 	_opcodesGoblinV4 = opcodesGoblin;
 }
 
-void Inter_v4::executeDrawOpcode(byte i) {
-	debugC(1, kDebugDrawOp, "opcodeDraw %d [0x%X] (%s)",
-			i, i, getOpcodeDrawDesc(i));
-
-	OpcodeDrawProcV4 op = _opcodesDrawV4[i].proc;
-
-	if (op == 0)
-		warning("unimplemented opcodeDraw: %d", i);
-	else
-		(this->*op) ();
-}
-
 bool Inter_v4::executeFuncOpcode(byte i, byte j, OpFuncParams &params) {
 	debugC(1, kDebugFuncOp, "opcodeFunc %d.%d [0x%X.0x%X] (%s) - %s, %d, %d",
 			i, j, i, j, getOpcodeFuncDesc(i, j), _vm->_game->_curTotFile,
@@ -699,10 +372,6 @@
 		(this->*op) (params);
 }
 
-const char *Inter_v4::getOpcodeDrawDesc(byte i) {
-	return _opcodesDrawV4[i].desc;
-}
-
 const char *Inter_v4::getOpcodeFuncDesc(byte i, byte j) {
 	if ((i > 4) || (j > 15))
 		return "";

Modified: scummvm/trunk/engines/gob/inter_v5.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v5.cpp	2009-06-17 03:14:22 UTC (rev 41600)
+++ scummvm/trunk/engines/gob/inter_v5.cpp	2009-06-17 04:15:45 UTC (rev 41601)
@@ -36,6 +36,7 @@
 namespace Gob {
 
 #define OPCODE(x) _OPCODE(Inter_v5, x)
+#define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(Inter_v5, x)
 
 const int Inter_v5::_goblinFuncLookUp[][2] = {
 	{0, 0},
@@ -69,332 +70,17 @@
 
 Inter_v5::Inter_v5(GobEngine *vm) : Inter_v4(vm) {
 	setupOpcodes();
+	NsetupOpcodes();
 }
 
-void Inter_v5::setupOpcodes() {
-	static const OpcodeDrawEntryV5 opcodesDraw[256] = {
-		/* 00 */
-		OPCODE(o1_loadMult),
-		OPCODE(o2_playMult),
-		OPCODE(o2_freeMultKeys),
-		{0, ""},
-		/* 04 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		OPCODE(o1_initCursor),
-		/* 08 */
-		OPCODE(o1_initCursorAnim),
-		OPCODE(o1_clearCursorAnim),
-		OPCODE(o2_setRenderFlags),
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		OPCODE(o1_loadAnim),
-		OPCODE(o1_freeAnim),
-		OPCODE(o1_updateAnim),
-		OPCODE(o2_multSub),
-		/* 14 */
-		OPCODE(o2_initMult),
-		OPCODE(o1_freeMult),
-		OPCODE(o1_animate),
-		OPCODE(o2_loadMultObject),
-		/* 18 */
-		OPCODE(o1_getAnimLayerInfo),
-		OPCODE(o1_getObjAnimSize),
-		OPCODE(o1_loadStatic),
-		OPCODE(o1_freeStatic),
-		/* 1C */
-		OPCODE(o2_renderStatic),
-		OPCODE(o2_loadCurLayer),
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		OPCODE(o2_playCDTrack),
-		OPCODE(o2_waitCDTrackEnd),
-		OPCODE(o2_stopCD),
-		OPCODE(o2_readLIC),
-		/* 24 */
-		OPCODE(o2_freeLIC),
-		OPCODE(o2_getCDTrackPos),
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		OPCODE(o2_loadFontToSprite),
-		OPCODE(o1_freeFontToSprite),
-		{0, ""},
-		{0, ""},
-		/* 34 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 38 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 3C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 40 */
-		OPCODE(o2_totSub),
-		OPCODE(o2_switchTotSub),
-		OPCODE(o2_pushVars),
-		OPCODE(o2_popVars),
-		/* 44 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 48 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 4C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 50 */
-		OPCODE(o2_loadMapObjects),
-		OPCODE(o2_freeGoblins),
-		OPCODE(o2_moveGoblin),
-		OPCODE(o2_writeGoblinPos),
-		/* 54 */
-		OPCODE(o2_stopGoblin),
-		OPCODE(o2_setGoblinState),
-		OPCODE(o2_placeGoblin),
-		{0, ""},
-		/* 58 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 5C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 60 */
-		{0, ""},
-		OPCODE(o5_deleteFile),
-		{0, ""},
-		{0, ""},
-		/* 64 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 68 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 6C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 70 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 74 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 78 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 7C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 80 */
-		OPCODE(o5_initScreen),
-		OPCODE(o2_scroll),
-		OPCODE(o2_setScrollOffset),
-		OPCODE(o4_playVmdOrMusic),
-		/* 84 */
-		OPCODE(o2_getImdInfo),
-		OPCODE(o2_openItk),
-		OPCODE(o2_closeItk),
-		OPCODE(o2_setImdFrontSurf),
-		/* 88 */
-		OPCODE(o2_resetImdFrontSurf),
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 8C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 90 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 94 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 98 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 9C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* AC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* BC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* CC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* DC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* EC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* FC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""}
-	};
+void Inter_v5::setupOpcodesDraw() {
+	Inter_v4::setupOpcodesDraw();
 
+	OPCODEDRAW(0x61, o5_deleteFile);
+	OPCODEDRAW(0x80, o5_initScreen);
+}
+
+void Inter_v5::setupOpcodes() {
 	static const OpcodeFuncEntryV5 opcodesFunc[80] = {
 		/* 00 */
 		OPCODE(o1_callSub),
@@ -590,23 +276,10 @@
 		{0, ""},
 	};
 
-	_opcodesDrawV5 = opcodesDraw;
 	_opcodesFuncV5 = opcodesFunc;
 	_opcodesGoblinV5 = opcodesGoblin;
 }
 
-void Inter_v5::executeDrawOpcode(byte i) {
-	debugC(1, kDebugDrawOp, "opcodeDraw %d [0x%X] (%s)",
-			i, i, getOpcodeDrawDesc(i));
-
-	OpcodeDrawProcV5 op = _opcodesDrawV5[i].proc;
-
-	if (op == 0)
-		warning("unimplemented opcodeDraw: %d", i);
-	else
-		(this->*op) ();
-}
-
 bool Inter_v5::executeFuncOpcode(byte i, byte j, OpFuncParams &params) {
 	debugC(1, kDebugFuncOp, "opcodeFunc %d.%d [0x%X.0x%X] (%s) - %s, %d, %d",
 			i, j, i, j, getOpcodeFuncDesc(i, j), _vm->_game->_curTotFile,
@@ -654,10 +327,6 @@
 	}
 }
 
-const char *Inter_v5::getOpcodeDrawDesc(byte i) {
-	return _opcodesDrawV5[i].desc;
-}
-
 const char *Inter_v5::getOpcodeFuncDesc(byte i, byte j) {
 	if ((i > 4) || (j > 15))
 		return "";

Modified: scummvm/trunk/engines/gob/inter_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v6.cpp	2009-06-17 03:14:22 UTC (rev 41600)
+++ scummvm/trunk/engines/gob/inter_v6.cpp	2009-06-17 04:15:45 UTC (rev 41601)
@@ -40,6 +40,7 @@
 namespace Gob {
 
 #define OPCODE(x) _OPCODE(Inter_v6, x)
+#define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(Inter_v6, x)
 
 const int Inter_v6::_goblinFuncLookUp[][2] = {
 	{0, 0},
@@ -49,332 +50,18 @@
 	_gotFirstPalette = false;
 
 	setupOpcodes();
+	NsetupOpcodes();
 }
 
-void Inter_v6::setupOpcodes() {
-	static const OpcodeDrawEntryV6 opcodesDraw[256] = {
-		/* 00 */
-		OPCODE(o1_loadMult),
-		OPCODE(o2_playMult),
-		OPCODE(o2_freeMultKeys),
-		{0, ""},
-		/* 04 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		OPCODE(o1_initCursor),
-		/* 08 */
-		OPCODE(o1_initCursorAnim),
-		OPCODE(o1_clearCursorAnim),
-		OPCODE(o2_setRenderFlags),
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		OPCODE(o1_loadAnim),
-		OPCODE(o1_freeAnim),
-		OPCODE(o1_updateAnim),
-		OPCODE(o2_multSub),
-		/* 14 */
-		OPCODE(o2_initMult),
-		OPCODE(o1_freeMult),
-		OPCODE(o1_animate),
-		OPCODE(o2_loadMultObject),
-		/* 18 */
-		OPCODE(o1_getAnimLayerInfo),
-		OPCODE(o1_getObjAnimSize),
-		OPCODE(o1_loadStatic),
-		OPCODE(o1_freeStatic),
-		/* 1C */
-		OPCODE(o2_renderStatic),
-		OPCODE(o2_loadCurLayer),
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		OPCODE(o2_playCDTrack),
-		OPCODE(o2_waitCDTrackEnd),
-		OPCODE(o2_stopCD),
-		OPCODE(o2_readLIC),
-		/* 24 */
-		OPCODE(o2_freeLIC),
-		OPCODE(o2_getCDTrackPos),
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		OPCODE(o2_loadFontToSprite),
-		OPCODE(o1_freeFontToSprite),
-		{0, ""},
-		{0, ""},
-		/* 34 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 38 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 3C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 40 */
-		OPCODE(o6_totSub),
-		OPCODE(o2_switchTotSub),
-		OPCODE(o2_pushVars),
-		OPCODE(o2_popVars),
-		/* 44 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 48 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 4C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 50 */
-		OPCODE(o2_loadMapObjects),
-		OPCODE(o2_freeGoblins),
-		OPCODE(o2_moveGoblin),
-		OPCODE(o2_writeGoblinPos),
-		/* 54 */
-		OPCODE(o2_stopGoblin),
-		OPCODE(o2_setGoblinState),
-		OPCODE(o2_placeGoblin),
-		{0, ""},
-		/* 58 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 5C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 60 */
-		{0, ""},
-		OPCODE(o5_deleteFile),
-		{0, ""},
-		{0, ""},
-		/* 64 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 68 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 6C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 70 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 74 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 78 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 7C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 80 */
-		OPCODE(o5_initScreen),
-		OPCODE(o2_scroll),
-		OPCODE(o2_setScrollOffset),
-		OPCODE(o6_playVmdOrMusic),
-		/* 84 */
-		OPCODE(o2_getImdInfo),
-		OPCODE(o6_openItk),
-		OPCODE(o2_closeItk),
-		OPCODE(o2_setImdFrontSurf),
-		/* 88 */
-		OPCODE(o2_resetImdFrontSurf),
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 8C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 90 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 94 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 98 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 9C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* A8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* AC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* B8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* BC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* C8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* CC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* D8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* DC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* E8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* EC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F0 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F4 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* F8 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* FC */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""}
-	};
+void Inter_v6::setupOpcodesDraw() {
+	Inter_v5::setupOpcodesDraw();
 
+	OPCODEDRAW(0x40, o6_totSub);
+	OPCODEDRAW(0x83, o6_playVmdOrMusic);
+	OPCODEDRAW(0x85, o6_openItk);
+}
+
+void Inter_v6::setupOpcodes() {
 	static const OpcodeFuncEntryV6 opcodesFunc[80] = {
 		/* 00 */
 		OPCODE(o1_callSub),
@@ -570,23 +257,10 @@
 		{0, ""},
 	};
 
-	_opcodesDrawV6 = opcodesDraw;
 	_opcodesFuncV6 = opcodesFunc;
 	_opcodesGoblinV6 = opcodesGoblin;
 }
 
-void Inter_v6::executeDrawOpcode(byte i) {
-	debugC(1, kDebugDrawOp, "opcodeDraw %d [0x%X] (%s)",
-			i, i, getOpcodeDrawDesc(i));
-
-	OpcodeDrawProcV6 op = _opcodesDrawV6[i].proc;
-
-	if (op == 0)
-		warning("unimplemented opcodeDraw: %d", i);
-	else
-		(this->*op) ();
-}
-
 bool Inter_v6::executeFuncOpcode(byte i, byte j, OpFuncParams &params) {
 	_vm->_video->_palLUT->buildNext();
 
@@ -636,10 +310,6 @@
 	}
 }
 
-const char *Inter_v6::getOpcodeDrawDesc(byte i) {
-	return _opcodesDrawV6[i].desc;
-}
-
 const char *Inter_v6::getOpcodeFuncDesc(byte i, byte j) {
 	if ((i > 4) || (j > 15))
 		return "";


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