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

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Wed Jun 17 06:16:51 CEST 2009


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

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

Modified Paths:
--------------
    scummvm/trunk/engines/gob/gob.cpp
    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/gob.cpp
===================================================================
--- scummvm/trunk/engines/gob/gob.cpp	2009-06-17 04:16:21 UTC (rev 41602)
+++ scummvm/trunk/engines/gob/gob.cpp	2009-06-17 04:16:51 UTC (rev 41603)
@@ -465,6 +465,8 @@
 		break;
 	}
 
+	_inter->setupOpcodes();
+
 	if (is640()) {
 		_video->_surfWidth = _width = 640;
 		_video->_surfHeight = _video->_splitHeight1 = _height = 480;

Modified: scummvm/trunk/engines/gob/inter.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter.cpp	2009-06-17 04:16:21 UTC (rev 41602)
+++ scummvm/trunk/engines/gob/inter.cpp	2009-06-17 04:16:51 UTC (rev 41603)
@@ -67,9 +67,10 @@
 	delocateVars();
 }
 
-void Inter::NsetupOpcodes() {
+void Inter::setupOpcodes() {
 	setupOpcodesDraw();
 	setupOpcodesFunc();
+	setupOpcodesGob();
 }
 
 void Inter::executeOpcodeDraw(byte i) {
@@ -99,8 +100,30 @@
 	return false;
 }
 
+void Inter::executeOpcodeGob(int i, OpGobParams &params) {
+	debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
+			i, i, getDescOpcodeGob(i));
+
+	OpcodeEntry<OpcodeGob> *op = 0;
+
+	if (_opcodesGob.contains(i))
+		op = &_opcodesGob.getVal(i);
+
+	if (op && op->proc && op->proc->isValid()) {
+		(*op->proc)(params);
+		return;
+	}
+
+	int16 val;
+
+	_vm->_global->_inter_execPtr -= 2;
+	val = load16();
+	_vm->_global->_inter_execPtr += val << 1;
+	warning("unimplemented opcodeGob: %d [0x%X]", i, i);
+}
+
 const char *Inter::getDescOpcodeDraw(byte i) {
-	const char *desc =  _opcodesDraw[i].desc;
+	const char *desc = _opcodesDraw[i].desc;
 
 	return ((desc) ? desc : "");
 }
@@ -114,6 +137,13 @@
 	return ((desc) ? desc : "");
 }
 
+const char *Inter::getDescOpcodeGob(int i) {
+	if (_opcodesGob.contains(i))
+		return _opcodesGob.getVal(i).desc;
+
+	return "";
+}
+
 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 04:16:21 UTC (rev 41602)
+++ scummvm/trunk/engines/gob/inter.h	2009-06-17 04:16:51 UTC (rev 41603)
@@ -27,6 +27,7 @@
 #define GOB_INTER_H
 
 #include "common/func.h"
+#include "common/hashmap.h"
 
 #include "gob/goblin.h"
 #include "gob/variables.h"
@@ -38,16 +39,20 @@
 #ifndef REDUCE_MEMORY_USAGE
 	#define _OPCODEDRAW(ver, x)  setProc(new Common::Functor0Mem<void, ver>(this, &ver::x), #x)
 	#define _OPCODEFUNC(ver, x)  setProc(new Common::Functor1Mem<OpFuncParams &, bool, ver>(this, &ver::x), #x)
+	#define _OPCODEGOB(ver, x)   setProc(new Common::Functor1Mem<OpGobParams &, void, ver>(this, &ver::x), #x)
 #else
 	#define _OPCODEDRAW(ver, x)  setProc(new Common::Functor0Mem<void, ver>(this, &ver::x), "")
 	#define _OPCODEFUNC(ver, x)  setProc(new Common::Functor1Mem<OpFuncParams &, bool, ver>(this, &ver::x), "")
+	#define _OPCODEGOB(ver, x)   setProc(new Common::Functor1Mem<OpGobParams &, void, ver>(this, &ver::x), "")
 #endif
 
-#define CLEAROPCODEDRAW(i) _opcodesDraw[i].setProc(0, 0);
-#define CLEAROPCODEFUNC(i) _opcodesFunc[i].setProc(0, 0);
+#define CLEAROPCODEDRAW(i) _opcodesDraw[i].setProc(0, 0)
+#define CLEAROPCODEFUNC(i) _opcodesFunc[i].setProc(0, 0)
+#define CLEAROPCODEGOB(i)  _opcodesGob.erase(i)
 
 typedef Common::Functor0<void> OpcodeDraw;
 typedef Common::Functor1<struct OpFuncParams &, bool> OpcodeFunc;
+typedef Common::Functor1<struct OpGobParams &, void> OpcodeGob;
 
 struct OpFuncParams {
 	byte cmdCount;
@@ -79,14 +84,6 @@
 	}
 };
 
-// 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, "" }
-#endif
-
 class Inter {
 public:
 	uint8 _terminate;
@@ -99,6 +96,8 @@
 
 	Variables *_variables;
 
+	void setupOpcodes();
+
 	void initControlVars(char full);
 	int16 load16();
 	char evalExpr(int16 *pRes);
@@ -124,6 +123,7 @@
 protected:
 	OpcodeEntry<OpcodeDraw> _opcodesDraw[256];
 	OpcodeEntry<OpcodeFunc> _opcodesFunc[256];
+	Common::HashMap<int, OpcodeEntry<OpcodeGob> > _opcodesGob;
 
 	bool _break;
 
@@ -139,20 +139,18 @@
 
 	GobEngine *_vm;
 
-	void NsetupOpcodes();
 	void executeOpcodeDraw(byte i);
 	bool executeOpcodeFunc(byte i, byte j, OpFuncParams &params);
+	void executeOpcodeGob(int i, OpGobParams &params);
 
 	const char *getDescOpcodeDraw(byte i);
 	const char *getDescOpcodeFunc(byte i, byte j);
+	const char *getDescOpcodeGob(int i);
 
 	virtual void setupOpcodesDraw() = 0;
 	virtual void setupOpcodesFunc() = 0;
+	virtual void setupOpcodesGob()  = 0;
 
-	virtual void setupOpcodes() = 0;
-	virtual void executeGoblinOpcode(int i, OpGobParams &params) = 0;
-	virtual const char *getOpcodeGoblinDesc(int i) = 0;
-
 	virtual void checkSwitchTable(byte **ppExec) = 0;
 
 	void o_drawNOP() {}
@@ -169,21 +167,10 @@
 	virtual void animPalette();
 
 protected:
-	typedef void (Inter_v1::*OpcodeGoblinProcV1)(OpGobParams &);
-	struct OpcodeGoblinEntryV1 {
-		OpcodeGoblinProcV1 proc;
-		const char *desc;
-	};
-	const OpcodeGoblinEntryV1 *_opcodesGoblinV1;
-	static const int _goblinFuncLookUp[][2];
-
 	virtual void setupOpcodesDraw();
 	virtual void setupOpcodesFunc();
+	virtual void setupOpcodesGob();
 
-	virtual void setupOpcodes();
-	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeGoblinDesc(int i);
-
 	virtual void checkSwitchTable(byte **ppExec);
 
 	void o1_loadMult();
@@ -351,21 +338,10 @@
 	virtual void animPalette();
 
 protected:
-	typedef void (Inter_v2::*OpcodeGoblinProcV2)(OpGobParams &);
-	struct OpcodeGoblinEntryV2 {
-		OpcodeGoblinProcV2 proc;
-		const char *desc;
-	};
-	const OpcodeGoblinEntryV2 *_opcodesGoblinV2;
-	static const int _goblinFuncLookUp[][2];
-
 	virtual void setupOpcodesDraw();
 	virtual void setupOpcodesFunc();
+	virtual void setupOpcodesGob();
 
-	virtual void setupOpcodes();
-	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeGoblinDesc(int i);
-
 	virtual void checkSwitchTable(byte **ppExec);
 
 	void o2_playMult();
@@ -430,21 +406,10 @@
 	virtual ~Inter_Bargon() {}
 
 protected:
-	typedef void (Inter_Bargon::*OpcodeGoblinProcBargon)(OpGobParams &);
-	struct OpcodeGoblinEntryBargon {
-		OpcodeGoblinProcBargon proc;
-		const char *desc;
-	};
-	const OpcodeGoblinEntryBargon *_opcodesGoblinBargon;
-	static const int _goblinFuncLookUp[][2];
-
 	virtual void setupOpcodesDraw();
 	virtual void setupOpcodesFunc();
+	virtual void setupOpcodesGob();
 
-	virtual void setupOpcodes();
-	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeGoblinDesc(int i);
-
 	void oBargon_intro0(OpGobParams &params);
 	void oBargon_intro1(OpGobParams &params);
 	void oBargon_intro2(OpGobParams &params);
@@ -463,21 +428,10 @@
 	virtual ~Inter_Fascination() {}
 
 protected:
-	typedef void (Inter_Fascination::*OpcodeGoblinProcFascination)(OpGobParams &);
-	struct OpcodeGoblinEntryFascination {
-		OpcodeGoblinProcFascination proc;
-		const char *desc;
-	};
-	const OpcodeGoblinEntryFascination *_opcodesGoblinFascination;
-	static const int _goblinFuncLookUp[][2];
-
 	virtual void setupOpcodesDraw();
 	virtual void setupOpcodesFunc();
+	virtual void setupOpcodesGob();
 
-	virtual void setupOpcodes();
-	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeGoblinDesc(int i);
-
 	void oFascin_playProtracker(OpGobParams &params);
 
 	void oFascin_geUnknown0(OpGobParams &params);
@@ -511,21 +465,10 @@
 	virtual ~Inter_v3() {}
 
 protected:
-	typedef void (Inter_v3::*OpcodeGoblinProcV3)(OpGobParams &);
-	struct OpcodeGoblinEntryV3 {
-		OpcodeGoblinProcV3 proc;
-		const char *desc;
-	};
-	const OpcodeGoblinEntryV3 *_opcodesGoblinV3;
-	static const int _goblinFuncLookUp[][2];
-
 	virtual void setupOpcodesDraw();
 	virtual void setupOpcodesFunc();
+	virtual void setupOpcodesGob();
 
-	virtual void setupOpcodes();
-	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeGoblinDesc(int i);
-
 	bool o3_getTotTextItemPart(OpFuncParams &params);
 	bool o3_copySprite(OpFuncParams &params);
 
@@ -538,21 +481,10 @@
 	virtual ~Inter_v4() {}
 
 protected:
-	typedef void (Inter_v4::*OpcodeGoblinProcV4)(OpGobParams &);
-	struct OpcodeGoblinEntryV4 {
-		OpcodeGoblinProcV4 proc;
-		const char *desc;
-	};
-	const OpcodeGoblinEntryV4 *_opcodesGoblinV4;
-	static const int _goblinFuncLookUp[][2];
-
 	virtual void setupOpcodesDraw();
 	virtual void setupOpcodesFunc();
+	virtual void setupOpcodesGob();
 
-	virtual void setupOpcodes();
-	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeGoblinDesc(int i);
-
 	void o4_initScreen();
 	void o4_playVmdOrMusic();
 };
@@ -563,23 +495,12 @@
 	virtual ~Inter_v5() {}
 
 protected:
-	typedef void (Inter_v5::*OpcodeGoblinProcV5)(OpGobParams &);
-	struct OpcodeGoblinEntryV5 {
-		OpcodeGoblinProcV5 proc;
-		const char *desc;
-	};
-	const OpcodeGoblinEntryV5 *_opcodesGoblinV5;
-	static const int _goblinFuncLookUp[][2];
+	byte _gob_97_98_val;
 
 	virtual void setupOpcodesDraw();
 	virtual void setupOpcodesFunc();
+	virtual void setupOpcodesGob();
 
-	virtual void setupOpcodes();
-	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeGoblinDesc(int i);
-
-	byte _gob_97_98_val;
-
 	void o5_deleteFile();
 	void o5_initScreen();
 
@@ -609,23 +530,12 @@
 	virtual ~Inter_v6() {}
 
 protected:
-	typedef void (Inter_v6::*OpcodeGoblinProcV6)(OpGobParams &);
-	struct OpcodeGoblinEntryV6 {
-		OpcodeGoblinProcV6 proc;
-		const char *desc;
-	};
-	const OpcodeGoblinEntryV6 *_opcodesGoblinV6;
-	static const int _goblinFuncLookUp[][2];
+	bool _gotFirstPalette;
 
 	virtual void setupOpcodesDraw();
 	virtual void setupOpcodesFunc();
-	
-	bool _gotFirstPalette;
+	virtual void setupOpcodesGob();
 
-	virtual void setupOpcodes();
-	virtual void executeGoblinOpcode(int i, OpGobParams &params);
-	virtual const char *getOpcodeGoblinDesc(int i);
-
 	void o6_totSub();
 	void o6_playVmdOrMusic();
 	void o6_openItk();

Modified: scummvm/trunk/engines/gob/inter_bargon.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_bargon.cpp	2009-06-17 04:16:21 UTC (rev 41602)
+++ scummvm/trunk/engines/gob/inter_bargon.cpp	2009-06-17 04:16:51 UTC (rev 41603)
@@ -39,88 +39,12 @@
 
 namespace Gob {
 
-#define OPCODE(x) _OPCODE(Inter_Bargon, x)
 #define OPCODEVER Inter_Bargon
 #define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
 #define OPCODEFUNC(i, x)  _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
+#define OPCODEGOB(i, x)   _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
 
-const int Inter_Bargon::_goblinFuncLookUp[][2] = {
-	{1, 0},
-	{2, 1},
-	{3, 2},
-	{4, 3},
-	{5, 4},
-	{6, 5},
-	{7, 6},
-	{8, 7},
-	{9, 8},
-	{10, 9},
-	{11, 10},
-	{13, 11},
-	{14, 12},
-	{15, 13},
-	{16, 14},
-	{21, 15},
-	{22, 16},
-	{23, 17},
-	{24, 18},
-	{25, 19},
-	{26, 20},
-	{27, 21},
-	{28, 22},
-	{29, 23},
-	{30, 24},
-	{32, 25},
-	{33, 26},
-	{34, 27},
-	{35, 28},
-	{36, 29},
-	{37, 30},
-	{40, 31},
-	{41, 32},
-	{42, 33},
-	{43, 34},
-	{44, 35},
-	{50, 36},
-	{52, 37},
-	{53, 38},
-	{100, 39},
-	{152, 40},
-	{200, 41},
-	{201, 42},
-	{202, 43},
-	{203, 44},
-	{204, 45},
-	{250, 46},
-	{251, 47},
-	{252, 48},
-	{500, 49},
-	{502, 50},
-	{503, 51},
-	{600, 52},
-	{601, 53},
-	{602, 54},
-	{603, 55},
-	{604, 56},
-	{605, 57},
-	{1000, 58},
-	{1001, 59},
-	{1002, 60},
-	{1003, 61},
-	{1004, 62},
-	{1005, 63},
-	{1006, 64},
-	{1008, 65},
-	{1009, 66},
-	{1010, 67},
-	{1011, 68},
-	{1015, 69},
-	{2005, 70}
-};
-
 Inter_Bargon::Inter_Bargon(GobEngine *vm) : Inter_v2(vm) {
-	setupOpcodes();
-	NsetupOpcodes();
 }
 
 void Inter_Bargon::setupOpcodesDraw() {
@@ -131,132 +55,22 @@
 	Inter_v2::setupOpcodesFunc();
 }
 
-void Inter_Bargon::setupOpcodes() {
-	static const OpcodeGoblinEntryBargon opcodesGoblin[71] = {
-		/* 00 */
-		OPCODE(oBargon_intro0),
-		OPCODE(oBargon_intro1),
-		OPCODE(oBargon_intro2),
-		OPCODE(oBargon_intro3),
-		/* 04 */
-		OPCODE(oBargon_intro4),
-		OPCODE(oBargon_intro5),
-		OPCODE(oBargon_intro6),
-		OPCODE(oBargon_intro7),
-		/* 08 */
-		OPCODE(oBargon_intro8),
-		OPCODE(oBargon_intro9),
-		OPCODE(o_gobNOP),
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 14 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 18 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 1C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 24 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		{0, ""},
-		{0, ""},
-		{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, ""},
-	};
+void Inter_Bargon::setupOpcodesGob() {
+	OPCODEGOB( 1, oBargon_intro0);
+	OPCODEGOB( 2, oBargon_intro1);
+	OPCODEGOB( 3, oBargon_intro2);
+	OPCODEGOB( 4, oBargon_intro3);
 
-	_opcodesGoblinBargon = opcodesGoblin;
-}
+	OPCODEGOB( 5, oBargon_intro4);
+	OPCODEGOB( 6, oBargon_intro5);
+	OPCODEGOB( 7, oBargon_intro6);
+	OPCODEGOB( 8, oBargon_intro7);
 
-void Inter_Bargon::executeGoblinOpcode(int i, OpGobParams &params) {
-	debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
-			i, i, getOpcodeGoblinDesc(i));
-
-	OpcodeGoblinProcBargon op = 0;
-
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i) {
-			op = _opcodesGoblinBargon[_goblinFuncLookUp[j][1]].proc;
-			break;
-		}
-
-	if (op == 0) {
-		int16 val;
-
-		_vm->_global->_inter_execPtr -= 2;
-		val = load16();
-		_vm->_global->_inter_execPtr += val << 1;
-		warning("unimplemented opcodeGob: %d", i);
-	} else
-		(this->*op) (params);
+	OPCODEGOB( 9, oBargon_intro8);
+	OPCODEGOB(10, oBargon_intro9);
+	OPCODEGOB(11, o_gobNOP);
 }
 
-const char *Inter_Bargon::getOpcodeGoblinDesc(int i) {
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i)
-			return _opcodesGoblinBargon[_goblinFuncLookUp[j][1]].desc;
-	return "";
-}
-
 void Inter_Bargon::oBargon_intro0(OpGobParams &params) {
 	if (_vm->_vidPlayer->primaryOpen("scaa", 0, 160)) {
 		_vm->_vidPlayer->primaryPlay(0, 92, 27, 0, 0, 0);

Modified: scummvm/trunk/engines/gob/inter_fascin.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_fascin.cpp	2009-06-17 04:16:21 UTC (rev 41602)
+++ scummvm/trunk/engines/gob/inter_fascin.cpp	2009-06-17 04:16:51 UTC (rev 41603)
@@ -40,32 +40,12 @@
 
 namespace Gob {
 
-#define OPCODE(x) _OPCODE(Inter_Fascination, x)
 #define OPCODEVER Inter_Fascination
 #define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
 #define OPCODEFUNC(i, x)  _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
+#define OPCODEGOB(i, x)   _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
 
-const int Inter_Fascination::_goblinFuncLookUp[][2] = {
-	{1, 0},
-	{2, 1},
-	{3, 2},
-	{4, 3},
-	{5, 4},
-	{6, 5},
-	{7, 6},
-	{8, 7},
-	{9, 8},
-	{10, 9},
-	{11, 10},
-	{12, 11},
-	{1000, 12},
-	{1001, 13},
-	{1002, 14}
-};
-
 Inter_Fascination::Inter_Fascination(GobEngine *vm) : Inter_v2(vm) {
-	setupOpcodes();
-	NsetupOpcodes();
 }
 
 void Inter_Fascination::setupOpcodesDraw() {
@@ -106,30 +86,25 @@
 	Inter_v2::setupOpcodesFunc();
 }
 
-void Inter_Fascination::setupOpcodes() {
-	static const OpcodeGoblinEntryFascination opcodesGoblin[15] = {
-		/* 00 */
-		OPCODE(oFascin_geUnknown0),
-		OPCODE(oFascin_geUnknown1),
-		OPCODE(oFascin_geUnknown2),
-		OPCODE(oFascin_geUnknown3),
-		/* 04 */
-		OPCODE(oFascin_geUnknown4),
-		OPCODE(oFascin_geUnknown5),
-		OPCODE(oFascin_geUnknown6),
-		OPCODE(oFascin_geUnknown7),
-		/* 08 */
-		OPCODE(oFascin_geUnknown8),
-		OPCODE(oFascin_geUnknown9),
-		OPCODE(oFascin_geUnknown10),
-		OPCODE(oFascin_geUnknown11),
-		/* 0C */
-		OPCODE(oFascin_geUnknown1000),
-		OPCODE(oFascin_geUnknown1001), //protrackerPlay doesn't play correctly "mod.extasy"
-		OPCODE(oFascin_geUnknown1002), //to be replaced by o2_stopProtracker when protrackerPlay is fixed
-	};
+void Inter_Fascination::setupOpcodesGob() {
+	OPCODEGOB(   1, oFascin_geUnknown0);
+	OPCODEGOB(   2, oFascin_geUnknown1);
+	OPCODEGOB(   3, oFascin_geUnknown2);
+	OPCODEGOB(   4, oFascin_geUnknown3);
 
-	_opcodesGoblinFascination = opcodesGoblin;
+	OPCODEGOB(   5, oFascin_geUnknown4);
+	OPCODEGOB(   6, oFascin_geUnknown5);
+	OPCODEGOB(   7, oFascin_geUnknown6);
+	OPCODEGOB(   8, oFascin_geUnknown7);
+
+	OPCODEGOB(   9, oFascin_geUnknown8);
+	OPCODEGOB(  10, oFascin_geUnknown9);
+	OPCODEGOB(  11, oFascin_geUnknown10);
+	OPCODEGOB(  12, oFascin_geUnknown11);
+
+	OPCODEGOB(1000, oFascin_geUnknown1000);
+	OPCODEGOB(1001, oFascin_geUnknown1001); //protrackerPlay doesn't play correctly "mod.extasy"
+	OPCODEGOB(1002, oFascin_geUnknown1002); //to be replaced by o2_stopProtracker when protrackerPlay is fixed
 }
 
 void Inter_Fascination::oFascin_geUnknown0(OpGobParams &params) {
@@ -277,37 +252,6 @@
 	evalExpr(0);
 }
 
-void Inter_Fascination::executeGoblinOpcode(int i, OpGobParams &params) {
-	debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
-			i, i, getOpcodeGoblinDesc(i));
-
-	OpcodeGoblinProcFascination op = 0;
-
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i) {
-			op = _opcodesGoblinFascination[_goblinFuncLookUp[j][1]].proc;
-			break;
-		}
-
-	if (op == 0) {
-		int16 val;
-
-		_vm->_global->_inter_execPtr -= 2;
-		val = load16();
-		_vm->_global->_inter_execPtr += val << 1;
-		warning("unimplemented opcodeGob: %d", i);
-	} else
-		(this->*op) (params);
-}
-
-const char *Inter_Fascination::getOpcodeGoblinDesc(int i) {
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i)
-			return _opcodesGoblinFascination[_goblinFuncLookUp[j][1]].desc;
-	warning("Error in getOpcodeGoblinDesc %d",i);
-	return "";
-}
-
 void Inter_Fascination::oFascin_playProtracker(OpGobParams &params) {
 	_vm->_sound->protrackerPlay("mod.extasy");
 }

Modified: scummvm/trunk/engines/gob/inter_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v1.cpp	2009-06-17 04:16:21 UTC (rev 41602)
+++ scummvm/trunk/engines/gob/inter_v1.cpp	2009-06-17 04:16:51 UTC (rev 41603)
@@ -46,88 +46,12 @@
 
 namespace Gob {
 
-#define OPCODE(x) _OPCODE(Inter_v1, x)
 #define OPCODEVER Inter_v1
 #define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
 #define OPCODEFUNC(i, x)  _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
+#define OPCODEGOB(i, x)   _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
 
-const int Inter_v1::_goblinFuncLookUp[][2] = {
-	{1, 0},
-	{2, 1},
-	{3, 2},
-	{4, 3},
-	{5, 4},
-	{6, 5},
-	{7, 6},
-	{8, 7},
-	{9, 8},
-	{10, 9},
-	{12, 10},
-	{13, 11},
-	{14, 12},
-	{15, 13},
-	{16, 14},
-	{21, 15},
-	{22, 16},
-	{23, 17},
-	{24, 18},
-	{25, 19},
-	{26, 20},
-	{27, 21},
-	{28, 22},
-	{29, 23},
-	{30, 24},
-	{32, 25},
-	{33, 26},
-	{34, 27},
-	{35, 28},
-	{36, 29},
-	{37, 30},
-	{40, 31},
-	{41, 32},
-	{42, 33},
-	{43, 34},
-	{44, 35},
-	{50, 36},
-	{52, 37},
-	{53, 38},
-	{150, 39},
-	{152, 40},
-	{200, 41},
-	{201, 42},
-	{202, 43},
-	{203, 44},
-	{204, 45},
-	{250, 46},
-	{251, 47},
-	{252, 48},
-	{500, 49},
-	{502, 50},
-	{503, 51},
-	{600, 52},
-	{601, 53},
-	{602, 54},
-	{603, 55},
-	{604, 56},
-	{605, 57},
-	{1000, 58},
-	{1001, 59},
-	{1002, 60},
-	{1003, 61},
-	{1004, 62},
-	{1005, 63},
-	{1006, 64},
-	{1008, 65},
-	{1009, 66},
-	{1010, 67},
-	{1011, 68},
-	{1015, 69},
-	{2005, 70}
-};
-
 Inter_v1::Inter_v1(GobEngine *vm) : Inter(vm) {
-	setupOpcodes();
-	NsetupOpcodes();
 }
 
 void Inter_v1::setupOpcodesDraw() {
@@ -241,130 +165,80 @@
 	OPCODEFUNC(0x4F, o1_manageDataFile);
 }
 
-void Inter_v1::setupOpcodes() {
-	static const OpcodeGoblinEntryV1 opcodesGoblin[71] = {
-		/* 00 */
-		OPCODE(o1_setState),
-		OPCODE(o1_setCurFrame),
-		OPCODE(o1_setNextState),
-		OPCODE(o1_setMultState),
-		/* 04 */
-		OPCODE(o1_setOrder),
-		OPCODE(o1_setActionStartState),
-		OPCODE(o1_setCurLookDir),
-		OPCODE(o1_setType),
-		/* 08 */
-		OPCODE(o1_setNoTick),
-		OPCODE(o1_setPickable),
-		OPCODE(o1_setXPos),
-		OPCODE(o1_setYPos),
-		/* 0C */
-		OPCODE(o1_setDoAnim),
-		OPCODE(o1_setRelaxTime),
-		OPCODE(o1_setMaxTick),
-		OPCODE(o1_getState),
-		/* 10 */
-		OPCODE(o1_getCurFrame),
-		OPCODE(o1_getNextState),
-		OPCODE(o1_getMultState),
-		OPCODE(o1_getOrder),
-		/* 14 */
-		OPCODE(o1_getActionStartState),
-		OPCODE(o1_getCurLookDir),
-		OPCODE(o1_getType),
-		OPCODE(o1_getNoTick),
-		/* 18 */
-		OPCODE(o1_getPickable),
-		OPCODE(o1_getObjMaxFrame),
-		OPCODE(o1_getXPos),
-		OPCODE(o1_getYPos),
-		/* 1C */
-		OPCODE(o1_getDoAnim),
-		OPCODE(o1_getRelaxTime),
-		OPCODE(o1_getMaxTick),
-		OPCODE(o1_manipulateMap),
-		/* 20 */
-		OPCODE(o1_getItem),
-		OPCODE(o1_manipulateMapIndirect),
-		OPCODE(o1_getItemIndirect),
-		OPCODE(o1_setPassMap),
-		/* 24 */
-		OPCODE(o1_setGoblinPosH),
-		OPCODE(o1_getGoblinPosXH),
-		OPCODE(o1_getGoblinPosYH),
-		OPCODE(o1_setGoblinMultState),
-		/* 28 */
-		OPCODE(o1_setGoblinUnk14),
-		OPCODE(o1_setItemIdInPocket),
-		OPCODE(o1_setItemIndInPocket),
-		OPCODE(o1_getItemIdInPocket),
-		/* 2C */
-		OPCODE(o1_getItemIndInPocket),
-		OPCODE(o1_setItemPos),
-		OPCODE(o1_setGoblinPos),
-		OPCODE(o1_setGoblinState),
-		/* 30 */
-		OPCODE(o1_setGoblinStateRedraw),
-		OPCODE(o1_decRelaxTime),
-		OPCODE(o1_getGoblinPosX),
-		OPCODE(o1_getGoblinPosY),
-		/* 34 */
-		OPCODE(o1_clearPathExistence),
-		OPCODE(o1_setGoblinVisible),
-		OPCODE(o1_setGoblinInvisible),
-		OPCODE(o1_getObjectIntersect),
-		/* 38 */
-		OPCODE(o1_getGoblinIntersect),
-		OPCODE(o1_setItemPos),
-		OPCODE(o1_loadObjects),
-		OPCODE(o1_freeObjects),
-		/* 3C */
-		OPCODE(o1_animateObjects),
-		OPCODE(o1_drawObjects),
-		OPCODE(o1_loadMap),
-		OPCODE(o1_moveGoblin),
-		/* 40 */
-		OPCODE(o1_switchGoblin),
-		OPCODE(o1_loadGoblin),
-		OPCODE(o1_writeTreatItem),
-		OPCODE(o1_moveGoblin0),
-		/* 44 */
-		OPCODE(o1_setGoblinTarget),
-		OPCODE(o1_setGoblinObjectsPos),
-		OPCODE(o1_initGoblin)
-	};
-
-	_opcodesGoblinV1 = opcodesGoblin;
+void Inter_v1::setupOpcodesGob() {
+	OPCODEGOB(   1, o1_setState);
+	OPCODEGOB(   2, o1_setCurFrame);
+	OPCODEGOB(   3, o1_setNextState);
+	OPCODEGOB(   4, o1_setMultState);
+	OPCODEGOB(   5, o1_setOrder);
+	OPCODEGOB(   6, o1_setActionStartState);
+	OPCODEGOB(   7, o1_setCurLookDir);
+	OPCODEGOB(   8, o1_setType);
+	OPCODEGOB(   9, o1_setNoTick);
+	OPCODEGOB(  10, o1_setPickable);
+	OPCODEGOB(  12, o1_setXPos);
+	OPCODEGOB(  13, o1_setYPos);
+	OPCODEGOB(  14, o1_setDoAnim);
+	OPCODEGOB(  15, o1_setRelaxTime);
+	OPCODEGOB(  16, o1_setMaxTick);
+	OPCODEGOB(  21, o1_getState);
+	OPCODEGOB(  22, o1_getCurFrame);
+	OPCODEGOB(  23, o1_getNextState);
+	OPCODEGOB(  24, o1_getMultState);
+	OPCODEGOB(  25, o1_getOrder);
+	OPCODEGOB(  26, o1_getActionStartState);
+	OPCODEGOB(  27, o1_getCurLookDir);
+	OPCODEGOB(  28, o1_getType);
+	OPCODEGOB(  29, o1_getNoTick);
+	OPCODEGOB(  30, o1_getPickable);
+	OPCODEGOB(  32, o1_getObjMaxFrame);
+	OPCODEGOB(  33, o1_getXPos);
+	OPCODEGOB(  34, o1_getYPos);
+	OPCODEGOB(  35, o1_getDoAnim);
+	OPCODEGOB(  36, o1_getRelaxTime);
+	OPCODEGOB(  37, o1_getMaxTick);
+	OPCODEGOB(  40, o1_manipulateMap);
+	OPCODEGOB(  41, o1_getItem);
+	OPCODEGOB(  42, o1_manipulateMapIndirect);
+	OPCODEGOB(  43, o1_getItemIndirect);
+	OPCODEGOB(  44, o1_setPassMap);
+	OPCODEGOB(  50, o1_setGoblinPosH);
+	OPCODEGOB(  52, o1_getGoblinPosXH);
+	OPCODEGOB(  53, o1_getGoblinPosYH);
+	OPCODEGOB( 150, o1_setGoblinMultState);
+	OPCODEGOB( 152, o1_setGoblinUnk14);
+	OPCODEGOB( 200, o1_setItemIdInPocket);
+	OPCODEGOB( 201, o1_setItemIndInPocket);
+	OPCODEGOB( 202, o1_getItemIdInPocket);
+	OPCODEGOB( 203, o1_getItemIndInPocket);
+	OPCODEGOB( 204, o1_setItemPos);
+	OPCODEGOB( 250, o1_setGoblinPos);
+	OPCODEGOB( 251, o1_setGoblinState);
+	OPCODEGOB( 252, o1_setGoblinStateRedraw);
+	OPCODEGOB( 500, o1_decRelaxTime);
+	OPCODEGOB( 502, o1_getGoblinPosX);
+	OPCODEGOB( 503, o1_getGoblinPosY);
+	OPCODEGOB( 600, o1_clearPathExistence);
+	OPCODEGOB( 601, o1_setGoblinVisible);
+	OPCODEGOB( 602, o1_setGoblinInvisible);
+	OPCODEGOB( 603, o1_getObjectIntersect);
+	OPCODEGOB( 604, o1_getGoblinIntersect);
+	OPCODEGOB( 605, o1_setItemPos);
+	OPCODEGOB(1000, o1_loadObjects);
+	OPCODEGOB(1001, o1_freeObjects);
+	OPCODEGOB(1002, o1_animateObjects);
+	OPCODEGOB(1003, o1_drawObjects);
+	OPCODEGOB(1004, o1_loadMap);
+	OPCODEGOB(1005, o1_moveGoblin);
+	OPCODEGOB(1006, o1_switchGoblin);
+	OPCODEGOB(1008, o1_loadGoblin);
+	OPCODEGOB(1009, o1_writeTreatItem);
+	OPCODEGOB(1010, o1_moveGoblin0);
+	OPCODEGOB(1011, o1_setGoblinTarget);
+	OPCODEGOB(1015, o1_setGoblinObjectsPos);
+	OPCODEGOB(2005, o1_initGoblin);
 }
 
-void Inter_v1::executeGoblinOpcode(int i, OpGobParams &params) {
-	debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
-			i, i, getOpcodeGoblinDesc(i));
-
-	OpcodeGoblinProcV1 op = 0;
-
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i) {
-			op = _opcodesGoblinV1[_goblinFuncLookUp[j][1]].proc;
-			break;
-		}
-
-	if (op == 0) {
-		warning("unimplemented opcodeGoblin: %d", i);
-		_vm->_global->_inter_execPtr -= 2;
-		int16 cmd = load16();
-		_vm->_global->_inter_execPtr += cmd * 2;
-	} else
-		(this->*op) (params);
-}
-
-const char *Inter_v1::getOpcodeGoblinDesc(int i) {
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i)
-			return _opcodesGoblinV1[_goblinFuncLookUp[j][1]].desc;
-	return "";
-}
-
 void Inter_v1::checkSwitchTable(byte **ppExec) {
 	int16 len;
 	int32 value;
@@ -1459,7 +1333,7 @@
 	if ((cmd < 40) && objDescSet && !gobParams.objDesc)
 		return false;
 
-	executeGoblinOpcode(cmd, gobParams);
+	executeOpcodeGob(cmd, gobParams);
 
 	return false;
 }

Modified: scummvm/trunk/engines/gob/inter_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v2.cpp	2009-06-17 04:16:21 UTC (rev 41602)
+++ scummvm/trunk/engines/gob/inter_v2.cpp	2009-06-17 04:16:51 UTC (rev 41603)
@@ -48,59 +48,12 @@
 
 namespace Gob {
 
-#define OPCODE(x) _OPCODE(Inter_v2, x)
 #define OPCODEVER Inter_v2
 #define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
 #define OPCODEFUNC(i, x)  _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
+#define OPCODEGOB(i, x)   _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
 
-const int Inter_v2::_goblinFuncLookUp[][2] = {
-	{0, 0},
-	{1, 1},
-	{2, 2},
-	{4, 3},
-	{5, 4},
-	{6, 5},
-	{7, 6},
-	{8, 7},
-	{9, 8},
-	{10, 9},
-	{12, 10},
-	{13, 11},
-	{14, 12},
-	{15, 13},
-	{16, 14},
-	{21, 15},
-	{22, 16},
-	{23, 17},
-	{24, 18},
-	{25, 19},
-	{26, 20},
-	{27, 21},
-	{28, 22},
-	{29, 23},
-	{30, 24},
-	{32, 25},
-	{33, 26},
-	{34, 27},
-	{35, 28},
-	{36, 29},
-	{37, 30},
-	{40, 31},
-	{41, 32},
-	{42, 33},
-	{43, 34},
-	{44, 35},
-	{50, 36},
-	{52, 37},
-	{53, 38},
-	{100, 39},
-	{500, 40},
-	{501, 41}
-};
-
 Inter_v2::Inter_v2(GobEngine *vm) : Inter_v1(vm) {
-	setupOpcodes();
-	NsetupOpcodes();
 }
 
 void Inter_v2::setupOpcodesDraw() {
@@ -181,131 +134,19 @@
 	OPCODEFUNC(0x4E, o2_writeData);
 }
 
-void Inter_v2::setupOpcodes() {
-	static const OpcodeGoblinEntryV2 opcodesGoblin[71] = {
-		/* 00 */
-		OPCODE(o2_loadInfogramesIns),
-		OPCODE(o2_startInfogrames),
-		OPCODE(o2_stopInfogrames),
-		{0, ""},
-		/* 04 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 08 */
-		{0, ""},
-		OPCODE(o2_playInfogrames),
-		{0, ""},
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 14 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 18 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 1C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 24 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		OPCODE(o2_handleGoblins),
-		/* 28 */
-		OPCODE(o2_playProtracker),
-		OPCODE(o2_stopProtracker),
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		{0, ""},
-		{0, ""},
-		{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, ""},
-	};
+void Inter_v2::setupOpcodesGob() {
+	OPCODEGOB(  0, o2_loadInfogramesIns);
+	OPCODEGOB(  1, o2_startInfogrames);
+	OPCODEGOB(  2, o2_stopInfogrames);
 
-	_opcodesGoblinV2 = opcodesGoblin;
-}
+	OPCODEGOB( 10, o2_playInfogrames);
 
-void Inter_v2::executeGoblinOpcode(int i, OpGobParams &params) {
-	debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
-		i, i, getOpcodeGoblinDesc(i));
+	OPCODEGOB(100, o2_handleGoblins);
 
-	OpcodeGoblinProcV2 op = 0;
-
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i) {
-			op = _opcodesGoblinV2[_goblinFuncLookUp[j][1]].proc;
-			break;
-		}
-
-	if (op == 0) {
-		int16 val;
-
-		_vm->_global->_inter_execPtr -= 2;
-		val = load16();
-		_vm->_global->_inter_execPtr += val << 1;
-	} else
-		(this->*op) (params);
+	OPCODEGOB(500, o2_playProtracker);
+	OPCODEGOB(501, o2_stopProtracker);
 }
 
-const char *Inter_v2::getOpcodeGoblinDesc(int i) {
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i)
-			return _opcodesGoblinV2[_goblinFuncLookUp[j][1]].desc;
-	return "";
-}
-
 void Inter_v2::checkSwitchTable(byte **ppExec) {
 	byte cmd;
 	int16 len;
@@ -1421,7 +1262,7 @@
 	_vm->_global->_inter_execPtr += 2;
 
 	if (cmd != 101)
-		executeGoblinOpcode(cmd, gobParams);
+		executeOpcodeGob(cmd, gobParams);
 	return false;
 }
 

Modified: scummvm/trunk/engines/gob/inter_v3.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v3.cpp	2009-06-17 04:16:21 UTC (rev 41602)
+++ scummvm/trunk/engines/gob/inter_v3.cpp	2009-06-17 04:16:51 UTC (rev 41603)
@@ -36,88 +36,12 @@
 
 namespace Gob {
 
-#define OPCODE(x) _OPCODE(Inter_v3, x)
 #define OPCODEVER Inter_v3
 #define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
 #define OPCODEFUNC(i, x)  _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
+#define OPCODEGOB(i, x)   _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
 
-const int Inter_v3::_goblinFuncLookUp[][2] = {
-	{0, 0},
-	{1, 1},
-	{2, 2},
-	{4, 3},
-	{5, 4},
-	{6, 5},
-	{7, 6},
-	{8, 7},
-	{9, 8},
-	{10, 9},
-	{12, 10},
-	{13, 11},
-	{14, 12},
-	{15, 13},
-	{16, 14},
-	{21, 15},
-	{22, 16},
-	{23, 17},
-	{24, 18},
-	{25, 19},
-	{26, 20},
-	{27, 21},
-	{28, 22},
-	{29, 23},
-	{30, 24},
-	{32, 25},
-	{33, 26},
-	{34, 27},
-	{35, 28},
-	{36, 29},
-	{37, 30},
-	{40, 31},
-	{41, 32},
-	{42, 33},
-	{43, 34},
-	{44, 35},
-	{50, 36},
-	{52, 37},
-	{53, 38},
-	{100, 39},
-	{152, 40},
-	{200, 41},
-	{201, 42},
-	{202, 43},
-	{203, 44},
-	{204, 45},
-	{250, 46},
-	{251, 47},
-	{252, 48},
-	{500, 49},
-	{502, 50},
-	{503, 51},
-	{600, 52},
-	{601, 53},
-	{602, 54},
-	{603, 55},
-	{604, 56},
-	{605, 57},
-	{1000, 58},
-	{1001, 59},
-	{1002, 60},
-	{1003, 61},
-	{1004, 62},
-	{1005, 63},
-	{1006, 64},
-	{1008, 65},
-	{1009, 66},
-	{1010, 67},
-	{1011, 68},
-	{1015, 69},
-	{2005, 70}
-};
-
 Inter_v3::Inter_v3(GobEngine *vm) : Inter_v2(vm) {
-	setupOpcodes();
-	NsetupOpcodes();
 }
 
 void Inter_v3::setupOpcodesDraw() {
@@ -131,131 +55,16 @@
 	OPCODEFUNC(0x32, o3_copySprite);
 }
 
-void Inter_v3::setupOpcodes() {
-	static const OpcodeGoblinEntryV3 opcodesGoblin[71] = {
-		/* 00 */
-		OPCODE(o2_loadInfogramesIns),
-		OPCODE(o2_startInfogrames),
-		OPCODE(o2_stopInfogrames),
-		{0, ""},
-		/* 04 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 08 */
-		{0, ""},
-		OPCODE(o2_playInfogrames),
-		{0, ""},
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 14 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 18 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 1C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 24 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		OPCODE(o3_wobble),
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		{0, ""},
-		{0, ""},
-		{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, ""},
-	};
+void Inter_v3::setupOpcodesGob() {
+	OPCODEGOB(  0, o2_loadInfogramesIns);
+	OPCODEGOB(  1, o2_startInfogrames);
+	OPCODEGOB(  2, o2_stopInfogrames);
 
-	_opcodesGoblinV3 = opcodesGoblin;
-}
+	OPCODEGOB( 10, o2_playInfogrames);
 
-void Inter_v3::executeGoblinOpcode(int i, OpGobParams &params) {
-	debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
-		i, i, getOpcodeGoblinDesc(i));
-
-	OpcodeGoblinProcV3 op = 0;
-
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i) {
-			op = _opcodesGoblinV3[_goblinFuncLookUp[j][1]].proc;
-			break;
-		}
-
-	if (op == 0) {
-		int16 val;
-
-		_vm->_global->_inter_execPtr -= 2;
-		val = load16();
-		_vm->_global->_inter_execPtr += val << 1;
-	} else
-		(this->*op) (params);
+	OPCODEGOB(100, o3_wobble);
 }
 
-const char *Inter_v3::getOpcodeGoblinDesc(int i) {
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i)
-			return _opcodesGoblinV3[_goblinFuncLookUp[j][1]].desc;
-	return "";
-}
-
 bool Inter_v3::o3_getTotTextItemPart(OpFuncParams &params) {
 	byte *totData;
 	int16 totTextItem;

Modified: scummvm/trunk/engines/gob/inter_v4.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v4.cpp	2009-06-17 04:16:21 UTC (rev 41602)
+++ scummvm/trunk/engines/gob/inter_v4.cpp	2009-06-17 04:16:51 UTC (rev 41603)
@@ -38,88 +38,12 @@
 
 namespace Gob {
 
-#define OPCODE(x) _OPCODE(Inter_v4, x)
 #define OPCODEVER Inter_v4
 #define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
 #define OPCODEFUNC(i, x)  _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
+#define OPCODEGOB(i, x)   _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
 
-const int Inter_v4::_goblinFuncLookUp[][2] = {
-	{0, 0},
-	{1, 1},
-	{2, 2},
-	{4, 3},
-	{5, 4},
-	{6, 5},
-	{7, 6},
-	{8, 7},
-	{9, 8},
-	{10, 9},
-	{12, 10},
-	{13, 11},
-	{14, 12},
-	{15, 13},
-	{16, 14},
-	{21, 15},
-	{22, 16},
-	{23, 17},
-	{24, 18},
-	{25, 19},
-	{26, 20},
-	{27, 21},
-	{28, 22},
-	{29, 23},
-	{30, 24},
-	{32, 25},
-	{33, 26},
-	{34, 27},
-	{35, 28},
-	{36, 29},
-	{37, 30},
-	{40, 31},
-	{41, 32},
-	{42, 33},
-	{43, 34},
-	{44, 35},
-	{50, 36},
-	{52, 37},
-	{53, 38},
-	{100, 39},
-	{152, 40},
-	{200, 41},
-	{201, 42},
-	{202, 43},
-	{203, 44},
-	{204, 45},
-	{250, 46},
-	{251, 47},
-	{252, 48},
-	{500, 49},
-	{502, 50},
-	{503, 51},
-	{600, 52},
-	{601, 53},
-	{602, 54},
-	{603, 55},
-	{604, 56},
-	{605, 57},
-	{1000, 58},
-	{1001, 59},
-	{1002, 60},
-	{1003, 61},
-	{1004, 62},
-	{1005, 63},
-	{1006, 64},
-	{1008, 65},
-	{1009, 66},
-	{1010, 67},
-	{1011, 68},
-	{1015, 69},
-	{2005, 70}
-};
-
 Inter_v4::Inter_v4(GobEngine *vm) : Inter_v3(vm) {
-	setupOpcodes();
-	NsetupOpcodes();
 }
 
 void Inter_v4::setupOpcodesDraw() {
@@ -133,133 +57,9 @@
 	Inter_v3::setupOpcodesFunc();
 }
 
-void Inter_v4::setupOpcodes() {
-	static const OpcodeGoblinEntryV4 opcodesGoblin[71] = {
-		/* 00 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 04 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 08 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 14 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 18 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 1C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 24 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		{0, ""},
-		{0, ""},
-		{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, ""},
-	};
-
-	_opcodesGoblinV4 = opcodesGoblin;
+void Inter_v4::setupOpcodesGob() {
 }
 
-void Inter_v4::executeGoblinOpcode(int i, OpGobParams &params) {
-	debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
-			i, i, getOpcodeGoblinDesc(i));
-
-	OpcodeGoblinProcV4 op = 0;
-
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i) {
-			op = _opcodesGoblinV4[_goblinFuncLookUp[j][1]].proc;
-			break;
-		}
-
-	if (op == 0) {
-		warning("unimplemented opcodeGoblin: %d", i);
-
-		int16 val;
-
-		_vm->_global->_inter_execPtr -= 2;
-		val = load16();
-		_vm->_global->_inter_execPtr += val << 1;
-	} else
-		(this->*op) (params);
-}
-
-const char *Inter_v4::getOpcodeGoblinDesc(int i) {
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i)
-			return _opcodesGoblinV4[_goblinFuncLookUp[j][1]].desc;
-	return "";
-}
-
 void Inter_v4::o4_initScreen() {
 	int16 offY;
 	int16 videoMode;

Modified: scummvm/trunk/engines/gob/inter_v5.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v5.cpp	2009-06-17 04:16:21 UTC (rev 41602)
+++ scummvm/trunk/engines/gob/inter_v5.cpp	2009-06-17 04:16:51 UTC (rev 41603)
@@ -35,44 +35,12 @@
 
 namespace Gob {
 
-#define OPCODE(x) _OPCODE(Inter_v5, x)
 #define OPCODEVER Inter_v5
 #define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
 #define OPCODEFUNC(i, x)  _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
+#define OPCODEGOB(i, x)   _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
 
-const int Inter_v5::_goblinFuncLookUp[][2] = {
-	{0, 0},
-	{1, 0},
-	{3, 0},
-	{2, 0},
-	{33, 0},
-	{80, 1},
-	{81, 2},
-	{82, 3},
-	{83, 4},
-	{84, 5},
-	{85, 6},
-	{86, 7},
-	{87, 0},
-	{88, 0},
-	{89, 0},
-	{90, 0},
-	{91, 0},
-	{92, 8},
-	{93, 0},
-	{94, 0},
-	{95, 9},
-	{96, 10},
-	{97, 11},
-	{98, 12},
-	{99, 0},
-	{100, 13},
-	{200, 14}
-};
-
 Inter_v5::Inter_v5(GobEngine *vm) : Inter_v4(vm) {
-	setupOpcodes();
-	NsetupOpcodes();
 }
 
 void Inter_v5::setupOpcodesDraw() {
@@ -88,135 +56,43 @@
 	OPCODEFUNC(0x45, o5_istrlen);
 }
 
-void Inter_v5::setupOpcodes() {
-	static const OpcodeGoblinEntryV5 opcodesGoblin[71] = {
-		/* 00 */
-		OPCODE(o5_spaceShooter),
-		OPCODE(o5_getSystemCDSpeed),
-		OPCODE(o5_getSystemRAM),
-		OPCODE(o5_getSystemCPUSpeed),
-		/* 04 */
-		OPCODE(o5_getSystemDrawSpeed),
-		OPCODE(o5_totalSystemSpecs),
-		OPCODE(o5_saveSystemSpecs),
-		OPCODE(o5_loadSystemSpecs),
-		/* 08 */
-		OPCODE(o5_gob92),
-		OPCODE(o5_gob95),
-		OPCODE(o5_gob96),
-		OPCODE(o5_gob97),
-		/* 0C */
-		OPCODE(o5_gob98),
-		OPCODE(o5_gob100),
-		OPCODE(o5_gob200),
-		{0, ""},
-		/* 10 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 14 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 18 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 1C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 24 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		{0, ""},
-		{0, ""},
-		{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, ""},
-	};
+void Inter_v5::setupOpcodesGob() {
+	OPCODEGOB(  0, o5_spaceShooter);
+	OPCODEGOB(  1, o5_spaceShooter);
+	OPCODEGOB(  2, o5_spaceShooter);
+	OPCODEGOB(  3, o5_spaceShooter);
 
-	_opcodesGoblinV5 = opcodesGoblin;
-}
+	OPCODEGOB( 33, o5_spaceShooter);
 
-void Inter_v5::executeGoblinOpcode(int i, OpGobParams &params) {
-	debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
-			i, i, getOpcodeGoblinDesc(i));
+	OPCODEGOB( 80, o5_getSystemCDSpeed);
+	OPCODEGOB( 81, o5_getSystemRAM);
+	OPCODEGOB( 82, o5_getSystemCPUSpeed);
+	OPCODEGOB( 83, o5_getSystemDrawSpeed);
+	OPCODEGOB( 84, o5_totalSystemSpecs);
 
-	OpcodeGoblinProcV5 op = 0;
+	OPCODEGOB( 85, o5_saveSystemSpecs);
+	OPCODEGOB( 86, o5_loadSystemSpecs);
 
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i) {
-			op = _opcodesGoblinV5[_goblinFuncLookUp[j][1]].proc;
-			break;
-		}
+	OPCODEGOB( 87, o5_spaceShooter);
+	OPCODEGOB( 88, o5_spaceShooter);
+	OPCODEGOB( 89, o5_spaceShooter);
+	OPCODEGOB( 90, o5_spaceShooter);
 
-	_vm->_global->_inter_execPtr -= 2;
+	OPCODEGOB( 91, o5_spaceShooter);
+	OPCODEGOB( 92, o5_gob92);
+	OPCODEGOB( 93, o5_spaceShooter);
+	OPCODEGOB( 94, o5_spaceShooter);
 
-	if (op == 0) {
-		warning("unimplemented opcodeGoblin: %d", i);
+	OPCODEGOB( 95, o5_gob95);
+	OPCODEGOB( 96, o5_gob96);
+	OPCODEGOB( 97, o5_gob97);
+	OPCODEGOB( 98, o5_gob98);
 
-		int16 paramCount = load16();
-		_vm->_global->_inter_execPtr += paramCount * 2;
-	} else {
-		params.extraData = i;
-
-		(this->*op) (params);
-	}
+	OPCODEGOB( 99, o5_spaceShooter);
+	OPCODEGOB(100, o5_gob100);
+	OPCODEGOB(200, o5_gob200);
 }
 
-const char *Inter_v5::getOpcodeGoblinDesc(int i) {
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i)
-			return _opcodesGoblinV5[_goblinFuncLookUp[j][1]].desc;
-	return "";
-}
-
 void Inter_v5::o5_deleteFile() {
 	evalExpr(0);
 

Modified: scummvm/trunk/engines/gob/inter_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v6.cpp	2009-06-17 04:16:21 UTC (rev 41602)
+++ scummvm/trunk/engines/gob/inter_v6.cpp	2009-06-17 04:16:51 UTC (rev 41603)
@@ -39,20 +39,13 @@
 
 namespace Gob {
 
-#define OPCODE(x) _OPCODE(Inter_v6, x)
 #define OPCODEVER Inter_v6
 #define OPCODEDRAW(i, x)  _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
 #define OPCODEFUNC(i, x)  _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
+#define OPCODEGOB(i, x)   _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
 
-const int Inter_v6::_goblinFuncLookUp[][2] = {
-	{0, 0},
-};
-
 Inter_v6::Inter_v6(GobEngine *vm) : Inter_v5(vm) {
 	_gotFirstPalette = false;
-
-	setupOpcodes();
-	NsetupOpcodes();
 }
 
 void Inter_v6::setupOpcodesDraw() {
@@ -73,135 +66,9 @@
 	OPCODEFUNC(0x33, o6_fillRect);
 }
 
-void Inter_v6::setupOpcodes() {
-	static const OpcodeGoblinEntryV6 opcodesGoblin[71] = {
-		/* 00 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 04 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 08 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 0C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 10 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 14 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 18 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 1C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 20 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 24 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 28 */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 2C */
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		{0, ""},
-		/* 30 */
-		{0, ""},
-		{0, ""},
-		{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, ""},
-	};
-
-	_opcodesGoblinV6 = opcodesGoblin;
+void Inter_v6::setupOpcodesGob() {
 }
 
-void Inter_v6::executeGoblinOpcode(int i, OpGobParams &params) {
-	debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
-			i, i, getOpcodeGoblinDesc(i));
-
-	OpcodeGoblinProcV6 op = 0;
-
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i) {
-			op = _opcodesGoblinV6[_goblinFuncLookUp[j][1]].proc;
-			break;
-		}
-
-	_vm->_global->_inter_execPtr -= 2;
-
-	if (op == 0) {
-		warning("unimplemented opcodeGoblin: %d", i);
-
-		int16 paramCount = load16();
-		_vm->_global->_inter_execPtr += paramCount * 2;
-	} else {
-		params.extraData = i;
-
-		(this->*op) (params);
-	}
-}
-
-const char *Inter_v6::getOpcodeGoblinDesc(int i) {
-	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
-		if (_goblinFuncLookUp[j][0] == i)
-			return _opcodesGoblinV6[_goblinFuncLookUp[j][1]].desc;
-	return "";
-}
-
 void Inter_v6::o6_totSub() {
 	char totFile[14];
 	byte length;


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