[Scummvm-cvs-logs] SF.net SVN: scummvm: [26490] scummvm/trunk/engines/agos

kirben at users.sourceforge.net kirben at users.sourceforge.net
Sun Apr 15 14:04:48 CEST 2007


Revision: 26490
          http://scummvm.svn.sourceforge.net/scummvm/?rev=26490&view=rev
Author:   kirben
Date:     2007-04-15 05:04:47 -0700 (Sun, 15 Apr 2007)

Log Message:
-----------
Add eriktorbjorn's patch to split script opcodes into specific game engines.

Modified Paths:
--------------
    scummvm/trunk/engines/agos/agos.h
    scummvm/trunk/engines/agos/icons.cpp
    scummvm/trunk/engines/agos/script.cpp
    scummvm/trunk/engines/agos/script_e1.cpp
    scummvm/trunk/engines/agos/script_e2.cpp
    scummvm/trunk/engines/agos/script_ff.cpp
    scummvm/trunk/engines/agos/script_pp.cpp
    scummvm/trunk/engines/agos/script_s1.cpp
    scummvm/trunk/engines/agos/script_s2.cpp
    scummvm/trunk/engines/agos/script_ww.cpp

Modified: scummvm/trunk/engines/agos/agos.h
===================================================================
--- scummvm/trunk/engines/agos/agos.h	2007-04-15 11:30:11 UTC (rev 26489)
+++ scummvm/trunk/engines/agos/agos.h	2007-04-15 12:04:47 UTC (rev 26490)
@@ -124,6 +124,15 @@
 
 class Debugger;
 
+// This is to help devices with small memory (PDA, smartphones, ...)
+// to save a bit of memory used by opcode names in the AGOS engine.
+
+#ifndef REDUCE_MEMORY_USAGE
+#	define _OPCODE(ver, x)	{ &ver::x, #x }
+#else
+#	define _OPCODE(ver, x)	{ &ver::x, "" }
+#endif
+
 class AGOSEngine : public Engine {
 	friend class Debugger;
 	friend class MoviePlayer;
@@ -131,12 +140,7 @@
 	GUI::Debugger *getDebugger();
 
 public:
-	typedef void (AGOSEngine::*OpcodeProc) ();
-
-	virtual void setupOpcodes(OpcodeProc *op);
-
-	void setupOpcodes();
-	OpcodeProc _opcode_table[300];
+	virtual void setupOpcodes();
 	int _numOpcodes;
 
 	typedef void (AGOSEngine::*VgaOpcodeProc) ();
@@ -574,6 +578,7 @@
 	bool checkIfToRunSubroutineLine(SubroutineLine *sl, Subroutine *sub);
 
 	int runScript();
+	virtual void executeOpcode(int opcode) = 0;
 
 	byte getByte();
 	int getNextWord();
@@ -951,6 +956,7 @@
 	int getScriptReturn();
 
 	// Opcodes, common
+	void o_invalid();
 	void o_at();
 	void o_notAt();
 	void o_carried();
@@ -1033,6 +1039,7 @@
 	void o_defObj();
 	void o_here();
 	void o_doClassIcons();
+	void o_playTune();
 	void o_setAdjNoun();
 	void o_saveUserGame();
 	void o_loadUserGame();
@@ -1044,63 +1051,6 @@
 	void o_setDollar();
 	void o_isBox();
 
-	// Opcodes, Elvira 1
-	void oe1_present();
-	void oe1_notPresent();
-	void oe1_worn();
-	void oe1_notWorn();
-	void oe1_notCarried();
-	void oe1_isNotAt();
-	void oe1_sibling();
-	void oe1_notSibling();
-	void oe1_isIn();
-	void oe1_isNotIn();
-	void oe1_isPlayer();
-	void oe1_canPut();
-	void oe1_create();
-	void oe1_copyof();
-	void oe1_copyfo();
-	void oe1_whatO();
-	void oe1_weigh();
-	void oe1_setFF();
-	void oe1_moveDirn();
-	void oe1_score();
-	void oe1_look();
-	void oe1_doClass();
-	void oe1_pObj();
-	void oe1_pName();
-	void oe1_pcName();
-	void oe1_isCalled();
-	void oe1_cFlag();
-	void oe1_rescan();
-	void oe1_setUserItem();
-	void oe1_getUserItem();
-	void oe1_whereTo();
-	void oe1_doorExit();
-	void oe1_saveGame();
-	void oe1_loadGame();
-	void oe1_clearUserItem();
-	void oe1_findMaster();
-	void oe1_nextMaster();
-	void oe1_animate();
-	void oe1_stopAnimate();
-	void oe1_menu();
-	void oe1_enableInput();
-	void oe1_setTime();
-	void oe1_ifTime();
-	void oe1_playTune();
-	void oe1_bitClear();
-	void oe1_bitSet();
-	void oe1_bitTest();
-	void oe1_zoneDisk();
-	void oe1_printStats();
-	void oe1_stopTune();
-	void oe1_printPlayerDamage();
-	void oe1_printMonsterDamage();
-	void oe1_pauseGame();
-	void oe1_printPlayerHit();
-	void oe1_printMonsterHit();
-
 	int16 levelOf(Item *item); 
 	int16 moreText(Item *i);
 	void lobjFunc(Item *i, const char *f);
@@ -1109,152 +1059,6 @@
 	void printScroll();
 	void synchChain(Item *i);
 
-	// Opcodes, Elvira 2
-	void oe2_moveDirn();
-	void oe2_doClass();
-	void oe2_pObj();
-	void oe2_loadGame();
-	void oe2_drawItem();
-	void oe2_doTable();
-	void oe2_pauseGame();
-	void oe2_setDoorOpen();
-	void oe2_setDoorClosed();
-	void oe2_setDoorLocked();
-	void oe2_ifDoorOpen();
-	void oe2_ifDoorClosed();
-	void oe2_ifDoorLocked();
-	void oe2_storeItem();
-	void oe2_getItem();
-	void oe2_bSet();
-	void oe2_bClear();
-	void oe2_bZero();
-	void oe2_bNotZero();
-	void oe2_getOValue();
-	void oe2_setOValue();
-	void oe2_ink();
-	void oe2_printStats();
-	void oe2_setSuperRoom();
-	void oe2_getSuperRoom();
-	void oe2_setExitOpen();
-	void oe2_setExitClosed();
-	void oe2_setExitLocked();
-	void oe2_ifExitOpen();
-	void oe2_ifExitClosed();
-	void oe2_ifExitLocked();
-	void oe2_unk174();
-	void oe2_getDollar2();
-	void oe2_setSRExit();
-	void oe2_unk177();
-	void oe2_unk178();
-	void oe2_isAdjNoun();
-	void oe2_b2Set();
-	void oe2_b2Clear();
-	void oe2_b2Zero();
-	void oe2_b2NotZero();
-
-	// Opcodes, Waxworks
-	void oww_moveDirn();
-	void oww_goto();
-	void oww_addTextBox();
-	void oww_setShortText();
-	void oww_setLongText();
-	void oww_whereTo();
-	void oww_menu();
-	void oww_textMenu();
-	void oww_pauseGame();
-	void oww_boxMessage();
-	void oww_boxMsg();
-	void oww_boxLongText();
-	void oww_printBox();
-	void oww_boxPObj();
-	void oww_lockZones();
-	void oww_unlockZones();
-
-	// Opcodes, Simon 1
-	void oww_printLongText();
-	void os1_animate();
-	void os1_playTune();
-	void os1_pauseGame();
-	void os1_screenTextBox();
-	void os1_screenTextMsg();
-	void os1_playEffect();
-	void os1_screenTextPObj();
-	void os1_getPathPosn();
-	void os1_scnTxtLongText();
-	void os1_mouseOn();
-	void os1_mouseOff();
-	void os1_loadBeard();
-	void os1_unloadBeard();
-	void os1_unloadZone();
-	void os1_loadStrings();
-	void os1_unfreezeZones();
-	void os1_specialFade();
-
-	// Opcodes, Simon 2
-	void os2_printLongText();
-	void os2_rescan();
-	void os2_animate();
-	void os2_stopAnimate();
-	void os2_playTune();
-	void os2_screenTextPObj();
-	void os2_mouseOn();
-	void os2_mouseOff();
-	void os2_isShortText();
-	void os2_clearMarks();
-	void os2_waitMark();
-
-	// Opcodes, Feeble Files
-	void off_chance();
-	void off_jumpOut();
-	void off_addTextBox();
-	void off_printLongText();
-	void off_addBox();
-	void off_oracleTextDown();
-	void off_oracleTextUp();
-	void off_ifTime();
-	void off_setTime();
-	void off_saveUserGame();
-	void off_loadUserGame();
-	void off_listSaveGames();
-	void off_checkCD();
-	void off_screenTextBox();
-	void off_isAdjNoun();
-	void off_hyperLinkOn();
-	void off_hyperLinkOff();
-	void off_checkPaths();
-	void off_screenTextPObj();
-	void off_mouseOn();
-	void off_mouseOff();
-	void off_loadVideo();
-	void off_playVideo();
-	void off_centreScroll();
-	void off_resetPVCount();
-	void off_setPathValues();
-	void off_stopClock();
-	void off_restartClock();
-	void off_setColour();
-	void off_b3Set();
-	void off_b3Clear();
-	void off_b3Zero();
-	void off_b3NotZero();
-
-	// Opcodes, Puzzle Pack
-	void opp_iconifyWindow();
-	void opp_restoreOopsPosition();
-	void opp_loadMouseImage();
-	void opp_message();
-	void opp_setShortText();
-	void opp_loadHiScores();
-	void opp_checkHiScores();
-	void opp_sync();
-	void opp_saveUserGame();
-	void opp_loadUserGame();
-	void opp_saveOopsPosition();
-	void opp_resetGameTime();
-	void opp_resetPVCount();
-	void opp_setPathValues();
-	void opp_restartClock();
-
 protected:
 	bool drawImage_clip(VC10_state *state);
 
@@ -1415,10 +1219,75 @@
 	AGOSEngine_Elvira1(OSystem *system);
 	//~AGOSEngine_Elvira1();
 
+	virtual void setupOpcodes();
+	virtual void setupVideoOpcodes(VgaOpcodeProc *op);
 
-	virtual void setupOpcodes(OpcodeProc *op);
-	virtual void setupVideoOpcodes(VgaOpcodeProc *op);
-private:
+	virtual void executeOpcode(int opcode);
+
+	void oe1_present();
+	void oe1_notPresent();
+	void oe1_worn();
+	void oe1_notWorn();
+	void oe1_notCarried();
+	void oe1_isNotAt();
+	void oe1_sibling();
+	void oe1_notSibling();
+	void oe1_isIn();
+	void oe1_isNotIn();
+	void oe1_isPlayer();
+	void oe1_canPut();
+	void oe1_create();
+	void oe1_copyof();
+	void oe1_copyfo();
+	void oe1_whatO();
+	void oe1_weigh();
+	void oe1_setFF();
+	void oe1_moveDirn();
+	void oe1_score();
+	void oe1_look();
+	void oe1_doClass();
+	void oe1_pObj();
+	void oe1_pName();
+	void oe1_pcName();
+	void oe1_isCalled();
+	void oe1_cFlag();
+	void oe1_rescan();
+	void oe1_setUserItem();
+	void oe1_getUserItem();
+	void oe1_whereTo();
+	void oe1_doorExit();
+	void oe1_saveGame();
+	void oe1_loadGame();
+	void oe1_clearUserItem();
+	void oe1_findMaster();
+	void oe1_nextMaster();
+	void oe1_animate();
+	void oe1_stopAnimate();
+	void oe1_menu();
+	void oe1_enableInput();
+	void oe1_setTime();
+	void oe1_ifTime();
+	void oe1_playTune();
+	void oe1_bitClear();
+	void oe1_bitSet();
+	void oe1_bitTest();
+	void oe1_zoneDisk();
+	void oe1_printStats();
+	void oe1_stopTune();
+	void oe1_printPlayerDamage();
+	void oe1_printMonsterDamage();
+	void oe1_pauseGame();
+	void oe1_printPlayerHit();
+	void oe1_printMonsterHit();
+
+protected:
+	typedef void (AGOSEngine_Elvira1::*OpcodeProcElvira1) ();
+	struct OpcodeEntryElvira1 {
+		OpcodeProcElvira1 proc;
+		const char *desc;
+	};
+
+	const OpcodeEntryElvira1 *_opcodesElvira1;
 };
 
 class AGOSEngine_Elvira2 : public AGOSEngine_Elvira1 {
@@ -1426,9 +1295,61 @@
 	AGOSEngine_Elvira2(OSystem *system);
 	//~AGOSEngine_Elvira2();
 
-	virtual void setupOpcodes(OpcodeProc *op);
+	virtual void setupOpcodes();
 	virtual void setupVideoOpcodes(VgaOpcodeProc *op);
-private:
+
+	virtual void executeOpcode(int opcode);
+
+	void oe2_moveDirn();
+	void oe2_doClass();
+	void oe2_pObj();
+	void oe2_loadGame();
+	void oe2_drawItem();
+	void oe2_doTable();
+	void oe2_pauseGame();
+	void oe2_setDoorOpen();
+	void oe2_setDoorClosed();
+	void oe2_setDoorLocked();
+	void oe2_ifDoorOpen();
+	void oe2_ifDoorClosed();
+	void oe2_ifDoorLocked();
+	void oe2_storeItem();
+	void oe2_getItem();
+	void oe2_bSet();
+	void oe2_bClear();
+	void oe2_bZero();
+	void oe2_bNotZero();
+	void oe2_getOValue();
+	void oe2_setOValue();
+	void oe2_ink();
+	void oe2_printStats();
+	void oe2_setSuperRoom();
+	void oe2_getSuperRoom();
+	void oe2_setExitOpen();
+	void oe2_setExitClosed();
+	void oe2_setExitLocked();
+	void oe2_ifExitOpen();
+	void oe2_ifExitClosed();
+	void oe2_ifExitLocked();
+	void oe2_unk174();
+	void oe2_getDollar2();
+	void oe2_setSRExit();
+	void oe2_unk177();
+	void oe2_unk178();
+	void oe2_isAdjNoun();
+	void oe2_b2Set();
+	void oe2_b2Clear();
+	void oe2_b2Zero();
+	void oe2_b2NotZero();
+
+protected:
+	typedef void (AGOSEngine_Elvira2::*OpcodeProcElvira2) ();
+	struct OpcodeEntryElvira2 {
+		OpcodeProcElvira2 proc;
+		const char *desc;
+	};
+
+	const OpcodeEntryElvira2 *_opcodesElvira2;
 };
 
 class AGOSEngine_Waxworks : public AGOSEngine_Elvira2 {
@@ -1436,9 +1357,37 @@
 	AGOSEngine_Waxworks(OSystem *system);
 	//~AGOSEngine_Waxworks();
 
-	virtual void setupOpcodes(OpcodeProc *op);
+	virtual void setupOpcodes();
 	virtual void setupVideoOpcodes(VgaOpcodeProc *op);
-private:
+
+	virtual void executeOpcode(int opcode);
+
+	void oww_moveDirn();
+	void oww_goto();
+	void oww_addTextBox();
+	void oww_setShortText();
+	void oww_setLongText();
+	void oww_printLongText();
+	void oww_whereTo();
+	void oww_menu();
+	void oww_textMenu();
+	void oww_pauseGame();
+	void oww_boxMessage();
+	void oww_boxMsg();
+	void oww_boxLongText();
+	void oww_printBox();
+	void oww_boxPObj();
+	void oww_lockZones();
+	void oww_unlockZones();
+
+protected:
+	typedef void (AGOSEngine_Waxworks::*OpcodeProcWaxworks) ();
+	struct OpcodeEntryWaxworks {
+		OpcodeProcWaxworks proc;
+		const char *desc;
+	};
+
+	const OpcodeEntryWaxworks *_opcodesWaxworks;
 };
 
 class AGOSEngine_Simon1 : public AGOSEngine_Waxworks {
@@ -1446,9 +1395,37 @@
 	AGOSEngine_Simon1(OSystem *system);
 	//~AGOSEngine_Simon1();
 
-	virtual void setupOpcodes(OpcodeProc *op);
+	virtual void setupOpcodes();
 	virtual void setupVideoOpcodes(VgaOpcodeProc *op);
-private:
+
+	virtual void executeOpcode(int opcode);
+
+	// Opcodes, Simon 1
+	void os1_animate();
+	void os1_pauseGame();
+	void os1_screenTextBox();
+	void os1_screenTextMsg();
+	void os1_playEffect();
+	void os1_screenTextPObj();
+	void os1_getPathPosn();
+	void os1_scnTxtLongText();
+	void os1_mouseOn();
+	void os1_mouseOff();
+	void os1_loadBeard();
+	void os1_unloadBeard();
+	void os1_unloadZone();
+	void os1_loadStrings();
+	void os1_unfreezeZones();
+	void os1_specialFade();
+
+protected:
+	typedef void (AGOSEngine_Simon1::*OpcodeProcSimon1) ();
+	struct OpcodeEntrySimon1 {
+		OpcodeProcSimon1 proc;
+		const char *desc;
+	};
+
+	const OpcodeEntrySimon1 *_opcodesSimon1;
 };
 
 class AGOSEngine_Simon2 : public AGOSEngine_Simon1 {
@@ -1456,9 +1433,31 @@
 	AGOSEngine_Simon2(OSystem *system);
 	//~AGOSEngine_Simon2();
 
-	virtual void setupOpcodes(OpcodeProc *op);
+	virtual void setupOpcodes();
 	virtual void setupVideoOpcodes(VgaOpcodeProc *op);
-private:
+
+	virtual void executeOpcode(int opcode);
+
+	void os2_printLongText();
+	void os2_rescan();
+	void os2_animate();
+	void os2_stopAnimate();
+	void os2_playTune();
+	void os2_screenTextPObj();
+	void os2_mouseOn();
+	void os2_mouseOff();
+	void os2_isShortText();
+	void os2_clearMarks();
+	void os2_waitMark();
+
+protected:
+	typedef void (AGOSEngine_Simon2::*OpcodeProcSimon2) ();
+	struct OpcodeEntrySimon2 {
+		OpcodeProcSimon2 proc;
+		const char *desc;
+	};
+
+	const OpcodeEntrySimon2 *_opcodesSimon2;
 };
 
 class AGOSEngine_Feeble : public AGOSEngine_Simon2 {
@@ -1466,11 +1465,56 @@
 	AGOSEngine_Feeble(OSystem *system);
 	//~AGOSEngine_Feeble();
 
-	virtual void setupOpcodes(OpcodeProc *op);
+	virtual void setupOpcodes();
 	virtual void setupVideoOpcodes(VgaOpcodeProc *op);
 
+	virtual void executeOpcode(int opcode);
+
 	virtual void drawMousePointer();
+
+	void off_chance();
+	void off_jumpOut();
+	void off_addTextBox();
+	void off_printLongText();
+	void off_addBox();
+	void off_oracleTextDown();
+	void off_oracleTextUp();
+	void off_ifTime();
+	void off_setTime();
+	void off_saveUserGame();
+	void off_loadUserGame();
+	void off_listSaveGames();
+	void off_checkCD();
+	void off_screenTextBox();
+	void off_isAdjNoun();
+	void off_hyperLinkOn();
+	void off_hyperLinkOff();
+	void off_checkPaths();
+	void off_screenTextPObj();
+	void off_mouseOn();
+	void off_mouseOff();
+	void off_loadVideo();
+	void off_playVideo();
+	void off_centreScroll();
+	void off_resetPVCount();
+	void off_setPathValues();
+	void off_stopClock();
+	void off_restartClock();
+	void off_setColour();
+	void off_b3Set();
+	void off_b3Clear();
+	void off_b3Zero();
+	void off_b3NotZero();
+
 protected:
+	typedef void (AGOSEngine_Feeble::*OpcodeProcFeeble) ();
+	struct OpcodeEntryFeeble {
+		OpcodeProcFeeble proc;
+		const char *desc;
+	};
+
+	const OpcodeEntryFeeble *_opcodesFeeble;
+
 	virtual void resetVerbs();
 	virtual void setVerb(HitArea * ha);
 
@@ -1480,7 +1524,6 @@
 	virtual void clearName();
 
 	virtual void drawIconArray(uint i, Item *item_ptr, int line, int classMask);
-private:
 };
 
 class AGOSEngine_PuzzlePack : public AGOSEngine_Feeble {
@@ -1488,11 +1531,36 @@
 	AGOSEngine_PuzzlePack(OSystem *system);
 	//~AGOSEngine_PuzzlePack();
 
-	virtual void setupOpcodes(OpcodeProc *op);
+	virtual void setupOpcodes();
 
+	virtual void executeOpcode(int opcode);
+
+	void opp_iconifyWindow();
+	void opp_restoreOopsPosition();
+	void opp_loadMouseImage();
+	void opp_message();
+	void opp_setShortText();
+	void opp_loadHiScores();
+	void opp_checkHiScores();
+	void opp_sync();
+	void opp_saveUserGame();
+	void opp_loadUserGame();
+	void opp_saveOopsPosition();
+	void opp_resetGameTime();
+	void opp_resetPVCount();
+	void opp_setPathValues();
+	void opp_restartClock();
+
 protected:
+	typedef void (AGOSEngine_PuzzlePack::*OpcodeProcPuzzlePack) ();
+	struct OpcodeEntryPuzzlePack {
+		OpcodeProcPuzzlePack proc;
+		const char *desc;
+	};
+
+	const OpcodeEntryPuzzlePack *_opcodesPuzzlePack;
+
 	virtual void resetVerbs();
-private:
 };
 
 } // End of namespace AGOS

Modified: scummvm/trunk/engines/agos/icons.cpp
===================================================================
--- scummvm/trunk/engines/agos/icons.cpp	2007-04-15 11:30:11 UTC (rev 26489)
+++ scummvm/trunk/engines/agos/icons.cpp	2007-04-15 12:04:47 UTC (rev 26490)
@@ -58,7 +58,7 @@
 		error("Out of icon memory");
 
 	memcpy(_iconFilePtr, src, 43 * 336);
-	os1_unfreezeZones();
+	unfreezeBottom();
 }
 
 // Thanks to Stuart Caie for providing the original

Modified: scummvm/trunk/engines/agos/script.cpp
===================================================================
--- scummvm/trunk/engines/agos/script.cpp	2007-04-15 11:30:11 UTC (rev 26489)
+++ scummvm/trunk/engines/agos/script.cpp	2007-04-15 12:04:47 UTC (rev 26490)
@@ -36,128 +36,8 @@
 
 namespace AGOS {
 
-void AGOSEngine::setupOpcodes(OpcodeProc *op) {
-	// A common set of opcodes for Elvira 2 and later.
-
-	op[1] = &AGOSEngine::o_at;
-	op[2] = &AGOSEngine::o_notAt;
-	op[5] = &AGOSEngine::o_carried;
-	op[6] = &AGOSEngine::o_notCarried;
-	op[7] = &AGOSEngine::o_isAt;
-	op[11] = &AGOSEngine::o_zero;
-	op[12] = &AGOSEngine::o_notZero;
-	op[13] = &AGOSEngine::o_eq;
-	op[14] = &AGOSEngine::o_notEq;
-	op[15] = &AGOSEngine::o_gt;
-	op[16] = &AGOSEngine::o_lt;
-	op[17] = &AGOSEngine::o_eqf;
-	op[18] = &AGOSEngine::o_notEqf;
-	op[19] = &AGOSEngine::o_ltf;
-	op[20] = &AGOSEngine::o_gtf;
-	op[23] = &AGOSEngine::o_chance;
-	op[25] = &AGOSEngine::o_isRoom;
-	op[26] = &AGOSEngine::o_isObject;
-	op[27] = &AGOSEngine::o_state;
-	op[28] = &AGOSEngine::o_oflag;
-	op[31] = &AGOSEngine::o_destroy;
-	op[33] = &AGOSEngine::o_place;
-	op[36] = &AGOSEngine::o_copyff;
-	op[41] = &AGOSEngine::o_clear;
-	op[42] = &AGOSEngine::o_let;
-	op[43] = &AGOSEngine::o_add;
-	op[44] = &AGOSEngine::o_sub;
-	op[45] = &AGOSEngine::o_addf;
-	op[46] = &AGOSEngine::o_subf;
-	op[47] = &AGOSEngine::o_mul;
-	op[48] = &AGOSEngine::o_div;
-	op[49] = &AGOSEngine::o_mulf;
-	op[50] = &AGOSEngine::o_divf;
-	op[51] = &AGOSEngine::o_mod;
-	op[52] = &AGOSEngine::o_modf;
-	op[53] = &AGOSEngine::o_random;
-	op[55] = &AGOSEngine::o_goto;
-	op[56] = &AGOSEngine::o_oset;
-	op[57] = &AGOSEngine::o_oclear;
-	op[58] = &AGOSEngine::o_putBy;
-	op[59] = &AGOSEngine::o_inc;
-	op[60] = &AGOSEngine::o_dec;
-	op[61] = &AGOSEngine::o_setState;
-	op[62] = &AGOSEngine::o_print;
-	op[63] = &AGOSEngine::o_message;
-	op[64] = &AGOSEngine::o_msg;
-	op[68] = &AGOSEngine::o_end;
-	op[69] = &AGOSEngine::o_done;
-	op[71] = &AGOSEngine::o_process;
-	op[76] = &AGOSEngine::o_when;
-	op[77] = &AGOSEngine::o_if1;
-	op[78] = &AGOSEngine::o_if2;
-	op[79] = &AGOSEngine::o_isCalled;
-	op[80] = &AGOSEngine::o_is;
-	op[82] = &AGOSEngine::o_debug;
-	op[87] = &AGOSEngine::o_comment;
-	op[90] = &AGOSEngine::o_getParent;
-	op[91] = &AGOSEngine::o_getNext;
-	op[92] = &AGOSEngine::o_getChildren;
-	op[96] = &AGOSEngine::o_picture;
-	op[97] = &AGOSEngine::o_loadZone;
-	op[100] = &AGOSEngine::o_killAnimate;
-	op[101] = &AGOSEngine::o_defWindow;
-	op[102] = &AGOSEngine::o_window;
-	op[103] = &AGOSEngine::o_cls;
-	op[104] = &AGOSEngine::o_closeWindow;
-	op[107] = &AGOSEngine::o_addBox;
-	op[108] = &AGOSEngine::o_delBox;
-	op[109] = &AGOSEngine::o_enableBox;
-	op[110] = &AGOSEngine::o_disableBox;
-	op[111] = &AGOSEngine::o_moveBox;
-	op[114] = &AGOSEngine::o_doIcons;
-	op[115] = &AGOSEngine::o_isClass;
-	op[116] = &AGOSEngine::o_setClass;
-	op[117] = &AGOSEngine::o_unsetClass;
-	op[119] = &AGOSEngine::o_waitSync;
-	op[120] = &AGOSEngine::o_sync;
-	op[121] = &AGOSEngine::o_defObj;
-	op[125] = &AGOSEngine::o_here;
-	op[126] = &AGOSEngine::o_doClassIcons;
-	op[130] = &AGOSEngine::o_setAdjNoun;
-	op[132] = &AGOSEngine::o_saveUserGame;
-	op[133] = &AGOSEngine::o_loadUserGame;
-	op[136] = &AGOSEngine::o_copysf;
-	op[137] = &AGOSEngine::o_restoreIcons;
-	op[138] = &AGOSEngine::o_freezeZones;
-	op[139] = &AGOSEngine::o_placeNoIcons;
-	op[140] = &AGOSEngine::o_clearTimers;
-	op[141] = &AGOSEngine::o_setDollar;
-	op[142] = &AGOSEngine::o_isBox;
-	op[143] = &AGOSEngine::oe2_doTable;
-	op[151] = &AGOSEngine::oe2_storeItem;
-	op[152] = &AGOSEngine::oe2_getItem;
-	op[153] = &AGOSEngine::oe2_bSet;
-	op[154] = &AGOSEngine::oe2_bClear;
-	op[155] = &AGOSEngine::oe2_bZero;
-	op[156] = &AGOSEngine::oe2_bNotZero;
-	op[157] = &AGOSEngine::oe2_getOValue;
-	op[158] = &AGOSEngine::oe2_setOValue;
-	op[160] = &AGOSEngine::oe2_ink;
-}
-
 void AGOSEngine::setupOpcodes() {
-	memset(_opcode_table, 0, sizeof(_opcode_table));
-	_numOpcodes = ARRAYSIZE(_opcode_table);
-
-	switch (getGameType()) {
-	case GType_ELVIRA1:
-	case GType_ELVIRA2:
-	case GType_WW:
-	case GType_SIMON1:
-	case GType_SIMON2:
-	case GType_FF:
-	case GType_PP:
-		setupOpcodes(_opcode_table);
-		break;
-	default:
-		error("setupOpcodes: Unknown game");
-	}
+	error("setupOpcodes: Unknown game");
 }
 
 void AGOSEngine::setScriptCondition(bool cond) {
@@ -180,6 +60,11 @@
 // Common Opcodes
 // -----------------------------------------------------------------------
 
+void AGOSEngine::o_invalid() {
+	// TODO: Better error reporting
+	error("Invalid opcode");
+}
+
 void AGOSEngine::o_at() {
 	// 1: ptrA parent is
 	setScriptCondition(me()->parent == getNextItemID());
@@ -815,6 +700,18 @@
 	mouseOn();
 }
 
+void AGOSEngine::o_playTune() {
+	// 127:  play tune
+	int music = getVarOrWord();
+	int track = getVarOrWord();
+
+	if (music != _lastMusicPlayed) {
+		_lastMusicPlayed = music;
+		loadMusic(music);
+		_midi.startTrack(track);
+	}
+}
+
 void AGOSEngine::o_setAdjNoun() {
 	// 130: set adj noun
 	uint var = getVarOrByte();
@@ -1027,10 +924,10 @@
 		setScriptCondition(true);
 		setScriptReturn(0);
 
-		if (opcode > _numOpcodes || !_opcode_table[opcode])
+		if (opcode > _numOpcodes)
 			error("Invalid opcode '%d' encountered", opcode);
 
-		(this->*_opcode_table[opcode]) ();
+		executeOpcode(opcode);
 	} while (getScriptCondition() != flag && !getScriptReturn());
 
 	return getScriptReturn();

Modified: scummvm/trunk/engines/agos/script_e1.cpp
===================================================================
--- scummvm/trunk/engines/agos/script_e1.cpp	2007-04-15 11:30:11 UTC (rev 26489)
+++ scummvm/trunk/engines/agos/script_e1.cpp	2007-04-15 12:04:47 UTC (rev 26490)
@@ -28,169 +28,393 @@
 
 namespace AGOS {
 
-void AGOSEngine_Elvira1::setupOpcodes(OpcodeProc *op) {
-	op[0] = &AGOSEngine::o_at;
-	op[1] = &AGOSEngine::o_notAt;
-	op[2] = &AGOSEngine::oe1_present;
-	op[3] = &AGOSEngine::oe1_notPresent;
-	op[4] = &AGOSEngine::oe1_worn;
-	op[5] = &AGOSEngine::oe1_notWorn;
-	op[6] = &AGOSEngine::o_carried;
-	op[7] = &AGOSEngine::o_notCarried;
-	op[8] = &AGOSEngine::o_isAt;
-	op[9] = &AGOSEngine::oe1_isNotAt;
-	op[10] = &AGOSEngine::oe1_sibling;
-	op[11] = &AGOSEngine::oe1_notSibling;
-	op[12] = &AGOSEngine::o_zero;
-	op[13] = &AGOSEngine::o_notZero;
-	op[14] = &AGOSEngine::o_eq;
-	op[15] = &AGOSEngine::o_notEq;
-	op[16] = &AGOSEngine::o_gt;
-	op[17] = &AGOSEngine::o_lt;
-	op[18] = &AGOSEngine::o_eqf;
-	op[19] = &AGOSEngine::o_notEqf;
-	op[20] = &AGOSEngine::o_ltf;
-	op[21] = &AGOSEngine::o_gtf;
-	op[22] = &AGOSEngine::oe1_isIn;
-	op[23] = &AGOSEngine::oe1_isNotIn;
-	op[29] = &AGOSEngine::o_chance;
-	op[30] = &AGOSEngine::oe1_isPlayer;
-	op[32] = &AGOSEngine::o_isRoom;
-	op[33] = &AGOSEngine::o_isObject;
-	op[34] = &AGOSEngine::o_state;
-	op[36] = &AGOSEngine::o_oflag;
-	op[37] = &AGOSEngine::oe1_canPut;
-	op[47] = &AGOSEngine::oe1_create;
-	op[48] = &AGOSEngine::o_destroy;
-	op[51] = &AGOSEngine::o_place;
-	op[54] = &AGOSEngine::oe1_copyof;
-	op[55] = &AGOSEngine::oe1_copyfo;
-	op[56] = &AGOSEngine::o_copyff;
-	op[57] = &AGOSEngine::oe1_whatO;
-	op[59] = &AGOSEngine::oe1_weigh;
-	op[60] = &AGOSEngine::oe1_setFF;
-	op[61] = &AGOSEngine::o_clear;
-	op[64] = &AGOSEngine::o_let;
-	op[65] = &AGOSEngine::o_add;
-	op[66] = &AGOSEngine::o_sub;
-	op[67] = &AGOSEngine::o_addf;
-	op[68] = &AGOSEngine::o_subf;
-	op[69] = &AGOSEngine::o_mul;
-	op[70] = &AGOSEngine::o_div;
-	op[71] = &AGOSEngine::o_mulf;
-	op[72] = &AGOSEngine::o_divf;
-	op[73] = &AGOSEngine::o_mod;
-	op[74] = &AGOSEngine::o_modf;
-	op[75] = &AGOSEngine::o_random;
-	op[76] = &AGOSEngine::oe1_moveDirn;
-	op[77] = &AGOSEngine::o_goto;
-	op[80] = &AGOSEngine::o_oset;
-	op[81] = &AGOSEngine::o_oclear;
-	op[84] = &AGOSEngine::o_putBy;
-	op[85] = &AGOSEngine::o_inc;
-	op[86] = &AGOSEngine::o_dec;
-	op[87] = &AGOSEngine::o_setState;
-	op[89] = &AGOSEngine::o_print;
-	op[90] = &AGOSEngine::oe1_score;
-	op[91] = &AGOSEngine::o_message;
-	op[92] = &AGOSEngine::o_msg;
-	op[96] = &AGOSEngine::oe1_look;
-	op[97] = &AGOSEngine::o_end;
-	op[98] = &AGOSEngine::o_done;
-	op[105] = &AGOSEngine::o_process;
-	op[106] = &AGOSEngine::oe1_doClass;
-	op[112] = &AGOSEngine::oe1_pObj;
-	op[114] = &AGOSEngine::oe1_pName;
-	op[115] = &AGOSEngine::oe1_pcName;
-	op[119] = &AGOSEngine::o_when;
-	op[128] = &AGOSEngine::o_if1;
-	op[129] = &AGOSEngine::o_if2;
-	op[135] = &AGOSEngine::oe1_isCalled;
-	op[136] = &AGOSEngine::o_is;
-	op[152] = &AGOSEngine::o_debug;
-	op[162] = &AGOSEngine::oe1_cFlag;
-	op[164] = &AGOSEngine::oe1_rescan;
-	op[176] = &AGOSEngine::oe1_setUserItem;
-	op[177] = &AGOSEngine::oe1_getUserItem;
-	op[178] = &AGOSEngine::oe1_clearUserItem;
-	op[180] = &AGOSEngine::oe1_whereTo;
-	op[181] = &AGOSEngine::oe1_doorExit;
-	op[198] = &AGOSEngine::o_comment;
-	op[201] = &AGOSEngine::oe1_saveGame;
-	op[202] = &AGOSEngine::oe1_loadGame;
-	op[206] = &AGOSEngine::o_getParent;
-	op[207] = &AGOSEngine::o_getNext;
-	op[208] = &AGOSEngine::o_getChildren;
-	op[219] = &AGOSEngine::oe1_findMaster;
-	op[220] = &AGOSEngine::oe1_nextMaster;
-	op[224] = &AGOSEngine::o_picture;
-	op[225] = &AGOSEngine::o_loadZone;
-	op[226] = &AGOSEngine::oe1_animate;
-	op[227] = &AGOSEngine::oe1_stopAnimate;
-	op[228] = &AGOSEngine::o_killAnimate;
-	op[229] = &AGOSEngine::o_defWindow;
-	op[230] = &AGOSEngine::o_window;
-	op[231] = &AGOSEngine::o_cls;
-	op[232] = &AGOSEngine::o_closeWindow;
-	op[233] = &AGOSEngine::oe1_menu;
-	op[235] = &AGOSEngine::o_addBox;
-	op[236] = &AGOSEngine::o_delBox;
-	op[237] = &AGOSEngine::o_enableBox;
-	op[238] = &AGOSEngine::o_disableBox;
-	op[239] = &AGOSEngine::o_moveBox;
-	op[242] = &AGOSEngine::o_doIcons;
-	op[243] = &AGOSEngine::o_isClass;
-	op[249] = &AGOSEngine::o_setClass;
-	op[250] = &AGOSEngine::o_unsetClass;
-	op[251] = &AGOSEngine::oe1_bitClear;
-	op[252] = &AGOSEngine::oe1_bitSet;
-	op[253] = &AGOSEngine::oe1_bitTest;
-	op[255] = &AGOSEngine::o_waitSync;
-	op[256] = &AGOSEngine::o_sync;
-	op[257] = &AGOSEngine::o_defObj;
-	op[258] = &AGOSEngine::oe1_enableInput;
-	op[259] = &AGOSEngine::oe1_setTime;
-	op[260] = &AGOSEngine::oe1_ifTime;
-	op[261] = &AGOSEngine::o_here;
-	op[262] = &AGOSEngine::o_doClassIcons;
-	op[263] = &AGOSEngine::oe1_playTune;
-	op[266] = &AGOSEngine::o_setAdjNoun;
-	op[267] = &AGOSEngine::oe1_zoneDisk;
-	op[268] = &AGOSEngine::o_saveUserGame;
-	op[269] = &AGOSEngine::o_loadUserGame;
-	op[270] = &AGOSEngine::oe1_printStats;
-	op[271] = &AGOSEngine::oe1_stopTune;
-	op[272] = &AGOSEngine::oe1_printPlayerDamage;
-	op[273] = &AGOSEngine::oe1_printMonsterDamage;
-	op[274] = &AGOSEngine::oe1_pauseGame;
-	op[275] = &AGOSEngine::o_copysf;
-	op[276] = &AGOSEngine::o_restoreIcons;
-	op[277] = &AGOSEngine::oe1_printPlayerHit;
-	op[278] = &AGOSEngine::oe1_printMonsterHit;
-	op[279] = &AGOSEngine::o_freezeZones;
-	op[280] = &AGOSEngine::o_placeNoIcons;
-	op[281] = &AGOSEngine::o_clearTimers;
-	op[282] = &AGOSEngine::o_setDollar;
-	op[283] = &AGOSEngine::o_isBox;
+#define OPCODE(x)	_OPCODE(AGOSEngine_Elvira1, x)
+
+void AGOSEngine_Elvira1::setupOpcodes() {
+	static const OpcodeEntryElvira1 opcodes[] = {
+		/* 00 */
+		OPCODE(o_at),
+		OPCODE(o_notAt),
+		OPCODE(oe1_present),
+		OPCODE(oe1_notPresent),
+		/* 04 */
+		OPCODE(oe1_worn),
+		OPCODE(oe1_notWorn),
+		OPCODE(o_carried),
+		OPCODE(o_notCarried),
+		/* 08 */
+		OPCODE(o_isAt),
+		OPCODE(oe1_isNotAt),
+		OPCODE(oe1_sibling),
+		OPCODE(oe1_notSibling),
+		/* 12 */
+		OPCODE(o_zero),
+		OPCODE(o_notZero),
+		OPCODE(o_eq),
+		OPCODE(o_notEq),
+		/* 16 */
+		OPCODE(o_gt),
+		OPCODE(o_lt),
+		OPCODE(o_eqf),
+		OPCODE(o_notEqf),
+		/* 20 */
+		OPCODE(o_ltf),
+		OPCODE(o_gtf),
+		OPCODE(oe1_isIn),
+		OPCODE(oe1_isNotIn),
+		/* 24 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 28 */
+		OPCODE(o_invalid),
+		OPCODE(o_chance),
+		OPCODE(oe1_isPlayer),
+		OPCODE(o_invalid),
+		/* 32 */
+		OPCODE(o_isRoom),
+		OPCODE(o_isObject),
+		OPCODE(o_state),
+		OPCODE(o_invalid),
+		/* 36 */
+		OPCODE(o_oflag),
+		OPCODE(oe1_canPut),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 40 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 44 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(oe1_create),
+		/* 48 */
+		OPCODE(o_destroy),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_place),
+		/* 52 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(oe1_copyof),
+		OPCODE(oe1_copyfo),
+		/* 56 */
+		OPCODE(o_copyff),
+		OPCODE(oe1_whatO),
+		OPCODE(o_invalid),
+		OPCODE(oe1_weigh),
+		/* 60 */
+		OPCODE(oe1_setFF),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 64 */
+		OPCODE(o_let),
+		OPCODE(o_add),
+		OPCODE(o_sub),
+		OPCODE(o_addf),
+		/* 68 */
+		OPCODE(o_subf),
+		OPCODE(o_mul),
+		OPCODE(o_div),
+		OPCODE(o_mulf),
+		/* 72 */
+		OPCODE(o_divf),
+		OPCODE(o_mod),
+		OPCODE(o_modf),
+		OPCODE(o_random),
+		/* 76 */
+		OPCODE(oe1_moveDirn),
+		OPCODE(o_goto),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 80 */
+		OPCODE(o_oset),
+		OPCODE(o_oclear),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 84 */
+		OPCODE(o_putBy),
+		OPCODE(o_inc),
+		OPCODE(o_dec),
+		OPCODE(o_setState),
+		/* 88 */
+		OPCODE(o_invalid),
+		OPCODE(o_print),
+		OPCODE(oe1_score),
+		OPCODE(o_message),
+		/* 92 */
+		OPCODE(o_msg),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 96 */
+		OPCODE(oe1_look),
+		OPCODE(o_end),
+		OPCODE(o_done),
+		OPCODE(o_invalid),
+		/* 100 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 104 */
+		OPCODE(o_invalid),
+		OPCODE(o_process),
+		OPCODE(oe1_doClass),
+		OPCODE(o_invalid),
+		/* 108 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 112*/
+		OPCODE(oe1_pObj),
+		OPCODE(o_invalid),
+		OPCODE(oe1_pName),
+		OPCODE(oe1_pcName),
+		/* 116 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_when),
+		/* 120 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 124 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 128 */
+		OPCODE(o_if1),
+		OPCODE(o_if2),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 132 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(oe1_isCalled),
+		/* 136 */
+		OPCODE(o_is),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 140 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 144 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 148 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 152 */
+		OPCODE(o_debug),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 156 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 160 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(oe1_cFlag),
+		OPCODE(o_invalid),
+		/* 164 */
+		OPCODE(oe1_rescan),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 168 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 172 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 176 */
+		OPCODE(oe1_setUserItem),
+		OPCODE(oe1_getUserItem),
+		OPCODE(oe1_clearUserItem),
+		OPCODE(o_invalid),
+		/* 180 */
+		OPCODE(oe1_whereTo),
+		OPCODE(oe1_doorExit),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 184 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 188 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 192 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 196 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_comment),
+		OPCODE(o_invalid),
+		/* 200 */
+		OPCODE(o_invalid),
+		OPCODE(oe1_saveGame),
+		OPCODE(oe1_loadGame),
+		OPCODE(o_invalid),
+		/* 204 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_getParent),
+		OPCODE(o_getNext),
+		/* 208 */
+		OPCODE(o_getChildren),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 212 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 216 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(oe1_findMaster),
+		/* 220 */
+		OPCODE(oe1_nextMaster),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 224 */
+		OPCODE(o_picture),
+		OPCODE(o_loadZone),
+		OPCODE(oe1_animate),
+		OPCODE(oe1_stopAnimate),
+		/* 228 */
+		OPCODE(o_killAnimate),
+		OPCODE(o_defWindow),
+		OPCODE(o_window),
+		OPCODE(o_cls),
+		/* 232 */
+		OPCODE(o_closeWindow),
+		OPCODE(oe1_menu),
+		OPCODE(o_invalid),
+		OPCODE(o_addBox),
+		/* 236 */
+		OPCODE(o_delBox),
+		OPCODE(o_enableBox),
+		OPCODE(o_disableBox),
+		OPCODE(o_moveBox),
+		/* 240 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_doIcons),
+		OPCODE(o_isClass),
+		/* 244 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 248 */
+		OPCODE(o_invalid),
+		OPCODE(o_setClass),
+		OPCODE(o_unsetClass),
+		OPCODE(oe1_bitClear),
+		/* 252 */
+		OPCODE(oe1_bitSet),
+		OPCODE(oe1_bitTest),
+		OPCODE(o_invalid),
+		OPCODE(o_waitSync),
+		/* 256 */
+		OPCODE(o_sync),
+		OPCODE(o_defObj),
+		OPCODE(oe1_enableInput),
+		OPCODE(oe1_setTime),
+		/* 260 */
+		OPCODE(oe1_ifTime),
+		OPCODE(o_here),
+		OPCODE(o_doClassIcons),
+		OPCODE(oe1_playTune),
+		/* 264 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_setAdjNoun),
+		OPCODE(oe1_zoneDisk),
+		/* 268 */
+		OPCODE(o_saveUserGame),
+		OPCODE(o_loadUserGame),
+		OPCODE(oe1_printStats),
+		OPCODE(oe1_stopTune),
+		/* 272 */
+		OPCODE(oe1_printPlayerDamage),
+		OPCODE(oe1_printMonsterDamage),
+		OPCODE(oe1_pauseGame),
+		OPCODE(o_copysf),
+		/* 276 */
+		OPCODE(o_restoreIcons),
+		OPCODE(oe1_printPlayerHit),
+		OPCODE(oe1_printMonsterHit),
+		OPCODE(o_freezeZones),
+		/* 280 */
+		OPCODE(o_placeNoIcons),
+		OPCODE(o_clearTimers),
+		OPCODE(o_setDollar),
+		OPCODE(o_isBox)
+	};
+
+	_opcodesElvira1 = opcodes;
+	_numOpcodes = 284;
 }
 
+void AGOSEngine_Elvira1::executeOpcode(int opcode) {
+	OpcodeProcElvira1 op = _opcodesElvira1[opcode].proc;
+	(this->*op) ();
+}
+
 // -----------------------------------------------------------------------
 // Elvira 1 Opcodes
 // -----------------------------------------------------------------------
 
-void AGOSEngine::oe1_present() {
+void AGOSEngine_Elvira1::oe1_present() {
 	// 2: present (here or carried)
 	Item *item = getNextItemPtr();
 	setScriptCondition(item->parent == getItem1ID() || item->parent == me()->parent);
 }
 
-void AGOSEngine::oe1_notPresent() {
+void AGOSEngine_Elvira1::oe1_notPresent() {
 	// 3: not present (neither here nor carried)
 	Item *item = getNextItemPtr();
 	setScriptCondition(item->parent != getItem1ID() && item->parent != me()->parent);
 }
 
-void AGOSEngine::oe1_worn() {
+void AGOSEngine_Elvira1::oe1_worn() {
 	// 4: worn
 	Item *item = getNextItemPtr();
 	SubObject *subObject = (SubObject *)findChildOfType(item, 2);
@@ -201,7 +425,7 @@
 		setScriptCondition((subObject->objectFlags & kOFWorn) != 0);
 }
 
-void AGOSEngine::oe1_notWorn() {
+void AGOSEngine_Elvira1::oe1_notWorn() {
 	// 5: not worn
 	Item *item = getNextItemPtr();
 	SubObject *subObject = (SubObject *)findChildOfType(item, 2);
@@ -212,72 +436,72 @@
 		setScriptCondition((subObject->objectFlags & kOFWorn) == 0);
 }
 
-void AGOSEngine::oe1_isNotAt() {
+void AGOSEngine_Elvira1::oe1_isNotAt() {
 	// 9: parent is not
 	Item *item = getNextItemPtr();
 	setScriptCondition(item->parent != getNextItemID());
 }
 
-void AGOSEngine::oe1_sibling() {
+void AGOSEngine_Elvira1::oe1_sibling() {
 	// 10: sibling
 	Item *item1 = getNextItemPtr();
 	Item *item2 = getNextItemPtr();
 	setScriptCondition(item1->parent == item2->parent);
 }
 
-void AGOSEngine::oe1_notSibling() {
+void AGOSEngine_Elvira1::oe1_notSibling() {
 	// 11: not sibling
 	Item *item1 = getNextItemPtr();
 	Item *item2 = getNextItemPtr();
 	setScriptCondition(item1->parent != item2->parent);
 }
 
-void AGOSEngine::oe1_isIn() {
+void AGOSEngine_Elvira1::oe1_isIn() {
 	// 22: is in
 	Item *item1 = getNextItemPtr();
 	Item *item2 = getNextItemPtr();
 	setScriptCondition(contains(item1, item2) != 0);
 }
 
-void AGOSEngine::oe1_isNotIn() {
+void AGOSEngine_Elvira1::oe1_isNotIn() {
 	// 23: is not in
 	Item *item1 = getNextItemPtr();
 	Item *item2 = getNextItemPtr();
 	setScriptCondition(contains(item1, item2) == 0);
 }
 
-void AGOSEngine::oe1_isPlayer() {
+void AGOSEngine_Elvira1::oe1_isPlayer() {
 	// 30: is player
 	setScriptCondition(isPlayer(getNextItemPtr()));
 }
 
-void AGOSEngine::oe1_canPut() {
+void AGOSEngine_Elvira1::oe1_canPut() {
 	// 37: can put
 	Item *item1 = getNextItemPtr();
 	Item *item2 = getNextItemPtr();
 	setScriptCondition(canPlace(item1, item2) == 0);
 }
 
-void AGOSEngine::oe1_create() {
+void AGOSEngine_Elvira1::oe1_create() {
 	// 47: create
 	setItemParent(getNextItemPtr(), derefItem(me()->parent));
 }
 
-void AGOSEngine::oe1_copyof() {
+void AGOSEngine_Elvira1::oe1_copyof() {
 	// 54: copy of
 	Item *item = getNextItemPtr();
 	uint tmp = getVarOrByte();
 	writeNextVarContents(getUserFlag(item, tmp));
 }
 
-void AGOSEngine::oe1_copyfo() {
+void AGOSEngine_Elvira1::oe1_copyfo() {
 	// 55: copy fo
 	uint tmp = getNextVarContents();
 	Item *item = getNextItemPtr();
 	setUserFlag(item, getVarOrByte(), tmp);
 }
 
-void AGOSEngine::oe1_whatO() {
+void AGOSEngine_Elvira1::oe1_whatO() {
 	// 57: what o
 	int a = getVarOrWord();	
 
@@ -287,30 +511,30 @@
 		_objectItem = findMaster(_scriptAdj2, _scriptNoun2);
 }
 
-void AGOSEngine::oe1_weigh() {
+void AGOSEngine_Elvira1::oe1_weigh() {
 	// 59: weight
 	Item *item = getNextItemPtr();
 	writeNextVarContents(weighUp(item));
 }
 
-void AGOSEngine::oe1_setFF() {
+void AGOSEngine_Elvira1::oe1_setFF() {
 	// 60: set FF
 	writeNextVarContents(255);
 }
 
-void AGOSEngine::oe1_moveDirn() {
+void AGOSEngine_Elvira1::oe1_moveDirn() {
 	// 54: move direction
 	int16 d = readVariable(getVarOrWord());
 	moveDirn_e1(me(), d);
 }
 
-void AGOSEngine::oe1_score() {
+void AGOSEngine_Elvira1::oe1_score() {
 	// 90: score
 	SubPlayer *p = (SubPlayer *) findChildOfType(me(), 3);
 	showMessageFormat("Your score is %ld.\n", p->score);
 }
 
-void AGOSEngine::oe1_look() {
+void AGOSEngine_Elvira1::oe1_look() {
 	// 96: look
 	Item *i = derefItem(me()->parent);
 	if (i == NULL)
@@ -343,7 +567,7 @@
 	}
 }
 
-void AGOSEngine::oe1_doClass() {
+void AGOSEngine_Elvira1::oe1_doClass() {
 	// 106: do class
 	Item *i = getNextItemPtr();
 	int16 cm = getVarOrWord();
@@ -366,7 +590,7 @@
 	}
 }
 
-void AGOSEngine::oe1_pObj() {
+void AGOSEngine_Elvira1::oe1_pObj() {
 	// 112: print object
 	SubObject *subObject = (SubObject *)findChildOfType(getNextItemPtr(), 2);
 	getVarOrWord();
@@ -375,13 +599,13 @@
 		showMessageFormat("%s", (const char *)getStringPtrByID(subObject->objectName));
 }
 
-void AGOSEngine::oe1_pName() {
+void AGOSEngine_Elvira1::oe1_pName() {
 	// 114:
 	Item *i = getNextItemPtr();
 	showMessageFormat("%s", (const char *)getStringPtrByID(i->itemName));
 }
 
-void AGOSEngine::oe1_pcName() {
+void AGOSEngine_Elvira1::oe1_pcName() {
 	// 115:
 	Item *i = getNextItemPtr();
 	Common::String name = (const char *)getStringPtrByID(i->itemName);
@@ -389,14 +613,14 @@
 	showMessageFormat("%s", name.c_str());
 }
 
-void AGOSEngine::oe1_isCalled() {
+void AGOSEngine_Elvira1::oe1_isCalled() {
 	// 135: childstruct fr2 is
 	Item *item = getNextItemPtr();
 	uint stringId = getNextStringID();
 	setScriptCondition(!scumm_stricmp((const char *)getStringPtrByID(item->itemName), (const char *)getStringPtrByID(stringId)));
 }
 
-void AGOSEngine::oe1_cFlag() {
+void AGOSEngine_Elvira1::oe1_cFlag() {
 	// 162: check container flag
 	SubContainer *c = (SubContainer *)findChildOfType(getNextItemPtr(), 7);
 	uint bit = getVarOrWord();
@@ -407,19 +631,19 @@
 		setScriptCondition((c->flags & (1 << bit)) != 0);
 }
 
-void AGOSEngine::oe1_rescan() {
+void AGOSEngine_Elvira1::oe1_rescan() {
 	// 164: restart subroutine
 	setScriptReturn(-10);
 }
 
-void AGOSEngine::oe1_setUserItem() {
+void AGOSEngine_Elvira1::oe1_setUserItem() {
 	// 176: set user item
 	Item *i = getNextItemPtr();
 	uint tmp = getVarOrWord();
 	setUserItem(i, tmp, getNextItemID());
 }
 
-void AGOSEngine::oe1_getUserItem() {
+void AGOSEngine_Elvira1::oe1_getUserItem() {
 	// 177: get user item
 	Item *i = getNextItemPtr();
 	int n = getVarOrWord();
@@ -430,7 +654,7 @@
 		_objectItem = derefItem(getUserItem(i, n));
 }
 
-void AGOSEngine::oe1_whereTo() {
+void AGOSEngine_Elvira1::oe1_whereTo() {
 	// 180: where to
 	Item *i = getNextItemPtr();
 	int16 d = getVarOrWord();
@@ -442,7 +666,7 @@
 		_objectItem = getExitOf_e1(i, d);
 }
 
-void AGOSEngine::oe1_doorExit() {
+void AGOSEngine_Elvira1::oe1_doorExit() {
 	// 181: door exit
 	Item *x;
 	Item *a = (Item *)-1;
@@ -466,7 +690,7 @@
 	writeVariable(f, 255);
 }
 
-void AGOSEngine::oe1_saveGame() {
+void AGOSEngine_Elvira1::oe1_saveGame() {
 	// 201: save game
 	uint16 stringId = getNextStringID();
 
@@ -474,7 +698,7 @@
 	saveGame_e1((const char *)getStringPtrByID(stringId));
 }
 
-void AGOSEngine::oe1_loadGame() {
+void AGOSEngine_Elvira1::oe1_loadGame() {
 	// 202: load game
 	uint16 stringId = getNextStringID();
 	debug(0, "oe1_loadGame: stub (%s)", (const char *)getStringPtrByID(stringId));
@@ -486,14 +710,14 @@
 	}
 }
 
-void AGOSEngine::oe1_clearUserItem() {
+void AGOSEngine_Elvira1::oe1_clearUserItem() {
 	// 178: clear user item
 	Item *i = getNextItemPtr();
 	uint tmp = getVarOrWord();
 	setUserItem(i, tmp, 0);
 }
 
-void AGOSEngine::oe1_findMaster() {
+void AGOSEngine_Elvira1::oe1_findMaster() {
 	// 219: find master
 	int16 ad, no;
 	int16 d = getVarOrByte();
@@ -508,7 +732,7 @@
 		_objectItem = findMaster(ad, no);
 }
 
-void AGOSEngine::oe1_nextMaster() {
+void AGOSEngine_Elvira1::oe1_nextMaster() {
 	// 220: next master
 	int16 ad, no;
 	Item *item = getNextItemPtr();
@@ -524,7 +748,7 @@
 		_objectItem = nextMaster(item, ad, no);
 }
 
-void AGOSEngine::oe1_animate() {
+void AGOSEngine_Elvira1::oe1_animate() {
 	// 226: animate
 	uint vgaSpriteId = getVarOrWord();
 	uint windowNum = getVarOrByte();
@@ -537,19 +761,19 @@
 	_lockWord &= ~0x40;
 }
 
-void AGOSEngine::oe1_stopAnimate() {
+void AGOSEngine_Elvira1::oe1_stopAnimate() {
 	// 227: stop animate
 	stopAnimate(getVarOrWord());
 }
 
-void AGOSEngine::oe1_menu() {
+void AGOSEngine_Elvira1::oe1_menu() {
 	// 233: agos menu
 	uint b = getVarOrWord();
 	uint a = getVarOrWord();
 	drawMenuStrip(a, b);
 }
 
-void AGOSEngine::oe1_bitClear() {
+void AGOSEngine_Elvira1::oe1_bitClear() {
 	// 251: set bit off
 	int var = getVarOrWord();
 	int bit = getVarOrWord();
@@ -557,7 +781,7 @@
 	writeVariable(var, _variableArray[var] & ~(1 << bit));
 }
 
-void AGOSEngine::oe1_bitSet() {
+void AGOSEngine_Elvira1::oe1_bitSet() {
 	// 252: set bit on
 	int var = getVarOrWord();
 	int bit = getVarOrWord();
@@ -565,7 +789,7 @@
 	writeVariable(var, _variableArray[var] | (1 << bit));
 }
 
-void AGOSEngine::oe1_bitTest() {
+void AGOSEngine_Elvira1::oe1_bitTest() {
 	// 253: bit test
 	int var = getVarOrWord();
 	int bit = getVarOrWord();
@@ -573,7 +797,7 @@
 	setScriptCondition((_variableArray[var] & (1 << bit)) != 0);
 }
 
-void AGOSEngine::oe1_enableInput() {
+void AGOSEngine_Elvira1::oe1_enableInput() {
 	// 258: enable input
 	_variableArray[500] = 0;
 
@@ -593,12 +817,12 @@
 	_lastHitArea = 0;
 }
 
-void AGOSEngine::oe1_setTime() {
+void AGOSEngine_Elvira1::oe1_setTime() {
 	// 259: set time
 	time(&_timeStore);
 }
 
-void AGOSEngine::oe1_ifTime() {
+void AGOSEngine_Elvira1::oe1_ifTime() {
 	// 260: if time
 	time_t t;
 
@@ -611,7 +835,7 @@
 		setScriptCondition(false);
 }
 
-void AGOSEngine::oe1_playTune() {
+void AGOSEngine_Elvira1::oe1_playTune() {
 	// 264: play tune
 	int music = getVarOrWord();
 	int track = getVarOrWord();
@@ -631,13 +855,13 @@
 	}
 }
 
-void AGOSEngine::oe1_zoneDisk() {
+void AGOSEngine_Elvira1::oe1_zoneDisk() {
 	// 267: set disk number of each zone
 	getVarOrWord();
 	getVarOrWord();
 }
 
-void AGOSEngine::oe1_printStats() {
+void AGOSEngine_Elvira1::oe1_printStats() {
 	// 270: print stats
 	WindowBlock *window = _dummyWindow;
 	int val;
@@ -697,11 +921,11 @@
 	mouseOn();
 }
 
-void AGOSEngine::oe1_stopTune() {
+void AGOSEngine_Elvira1::oe1_stopTune() {
 	// 271: stop tune
 }
 
-void AGOSEngine::oe1_printPlayerDamage() {
+void AGOSEngine_Elvira1::oe1_printPlayerDamage() {
 	// 272: print player damage
 	WindowBlock *window = _dummyWindow;
 	window->flags = 1;
@@ -711,7 +935,7 @@
 	mouseOn();
 }
 
-void AGOSEngine::oe1_printMonsterDamage() {
+void AGOSEngine_Elvira1::oe1_printMonsterDamage() {
 	// 273: print monster damage
 	WindowBlock *window = _dummyWindow;
 	window->flags = 1;
@@ -721,7 +945,7 @@
 	mouseOn();
 }
 
-void AGOSEngine::oe1_pauseGame() {
+void AGOSEngine_Elvira1::oe1_pauseGame() {
 	// 274: pause game
 	WindowBlock *window = _windowArray[4];
 	const char *message1, *message2;
@@ -792,7 +1016,7 @@
 	_gameStoppedClock = time(NULL) - pauseTime + _gameStoppedClock;
 }
 
-void AGOSEngine::oe1_printPlayerHit() {
+void AGOSEngine_Elvira1::oe1_printPlayerHit() {
 	// 277: print player hit
 	WindowBlock *window = _dummyWindow;
 	window->flags = 1;
@@ -802,7 +1026,7 @@
 	mouseOn();
 }
 
-void AGOSEngine::oe1_printMonsterHit() {
+void AGOSEngine_Elvira1::oe1_printMonsterHit() {
 	// 278: print monster hit
 	WindowBlock *window = _dummyWindow;
 	window->flags = 1;

Modified: scummvm/trunk/engines/agos/script_e2.cpp
===================================================================
--- scummvm/trunk/engines/agos/script_e2.cpp	2007-04-15 11:30:11 UTC (rev 26489)
+++ scummvm/trunk/engines/agos/script_e2.cpp	2007-04-15 12:04:47 UTC (rev 26490)
@@ -27,77 +27,262 @@
 
 namespace AGOS {
 
-void AGOSEngine_Elvira2::setupOpcodes(OpcodeProc *op) {
-	AGOSEngine::setupOpcodes(op);
+#define OPCODE(x)	_OPCODE(AGOSEngine_Elvira2, x)
 
-	op[8] = &AGOSEngine::oe1_isNotAt;
-	op[9] = &AGOSEngine::oe1_sibling;
-	op[10] = &AGOSEngine::oe1_notSibling;
-	op[21] = &AGOSEngine::oe1_isIn;
-	op[22] = &AGOSEngine::oe1_isNotIn;
-	op[24] = &AGOSEngine::oe1_isPlayer;
-	op[29] = &AGOSEngine::oe1_canPut;
-	op[34] = &AGOSEngine::oe1_copyof;
-	op[35] = &AGOSEngine::oe1_copyfo;
-	op[37] = &AGOSEngine::oe1_whatO;
-	op[39] = &AGOSEngine::oe1_weigh;
-	op[54] = &AGOSEngine::oe2_moveDirn;
-	op[72] = &AGOSEngine::oe2_doClass;
-	op[73] = &AGOSEngine::oe2_pObj;
-	op[74] = &AGOSEngine::oe1_pName;
-	op[75] = &AGOSEngine::oe1_pcName;
-	op[79] = &AGOSEngine::oe1_isCalled;
-	op[83] = &AGOSEngine::oe1_rescan;
-	op[89] = &AGOSEngine::oe2_loadGame;
-	op[94] = &AGOSEngine::oe1_findMaster;
-	op[95] = &AGOSEngine::oe1_nextMaster;
-	op[98] = &AGOSEngine::oe1_animate;
-	op[99] = &AGOSEngine::oe1_stopAnimate;
-	op[113] = &AGOSEngine::oe2_drawItem;
-	op[123] = &AGOSEngine::oe1_setTime;
-	op[124] = &AGOSEngine::oe1_ifTime;
-	op[127] = &AGOSEngine::os1_playTune;
-	op[135] = &AGOSEngine::oe2_pauseGame;
-	op[144] = &AGOSEngine::oe2_setDoorOpen;
-	op[145] = &AGOSEngine::oe2_setDoorClosed;
-	op[146] = &AGOSEngine::oe2_setDoorLocked;
-	op[147] = &AGOSEngine::oe2_setDoorClosed;
-	op[148] = &AGOSEngine::oe2_ifDoorOpen;
-	op[149] = &AGOSEngine::oe2_ifDoorClosed;
-	op[150] = &AGOSEngine::oe2_ifDoorLocked;
-	op[161] = &AGOSEngine::oe2_printStats;
-	op[165] = &AGOSEngine::oe2_setSuperRoom;
-	op[166] = &AGOSEngine::oe2_getSuperRoom;
-	op[167] = &AGOSEngine::oe2_setExitOpen;
-	op[168] = &AGOSEngine::oe2_setExitClosed;
-	op[169] = &AGOSEngine::oe2_setExitLocked;
-	op[170] = &AGOSEngine::oe2_setExitClosed;
-	op[171] = &AGOSEngine::oe2_ifExitOpen;
-	op[172] = &AGOSEngine::oe2_ifExitClosed;
-	op[173] = &AGOSEngine::oe2_ifExitLocked;
-	op[174] = &AGOSEngine::oe2_unk174;
-	op[175] = &AGOSEngine::oe2_getDollar2;
-	op[176] = &AGOSEngine::oe2_setSRExit;
-	op[177] = &AGOSEngine::oe2_unk177;
-	op[178] = &AGOSEngine::oe2_unk178;
-	op[179] = &AGOSEngine::oe2_isAdjNoun;
-	op[180] = &AGOSEngine::oe2_b2Set;
-	op[181] = &AGOSEngine::oe2_b2Clear;
-	op[182] = &AGOSEngine::oe2_b2Zero;
-	op[183] = &AGOSEngine::oe2_b2NotZero;
+void AGOSEngine_Elvira2::setupOpcodes() {
+	static const OpcodeEntryElvira2 opcodes[] = {
+		/* 00 */
+		OPCODE(o_invalid),
+		OPCODE(o_at),
+		OPCODE(o_notAt),
+		OPCODE(o_invalid),
+		/* 04 */
+		OPCODE(o_invalid),
+		OPCODE(o_carried),
+		OPCODE(o_notCarried),
+		OPCODE(o_isAt),
+		/* 08 */
+		OPCODE(oe1_isNotAt),
+		OPCODE(oe1_sibling),
+		OPCODE(oe1_notSibling),
+		OPCODE(o_zero),
+		/* 12 */
+		OPCODE(o_notZero),
+		OPCODE(o_eq),
+		OPCODE(o_notEq),
+		OPCODE(o_gt),
+		/* 16 */
+		OPCODE(o_lt),
+		OPCODE(o_eqf),
+		OPCODE(o_notEqf),
+		OPCODE(o_ltf),
+		/* 20 */
+		OPCODE(o_gtf),
+		OPCODE(oe1_isIn),
+		OPCODE(oe1_isNotIn),
+		OPCODE(o_chance),
+		/* 24 */
+		OPCODE(oe1_isPlayer),
+		OPCODE(o_isRoom),
+		OPCODE(o_isObject),
+		OPCODE(o_state),
+		/* 28 */
+		OPCODE(o_oflag),
+		OPCODE(oe1_canPut),
+		OPCODE(o_invalid),
+		OPCODE(o_destroy),
+		/* 32 */
+		OPCODE(o_invalid),
+		OPCODE(o_place),
+		OPCODE(oe1_copyof),
+		OPCODE(oe1_copyfo),
+		/* 36 */
+		OPCODE(o_copyff),
+		OPCODE(oe1_whatO),
+		OPCODE(o_invalid),
+		OPCODE(oe1_weigh),
+		/* 40 */
+		OPCODE(o_invalid),
+		OPCODE(o_clear),
+		OPCODE(o_let),
+		OPCODE(o_add),
+		/* 44 */
+		OPCODE(o_sub),
+		OPCODE(o_addf),
+		OPCODE(o_subf),
+		OPCODE(o_mul),
+		/* 48 */
+		OPCODE(o_div),
+		OPCODE(o_mulf),
+		OPCODE(o_divf),
+		OPCODE(o_mod),
+		/* 52 */
+		OPCODE(o_modf),
+		OPCODE(o_random),
+		OPCODE(oe2_moveDirn),
+		OPCODE(o_goto),
+		/* 56 */
+		OPCODE(o_oset),
+		OPCODE(o_oclear),
+		OPCODE(o_putBy),
+		OPCODE(o_inc),
+		/* 60 */
+		OPCODE(o_dec),
+		OPCODE(o_setState),
+		OPCODE(o_print),
+		OPCODE(o_message),
+		/* 64 */
+		OPCODE(o_msg),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 68 */
+		OPCODE(o_end),
+		OPCODE(o_done),
+		OPCODE(o_invalid),
+		OPCODE(o_process),
+		/* 72 */
+		OPCODE(oe2_doClass),
+		OPCODE(oe2_pObj),
+		OPCODE(oe1_pName),
+		OPCODE(oe1_pcName),
+		/* 76 */
+		OPCODE(o_when),
+		OPCODE(o_if1),
+		OPCODE(o_if2),
+		OPCODE(oe1_isCalled),
+		/* 80 */
+		OPCODE(o_is),
+		OPCODE(o_invalid),
+		OPCODE(o_debug),
+		OPCODE(oe1_rescan),
+		/* 84 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_comment),
+		/* 88 */
+		OPCODE(o_invalid),
+		OPCODE(oe2_loadGame),
+		OPCODE(o_getParent),
+		OPCODE(o_getNext),
+		/* 92 */
+		OPCODE(o_getChildren),
+		OPCODE(o_invalid),
+		OPCODE(oe1_findMaster),
+		OPCODE(oe1_nextMaster),
+		/* 96 */
+		OPCODE(o_picture),
+		OPCODE(o_loadZone),
+		OPCODE(oe1_animate),
+		OPCODE(oe1_stopAnimate),
+		/* 100 */
+		OPCODE(o_killAnimate),
+		OPCODE(o_defWindow),
+		OPCODE(o_window),
+		OPCODE(o_cls),
+		/* 104 */
+		OPCODE(o_closeWindow),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_addBox),
+		/* 108 */
+		OPCODE(o_delBox),
+		OPCODE(o_enableBox),
+		OPCODE(o_disableBox),
+		OPCODE(o_moveBox),
+		/* 112 */
+		OPCODE(o_invalid),
+		OPCODE(oe2_drawItem),
+		OPCODE(o_doIcons),
+		OPCODE(o_isClass),
+		/* 116 */
+		OPCODE(o_setClass),
+		OPCODE(o_unsetClass),
+		OPCODE(o_invalid),
+		OPCODE(o_waitSync),
+		/* 120*/
+		OPCODE(o_sync),
+		OPCODE(o_defObj),
+		OPCODE(o_invalid),
+		OPCODE(oe1_setTime),
+		/* 124 */
+		OPCODE(oe1_ifTime),
+		OPCODE(o_here),
+		OPCODE(o_doClassIcons),
+		OPCODE(o_playTune),
+		/* 128 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_setAdjNoun),
+		OPCODE(o_invalid),
+		/* 132 */
+		OPCODE(o_saveUserGame),
+		OPCODE(o_loadUserGame),
+		OPCODE(o_invalid),
+		OPCODE(oe2_pauseGame),
+		/* 136 */
+		OPCODE(o_copysf),
+		OPCODE(o_restoreIcons),
+		OPCODE(o_freezeZones),
+		OPCODE(o_placeNoIcons),
+		/* 140 */
+		OPCODE(o_clearTimers),
+		OPCODE(o_setDollar),
+		OPCODE(o_isBox),
+		OPCODE(oe2_doTable),
+		/* 144 */
+		OPCODE(oe2_setDoorOpen),
+		OPCODE(oe2_setDoorClosed),
+		OPCODE(oe2_setDoorLocked),
+		OPCODE(oe2_setDoorClosed),
+		/* 148 */
+		OPCODE(oe2_ifDoorOpen),
+		OPCODE(oe2_ifDoorClosed),
+		OPCODE(oe2_ifDoorLocked),
+		OPCODE(oe2_storeItem),
+		/* 152 */
+		OPCODE(oe2_getItem),
+		OPCODE(oe2_bSet),
+		OPCODE(oe2_bClear),
+		OPCODE(oe2_bZero),
+		/* 156 */
+		OPCODE(oe2_bNotZero),
+		OPCODE(oe2_getOValue),
+		OPCODE(oe2_setOValue),
+		OPCODE(o_invalid),
+		/* 160 */
+		OPCODE(oe2_ink),
+		OPCODE(oe2_printStats),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 164 */
+		OPCODE(o_invalid),
+		OPCODE(oe2_setSuperRoom),
+		OPCODE(oe2_getSuperRoom),
+		OPCODE(oe2_setExitOpen),
+		/* 168 */
+		OPCODE(oe2_setExitClosed),
+		OPCODE(oe2_setExitLocked),
+		OPCODE(oe2_setExitClosed),
+		OPCODE(oe2_ifExitOpen),
+		/* 172 */
+		OPCODE(oe2_ifExitClosed),
+		OPCODE(oe2_ifExitLocked),
+		OPCODE(oe2_unk174),
+		OPCODE(oe2_getDollar2),
+		/* 176 */
+		OPCODE(oe2_setSRExit),
+		OPCODE(oe2_unk177),
+		OPCODE(oe2_unk178),
+		OPCODE(oe2_isAdjNoun),
+		/* 180 */
+		OPCODE(oe2_b2Set),
+		OPCODE(oe2_b2Clear),
+		OPCODE(oe2_b2Zero),
+		OPCODE(oe2_b2NotZero)
+	};
+
+	_opcodesElvira2 = opcodes;
+	_numOpcodes = 184;
 }
 
+void AGOSEngine_Elvira2::executeOpcode(int opcode) {
+	OpcodeProcElvira2 op = _opcodesElvira2[opcode].proc;
+	(this->*op) ();
+}
+
 // -----------------------------------------------------------------------
 // Elvira 2 Opcodes
 // -----------------------------------------------------------------------
 
-void AGOSEngine::oe2_moveDirn() {
+void AGOSEngine_Elvira2::oe2_moveDirn() {
 	// 54: move direction
 	int16 d = getVarOrByte();
 	moveDirn_e2(me(), d);
 }
 
-void AGOSEngine::oe2_doClass() {
+void AGOSEngine_Elvira2::oe2_doClass() {
 	// 72: do class
 	Item *i = getNextItemPtr();
 	byte cm = getByte();
@@ -120,7 +305,7 @@
 	}
 }
 
-void AGOSEngine::oe2_pObj() {
+void AGOSEngine_Elvira2::oe2_pObj() {
 	// 73: print object
 	SubObject *subObject = (SubObject *)findChildOfType(getNextItemPtr(), 2);
 
@@ -128,7 +313,7 @@
 		showMessageFormat((const char *)getStringPtrByID(subObject->objectFlagValue[0]));
 }
 
-void AGOSEngine::oe2_loadGame() {
+void AGOSEngine_Elvira2::oe2_loadGame() {
 	// 89: load game
 	uint16 stringId = getNextStringID();
 	debug(0, "oe1_loadGame: stub (%s)", (const char *)getStringPtrByID(stringId));
@@ -140,7 +325,7 @@
 	}
 }
 
-void AGOSEngine::oe2_drawItem() {
+void AGOSEngine_Elvira2::oe2_drawItem() {
 	// 113: draw item
 	Item *i = getNextItemPtr();
 	int a = getVarOrByte();
@@ -151,7 +336,7 @@
 	mouseOn();
 }
 
-void AGOSEngine::oe2_doTable() {
+void AGOSEngine_Elvira2::oe2_doTable() {
 	// 143: start item sub
 	Item *i = getNextItemPtr();
 
@@ -176,7 +361,7 @@
 	}
 }
 
-void AGOSEngine::oe2_pauseGame() {
+void AGOSEngine_Elvira2::oe2_pauseGame() {
 	// 135: pause game
 	HitArea *ha;
 
@@ -205,53 +390,53 @@
 	_gameStoppedClock = time(NULL) - pauseTime + _gameStoppedClock;
 }
 
-void AGOSEngine::oe2_setDoorOpen() {
+void AGOSEngine_Elvira2::oe2_setDoorOpen() {
 	// 144: set door open
 	Item *i = getNextItemPtr();
 	setDoorState(i, getVarOrByte(), 1);
 }
 
-void AGOSEngine::oe2_setDoorClosed() {
+void AGOSEngine_Elvira2::oe2_setDoorClosed() {
 	// 145: set door closed
 	Item *i = getNextItemPtr();
 	setDoorState(i, getVarOrByte(), 2);
 }
 
-void AGOSEngine::oe2_setDoorLocked() {
+void AGOSEngine_Elvira2::oe2_setDoorLocked() {
 	// 146: set door locked
 	Item *i = getNextItemPtr();
 	setDoorState(i, getVarOrByte(), 3);
 }
 
-void AGOSEngine::oe2_ifDoorOpen() {
+void AGOSEngine_Elvira2::oe2_ifDoorOpen() {
 	// 148: if door open
 	Item *i = getNextItemPtr();
 	uint16 d = getVarOrByte();
 	setScriptCondition(getDoorState(i, d) == 1);
 }
 
-void AGOSEngine::oe2_ifDoorClosed() {
+void AGOSEngine_Elvira2::oe2_ifDoorClosed() {
 	// 149: if door closed
 	Item *i = getNextItemPtr();
 	uint16 d = getVarOrByte();
 	setScriptCondition(getDoorState(i, d) == 2);
 }
 
-void AGOSEngine::oe2_ifDoorLocked() {
+void AGOSEngine_Elvira2::oe2_ifDoorLocked() {
 	// 150: if door locked
 	Item *i=getNextItemPtr();
 	uint16 d = getVarOrByte();
 	setScriptCondition(getDoorState(i, d) == 3);
 }
 
-void AGOSEngine::oe2_storeItem() {
+void AGOSEngine_Elvira2::oe2_storeItem() {
 	// 151: set array6 to item
 	uint var = getVarOrByte();
 	Item *item = getNextItemPtr();
 	_itemStore[var] = item;
 }
 
-void AGOSEngine::oe2_getItem() {
+void AGOSEngine_Elvira2::oe2_getItem() {
 	// 152: set m1 to m3 to array 6
 	Item *item = _itemStore[getVarOrByte()];
 	uint var = getVarOrByte();
@@ -262,22 +447,22 @@
 	}
 }
 
-void AGOSEngine::oe2_bSet() {
+void AGOSEngine_Elvira2::oe2_bSet() {
 	// 153: set bit
 	setBitFlag(getVarWrapper(), true);
 }
 
-void AGOSEngine::oe2_bClear() {
+void AGOSEngine_Elvira2::oe2_bClear() {
 	// 154: clear bit
 	setBitFlag(getVarWrapper(), false);
 }
 
-void AGOSEngine::oe2_bZero() {
+void AGOSEngine_Elvira2::oe2_bZero() {
 	// 155: is bit clear
 	setScriptCondition(!getBitFlag(getVarWrapper()));
 }
 
-void AGOSEngine::oe2_bNotZero() {
+void AGOSEngine_Elvira2::oe2_bNotZero() {
 	// 156: is bit set
 	uint bit = getVarWrapper();
 
@@ -289,7 +474,7 @@
 	setScriptCondition(getBitFlag(bit));
 }
 
-void AGOSEngine::oe2_getOValue() {
+void AGOSEngine_Elvira2::oe2_getOValue() {
 	// 157: get item int prop
 	Item *item = getNextItemPtr();
 	SubObject *subObject = (SubObject *)findChildOfType(item, 2);
@@ -303,7 +488,7 @@
 	}
 }
 
-void AGOSEngine::oe2_setOValue() {
+void AGOSEngine_Elvira2::oe2_setOValue() {
 	// 158: set item prop
 	Item *item = getNextItemPtr();
 	SubObject *subObject = (SubObject *)findChildOfType(item, 2);
@@ -316,12 +501,12 @@
 	}
 }
 
-void AGOSEngine::oe2_ink() {
+void AGOSEngine_Elvira2::oe2_ink() {
 	// 160
 	setTextColor(getVarOrByte());
 }
 
-void AGOSEngine::oe2_printStats() {
+void AGOSEngine_Elvira2::oe2_printStats() {
 	// 161: print stats
 	WindowBlock *window = _dummyWindow;
 	int val;
@@ -366,17 +551,17 @@
 	mouseOn();
 }
 
-void AGOSEngine::oe2_setSuperRoom() {
+void AGOSEngine_Elvira2::oe2_setSuperRoom() {
 	// 165: set super room
 	_superRoomNumber = getVarOrWord();
 }
 
-void AGOSEngine::oe2_getSuperRoom() {
+void AGOSEngine_Elvira2::oe2_getSuperRoom() {
 	// 166: get super room
 	writeNextVarContents(_superRoomNumber);
 }
 
-void AGOSEngine::oe2_setExitOpen() {
+void AGOSEngine_Elvira2::oe2_setExitOpen() {
 	// 167: set exit open
 	Item *i = getNextItemPtr();
 	uint16 n = getVarOrWord();
@@ -384,7 +569,7 @@
 	setExitState(i, n, d, 1);
 }
 
-void AGOSEngine::oe2_setExitClosed() {
+void AGOSEngine_Elvira2::oe2_setExitClosed() {
 	// 168: set exit closed
 	Item *i = getNextItemPtr();
 	uint16 n = getVarOrWord();
@@ -392,7 +577,7 @@
 	setExitState(i, n, d, 2);
 }
 
-void AGOSEngine::oe2_setExitLocked() {
+void AGOSEngine_Elvira2::oe2_setExitLocked() {
 	// 169: set exit locked
 	Item *i = getNextItemPtr();
 	uint16 n = getVarOrWord();
@@ -400,7 +585,7 @@
 	setExitState(i, n, d, 3);
 }
 
-void AGOSEngine::oe2_ifExitOpen() {
+void AGOSEngine_Elvira2::oe2_ifExitOpen() {
 	// 171: if exit open
 	Item *i = getNextItemPtr();
 	uint16 n = getVarOrWord();
@@ -408,7 +593,7 @@
 	setScriptCondition(getExitState(i, n, d) == 1);
 }
 
-void AGOSEngine::oe2_ifExitClosed() {
+void AGOSEngine_Elvira2::oe2_ifExitClosed() {
 	// 172: if exit closed
 	Item *i = getNextItemPtr();
 	uint16 n = getVarOrWord();
@@ -416,7 +601,7 @@
 	setScriptCondition(getExitState(i, n, d) == 2);
 }
 
-void AGOSEngine::oe2_ifExitLocked() {
+void AGOSEngine_Elvira2::oe2_ifExitLocked() {
 	// 173: if exit locked
 	Item *i = getNextItemPtr();
 	uint16 n = getVarOrWord();
@@ -424,13 +609,13 @@
 	setScriptCondition(getExitState(i, n, d) == 3);
 }
 
-void AGOSEngine::oe2_unk174() {
+void AGOSEngine_Elvira2::oe2_unk174() {
 	// 174:
 	uint a = getVarOrWord();
 	debug(0, "oe2_unk174: stub (%d)", a);
 }
 
-void AGOSEngine::oe2_getDollar2() {
+void AGOSEngine_Elvira2::oe2_getDollar2() {
 	// 175
 	_showPreposition = true;
 
@@ -455,7 +640,7 @@
 	_showPreposition = false;
 }
 
-void AGOSEngine::oe2_setSRExit() {
+void AGOSEngine_Elvira2::oe2_setSRExit() {
 	// 176: set super room exit
 	Item *i = getNextItemPtr();
 	uint n = getVarOrWord();
@@ -464,44 +649,44 @@
 	setSRExit(i, n, d, s);
 }
 
-void AGOSEngine::oe2_unk177() {
+void AGOSEngine_Elvira2::oe2_unk177() {
 	// 177: set unknown vga event
 	uint a = getVarOrByte();
 	debug(0, "oe2_unk177: stub (%d)", a);
 }
 
-void AGOSEngine::oe2_unk178() {
+void AGOSEngine_Elvira2::oe2_unk178() {
 	// 178: set unknown vga event
 	uint a = getVarOrByte();
 	debug(0, "oe2_unk178: stub (%d)", a);
 }
 
-void AGOSEngine::oe2_isAdjNoun() {
+void AGOSEngine_Elvira2::oe2_isAdjNoun() {
 	// 179: item unk1 unk2 is
 	Item *item = getNextItemPtr();
 	int16 a = getNextWord(), b = getNextWord();
 	setScriptCondition(item->adjective == a && item->noun == b);
 }
 
-void AGOSEngine::oe2_b2Set() {
+void AGOSEngine_Elvira2::oe2_b2Set() {
 	// 180: set bit2
 	uint bit = getVarOrByte();
 	_bitArrayTwo[bit / 16] |= (1 << (bit & 15));
 }
 
-void AGOSEngine::oe2_b2Clear() {
+void AGOSEngine_Elvira2::oe2_b2Clear() {
 	// 181: clear bit2
 	uint bit = getVarOrByte();
 	_bitArrayTwo[bit / 16] &= ~(1 << (bit & 15));
 }
 
-void AGOSEngine::oe2_b2Zero() {
+void AGOSEngine_Elvira2::oe2_b2Zero() {
 	// 182: is bit2 clear
 	uint bit = getVarOrByte();
 	setScriptCondition((_bitArrayTwo[bit / 16] & (1 << (bit & 15))) == 0);
 }
 
-void AGOSEngine::oe2_b2NotZero() {
+void AGOSEngine_Elvira2::oe2_b2NotZero() {
 	// 183: is bit2 set
 	uint bit = getVarOrByte();
 	setScriptCondition((_bitArrayTwo[bit / 16] & (1 << (bit & 15))) != 0);

Modified: scummvm/trunk/engines/agos/script_ff.cpp
===================================================================
--- scummvm/trunk/engines/agos/script_ff.cpp	2007-04-15 11:30:11 UTC (rev 26489)
+++ scummvm/trunk/engines/agos/script_ff.cpp	2007-04-15 12:04:47 UTC (rev 26490)
@@ -30,69 +30,276 @@
 
 namespace AGOS {
 
-void AGOSEngine_Feeble::setupOpcodes(OpcodeProc *op) {
-	AGOSEngine::setupOpcodes(op);
+#define OPCODE(x)	_OPCODE(AGOSEngine_Feeble, x)
 
-	op[23] = &AGOSEngine::off_chance;
-	op[37] = &AGOSEngine::off_jumpOut;
-	op[65] = &AGOSEngine::off_addTextBox;
-	op[66] = &AGOSEngine::oww_setShortText;
-	op[67] = &AGOSEngine::oww_setLongText;
-	op[70] = &AGOSEngine::off_printLongText;
-	op[83] = &AGOSEngine::os2_rescan;
-	op[98] = &AGOSEngine::os2_animate;
-	op[99] = &AGOSEngine::os2_stopAnimate;
-	op[107] = &AGOSEngine::off_addBox;
-	op[122] = &AGOSEngine::off_oracleTextDown;
-	op[123] = &AGOSEngine::off_oracleTextUp;
-	op[124] = &AGOSEngine::off_ifTime;
-	op[131] = &AGOSEngine::off_setTime;
-	op[132] = &AGOSEngine::off_saveUserGame;
-	op[133] = &AGOSEngine::off_loadUserGame;
-	op[134] = &AGOSEngine::off_listSaveGames;
-	op[135] = &AGOSEngine::off_checkCD;
-	op[161] = &AGOSEngine::off_screenTextBox;
-	op[162] = &AGOSEngine::os1_screenTextMsg;
-	op[164] = &AGOSEngine::oe2_getDollar2;
-	op[165] = &AGOSEngine::off_isAdjNoun;
-	op[166] = &AGOSEngine::oe2_b2Set;
-	op[167] = &AGOSEngine::oe2_b2Clear;
-	op[168] = &AGOSEngine::oe2_b2Zero;
-	op[169] = &AGOSEngine::oe2_b2NotZero;
-	op[171] = &AGOSEngine::off_hyperLinkOn;
-	op[172] = &AGOSEngine::off_hyperLinkOff;
-	op[173] = &AGOSEngine::off_checkPaths;
-	op[175] = &AGOSEngine::oww_lockZones;
-	op[176] = &AGOSEngine::oww_unlockZones;
-	op[177] = &AGOSEngine::off_screenTextPObj;
-	op[178] = &AGOSEngine::os1_getPathPosn;
-	op[179] = &AGOSEngine::os1_scnTxtLongText;
-	op[180] = &AGOSEngine::off_mouseOn;
-	op[181] = &AGOSEngine::off_mouseOff;
-	op[182] = &AGOSEngine::off_loadVideo;
-	op[183] = &AGOSEngine::off_playVideo;
-	op[184] = &AGOSEngine::os1_unloadZone;
-	op[186] = &AGOSEngine::os1_unfreezeZones;
-	op[187] = &AGOSEngine::off_centreScroll;
-	op[188] = &AGOSEngine::os2_isShortText;
-	op[189] = &AGOSEngine::os2_clearMarks;
-	op[190] = &AGOSEngine::os2_waitMark;
-	op[191] = &AGOSEngine::off_resetPVCount;
-	op[192] = &AGOSEngine::off_setPathValues;
-	op[193] = &AGOSEngine::off_stopClock;
-	op[194] = &AGOSEngine::off_restartClock;
-	op[195] = &AGOSEngine::off_setColour;
-	op[196] = &AGOSEngine::off_b3Set;
-	op[197] = &AGOSEngine::off_b3Clear;
-	op[198] = &AGOSEngine::off_b3Zero;
-	op[199] = &AGOSEngine::off_b3NotZero;
+void AGOSEngine_Feeble::setupOpcodes() {
+	static const OpcodeEntryFeeble opcodes[] = {
+		/* 00 */
+		OPCODE(o_invalid),
+		OPCODE(o_at),
+		OPCODE(o_notAt),
+		OPCODE(o_invalid),
+		/* 04 */
+		OPCODE(o_invalid),
+		OPCODE(o_carried),
+		OPCODE(o_notCarried),
+		OPCODE(o_isAt),
+		/* 08 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_zero),
+		/* 12 */
+		OPCODE(o_notZero),
+		OPCODE(o_eq),
+		OPCODE(o_notEq),
+		OPCODE(o_gt),
+		/* 16 */
+		OPCODE(o_lt),
+		OPCODE(o_eqf),
+		OPCODE(o_notEqf),
+		OPCODE(o_ltf),
+		/* 20 */
+		OPCODE(o_gtf),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(off_chance),
+		/* 24 */
+		OPCODE(o_invalid),
+		OPCODE(o_isRoom),
+		OPCODE(o_isObject),
+		OPCODE(o_state),
+		/* 28 */
+		OPCODE(o_oflag),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_destroy),
+		/* 32 */
+		OPCODE(o_invalid),
+		OPCODE(o_place),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 36 */
+		OPCODE(o_copyff),
+		OPCODE(off_jumpOut),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 40 */
+		OPCODE(o_invalid),
+		OPCODE(o_clear),
+		OPCODE(o_let),
+		OPCODE(o_add),
+		/* 44 */
+		OPCODE(o_sub),
+		OPCODE(o_addf),
+		OPCODE(o_subf),
+		OPCODE(o_mul),
+		/* 48 */
+		OPCODE(o_div),
+		OPCODE(o_mulf),
+		OPCODE(o_divf),
+		OPCODE(o_mod),
+		/* 52 */
+		OPCODE(o_modf),
+		OPCODE(o_random),
+		OPCODE(o_invalid),
+		OPCODE(o_goto),
+		/* 56 */
+		OPCODE(o_oset),
+		OPCODE(o_oclear),
+		OPCODE(o_putBy),
+		OPCODE(o_inc),
+		/* 60 */
+		OPCODE(o_dec),
+		OPCODE(o_setState),
+		OPCODE(o_print),
+		OPCODE(o_message),
+		/* 64 */
+		OPCODE(o_msg),
+		OPCODE(off_addTextBox),
+		OPCODE(oww_setShortText),
+		OPCODE(oww_setLongText),
+		/* 68 */
+		OPCODE(o_end),
+		OPCODE(o_done),
+		OPCODE(off_printLongText),
+		OPCODE(o_process),
+		/* 72 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 76 */
+		OPCODE(o_when),
+		OPCODE(o_if1),
+		OPCODE(o_if2),
+		OPCODE(o_isCalled),
+		/* 80 */
+		OPCODE(o_is),
+		OPCODE(o_invalid),
+		OPCODE(o_debug),
+		OPCODE(os2_rescan),
+		/* 84 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_comment),
+		/* 88 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_getParent),
+		OPCODE(o_getNext),
+		/* 92 */
+		OPCODE(o_getChildren),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 96 */
+		OPCODE(o_picture),
+		OPCODE(o_loadZone),
+		OPCODE(os2_animate),
+		OPCODE(os2_stopAnimate),
+		/* 100 */
+		OPCODE(o_killAnimate),
+		OPCODE(o_defWindow),
+		OPCODE(o_window),
+		OPCODE(o_cls),
+		/* 104 */
+		OPCODE(o_closeWindow),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(off_addBox),
+		/* 108 */
+		OPCODE(o_delBox),
+		OPCODE(o_enableBox),
+		OPCODE(o_disableBox),
+		OPCODE(o_moveBox),
+		/* 112 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_doIcons),
+		OPCODE(o_isClass),
+		/* 116 */
+		OPCODE(o_setClass),
+		OPCODE(o_unsetClass),
+		OPCODE(o_invalid),
+		OPCODE(o_waitSync),
+		/* 120 */
+		OPCODE(o_sync),
+		OPCODE(o_defObj),
+		OPCODE(off_oracleTextDown),
+		OPCODE(off_oracleTextUp),
+		/* 124 */
+		OPCODE(off_ifTime),
+		OPCODE(o_here),
+		OPCODE(o_doClassIcons),
+		OPCODE(o_invalid),
+		/* 128 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_setAdjNoun),
+		OPCODE(off_setTime),
+		/* 132 */
+		OPCODE(off_saveUserGame),
+		OPCODE(off_loadUserGame),
+		OPCODE(off_listSaveGames),
+		OPCODE(off_checkCD),
+		/* 136 */
+		OPCODE(o_copysf),
+		OPCODE(o_restoreIcons),
+		OPCODE(o_freezeZones),
+		OPCODE(o_placeNoIcons),
+		/* 140 */
+		OPCODE(o_clearTimers),
+		OPCODE(o_setDollar),
+		OPCODE(o_isBox),
+		OPCODE(oe2_doTable),
+		/* 144 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 148 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(oe2_storeItem),
+		/* 152 */
+		OPCODE(oe2_getItem),
+		OPCODE(oe2_bSet),
+		OPCODE(oe2_bClear),
+		OPCODE(oe2_bZero),
+		/* 156 */
+		OPCODE(oe2_bNotZero),
+		OPCODE(oe2_getOValue),
+		OPCODE(oe2_setOValue),
+		OPCODE(o_invalid),
+		/* 160 */
+		OPCODE(oe2_ink),
+		OPCODE(off_screenTextBox),
+		OPCODE(os1_screenTextMsg),
+		OPCODE(o_invalid),
+		/* 164 */
+		OPCODE(oe2_getDollar2),
+		OPCODE(off_isAdjNoun),
+		OPCODE(oe2_b2Set),
+		OPCODE(oe2_b2Clear),
+		/* 168 */
+		OPCODE(oe2_b2Zero),
+		OPCODE(oe2_b2NotZero),
+		OPCODE(o_invalid),
+		OPCODE(off_hyperLinkOn),
+		/* 172 */
+		OPCODE(off_hyperLinkOff),
+		OPCODE(off_checkPaths),
+		OPCODE(o_invalid),
+		OPCODE(oww_lockZones),
+		/* 176 */
+		OPCODE(oww_unlockZones),
+		OPCODE(off_screenTextPObj),
+		OPCODE(os1_getPathPosn),
+		OPCODE(os1_scnTxtLongText),
+		/* 180 */
+		OPCODE(off_mouseOn),
+		OPCODE(off_mouseOff),
+		OPCODE(off_loadVideo),
+		OPCODE(off_playVideo),
+		/* 184 */
+		OPCODE(os1_unloadZone),
+		OPCODE(o_invalid),
+		OPCODE(os1_unfreezeZones),
+		OPCODE(off_centreScroll),
+		/* 188 */
+		OPCODE(os2_isShortText),
+		OPCODE(os2_clearMarks),
+		OPCODE(os2_waitMark),
+		OPCODE(off_resetPVCount),
+		/* 192 */
+		OPCODE(off_setPathValues),
+		OPCODE(off_stopClock),
+		OPCODE(off_restartClock),
+		OPCODE(off_setColour),
+		/* 196 */
+		OPCODE(off_b3Set),
+		OPCODE(off_b3Clear),
+		OPCODE(off_b3Zero),
+		OPCODE(off_b3NotZero)
+	};
+
+	_opcodesFeeble = opcodes;
+	_numOpcodes = 200;
 }
 
+void AGOSEngine_Feeble::executeOpcode(int opcode) {
+	OpcodeProcFeeble op = _opcodesFeeble[opcode].proc;
+	(this->*op) ();
+}
+
 // -----------------------------------------------------------------------
 // Feeble Files Opcodes
 // -----------------------------------------------------------------------
 
-void AGOSEngine::off_chance() {
+void AGOSEngine_Feeble::off_chance() {
 	// 23
 	uint a = getVarOrWord();
 
@@ -112,13 +319,13 @@
 		setScriptCondition(false);
 }
 
-void AGOSEngine::off_jumpOut() {
+void AGOSEngine_Feeble::off_jumpOut() {
 	// 37
 	getVarOrByte();
 	setScriptReturn(1);
 }
 
-void AGOSEngine::off_addTextBox() {
+void AGOSEngine_Feeble::off_addTextBox() {
 	// 65: add hit area
 	uint flags = kBFTextBox | kBFBoxItem;
 	uint id = getVarOrWord();
@@ -139,14 +346,14 @@
 		defineBox(id, x, y, w, h, flags + (num << 8), 208, _dummyItem2);
 }
 
-void AGOSEngine::off_printLongText() {
+void AGOSEngine_Feeble::off_printLongText() {
 	// 70: show string from array
 	int num = getVarOrByte();
 	const char *str = (const char *)getStringPtrByID(_longText[num]);
 	sendInteractText(num, "%d. %s\n", num, str);
 }
 
-void AGOSEngine::off_addBox() {
+void AGOSEngine_Feeble::off_addBox() {
 	// 107: add item hitarea
 	uint flags = 0;
 	uint id = getVarOrWord();
@@ -176,17 +383,17 @@
 	defineBox(id, x, y, w, h, flags, verb, item);
 }
 
-void AGOSEngine::off_oracleTextDown() {
+void AGOSEngine_Feeble::off_oracleTextDown() {
 	// 122: oracle text down
 	oracleTextDown();
 }
 
-void AGOSEngine::off_oracleTextUp() {
+void AGOSEngine_Feeble::off_oracleTextUp() {
 	// 123: oracle text up
 	oracleTextUp();
 }
 
-void AGOSEngine::off_ifTime() {
+void AGOSEngine_Feeble::off_ifTime() {
 	// 124: if time
 	time_t t;
 
@@ -200,13 +407,13 @@
 		setScriptCondition(false);
 }
 
-void AGOSEngine::off_setTime() {
+void AGOSEngine_Feeble::off_setTime() {
 	// 131
 	time(&_timeStore);
 	_timeStore -= _gameStoppedClock;
 }
 
-void AGOSEngine::off_saveUserGame() {
+void AGOSEngine_Feeble::off_saveUserGame() {
 	// 132: save game
 	_noOracleScroll = 0;
 	_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
@@ -214,7 +421,7 @@
 	_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
 }
 
-void AGOSEngine::off_loadUserGame() {
+void AGOSEngine_Feeble::off_loadUserGame() {
 	// 133: load game
 	if (readVariable(55) == 999) {
 		loadGame(getFileName(GAME_RESTFILE), true);
@@ -223,12 +430,12 @@
 	}
 }
 
-void AGOSEngine::off_listSaveGames() {
+void AGOSEngine_Feeble::off_listSaveGames() {
 	// 134: dummy opcode?
 	listSaveGames(1);
 }
 
-void AGOSEngine::off_checkCD() {
+void AGOSEngine_Feeble::off_checkCD() {
 	// 135: switch CD
 	uint disc = readVariable(97);
 
@@ -244,7 +451,7 @@
 	debug(0, "Switch to CD number %d", disc);
 }
 
-void AGOSEngine::off_screenTextBox() {
+void AGOSEngine_Feeble::off_screenTextBox() {
 	// 161: setup text
 	TextLocation *tl = getTextLocation(getVarOrByte());
 
@@ -253,7 +460,7 @@
 	tl->width = getVarOrWord();
 }
 
-void AGOSEngine::off_isAdjNoun() {
+void AGOSEngine_Feeble::off_isAdjNoun() {
 	// 165: item unk1 unk2 is
 	Item *item = getNextItemPtr();
 	int16 a = getNextWord(), b = getNextWord();
@@ -265,17 +472,17 @@
 		setScriptCondition(false);
 }
 
-void AGOSEngine::off_hyperLinkOn() {
+void AGOSEngine_Feeble::off_hyperLinkOn() {
 	// 171: oracle hyperlink on
 	hyperLinkOn(getVarOrWord());
 }
 
-void AGOSEngine::off_hyperLinkOff() {
+void AGOSEngine_Feeble::off_hyperLinkOff() {
 	// 172: oracle hyperlink off
 	hyperLinkOff();
 }
 
-void AGOSEngine::off_checkPaths() {
+void AGOSEngine_Feeble::off_checkPaths() {
 	// 173 check paths
 	int i, count;
 	const uint8 *pathVal1 = _pathValues1;
@@ -311,7 +518,7 @@
 	_variableArray2[52] = result;
 }
 
-void AGOSEngine::off_screenTextPObj() {
+void AGOSEngine_Feeble::off_screenTextPObj() {
 	// 177: inventory descriptions
 	uint vgaSpriteId = getVarOrByte();
 	uint color = getVarOrByte();
@@ -340,7 +547,7 @@
 	}
 }
 
-void AGOSEngine::off_mouseOn() {
+void AGOSEngine_Feeble::off_mouseOn() {
 	// 180: force mouseOn
 	if (_mouseCursor != 5) {
 		resetVerbs();
@@ -349,29 +556,29 @@
 	_mouseHideCount = 0;
 }
 
-void AGOSEngine::off_mouseOff() {
+void AGOSEngine_Feeble::off_mouseOff() {
 	// 181: force mouseOff
 	scriptMouseOff();
 	clearName();
 }
 
-void AGOSEngine::off_loadVideo() {
+void AGOSEngine_Feeble::off_loadVideo() {
 	// 182: load video file
 	const byte *filename = getStringPtrByID(getNextStringID());
 	_moviePlay->load((const char *)filename);
 }
 
-void AGOSEngine::off_playVideo() {
+void AGOSEngine_Feeble::off_playVideo() {
 	// 183: play video
 	_moviePlay->play();
 }
 
-void AGOSEngine::off_centreScroll() {
+void AGOSEngine_Feeble::off_centreScroll() {
 	// 187
 	centreScroll();
 }
 
-void AGOSEngine::off_resetPVCount() {
+void AGOSEngine_Feeble::off_resetPVCount() {
 	// 191
 	if (getBitFlag(83)) {
 		_PVCount1 = 0;
@@ -382,7 +589,7 @@
 	}
 }
 
-void AGOSEngine::off_setPathValues() {
+void AGOSEngine_Feeble::off_setPathValues() {
 	// 192
 	uint8 a = getVarOrByte();
 	uint8 b = getVarOrByte();
@@ -401,19 +608,19 @@
 	}
 }
 
-void AGOSEngine::off_stopClock() {
+void AGOSEngine_Feeble::off_stopClock() {
 	// 193: pause clock
 	_clockStopped = time(NULL);
 }
 
-void AGOSEngine::off_restartClock() {
+void AGOSEngine_Feeble::off_restartClock() {
 	// 194: resume clock
 	if (_clockStopped != 0)
 		_gameStoppedClock += time(NULL) - _clockStopped;
 	_clockStopped = 0;
 }
 
-void AGOSEngine::off_setColour() {
+void AGOSEngine_Feeble::off_setColour() {
 	// 195: set palette colour
 	uint c = getVarOrByte() * 4;
 	uint r = getVarOrByte();
@@ -427,25 +634,25 @@
 	_paletteFlag = 2;
 }
 
-void AGOSEngine::off_b3Set() {
+void AGOSEngine_Feeble::off_b3Set() {
 	// 196: set bit3
 	uint bit = getVarOrByte();
 	_bitArrayThree[bit / 16] |= (1 << (bit & 15));
 }
 
-void AGOSEngine::off_b3Clear() {
+void AGOSEngine_Feeble::off_b3Clear() {
 	// 197: clear bit3
 	uint bit = getVarOrByte();
 	_bitArrayThree[bit / 16] &= ~(1 << (bit & 15));
 }
 
-void AGOSEngine::off_b3Zero() {
+void AGOSEngine_Feeble::off_b3Zero() {
 	// 198: is bit3 clear
 	uint bit = getVarOrByte();
 	setScriptCondition((_bitArrayThree[bit / 16] & (1 << (bit & 15))) == 0);
 }
 
-void AGOSEngine::off_b3NotZero() {
+void AGOSEngine_Feeble::off_b3NotZero() {
 	// 199: is bit3 set
 	uint bit = getVarOrByte();
 	setScriptCondition((_bitArrayThree[bit / 16] & (1 << (bit & 15))) != 0);

Modified: scummvm/trunk/engines/agos/script_pp.cpp
===================================================================
--- scummvm/trunk/engines/agos/script_pp.cpp	2007-04-15 11:30:11 UTC (rev 26489)
+++ scummvm/trunk/engines/agos/script_pp.cpp	2007-04-15 12:04:47 UTC (rev 26490)
@@ -29,64 +29,271 @@
 
 namespace AGOS {
 
-void AGOSEngine_PuzzlePack::setupOpcodes(OpcodeProc *op) {
-	AGOSEngine::setupOpcodes(op);
+#define OPCODE(x)	_OPCODE(AGOSEngine_PuzzlePack, x)
 
-	op[23] = &AGOSEngine::off_chance;
-	op[30] = &AGOSEngine::opp_iconifyWindow;
-	op[32] = &AGOSEngine::opp_restoreOopsPosition;
-	op[38] = &AGOSEngine::opp_loadMouseImage;
-	op[63] = &AGOSEngine::opp_message;
-	op[65] = &AGOSEngine::off_addTextBox;
-	op[66] = &AGOSEngine::opp_setShortText;
-	op[67] = &AGOSEngine::oww_setLongText;
-	op[70] = &AGOSEngine::off_printLongText;
-	op[83] = &AGOSEngine::os2_rescan;
-	op[98] = &AGOSEngine::os2_animate;
-	op[99] = &AGOSEngine::os2_stopAnimate;
-	op[105] = &AGOSEngine::opp_loadHiScores;
-	op[106] = &AGOSEngine::opp_checkHiScores;
-	op[107] = &AGOSEngine::off_addBox;
-	op[120] = &AGOSEngine::opp_sync;
-	op[122] = &AGOSEngine::off_oracleTextDown;
-	op[123] = &AGOSEngine::off_oracleTextUp;
-	op[124] = &AGOSEngine::off_ifTime;
-	op[131] = &AGOSEngine::off_setTime;
-	op[132] = &AGOSEngine::opp_saveUserGame;
-	op[133] = &AGOSEngine::opp_loadUserGame;
-	op[134] = &AGOSEngine::off_listSaveGames;
-	op[161] = &AGOSEngine::off_screenTextBox;
-	op[162] = &AGOSEngine::os1_screenTextMsg;
-	op[164] = &AGOSEngine::oe2_getDollar2;
-	op[165] = &AGOSEngine::off_isAdjNoun;
-	op[171] = &AGOSEngine::off_hyperLinkOn;
-	op[172] = &AGOSEngine::off_hyperLinkOff;
-	op[173] = &AGOSEngine::opp_saveOopsPosition;
-	op[175] = &AGOSEngine::oww_lockZones;
-	op[176] = &AGOSEngine::oww_unlockZones;
-	op[177] = &AGOSEngine::off_screenTextPObj;
-	op[178] = &AGOSEngine::os1_getPathPosn;
-	op[179] = &AGOSEngine::os1_scnTxtLongText;
-	op[180] = &AGOSEngine::os1_mouseOn;
-	op[181] = &AGOSEngine::off_mouseOff;
-	op[184] = &AGOSEngine::os1_unloadZone;
-	op[186] = &AGOSEngine::os1_unfreezeZones;
-	op[187] = &AGOSEngine::opp_resetGameTime;
-	op[188] = &AGOSEngine::os2_isShortText;
-	op[189] = &AGOSEngine::os2_clearMarks;
-	op[190] = &AGOSEngine::os2_waitMark;
-	op[191] = &AGOSEngine::opp_resetPVCount;
-	op[192] = &AGOSEngine::opp_setPathValues;
-	op[193] = &AGOSEngine::off_stopClock;
-	op[194] = &AGOSEngine::opp_restartClock;
-	op[195] = &AGOSEngine::off_setColour;
+void AGOSEngine_PuzzlePack::setupOpcodes() {
+	static const OpcodeEntryPuzzlePack opcodes[] = {
+		/* 00 */
+		OPCODE(o_invalid),
+		OPCODE(o_at),
+		OPCODE(o_notAt),
+		OPCODE(o_invalid),
+		/* 04 */
+		OPCODE(o_invalid),
+		OPCODE(o_carried),
+		OPCODE(o_notCarried),
+		OPCODE(o_isAt),
+		/* 08 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_zero),
+		/* 12 */
+		OPCODE(o_notZero),
+		OPCODE(o_eq),
+		OPCODE(o_notEq),
+		OPCODE(o_gt),
+		/* 16 */
+		OPCODE(o_lt),
+		OPCODE(o_eqf),
+		OPCODE(o_notEqf),
+		OPCODE(o_ltf),
+		/* 20 */
+		OPCODE(o_gtf),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(off_chance),
+		/* 24 */
+		OPCODE(o_invalid),
+		OPCODE(o_isRoom),
+		OPCODE(o_isObject),
+		OPCODE(o_state),
+		/* 28 */
+		OPCODE(o_oflag),
+		OPCODE(opp_iconifyWindow),
+		OPCODE(o_invalid),
+		OPCODE(o_destroy),
+		/* 32 */
+		OPCODE(opp_restoreOopsPosition),
+		OPCODE(o_place),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 36 */
+		OPCODE(o_copyff),
+		OPCODE(o_invalid),
+		OPCODE(opp_loadMouseImage),
+		OPCODE(o_invalid),
+		/* 40 */
+		OPCODE(o_invalid),
+		OPCODE(o_clear),
+		OPCODE(o_let),
+		OPCODE(o_add),
+		/* 44 */
+		OPCODE(o_sub),
+		OPCODE(o_addf),
+		OPCODE(o_subf),
+		OPCODE(o_mul),
+		/* 48 */
+		OPCODE(o_div),
+		OPCODE(o_mulf),
+		OPCODE(o_divf),
+		OPCODE(o_mod),
+		/* 52 */
+		OPCODE(o_modf),
+		OPCODE(o_random),
+		OPCODE(o_invalid),
+		OPCODE(o_goto),
+		/* 56 */
+		OPCODE(o_oset),
+		OPCODE(o_oclear),
+		OPCODE(o_putBy),
+		OPCODE(o_inc),
+		/* 60 */
+		OPCODE(o_dec),
+		OPCODE(o_setState),
+		OPCODE(o_print),
+		OPCODE(opp_message),
+		/* 64 */
+		OPCODE(o_msg),
+		OPCODE(off_addTextBox),
+		OPCODE(opp_setShortText),
+		OPCODE(oww_setLongText),
+		/* 68 */
+		OPCODE(o_end),
+		OPCODE(o_done),
+		OPCODE(off_printLongText),
+		OPCODE(o_process),
+		/* 72 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 76 */
+		OPCODE(o_when),
+		OPCODE(o_if1),
+		OPCODE(o_if2),
+		OPCODE(o_isCalled),
+		/* 80 */
+		OPCODE(o_is),
+		OPCODE(o_invalid),
+		OPCODE(o_debug),
+		OPCODE(os2_rescan),
+		/* 84 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_comment),
+		/* 88 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_getParent),
+		OPCODE(o_getNext),
+		/* 92 */
+		OPCODE(o_getChildren),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 96 */
+		OPCODE(o_picture),
+		OPCODE(o_loadZone),
+		OPCODE(os2_animate),
+		OPCODE(os2_stopAnimate),
+		/* 100 */
+		OPCODE(o_killAnimate),
+		OPCODE(o_defWindow),
+		OPCODE(o_window),
+		OPCODE(o_cls),
+		/* 104 */
+		OPCODE(o_closeWindow),
+		OPCODE(opp_loadHiScores),
+		OPCODE(opp_checkHiScores),
+		OPCODE(off_addBox),
+		/* 108 */
+		OPCODE(o_delBox),
+		OPCODE(o_enableBox),
+		OPCODE(o_disableBox),
+		OPCODE(o_moveBox),
+		/* 112 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_doIcons),
+		OPCODE(o_isClass),
+		/* 116 */
+		OPCODE(o_setClass),
+		OPCODE(o_unsetClass),
+		OPCODE(o_invalid),
+		OPCODE(o_waitSync),
+		/* 120 */
+		OPCODE(opp_sync),
+		OPCODE(o_defObj),
+		OPCODE(off_oracleTextDown),
+		OPCODE(off_oracleTextUp),
+		/* 124 */
+		OPCODE(off_ifTime),
+		OPCODE(o_here),
+		OPCODE(o_doClassIcons),
+		OPCODE(o_invalid),
+		/* 128 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_setAdjNoun),
+		OPCODE(off_setTime),
+		/* 132 */
+		OPCODE(opp_saveUserGame),
+		OPCODE(opp_loadUserGame),
+		OPCODE(off_listSaveGames),
+		OPCODE(o_invalid),
+		/* 136 */
+		OPCODE(o_copysf),
+		OPCODE(o_restoreIcons),
+		OPCODE(o_freezeZones),
+		OPCODE(o_placeNoIcons),
+		/* 140 */
+		OPCODE(o_clearTimers),
+		OPCODE(o_setDollar),
+		OPCODE(o_isBox),
+		OPCODE(oe2_doTable),
+		/* 144 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 148 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(oe2_storeItem),
+		/* 152 */
+		OPCODE(oe2_getItem),
+		OPCODE(oe2_bSet),
+		OPCODE(oe2_bClear),
+		OPCODE(oe2_bZero),
+		/* 156 */
+		OPCODE(oe2_bNotZero),
+		OPCODE(oe2_getOValue),
+		OPCODE(oe2_setOValue),
+		OPCODE(o_invalid),
+		/* 160 */
+		OPCODE(oe2_ink),
+		OPCODE(off_screenTextBox),
+		OPCODE(os1_screenTextMsg),
+		OPCODE(o_invalid),
+		/* 164 */
+		OPCODE(oe2_getDollar2),
+		OPCODE(off_isAdjNoun),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 168 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(off_hyperLinkOn),
+		/* 172 */
+		OPCODE(off_hyperLinkOff),
+		OPCODE(opp_saveOopsPosition),
+		OPCODE(o_invalid),
+		OPCODE(oww_lockZones),
+		/* 176 */
+		OPCODE(oww_unlockZones),
+		OPCODE(off_screenTextPObj),
+		OPCODE(os1_getPathPosn),
+		OPCODE(os1_scnTxtLongText),
+		/* 180 */
+		OPCODE(os1_mouseOn),
+		OPCODE(off_mouseOff),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 184 */
+		OPCODE(os1_unloadZone),
+		OPCODE(o_invalid),
+		OPCODE(os1_unfreezeZones),
+		OPCODE(opp_resetGameTime),
+		/* 188 */
+		OPCODE(os2_isShortText),
+		OPCODE(os2_clearMarks),
+		OPCODE(os2_waitMark),
+		OPCODE(opp_resetPVCount),
+		/* 192 */
+		OPCODE(opp_setPathValues),
+		OPCODE(off_stopClock),
+		OPCODE(opp_restartClock),
+		OPCODE(off_setColour),
+	};
+
+	_opcodesPuzzlePack = opcodes;
+	_numOpcodes = 196;
 }
 
+void AGOSEngine_PuzzlePack::executeOpcode(int opcode) {
+	OpcodeProcPuzzlePack op = _opcodesPuzzlePack[opcode].proc;
+	(this->*op) ();
+}
+
 // -----------------------------------------------------------------------
 // Puzzle Pack Opcodes
 // -----------------------------------------------------------------------
 
-void AGOSEngine::opp_iconifyWindow() {
+void AGOSEngine_PuzzlePack::opp_iconifyWindow() {
 	// 30
 	getNextItemPtr();
 	if (_clockStopped != 0)
@@ -95,7 +302,7 @@
 	_system->setFeatureState(OSystem::kFeatureIconifyWindow, true);
 }
 
-void AGOSEngine::opp_restoreOopsPosition() {
+void AGOSEngine_PuzzlePack::opp_restoreOopsPosition() {
 	// 32: restore oops position
 	uint i;
 
@@ -117,14 +324,14 @@
 	}
 }
 
-void AGOSEngine::opp_loadMouseImage() {
+void AGOSEngine_PuzzlePack::opp_loadMouseImage() {
 	// 38: load mouse image
 	getNextItemPtr();
 	getVarOrByte();
 	loadMouseImage();
 }
 
-void AGOSEngine::opp_message() {
+void AGOSEngine_PuzzlePack::opp_message() {
 	// 63: show string nl
 
 	if (getBitFlag(105)) {
@@ -136,7 +343,7 @@
 	}
 }
 
-void AGOSEngine::opp_setShortText() {
+void AGOSEngine_PuzzlePack::opp_setShortText() {
 	// 66: set item name
 	uint var = getVarOrByte();
 	uint stringId = getNextStringID();
@@ -147,18 +354,18 @@
 	}
 }
 
-void AGOSEngine::opp_loadHiScores() {
+void AGOSEngine_PuzzlePack::opp_loadHiScores() {
 	// 105: load high scores
 	getVarOrByte();
 }
 
-void AGOSEngine::opp_checkHiScores() {
+void AGOSEngine_PuzzlePack::opp_checkHiScores() {
 	// 106: check high scores
 	getVarOrByte();
 	getVarOrByte();
 }
 
-void AGOSEngine::opp_sync() {
+void AGOSEngine_PuzzlePack::opp_sync() {
 	// 120: sync
 	uint a = getVarOrWord();
 	if (a == 8001 || a == 8101 || a == 8201 || a == 8301 || a == 8401) {
@@ -167,7 +374,7 @@
 	sendSync(a);
 }
 
-void AGOSEngine::opp_saveUserGame() {
+void AGOSEngine_PuzzlePack::opp_saveUserGame() {
 	// 132: save game
 	if (_clockStopped != 0)
 		_gameTime += time(NULL) - _clockStopped;
@@ -183,7 +390,7 @@
 	//saveHiScores()
 }
 
-void AGOSEngine::opp_loadUserGame() {
+void AGOSEngine_PuzzlePack::opp_loadUserGame() {
 	// 133: load usergame
 
 	// NoPatience or Jumble
@@ -196,7 +403,7 @@
 	loadGame(genSaveName(1));
 }
 
-void AGOSEngine::opp_saveOopsPosition() {
+void AGOSEngine_PuzzlePack::opp_saveOopsPosition() {
 	// 173: save oops position
 	if (!isVgaQueueEmpty()) {
 		_oopsValid = true;
@@ -208,18 +415,18 @@
 	}
 }
 
-void AGOSEngine::opp_resetGameTime() {
+void AGOSEngine_PuzzlePack::opp_resetGameTime() {
 	// 187: reset game time
 	_gameTime = 0;
 }
 
-void AGOSEngine::opp_resetPVCount() {
+void AGOSEngine_PuzzlePack::opp_resetPVCount() {
 	// 191
 	_PVCount = 0;
 	_GPVCount = 0;
 }
 
-void AGOSEngine::opp_setPathValues() {
+void AGOSEngine_PuzzlePack::opp_setPathValues() {
 	// 192
 	_pathValues[_PVCount++] = getVarOrByte();
 	_pathValues[_PVCount++] = getVarOrByte();
@@ -227,7 +434,7 @@
 	_pathValues[_PVCount++] = getVarOrByte();
 }
 
-void AGOSEngine::opp_restartClock() {
+void AGOSEngine_PuzzlePack::opp_restartClock() {
 	// 194: resume clock
 	if (_clockStopped != 0)
 		_gameTime += time(NULL) - _clockStopped;

Modified: scummvm/trunk/engines/agos/script_s1.cpp
===================================================================
--- scummvm/trunk/engines/agos/script_s1.cpp	2007-04-15 11:30:11 UTC (rev 26489)
+++ scummvm/trunk/engines/agos/script_s1.cpp	2007-04-15 12:04:47 UTC (rev 26490)
@@ -33,49 +33,261 @@
 
 namespace AGOS {
 
-void AGOSEngine_Simon1::setupOpcodes(OpcodeProc *op) {
-	AGOSEngine::setupOpcodes(op);
+#define OPCODE(x)	_OPCODE(AGOSEngine_Simon1, x)
 
-	op[65] = &AGOSEngine::oww_addTextBox;
-	op[66] = &AGOSEngine::oww_setShortText;
-	op[67] = &AGOSEngine::oww_setLongText;
-	op[70] = &AGOSEngine::oww_printLongText;
-	op[83] = &AGOSEngine::oe1_rescan;
-	op[88] = &AGOSEngine::o_haltAnimation;
-	op[89] = &AGOSEngine::o_restartAnimation;
-	op[98] = &AGOSEngine::os1_animate;
-	op[99] = &AGOSEngine::oe1_stopAnimate;
-	op[127] = &AGOSEngine::os1_playTune;
-	op[135] = &AGOSEngine::os1_pauseGame;
-	op[161] = &AGOSEngine::os1_screenTextBox;
-	op[162] = &AGOSEngine::os1_screenTextMsg;
-	op[163] = &AGOSEngine::os1_playEffect;
-	op[164] = &AGOSEngine::oe2_getDollar2;
-	op[165] = &AGOSEngine::oe2_isAdjNoun;
-	op[166] = &AGOSEngine::oe2_b2Set;
-	op[167] = &AGOSEngine::oe2_b2Clear;
-	op[168] = &AGOSEngine::oe2_b2Zero;
-	op[169] = &AGOSEngine::oe2_b2NotZero;
-	op[175] = &AGOSEngine::oww_lockZones;
-	op[176] = &AGOSEngine::oww_unlockZones;
-	op[177] = &AGOSEngine::os1_screenTextPObj;
-	op[178] = &AGOSEngine::os1_getPathPosn;
-	op[179] = &AGOSEngine::os1_scnTxtLongText;
-	op[180] = &AGOSEngine::os1_mouseOn;
-	op[181] = &AGOSEngine::os1_mouseOff;
-	op[182] = &AGOSEngine::os1_loadBeard;
-	op[183] = &AGOSEngine::os1_unloadBeard;
-	op[184] = &AGOSEngine::os1_unloadZone;
-	op[185] = &AGOSEngine::os1_loadStrings;
-	op[186] = &AGOSEngine::os1_unfreezeZones;
-	op[187] = &AGOSEngine::os1_specialFade;
+void AGOSEngine_Simon1::setupOpcodes() {
+	static const OpcodeEntrySimon1 opcodes[] = {
+		/* 00 */
+		OPCODE(o_invalid),
+		OPCODE(o_at),
+		OPCODE(o_notAt),
+		OPCODE(o_invalid),
+		/* 04 */
+		OPCODE(o_invalid),
+		OPCODE(o_carried),
+		OPCODE(o_notCarried),
+		OPCODE(o_isAt),
+		/* 08 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_zero),
+		/* 12 */
+		OPCODE(o_notZero),
+		OPCODE(o_eq),
+		OPCODE(o_notEq),
+		OPCODE(o_gt),
+		/* 16 */
+		OPCODE(o_lt),
+		OPCODE(o_eqf),
+		OPCODE(o_notEqf),
+		OPCODE(o_ltf),
+		/* 20 */
+		OPCODE(o_gtf),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_chance),
+		/* 24 */
+		OPCODE(o_invalid),
+		OPCODE(o_isRoom),
+		OPCODE(o_isObject),
+		OPCODE(o_state),
+		/* 28 */
+		OPCODE(o_oflag),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_destroy),
+		/* 32 */
+		OPCODE(o_invalid),
+		OPCODE(o_place),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 36 */
+		OPCODE(o_copyff),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 40 */
+		OPCODE(o_invalid),
+		OPCODE(o_clear),
+		OPCODE(o_let),
+		OPCODE(o_add),
+		/* 44 */
+		OPCODE(o_sub),
+		OPCODE(o_addf),
+		OPCODE(o_subf),
+		OPCODE(o_mul),
+		/* 48 */
+		OPCODE(o_div),
+		OPCODE(o_mulf),
+		OPCODE(o_divf),
+		OPCODE(o_mod),
+		/* 52 */
+		OPCODE(o_modf),
+		OPCODE(o_random),
+		OPCODE(o_invalid),
+		OPCODE(o_goto),
+		/* 56 */
+		OPCODE(o_oset),
+		OPCODE(o_oclear),
+		OPCODE(o_putBy),
+		OPCODE(o_inc),
+		/* 60 */
+		OPCODE(o_dec),
+		OPCODE(o_setState),
+		OPCODE(o_print),
+		OPCODE(o_message),
+		/* 64 */
+		OPCODE(o_msg),
+		OPCODE(oww_addTextBox),
+		OPCODE(oww_setShortText),
+		OPCODE(oww_setLongText),
+		/* 68 */
+		OPCODE(o_end),
+		OPCODE(o_done),
+		OPCODE(oww_printLongText),
+		OPCODE(o_process),
+		/* 72 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 76 */
+		OPCODE(o_when),
+		OPCODE(o_if1),
+		OPCODE(o_if2),
+		OPCODE(o_isCalled),
+		/* 80 */
+		OPCODE(o_is),
+		OPCODE(o_invalid),
+		OPCODE(o_debug),
+		OPCODE(oe1_rescan),
+		/* 84 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_comment),
+		/* 88 */
+		OPCODE(o_haltAnimation),
+		OPCODE(o_restartAnimation),
+		OPCODE(o_getParent),
+		OPCODE(o_getNext),
+		/* 92 */
+		OPCODE(o_getChildren),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 96 */
+		OPCODE(o_picture),
+		OPCODE(o_loadZone),
+		OPCODE(os1_animate),
+		OPCODE(oe1_stopAnimate),
+		/* 100 */
+		OPCODE(o_killAnimate),
+		OPCODE(o_defWindow),
+		OPCODE(o_window),
+		OPCODE(o_cls),
+		/* 104 */
+		OPCODE(o_closeWindow),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_addBox),
+		/* 108 */
+		OPCODE(o_delBox),
+		OPCODE(o_enableBox),
+		OPCODE(o_disableBox),
+		OPCODE(o_moveBox),
+		/* 112 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_doIcons),
+		OPCODE(o_isClass),
+		/* 116 */
+		OPCODE(o_setClass),
+		OPCODE(o_unsetClass),
+		OPCODE(o_invalid),
+		OPCODE(o_waitSync),
+		/* 120 */
+		OPCODE(o_sync),
+		OPCODE(o_defObj),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 124 */
+		OPCODE(o_invalid),
+		OPCODE(o_here),
+		OPCODE(o_doClassIcons),
+		OPCODE(o_playTune),
+		/* 128 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_setAdjNoun),
+		OPCODE(o_invalid),
+		/* 132 */
+		OPCODE(o_saveUserGame),
+		OPCODE(o_loadUserGame),
+		OPCODE(o_invalid),
+		OPCODE(os1_pauseGame),
+		/* 136 */
+		OPCODE(o_copysf),
+		OPCODE(o_restoreIcons),
+		OPCODE(o_freezeZones),
+		OPCODE(o_placeNoIcons),
+		/* 140 */
+		OPCODE(o_clearTimers),
+		OPCODE(o_setDollar),
+		OPCODE(o_isBox),
+		OPCODE(oe2_doTable),
+		/* 144 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 148 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(oe2_storeItem),
+		/* 152 */
+		OPCODE(oe2_getItem),
+		OPCODE(oe2_bSet),
+		OPCODE(oe2_bClear),
+		OPCODE(oe2_bZero),
+		/* 156 */
+		OPCODE(oe2_bNotZero),
+		OPCODE(oe2_getOValue),
+		OPCODE(oe2_setOValue),
+		OPCODE(o_invalid),
+		/* 160 */
+		OPCODE(oe2_ink),
+		OPCODE(os1_screenTextBox),
+		OPCODE(os1_screenTextMsg),
+		OPCODE(os1_playEffect),
+		/* 164 */
+		OPCODE(oe2_getDollar2),
+		OPCODE(oe2_isAdjNoun),
+		OPCODE(oe2_b2Set),
+		OPCODE(oe2_b2Clear),
+		/* 168 */
+		OPCODE(oe2_b2Zero),
+		OPCODE(oe2_b2NotZero),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 172 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(oww_lockZones),
+		/* 176 */
+		OPCODE(oww_unlockZones),
+		OPCODE(os1_screenTextPObj),
+		OPCODE(os1_getPathPosn),
+		OPCODE(os1_scnTxtLongText),
+		/* 180 */
+		OPCODE(os1_mouseOn),
+		OPCODE(os1_mouseOff),
+		OPCODE(os1_loadBeard),
+		OPCODE(os1_unloadBeard),
+		/* 184 */
+		OPCODE(os1_unloadZone),
+		OPCODE(os1_loadStrings),
+		OPCODE(os1_unfreezeZones),
+		OPCODE(os1_specialFade),
+	};
+
+	_opcodesSimon1 = opcodes;
+	_numOpcodes = 188;
 }
 
+void AGOSEngine_Simon1::executeOpcode(int opcode) {
+	OpcodeProcSimon1 op = _opcodesSimon1[opcode].proc;
+	(this->*op) ();
+}
+
 // -----------------------------------------------------------------------
 // Simon 1 Opcodes
 // -----------------------------------------------------------------------
 
-void AGOSEngine::os1_animate() {
+void AGOSEngine_Simon1::os1_animate() {
 	// 98: animate
 	uint vgaSpriteId = getVarOrWord();
 	uint windowNum = getVarOrByte();
@@ -92,19 +304,7 @@
 	_lockWord &= ~0x40;
 }
 
-void AGOSEngine::os1_playTune() {
-	// 127:  play tune
-	int music = getVarOrWord();
-	int track = getVarOrWord();
-
-	if (music != _lastMusicPlayed) {
-		_lastMusicPlayed = music;
-		loadMusic(music);
-		_midi.startTrack(track);
-	}
-}
-
-void AGOSEngine::os1_pauseGame() {
+void AGOSEngine_Simon1::os1_pauseGame() {
 	// 135: pause game
 	_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
 
@@ -158,7 +358,7 @@
 	_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
 }
 
-void AGOSEngine::os1_screenTextBox() {
+void AGOSEngine_Simon1::os1_screenTextBox() {
 	// 161: setup text
 	TextLocation *tl = getTextLocation(getVarOrByte());
 
@@ -167,7 +367,7 @@
 	tl->width = getVarOrWord();
 }
 	
-void AGOSEngine::os1_screenTextMsg() {
+void AGOSEngine_Simon1::os1_screenTextMsg() {
 	// 162: print string
 	uint vgaSpriteId = getVarOrByte();
 	uint color = getVarOrByte();
@@ -202,7 +402,7 @@
 
 }
 
-void AGOSEngine::os1_playEffect() {
+void AGOSEngine_Simon1::os1_playEffect() {
 	// 163: play sound
 	uint soundId = getVarOrWord();
 
@@ -212,7 +412,7 @@
 		_sound->playEffects(soundId);
 }
 
-void AGOSEngine::os1_screenTextPObj() {
+void AGOSEngine_Simon1::os1_screenTextPObj() {
 	// 177: inventory descriptions
 	uint vgaSpriteId = getVarOrByte();
 	uint color = getVarOrByte();
@@ -253,7 +453,7 @@
 	}
 }
 
-void AGOSEngine::os1_getPathPosn() {
+void AGOSEngine_Simon1::os1_getPathPosn() {
 	// 178: path find
 	uint x = getVarOrWord();
 	uint y = getVarOrWord();
@@ -302,7 +502,7 @@
 	writeVariable(var_2, best_j);
 }
 
-void AGOSEngine::os1_scnTxtLongText() {
+void AGOSEngine_Simon1::os1_scnTxtLongText() {
 	// 179: conversation responses and room descriptions
 	uint vgaSpriteId = getVarOrByte();
 	uint color = getVarOrByte();
@@ -324,17 +524,17 @@
 		printScreenText(vgaSpriteId, color, string_ptr, tl->x, tl->y, tl->width);
 }
 
-void AGOSEngine::os1_mouseOn() {
+void AGOSEngine_Simon1::os1_mouseOn() {
 	// 180: force mouseOn
 	_mouseHideCount = 0;
 }
 
-void AGOSEngine::os1_mouseOff() {
+void AGOSEngine_Simon1::os1_mouseOff() {
 	// 181: force mouseOff
 	scriptMouseOff();
 }
 
-void AGOSEngine::os1_loadBeard() {
+void AGOSEngine_Simon1::os1_loadBeard() {
 	// 182: load beard
 	if (_beardLoaded == false) {
 		_beardLoaded = true;
@@ -344,7 +544,7 @@
 	}
 }
 
-void AGOSEngine::os1_unloadBeard() {
+void AGOSEngine_Simon1::os1_unloadBeard() {
 	// 183: unload beard
 	if (_beardLoaded == true) {
 		_beardLoaded = false;
@@ -354,7 +554,7 @@
 	}
 }
 
-void AGOSEngine::os1_unloadZone() {
+void AGOSEngine_Simon1::os1_unloadZone() {
 	// 184: unload zone
 	uint a = getVarOrWord();
 	VgaPointersEntry *vpe = &_vgaBufferPointers[a];
@@ -364,7 +564,7 @@
 	vpe->vgaFile2 = NULL;
 }
 
-void AGOSEngine::os1_loadStrings() {
+void AGOSEngine_Simon1::os1_loadStrings() {
 	// 185: load sound files
 	_soundFileId = getVarOrWord();
 	if (getPlatform() == Common::kPlatformAmiga && getFeatures() & GF_TALKIE) {
@@ -376,12 +576,12 @@
 	}
 }
 
-void AGOSEngine::os1_unfreezeZones() {
+void AGOSEngine_Simon1::os1_unfreezeZones() {
 	// 186: freeze zone
 	unfreezeBottom();
 }
 
-void AGOSEngine::os1_specialFade() {
+void AGOSEngine_Simon1::os1_specialFade() {
 	// 187: fade to black
 	uint i;
 

Modified: scummvm/trunk/engines/agos/script_s2.cpp
===================================================================
--- scummvm/trunk/engines/agos/script_s2.cpp	2007-04-15 11:30:11 UTC (rev 26489)
+++ scummvm/trunk/engines/agos/script_s2.cpp	2007-04-15 12:04:47 UTC (rev 26490)
@@ -27,55 +27,272 @@
 
 namespace AGOS {
 
-void AGOSEngine_Simon2::setupOpcodes(OpcodeProc *op) {
-	AGOSEngine::setupOpcodes(op);
+#define OPCODE(x)	_OPCODE(AGOSEngine_Simon2, x)
 
-	op[65] = &AGOSEngine::oww_addTextBox;
-	op[66] = &AGOSEngine::oww_setShortText;
-	op[67] = &AGOSEngine::oww_setLongText;
-	op[70] = &AGOSEngine::os2_printLongText;
-	op[83] = &AGOSEngine::os2_rescan;
-	op[88] = &AGOSEngine::o_haltAnimation;
-	op[89] = &AGOSEngine::o_restartAnimation;
-	op[98] = &AGOSEngine::os2_animate;
-	op[99] = &AGOSEngine::os2_stopAnimate;
-	op[127] = &AGOSEngine::os2_playTune;
-	op[135] = &AGOSEngine::os1_pauseGame;
-	op[161] = &AGOSEngine::os1_screenTextBox;
-	op[162] = &AGOSEngine::os1_screenTextMsg;
-	op[163] = &AGOSEngine::os1_playEffect;
-	op[164] = &AGOSEngine::oe2_getDollar2;
-	op[165] = &AGOSEngine::oe2_isAdjNoun;
-	op[166] = &AGOSEngine::oe2_b2Set;
-	op[167] = &AGOSEngine::oe2_b2Clear;
-	op[168] = &AGOSEngine::oe2_b2Zero;
-	op[169] = &AGOSEngine::oe2_b2NotZero;
-	op[175] = &AGOSEngine::oww_lockZones;
-	op[176] = &AGOSEngine::oww_unlockZones;
-	op[177] = &AGOSEngine::os2_screenTextPObj;
-	op[178] = &AGOSEngine::os1_getPathPosn;
-	op[179] = &AGOSEngine::os1_scnTxtLongText;
-	op[180] = &AGOSEngine::os2_mouseOn;
-	op[181] = &AGOSEngine::os2_mouseOff;
-	op[184] = &AGOSEngine::os1_unloadZone;
-	op[186] = &AGOSEngine::os1_unfreezeZones;
-	op[188] = &AGOSEngine::os2_isShortText;
-	op[189] = &AGOSEngine::os2_clearMarks;
-	op[190] = &AGOSEngine::os2_waitMark;
+void AGOSEngine_Simon2::setupOpcodes() {
+	static const OpcodeEntrySimon2 opcodes[] = {
+		/* 00 */
+		OPCODE(o_invalid),
+		OPCODE(o_at),
+		OPCODE(o_notAt),
+		OPCODE(o_invalid),
+		/* 04 */
+		OPCODE(o_invalid),
+		OPCODE(o_carried),
+		OPCODE(o_notCarried),
+		OPCODE(o_isAt),
+		/* 08 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_zero),
+		/* 12 */
+		OPCODE(o_notZero),
+		OPCODE(o_eq),
+		OPCODE(o_notEq),
+		OPCODE(o_gt),
+		/* 16 */
+		OPCODE(o_lt),
+		OPCODE(o_eqf),
+		OPCODE(o_notEqf),
+		OPCODE(o_ltf),
+		/* 20 */
+		OPCODE(o_gtf),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_chance),
+		/* 24 */
+		OPCODE(o_invalid),
+		OPCODE(o_isRoom),
+		OPCODE(o_isObject),
+		OPCODE(o_state),
+		/* 28 */
+		OPCODE(o_oflag),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_destroy),
+		/* 32 */
+		OPCODE(o_invalid),
+		OPCODE(o_place),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 36 */
+		OPCODE(o_copyff),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 40 */
+		OPCODE(o_invalid),
+		OPCODE(o_clear),
+		OPCODE(o_let),
+		OPCODE(o_add),
+		/* 44 */
+		OPCODE(o_sub),
+		OPCODE(o_addf),
+		OPCODE(o_subf),
+		OPCODE(o_mul),
+		/* 48 */
+		OPCODE(o_div),
+		OPCODE(o_mulf),
+		OPCODE(o_divf),
+		OPCODE(o_mod),
+		/* 52 */
+		OPCODE(o_modf),
+		OPCODE(o_random),
+		OPCODE(o_invalid),
+		OPCODE(o_goto),
+		/* 56 */
+		OPCODE(o_oset),
+		OPCODE(o_oclear),
+		OPCODE(o_putBy),
+		OPCODE(o_inc),
+		/* 60 */
+		OPCODE(o_dec),
+		OPCODE(o_setState),
+		OPCODE(o_print),
+		OPCODE(o_message),
+		/* 64 */
+		OPCODE(o_msg),
+		OPCODE(oww_addTextBox),
+		OPCODE(oww_setShortText),
+		OPCODE(oww_setLongText),
+		/* 68 */
+		OPCODE(o_end),
+		OPCODE(o_done),
+		OPCODE(os2_printLongText),
+		OPCODE(o_process),
+		/* 72 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 76 */
+		OPCODE(o_when),
+		OPCODE(o_if1),
+		OPCODE(o_if2),
+		OPCODE(o_isCalled),
+		/* 80 */
+		OPCODE(o_is),
+		OPCODE(o_invalid),
+		OPCODE(o_debug),
+		OPCODE(os2_rescan),
+		/* 84 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_comment),
+		/* 88 */
+		OPCODE(o_haltAnimation),
+		OPCODE(o_restartAnimation),
+		OPCODE(o_getParent),
+		OPCODE(o_getNext),
+		/* 92 */
+		OPCODE(o_getChildren),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 96 */
+		OPCODE(o_picture),
+		OPCODE(o_loadZone),
+		OPCODE(os2_animate),
+		OPCODE(os2_stopAnimate),
+		/* 100 */
+		OPCODE(o_killAnimate),
+		OPCODE(o_defWindow),
+		OPCODE(o_window),
+		OPCODE(o_cls),
+		/* 104 */
+		OPCODE(o_closeWindow),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_addBox),
+		/* 108 */
+		OPCODE(o_delBox),
+		OPCODE(o_enableBox),
+		OPCODE(o_disableBox),
+		OPCODE(o_moveBox),
+		/* 112 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_doIcons),
+		OPCODE(o_isClass),
+		/* 116 */
+		OPCODE(o_setClass),
+		OPCODE(o_unsetClass),
+		OPCODE(o_invalid),
+		OPCODE(o_waitSync),
+		/* 120 */
+		OPCODE(o_sync),
+		OPCODE(o_defObj),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 124 */
+		OPCODE(o_invalid),
+		OPCODE(o_here),
+		OPCODE(o_doClassIcons),
+		OPCODE(os2_playTune),
+		/* 128 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_setAdjNoun),
+		OPCODE(o_invalid),
+		/* 132 */
+		OPCODE(o_saveUserGame),
+		OPCODE(o_loadUserGame),
+		OPCODE(o_invalid),
+		OPCODE(os1_pauseGame),
+		/* 136 */
+		OPCODE(o_copysf),
+		OPCODE(o_restoreIcons),
+		OPCODE(o_freezeZones),
+		OPCODE(o_placeNoIcons),
+		/* 140 */
+		OPCODE(o_clearTimers),
+		OPCODE(o_setDollar),
+		OPCODE(o_isBox),
+		OPCODE(oe2_doTable),
+		/* 144 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 148 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(oe2_storeItem),
+		/* 152 */
+		OPCODE(oe2_getItem),
+		OPCODE(oe2_bSet),
+		OPCODE(oe2_bClear),
+		OPCODE(oe2_bZero),
+		/* 156C */
+		OPCODE(oe2_bNotZero),
+		OPCODE(oe2_getOValue),
+		OPCODE(oe2_setOValue),
+		OPCODE(o_invalid),
+		/* 160 */
+		OPCODE(oe2_ink),
+		OPCODE(os1_screenTextBox),
+		OPCODE(os1_screenTextMsg),
+		OPCODE(os1_playEffect),
+		/* 164 */
+		OPCODE(oe2_getDollar2),
+		OPCODE(oe2_isAdjNoun),
+		OPCODE(oe2_b2Set),
+		OPCODE(oe2_b2Clear),
+		/* 168 */
+		OPCODE(oe2_b2Zero),
+		OPCODE(oe2_b2NotZero),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 172 */
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		OPCODE(oww_lockZones),
+		/* 176 */
+		OPCODE(oww_unlockZones),
+		OPCODE(os2_screenTextPObj),
+		OPCODE(os1_getPathPosn),
+		OPCODE(os1_scnTxtLongText),
+		/* 180 */
+		OPCODE(os2_mouseOn),
+		OPCODE(os2_mouseOff),
+		OPCODE(o_invalid),
+		OPCODE(o_invalid),
+		/* 184 */
+		OPCODE(os1_unloadZone),
+		OPCODE(o_invalid),
+		OPCODE(os1_unfreezeZones),
+		OPCODE(o_invalid),
+		/* 188 */
+		OPCODE(os2_isShortText),
+		OPCODE(os2_clearMarks),
+		OPCODE(os2_waitMark),
+	};
+
+	_opcodesSimon2 = opcodes;
+	_numOpcodes = 191;
 }
 
+void AGOSEngine_Simon2::executeOpcode(int opcode) {
+	OpcodeProcSimon2 op = _opcodesSimon2[opcode].proc;
+	(this->*op) ();
+}
+
 // -----------------------------------------------------------------------
 // Simon 2 Opcodes

@@ Diff output truncated at 100000 characters. @@

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