[Scummvm-git-logs] scummvm master -> fa7688a93199f25e84d7c39ca232a4f20a629274

waltervn walter at vanniftrik-it.nl
Sat Mar 30 23:37:17 CET 2019


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
fa7688a931 ADL: Refactor opcodes


Commit: fa7688a93199f25e84d7c39ca232a4f20a629274
    https://github.com/scummvm/scummvm/commit/fa7688a93199f25e84d7c39ca232a4f20a629274
Author: Walter van Niftrik (walter at scummvm.org)
Date: 2019-03-30T23:18:02+01:00

Commit Message:
ADL: Refactor opcodes

Changed paths:
    engines/adl/adl.cpp
    engines/adl/adl.h
    engines/adl/adl_v2.cpp
    engines/adl/adl_v2.h
    engines/adl/adl_v3.cpp
    engines/adl/adl_v3.h
    engines/adl/adl_v4.cpp
    engines/adl/adl_v4.h
    engines/adl/adl_v5.cpp
    engines/adl/adl_v5.h
    engines/adl/hires5.cpp
    engines/adl/hires6.cpp


diff --git a/engines/adl/adl.cpp b/engines/adl/adl.cpp
index f4f306a..17fdd28 100644
--- a/engines/adl/adl.cpp
+++ b/engines/adl/adl.cpp
@@ -415,69 +415,42 @@ bool AdlEngine::isInputValid(const Commands &commands, byte verb, byte noun, boo
 	return false;
 }
 
-typedef Common::Functor1Mem<ScriptEnv &, int, AdlEngine> OpcodeV1;
-#define SetOpcodeTable(x) table = &x;
-#define Opcode(x) table->push_back(new OpcodeV1(this, &AdlEngine::x))
-#define OpcodeUnImpl() table->push_back(new OpcodeV1(this, 0))
-
 void AdlEngine::setupOpcodeTables() {
-	Common::Array<const Opcode *> *table = 0;
-
-	SetOpcodeTable(_condOpcodes);
-	// 0x00
-	OpcodeUnImpl();
-	OpcodeUnImpl();
-	OpcodeUnImpl();
-	Opcode(o1_isItemInRoom);
-	// 0x04
-	OpcodeUnImpl();
-	Opcode(o1_isMovesGT);
-	Opcode(o1_isVarEQ);
-	OpcodeUnImpl();
-	// 0x08
-	OpcodeUnImpl();
-	Opcode(o1_isCurPicEQ);
-	Opcode(o1_isItemPicEQ);
-
-	SetOpcodeTable(_actOpcodes);
-	// 0x00
-	OpcodeUnImpl();
-	Opcode(o1_varAdd);
-	Opcode(o1_varSub);
-	Opcode(o1_varSet);
-	// 0x04
-	Opcode(o1_listInv);
-	Opcode(o1_moveItem);
-	Opcode(o1_setRoom);
-	Opcode(o1_setCurPic);
-	// 0x08
-	Opcode(o1_setPic);
-	Opcode(o1_printMsg);
-	Opcode(o1_setLight);
-	Opcode(o1_setDark);
-	// 0x0c
-	OpcodeUnImpl();
-	Opcode(o1_quit);
-	OpcodeUnImpl();
-	Opcode(o1_save);
-	// 0x10
-	Opcode(o1_restore);
-	Opcode(o1_restart);
-	Opcode(o1_placeItem);
-	Opcode(o1_setItemPic);
-	// 0x14
-	Opcode(o1_resetPic);
-	Opcode(o1_goDirection<IDI_DIR_NORTH>);
-	Opcode(o1_goDirection<IDI_DIR_SOUTH>);
-	Opcode(o1_goDirection<IDI_DIR_EAST>);
-	// 0x18
-	Opcode(o1_goDirection<IDI_DIR_WEST>);
-	Opcode(o1_goDirection<IDI_DIR_UP>);
-	Opcode(o1_goDirection<IDI_DIR_DOWN>);
-	Opcode(o1_takeItem);
-	// 0x1c
-	Opcode(o1_dropItem);
-	Opcode(o1_setRoomPic);
+	_condOpcodes.resize(0x0b);
+	_condOpcodes[0x03] = opcode(&AdlEngine::o_isItemInRoom);
+	_condOpcodes[0x05] = opcode(&AdlEngine::o_isMovesGT);
+	_condOpcodes[0x06] = opcode(&AdlEngine::o_isVarEQ);
+	_condOpcodes[0x09] = opcode(&AdlEngine::o_isCurPicEQ);
+	_condOpcodes[0x0a] = opcode(&AdlEngine::o_isItemPicEQ);
+
+	_actOpcodes.resize(0x1e);
+	_actOpcodes[0x01] = opcode(&AdlEngine::o_varAdd);
+	_actOpcodes[0x02] = opcode(&AdlEngine::o_varSub);
+	_actOpcodes[0x03] = opcode(&AdlEngine::o_varSet);
+	_actOpcodes[0x04] = opcode(&AdlEngine::o_listInv);
+	_actOpcodes[0x05] = opcode(&AdlEngine::o_moveItem);
+	_actOpcodes[0x06] = opcode(&AdlEngine::o_setRoom);
+	_actOpcodes[0x07] = opcode(&AdlEngine::o_setCurPic);
+	_actOpcodes[0x08] = opcode(&AdlEngine::o_setPic);
+	_actOpcodes[0x09] = opcode(&AdlEngine::o_printMsg);
+	_actOpcodes[0x0a] = opcode(&AdlEngine::o_setLight);
+	_actOpcodes[0x0b] = opcode(&AdlEngine::o_setDark);
+	_actOpcodes[0x0d] = opcode(&AdlEngine::o_quit);
+	_actOpcodes[0x0f] = opcode(&AdlEngine::o_save);
+	_actOpcodes[0x10] = opcode(&AdlEngine::o_restore);
+	_actOpcodes[0x11] = opcode(&AdlEngine::o_restart);
+	_actOpcodes[0x12] = opcode(&AdlEngine::o_placeItem);
+	_actOpcodes[0x13] = opcode(&AdlEngine::o_setItemPic);
+	_actOpcodes[0x14] = opcode(&AdlEngine::o_resetPic);
+	_actOpcodes[0x15] = opcode(&AdlEngine::o_goNorth);
+	_actOpcodes[0x16] = opcode(&AdlEngine::o_goSouth);
+	_actOpcodes[0x17] = opcode(&AdlEngine::o_goEast);
+	_actOpcodes[0x18] = opcode(&AdlEngine::o_goWest);
+	_actOpcodes[0x19] = opcode(&AdlEngine::o_goUp);
+	_actOpcodes[0x1a] = opcode(&AdlEngine::o_goDown);
+	_actOpcodes[0x1b] = opcode(&AdlEngine::o_takeItem);
+	_actOpcodes[0x1c] = opcode(&AdlEngine::o_dropItem);
+	_actOpcodes[0x1d] = opcode(&AdlEngine::o_setRoomPic);
 }
 
 void AdlEngine::initState() {
@@ -1129,7 +1102,7 @@ bool AdlEngine::op_debug(const char *fmt, ...) const {
 	return false;
 }
 
-int AdlEngine::o1_isItemInRoom(ScriptEnv &e) {
+int AdlEngine::o_isItemInRoom(ScriptEnv &e) {
 	OP_DEBUG_2("\t&& GET_ITEM_ROOM(%s) == %s", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str());
 
 	if (getItem(e.arg(1)).room == roomArg(e.arg(2)))
@@ -1138,7 +1111,7 @@ int AdlEngine::o1_isItemInRoom(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine::o1_isMovesGT(ScriptEnv &e) {
+int AdlEngine::o_isMovesGT(ScriptEnv &e) {
 	OP_DEBUG_1("\t&& MOVES > %d", e.arg(1));
 
 	if (_state.moves > e.arg(1))
@@ -1147,7 +1120,7 @@ int AdlEngine::o1_isMovesGT(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine::o1_isVarEQ(ScriptEnv &e) {
+int AdlEngine::o_isVarEQ(ScriptEnv &e) {
 	OP_DEBUG_2("\t&& VARS[%d] == %d", e.arg(1), e.arg(2));
 
 	if (getVar(e.arg(1)) == e.arg(2))
@@ -1156,7 +1129,7 @@ int AdlEngine::o1_isVarEQ(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine::o1_isCurPicEQ(ScriptEnv &e) {
+int AdlEngine::o_isCurPicEQ(ScriptEnv &e) {
 	OP_DEBUG_1("\t&& GET_CURPIC() == %d", e.arg(1));
 
 	if (_state.curPicture == e.arg(1))
@@ -1165,7 +1138,7 @@ int AdlEngine::o1_isCurPicEQ(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine::o1_isItemPicEQ(ScriptEnv &e) {
+int AdlEngine::o_isItemPicEQ(ScriptEnv &e) {
 	OP_DEBUG_2("\t&& GET_ITEM_PIC(%s) == %d", itemStr(e.arg(1)).c_str(), e.arg(2));
 
 	if (getItem(e.arg(1)).picture == e.arg(2))
@@ -1174,28 +1147,28 @@ int AdlEngine::o1_isItemPicEQ(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine::o1_varAdd(ScriptEnv &e) {
+int AdlEngine::o_varAdd(ScriptEnv &e) {
 	OP_DEBUG_2("\tVARS[%d] += %d", e.arg(2), e.arg(1));
 
 	setVar(e.arg(2), getVar(e.arg(2)) + e.arg(1));
 	return 2;
 }
 
-int AdlEngine::o1_varSub(ScriptEnv &e) {
+int AdlEngine::o_varSub(ScriptEnv &e) {
 	OP_DEBUG_2("\tVARS[%d] -= %d", e.arg(2), e.arg(1));
 
 	setVar(e.arg(2), getVar(e.arg(2)) - e.arg(1));
 	return 2;
 }
 
-int AdlEngine::o1_varSet(ScriptEnv &e) {
+int AdlEngine::o_varSet(ScriptEnv &e) {
 	OP_DEBUG_2("\tVARS[%d] = %d", e.arg(1), e.arg(2));
 
 	setVar(e.arg(1), e.arg(2));
 	return 2;
 }
 
-int AdlEngine::o1_listInv(ScriptEnv &e) {
+int AdlEngine::o_listInv(ScriptEnv &e) {
 	OP_DEBUG_0("\tLIST_INVENTORY()");
 
 	Common::List<Item>::const_iterator item;
@@ -1207,63 +1180,63 @@ int AdlEngine::o1_listInv(ScriptEnv &e) {
 	return 0;
 }
 
-int AdlEngine::o1_moveItem(ScriptEnv &e) {
+int AdlEngine::o_moveItem(ScriptEnv &e) {
 	OP_DEBUG_2("\tSET_ITEM_ROOM(%s, %s)", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str());
 
 	getItem(e.arg(1)).room = e.arg(2);
 	return 2;
 }
 
-int AdlEngine::o1_setRoom(ScriptEnv &e) {
+int AdlEngine::o_setRoom(ScriptEnv &e) {
 	OP_DEBUG_1("\tROOM = %d", e.arg(1));
 
 	switchRoom(e.arg(1));
 	return 1;
 }
 
-int AdlEngine::o1_setCurPic(ScriptEnv &e) {
+int AdlEngine::o_setCurPic(ScriptEnv &e) {
 	OP_DEBUG_1("\tSET_CURPIC(%d)", e.arg(1));
 
 	getCurRoom().curPicture = e.arg(1);
 	return 1;
 }
 
-int AdlEngine::o1_setPic(ScriptEnv &e) {
+int AdlEngine::o_setPic(ScriptEnv &e) {
 	OP_DEBUG_1("\tSET_PIC(%d)", e.arg(1));
 
 	getCurRoom().picture = getCurRoom().curPicture = e.arg(1);
 	return 1;
 }
 
-int AdlEngine::o1_printMsg(ScriptEnv &e) {
+int AdlEngine::o_printMsg(ScriptEnv &e) {
 	OP_DEBUG_1("\tPRINT(%s)", msgStr(e.arg(1)).c_str());
 
 	printMessage(e.arg(1));
 	return 1;
 }
 
-int AdlEngine::o1_setLight(ScriptEnv &e) {
+int AdlEngine::o_setLight(ScriptEnv &e) {
 	OP_DEBUG_0("\tLIGHT()");
 
 	_state.isDark = false;
 	return 0;
 }
 
-int AdlEngine::o1_setDark(ScriptEnv &e) {
+int AdlEngine::o_setDark(ScriptEnv &e) {
 	OP_DEBUG_0("\tDARK()");
 
 	_state.isDark = true;
 	return 0;
 }
 
-int AdlEngine::o1_save(ScriptEnv &e) {
+int AdlEngine::o_save(ScriptEnv &e) {
 	OP_DEBUG_0("\tSAVE_GAME()");
 
 	saveGameState(0, "");
 	return 0;
 }
 
-int AdlEngine::o1_restore(ScriptEnv &e) {
+int AdlEngine::o_restore(ScriptEnv &e) {
 	OP_DEBUG_0("\tRESTORE_GAME()");
 
 	loadGameState(0);
@@ -1271,7 +1244,7 @@ int AdlEngine::o1_restore(ScriptEnv &e) {
 	return 0;
 }
 
-int AdlEngine::o1_restart(ScriptEnv &e) {
+int AdlEngine::o_restart(ScriptEnv &e) {
 	OP_DEBUG_0("\tRESTART_GAME()");
 
 	_display->printString(_strings.playAgain);
@@ -1287,10 +1260,10 @@ int AdlEngine::o1_restart(ScriptEnv &e) {
 		return -1;
 	}
 
-	return o1_quit(e);
+	return o_quit(e);
 }
 
-int AdlEngine::o1_quit(ScriptEnv &e) {
+int AdlEngine::o_quit(ScriptEnv &e) {
 	OP_DEBUG_0("\tQUIT_GAME()");
 
 	printMessage(_messageIds.thanksForPlaying);
@@ -1304,7 +1277,7 @@ int AdlEngine::o1_quit(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine::o1_placeItem(ScriptEnv &e) {
+int AdlEngine::o_placeItem(ScriptEnv &e) {
 	OP_DEBUG_4("\tPLACE_ITEM(%s, %s, (%d, %d))", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str(), e.arg(3), e.arg(4));
 
 	Item &item = getItem(e.arg(1));
@@ -1315,25 +1288,24 @@ int AdlEngine::o1_placeItem(ScriptEnv &e) {
 	return 4;
 }
 
-int AdlEngine::o1_setItemPic(ScriptEnv &e) {
+int AdlEngine::o_setItemPic(ScriptEnv &e) {
 	OP_DEBUG_2("\tSET_ITEM_PIC(%s, %d)", itemStr(e.arg(2)).c_str(), e.arg(1));
 
 	getItem(e.arg(2)).picture = e.arg(1);
 	return 2;
 }
 
-int AdlEngine::o1_resetPic(ScriptEnv &e) {
+int AdlEngine::o_resetPic(ScriptEnv &e) {
 	OP_DEBUG_0("\tRESET_PIC()");
 
 	getCurRoom().curPicture = getCurRoom().picture;
 	return 0;
 }
 
-template <Direction D>
-int AdlEngine::o1_goDirection(ScriptEnv &e) {
-	OP_DEBUG_0((Common::String("\tGO_") + dirStr(D) + "()").c_str());
+int AdlEngine::goDirection(ScriptEnv &e, Direction dir) {
+	OP_DEBUG_0((Common::String("\tGO_") + dirStr(dir) + "()").c_str());
 
-	byte room = getCurRoom().connections[D];
+	byte room = getCurRoom().connections[dir];
 
 	if (room == 0) {
 		printMessage(_messageIds.cantGoThere);
@@ -1344,21 +1316,21 @@ int AdlEngine::o1_goDirection(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine::o1_takeItem(ScriptEnv &e) {
+int AdlEngine::o_takeItem(ScriptEnv &e) {
 	OP_DEBUG_0("\tTAKE_ITEM()");
 
 	takeItem(e.getNoun());
 	return 0;
 }
 
-int AdlEngine::o1_dropItem(ScriptEnv &e) {
+int AdlEngine::o_dropItem(ScriptEnv &e) {
 	OP_DEBUG_0("\tDROP_ITEM()");
 
 	dropItem(e.getNoun());
 	return 0;
 }
 
-int AdlEngine::o1_setRoomPic(ScriptEnv &e) {
+int AdlEngine::o_setRoomPic(ScriptEnv &e) {
 	OP_DEBUG_2("\tSET_ROOM_PIC(%d, %d)", e.arg(1), e.arg(2));
 
 	getRoom(e.arg(1)).picture = getRoom(e.arg(1)).curPicture = e.arg(2);
diff --git a/engines/adl/adl.h b/engines/adl/adl.h
index 143b074..b7a2ff5 100644
--- a/engines/adl/adl.h
+++ b/engines/adl/adl.h
@@ -30,6 +30,7 @@
 #include "common/hashmap.h"
 #include "common/hash-str.h"
 #include "common/func.h"
+#include "common/ptr.h"
 #include "common/scummsys.h"
 
 #include "engines/engine.h"
@@ -284,35 +285,48 @@ protected:
 	void loadDroppedItemOffsets(Common::ReadStream &stream, byte count);
 
 	// Opcodes
-	int o1_isItemInRoom(ScriptEnv &e);
-	int o1_isMovesGT(ScriptEnv &e);
-	int o1_isVarEQ(ScriptEnv &e);
-	int o1_isCurPicEQ(ScriptEnv &e);
-	int o1_isItemPicEQ(ScriptEnv &e);
-
-	int o1_varAdd(ScriptEnv &e);
-	int o1_varSub(ScriptEnv &e);
-	int o1_varSet(ScriptEnv &e);
-	int o1_listInv(ScriptEnv &e);
-	int o1_moveItem(ScriptEnv &e);
-	int o1_setRoom(ScriptEnv &e);
-	int o1_setCurPic(ScriptEnv &e);
-	int o1_setPic(ScriptEnv &e);
-	int o1_printMsg(ScriptEnv &e);
-	int o1_setLight(ScriptEnv &e);
-	int o1_setDark(ScriptEnv &e);
-	int o1_save(ScriptEnv &e);
-	int o1_restore(ScriptEnv &e);
-	int o1_restart(ScriptEnv &e);
-	int o1_quit(ScriptEnv &e);
-	int o1_placeItem(ScriptEnv &e);
-	int o1_setItemPic(ScriptEnv &e);
-	int o1_resetPic(ScriptEnv &e);
-	template <Direction D>
-	int o1_goDirection(ScriptEnv &e);
-	int o1_takeItem(ScriptEnv &e);
-	int o1_dropItem(ScriptEnv &e);
-	int o1_setRoomPic(ScriptEnv &e);
+	typedef Common::SharedPtr<Common::Functor1<ScriptEnv &, int> > Opcode;
+
+	template <class T>
+	Opcode opcode(int (T::*f)(ScriptEnv &)) {
+		return Opcode(new Common::Functor1Mem<ScriptEnv &, int, T>(static_cast<T *>(this), f));
+	}
+
+	virtual int o_isItemInRoom(ScriptEnv &e);
+	virtual int o_isMovesGT(ScriptEnv &e);
+	virtual int o_isVarEQ(ScriptEnv &e);
+	virtual int o_isCurPicEQ(ScriptEnv &e);
+	virtual int o_isItemPicEQ(ScriptEnv &e);
+
+	virtual int o_varAdd(ScriptEnv &e);
+	virtual int o_varSub(ScriptEnv &e);
+	virtual int o_varSet(ScriptEnv &e);
+	virtual int o_listInv(ScriptEnv &e);
+	virtual int o_moveItem(ScriptEnv &e);
+	virtual int o_setRoom(ScriptEnv &e);
+	virtual int o_setCurPic(ScriptEnv &e);
+	virtual int o_setPic(ScriptEnv &e);
+	virtual int o_printMsg(ScriptEnv &e);
+	virtual int o_setLight(ScriptEnv &e);
+	virtual int o_setDark(ScriptEnv &e);
+	virtual int o_save(ScriptEnv &e);
+	virtual int o_restore(ScriptEnv &e);
+	virtual int o_restart(ScriptEnv &e);
+	virtual int o_quit(ScriptEnv &e);
+	virtual int o_placeItem(ScriptEnv &e);
+	virtual int o_setItemPic(ScriptEnv &e);
+	virtual int o_resetPic(ScriptEnv &e);
+	virtual int o_takeItem(ScriptEnv &e);
+	virtual int o_dropItem(ScriptEnv &e);
+	virtual int o_setRoomPic(ScriptEnv &e);
+
+	virtual int goDirection(ScriptEnv &e, Direction D);
+	int o_goNorth(ScriptEnv &e) { return goDirection(e, IDI_DIR_NORTH); }
+	int o_goSouth(ScriptEnv &e) { return goDirection(e, IDI_DIR_SOUTH); }
+	int o_goEast(ScriptEnv &e) { return goDirection(e, IDI_DIR_EAST); }
+	int o_goWest(ScriptEnv &e) { return goDirection(e, IDI_DIR_WEST); }
+	int o_goUp(ScriptEnv &e) { return goDirection(e, IDI_DIR_UP); }
+	int o_goDown(ScriptEnv &e) { return goDirection(e, IDI_DIR_DOWN); }
 
 	// Graphics
 	void drawPic(byte pic, Common::Point pos = Common::Point()) const;
@@ -357,8 +371,7 @@ protected:
 	bool _textMode;
 
 	// Opcodes
-	typedef Common::Functor1<ScriptEnv &, int> Opcode;
-	Common::Array<const Opcode *> _condOpcodes, _actOpcodes;
+	Common::Array<Opcode> _condOpcodes, _actOpcodes;
 	// Message strings in data file
 	Common::Array<DataBlockPtr> _messages;
 	// Picture data
diff --git a/engines/adl/adl_v2.cpp b/engines/adl/adl_v2.cpp
index 4089ab3..84829a7 100644
--- a/engines/adl/adl_v2.cpp
+++ b/engines/adl/adl_v2.cpp
@@ -54,73 +54,19 @@ void AdlEngine_v2::insertDisk(byte volume) {
 	_currentVolume = volume;
 }
 
-typedef Common::Functor1Mem<ScriptEnv &, int, AdlEngine_v2> OpcodeV2;
-#define SetOpcodeTable(x) table = &x;
-#define Opcode(x) table->push_back(new OpcodeV2(this, &AdlEngine_v2::x))
-#define OpcodeUnImpl() table->push_back(new OpcodeV2(this, 0))
-
 void AdlEngine_v2::setupOpcodeTables() {
-	Common::Array<const Opcode *> *table = 0;
-
-	SetOpcodeTable(_condOpcodes);
-	// 0x00
-	OpcodeUnImpl();
-	Opcode(o2_isFirstTime);
-	Opcode(o2_isRandomGT);
-	Opcode(o1_isItemInRoom);
-	// 0x04
-	Opcode(o2_isNounNotInRoom);
-	Opcode(o1_isMovesGT);
-	Opcode(o1_isVarEQ);
-	Opcode(o2_isCarryingSomething);
-	// 0x08
-	OpcodeUnImpl();
-	Opcode(o1_isCurPicEQ);
-	Opcode(o1_isItemPicEQ);
-
-	SetOpcodeTable(_actOpcodes);
-	// 0x00
-	OpcodeUnImpl();
-	Opcode(o1_varAdd);
-	Opcode(o1_varSub);
-	Opcode(o1_varSet);
-	// 0x04
-	Opcode(o1_listInv);
-	Opcode(o2_moveItem);
-	Opcode(o1_setRoom);
-	Opcode(o2_setCurPic);
-	// 0x08
-	Opcode(o2_setPic);
-	Opcode(o1_printMsg);
-	Opcode(o1_setLight);
-	Opcode(o1_setDark);
-	// 0x0c
-	Opcode(o2_moveAllItems);
-	Opcode(o1_quit);
-	OpcodeUnImpl();
-	Opcode(o2_save);
-	// 0x10
-	Opcode(o2_restore);
-	Opcode(o1_restart);
-	Opcode(o2_placeItem);
-	Opcode(o1_setItemPic);
-	// 0x14
-	Opcode(o1_resetPic);
-	Opcode(o1_goDirection<IDI_DIR_NORTH>);
-	Opcode(o1_goDirection<IDI_DIR_SOUTH>);
-	Opcode(o1_goDirection<IDI_DIR_EAST>);
-	// 0x18
-	Opcode(o1_goDirection<IDI_DIR_WEST>);
-	Opcode(o1_goDirection<IDI_DIR_UP>);
-	Opcode(o1_goDirection<IDI_DIR_DOWN>);
-	Opcode(o1_takeItem);
-	// 0x1c
-	Opcode(o1_dropItem);
-	Opcode(o1_setRoomPic);
-	Opcode(o2_tellTime);
-	Opcode(o2_setRoomFromVar);
-	// 0x20
-	Opcode(o2_initDisk);
+	AdlEngine::setupOpcodeTables();
+
+	_condOpcodes[0x01] = opcode(&AdlEngine_v2::o_isFirstTime);
+	_condOpcodes[0x02] = opcode(&AdlEngine_v2::o_isRandomGT);
+	_condOpcodes[0x04] = opcode(&AdlEngine_v2::o_isNounNotInRoom);
+	_condOpcodes[0x07] = opcode(&AdlEngine_v2::o_isCarryingSomething);
+
+	_actOpcodes.resize(0x21);
+	_actOpcodes[0x0c] = opcode(&AdlEngine_v2::o_moveAllItems);
+	_actOpcodes[0x1e] = opcode(&AdlEngine_v2::o_tellTime);
+	_actOpcodes[0x1f] = opcode(&AdlEngine_v2::o_setRoomFromVar);
+	_actOpcodes[0x20] = opcode(&AdlEngine_v2::o_initDisk);
 }
 
 void AdlEngine_v2::initState() {
@@ -466,7 +412,7 @@ void AdlEngine_v2::loadItemPictures(Common::ReadStream &stream, byte count) {
 	}
 }
 
-int AdlEngine_v2::o2_isFirstTime(ScriptEnv &e) {
+int AdlEngine_v2::o_isFirstTime(ScriptEnv &e) {
 	OP_DEBUG_0("\t&& IS_FIRST_TIME()");
 
 	bool oldFlag = getCurRoom().isFirstTime;
@@ -479,7 +425,7 @@ int AdlEngine_v2::o2_isFirstTime(ScriptEnv &e) {
 	return 0;
 }
 
-int AdlEngine_v2::o2_isRandomGT(ScriptEnv &e) {
+int AdlEngine_v2::o_isRandomGT(ScriptEnv &e) {
 	OP_DEBUG_1("\t&& RAND() > %d", e.arg(1));
 
 	byte rnd = _random->getRandomNumber(255);
@@ -490,7 +436,7 @@ int AdlEngine_v2::o2_isRandomGT(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine_v2::o2_isNounNotInRoom(ScriptEnv &e) {
+int AdlEngine_v2::o_isNounNotInRoom(ScriptEnv &e) {
 	OP_DEBUG_1("\t&& NO_SUCH_ITEMS_IN_ROOM(%s)", itemRoomStr(e.arg(1)).c_str());
 
 	Common::List<Item>::const_iterator item;
@@ -502,7 +448,7 @@ int AdlEngine_v2::o2_isNounNotInRoom(ScriptEnv &e) {
 	return 1;
 }
 
-int AdlEngine_v2::o2_isCarryingSomething(ScriptEnv &e) {
+int AdlEngine_v2::o_isCarryingSomething(ScriptEnv &e) {
 	OP_DEBUG_0("\t&& IS_CARRYING_SOMETHING()");
 
 	Common::List<Item>::const_iterator item;
@@ -513,7 +459,7 @@ int AdlEngine_v2::o2_isCarryingSomething(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine_v2::o2_moveItem(ScriptEnv &e) {
+int AdlEngine_v2::o_moveItem(ScriptEnv &e) {
 	OP_DEBUG_2("\tSET_ITEM_ROOM(%s, %s)", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str());
 
 	byte room = roomArg(e.arg(2));
@@ -531,21 +477,21 @@ int AdlEngine_v2::o2_moveItem(ScriptEnv &e) {
 	return 2;
 }
 
-int AdlEngine_v2::o2_setCurPic(ScriptEnv &e) {
+int AdlEngine_v2::o_setCurPic(ScriptEnv &e) {
 	OP_DEBUG_1("\tSET_CURPIC(%d)", e.arg(1));
 
 	getCurRoom().curPicture = _state.curPicture = e.arg(1);
 	return 1;
 }
 
-int AdlEngine_v2::o2_setPic(ScriptEnv &e) {
+int AdlEngine_v2::o_setPic(ScriptEnv &e) {
 	OP_DEBUG_1("\tSET_PIC(%d)", e.arg(1));
 
 	getCurRoom().picture = getCurRoom().curPicture = _state.curPicture = e.arg(1);
 	return 1;
 }
 
-int AdlEngine_v2::o2_moveAllItems(ScriptEnv &e) {
+int AdlEngine_v2::o_moveAllItems(ScriptEnv &e) {
 	OP_DEBUG_2("\tMOVE_ALL_ITEMS(%s, %s)", itemRoomStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str());
 
 	byte room1 = roomArg(e.arg(1));
@@ -567,7 +513,7 @@ int AdlEngine_v2::o2_moveAllItems(ScriptEnv &e) {
 	return 2;
 }
 
-int AdlEngine_v2::o2_save(ScriptEnv &e) {
+int AdlEngine_v2::o_save(ScriptEnv &e) {
 	OP_DEBUG_0("\tSAVE_GAME()");
 
 	int slot = askForSlot(_strings_v2.saveInsert);
@@ -582,7 +528,7 @@ int AdlEngine_v2::o2_save(ScriptEnv &e) {
 	return 0;
 }
 
-int AdlEngine_v2::o2_restore(ScriptEnv &e) {
+int AdlEngine_v2::o_restore(ScriptEnv &e) {
 	OP_DEBUG_0("\tRESTORE_GAME()");
 
 	int slot = askForSlot(_strings_v2.restoreInsert);
@@ -600,7 +546,7 @@ int AdlEngine_v2::o2_restore(ScriptEnv &e) {
 	return 0;
 }
 
-int AdlEngine_v2::o2_placeItem(ScriptEnv &e) {
+int AdlEngine_v2::o_placeItem(ScriptEnv &e) {
 	OP_DEBUG_4("\tPLACE_ITEM(%s, %s, (%d, %d))", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str(), e.arg(3), e.arg(4));
 
 	Item &item = getItem(e.arg(1));
@@ -613,7 +559,7 @@ int AdlEngine_v2::o2_placeItem(ScriptEnv &e) {
 	return 4;
 }
 
-int AdlEngine_v2::o2_tellTime(ScriptEnv &e) {
+int AdlEngine_v2::o_tellTime(ScriptEnv &e) {
 	OP_DEBUG_0("\tTELL_TIME()");
 
 	Common::String time = _strings_v2.time;
@@ -628,14 +574,14 @@ int AdlEngine_v2::o2_tellTime(ScriptEnv &e) {
 	return 0;
 }
 
-int AdlEngine_v2::o2_setRoomFromVar(ScriptEnv &e) {
+int AdlEngine_v2::o_setRoomFromVar(ScriptEnv &e) {
 	OP_DEBUG_1("\tROOM = VAR[%d]", e.arg(1));
 	getCurRoom().curPicture = getCurRoom().picture;
 	_state.room = getVar(e.arg(1));
 	return 1;
 }
 
-int AdlEngine_v2::o2_initDisk(ScriptEnv &e) {
+int AdlEngine_v2::o_initDisk(ScriptEnv &e) {
 	OP_DEBUG_0("\tINIT_DISK()");
 
 	_display->printAsciiString("NOT REQUIRED\r");
diff --git a/engines/adl/adl_v2.h b/engines/adl/adl_v2.h
index 861694a..564b4dc 100644
--- a/engines/adl/adl_v2.h
+++ b/engines/adl/adl_v2.h
@@ -64,21 +64,21 @@ protected:
 	void checkTextOverflow(char c);
 	void handleTextOverflow();
 
-	int o2_isFirstTime(ScriptEnv &e);
-	int o2_isRandomGT(ScriptEnv &e);
-	int o2_isNounNotInRoom(ScriptEnv &e);
-	int o2_isCarryingSomething(ScriptEnv &e);
+	virtual int o_isFirstTime(ScriptEnv &e);
+	virtual int o_isRandomGT(ScriptEnv &e);
+	virtual int o_isNounNotInRoom(ScriptEnv &e);
+	virtual int o_isCarryingSomething(ScriptEnv &e);
 
-	int o2_moveItem(ScriptEnv &e);
-	int o2_setCurPic(ScriptEnv &e);
-	int o2_setPic(ScriptEnv &e);
-	int o2_moveAllItems(ScriptEnv &e);
-	int o2_save(ScriptEnv &e);
-	int o2_restore(ScriptEnv &e);
-	int o2_placeItem(ScriptEnv &e);
-	int o2_tellTime(ScriptEnv &e);
-	int o2_setRoomFromVar(ScriptEnv &e);
-	int o2_initDisk(ScriptEnv &e);
+	virtual int o_moveItem(ScriptEnv &e) override;
+	virtual int o_setCurPic(ScriptEnv &e) override;
+	virtual int o_setPic(ScriptEnv &e) override;
+	virtual int o_moveAllItems(ScriptEnv &e);
+	virtual int o_save(ScriptEnv &e) override;
+	virtual int o_restore(ScriptEnv &e) override ;
+	virtual int o_placeItem(ScriptEnv &e) override;
+	virtual int o_tellTime(ScriptEnv &e);
+	virtual int o_setRoomFromVar(ScriptEnv &e);
+	virtual int o_initDisk(ScriptEnv &e);
 
 	struct {
 		Common::String time;
diff --git a/engines/adl/adl_v3.cpp b/engines/adl/adl_v3.cpp
index 46af211..88884b7 100644
--- a/engines/adl/adl_v3.cpp
+++ b/engines/adl/adl_v3.cpp
@@ -56,15 +56,7 @@ void AdlEngine_v3::loadItemDescriptions(Common::SeekableReadStream &stream, byte
 		error("Error loading item descriptions");
 }
 
-typedef Common::Functor1Mem<ScriptEnv &, int, AdlEngine_v3> OpcodeV3;
-
-void AdlEngine_v3::setupOpcodeTables() {
-	AdlEngine_v2::setupOpcodeTables();
-	delete _condOpcodes[0x04];
-	_condOpcodes[0x04] = new OpcodeV3(this, &AdlEngine_v3::o3_isNounNotInRoom);
-}
-
-int AdlEngine_v3::o3_isNounNotInRoom(ScriptEnv &e) {
+int AdlEngine_v3::o_isNounNotInRoom(ScriptEnv &e) {
 	OP_DEBUG_1("\t&& NO_SUCH_ITEMS_IN_ROOM(%s)", itemRoomStr(e.arg(1)).c_str());
 
 	Common::List<Item>::const_iterator item;
diff --git a/engines/adl/adl_v3.h b/engines/adl/adl_v3.h
index ab56d4e..3bb8908 100644
--- a/engines/adl/adl_v3.h
+++ b/engines/adl/adl_v3.h
@@ -35,12 +35,11 @@ protected:
 	AdlEngine_v3(OSystem *syst, const AdlGameDescription *gd);
 
 	// AdlEngine
-	virtual void setupOpcodeTables();
 	Common::String getItemDescription(const Item &item) const;
 
 	void loadItemDescriptions(Common::SeekableReadStream &stream, byte count);
 
-	int o3_isNounNotInRoom(ScriptEnv &e);
+	virtual int o_isNounNotInRoom(ScriptEnv &e) override;
 
 	Common::Array<Common::String> _itemDesc;
 };
diff --git a/engines/adl/adl_v4.cpp b/engines/adl/adl_v4.cpp
index c06099b..dabee63 100644
--- a/engines/adl/adl_v4.cpp
+++ b/engines/adl/adl_v4.cpp
@@ -420,7 +420,22 @@ void AdlEngine_v4::switchRoom(byte roomNr) {
 	restoreRoomState(_state.room);
 }
 
-int AdlEngine_v4::o4_isItemInRoom(ScriptEnv &e) {
+void AdlEngine_v4::setupOpcodeTables() {
+	AdlEngine_v3::setupOpcodeTables();
+
+	_condOpcodes[0x08] = opcode(&AdlEngine_v4::o_isVarGT);
+	_condOpcodes[0x0a].reset();
+
+	_actOpcodes[0x0a] = opcode(&AdlEngine_v4::o_setRegionToPrev);
+	_actOpcodes[0x0b].reset();
+	_actOpcodes[0x0e] = opcode(&AdlEngine_v4::o_setRegion);
+	_actOpcodes[0x12] = opcode(&AdlEngine_v4::o_setRegionRoom);
+	_actOpcodes[0x13].reset();
+	_actOpcodes[0x1e].reset();
+	_actOpcodes[0x1f].reset();
+}
+
+int AdlEngine_v4::o_isItemInRoom(ScriptEnv &e) {
 	OP_DEBUG_2("\t&& GET_ITEM_ROOM(%s) == %s", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str());
 
 	const Item &item = getItem(e.arg(1));
@@ -434,7 +449,7 @@ int AdlEngine_v4::o4_isItemInRoom(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine_v4::o4_isVarGT(ScriptEnv &e) {
+int AdlEngine_v4::o_isVarGT(ScriptEnv &e) {
 	OP_DEBUG_2("\t&& VARS[%d] > %d", e.arg(1), e.arg(2));
 
 	if (getVar(e.arg(1)) > e.arg(2))
@@ -443,13 +458,13 @@ int AdlEngine_v4::o4_isVarGT(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine_v4::o4_moveItem(ScriptEnv &e) {
-	o2_moveItem(e);
+int AdlEngine_v4::o_moveItem(ScriptEnv &e) {
+	AdlEngine_v3::o_moveItem(e);
 	getItem(e.arg(1)).region = _state.region;
 	return 2;
 }
 
-int AdlEngine_v4::o4_setRegionToPrev(ScriptEnv &e) {
+int AdlEngine_v4::o_setRegionToPrev(ScriptEnv &e) {
 	OP_DEBUG_0("\tREGION = PREV_REGION");
 
 	switchRegion(_state.prevRegion);
@@ -458,7 +473,7 @@ int AdlEngine_v4::o4_setRegionToPrev(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine_v4::o4_moveAllItems(ScriptEnv &e) {
+int AdlEngine_v4::o_moveAllItems(ScriptEnv &e) {
 	OP_DEBUG_2("\tMOVE_ALL_ITEMS(%s, %s)", itemRoomStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str());
 
 	byte room1 = roomArg(e.arg(1));
@@ -495,7 +510,7 @@ int AdlEngine_v4::o4_moveAllItems(ScriptEnv &e) {
 	return 2;
 }
 
-int AdlEngine_v4::o4_setRegion(ScriptEnv &e) {
+int AdlEngine_v4::o_setRegion(ScriptEnv &e) {
 	OP_DEBUG_1("\tREGION = %d", e.arg(1));
 
 	switchRegion(e.arg(1));
@@ -504,7 +519,7 @@ int AdlEngine_v4::o4_setRegion(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine_v4::o4_save(ScriptEnv &e) {
+int AdlEngine_v4::o_save(ScriptEnv &e) {
 	OP_DEBUG_0("\tSAVE_GAME()");
 
 	_display->printString(_strings_v2.saveReplace);
@@ -525,7 +540,7 @@ int AdlEngine_v4::o4_save(ScriptEnv &e) {
 	return 0;
 }
 
-int AdlEngine_v4::o4_restore(ScriptEnv &e) {
+int AdlEngine_v4::o_restore(ScriptEnv &e) {
 	OP_DEBUG_0("\tRESTORE_GAME()");
 
 	const int slot = askForSlot(_strings_v2.restoreInsert);
@@ -544,7 +559,7 @@ int AdlEngine_v4::o4_restore(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine_v4::o4_restart(ScriptEnv &e) {
+int AdlEngine_v4::o_restart(ScriptEnv &e) {
 	OP_DEBUG_0("\tRESTART_GAME()");
 
 	while (true) {
@@ -555,7 +570,7 @@ int AdlEngine_v4::o4_restart(ScriptEnv &e) {
 			return -1;
 
 		if (input.firstChar() == APPLECHAR('N')) {
-			return o1_quit(e);
+			return o_quit(e);
 		} else if (input.firstChar() == APPLECHAR('Y')) {
 			// The original game loads a special save game from volume 3
 			initState();
@@ -566,7 +581,7 @@ int AdlEngine_v4::o4_restart(ScriptEnv &e) {
 	}
 }
 
-int AdlEngine_v4::o4_setRegionRoom(ScriptEnv &e) {
+int AdlEngine_v4::o_setRegionRoom(ScriptEnv &e) {
 	OP_DEBUG_2("\tSET_REGION_ROOM(%d, %d)", e.arg(1), e.arg(2));
 
 	switchRegion(e.arg(1));
@@ -576,8 +591,8 @@ int AdlEngine_v4::o4_setRegionRoom(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine_v4::o4_setRoomPic(ScriptEnv &e) {
-	o1_setRoomPic(e);
+int AdlEngine_v4::o_setRoomPic(ScriptEnv &e) {
+	AdlEngine_v3::o_setRoomPic(e);
 	backupRoomState(e.arg(1));
 	return 2;
 }
diff --git a/engines/adl/adl_v4.h b/engines/adl/adl_v4.h
index efb58b2..0c90c02 100644
--- a/engines/adl/adl_v4.h
+++ b/engines/adl/adl_v4.h
@@ -49,6 +49,7 @@ protected:
 	AdlEngine_v4(OSystem *syst, const AdlGameDescription *gd);
 
 	// AdlEngine
+	virtual void setupOpcodeTables();
 	virtual void gameLoop();
 	virtual void loadState(Common::ReadStream &stream);
 	virtual void saveState(Common::WriteStream &stream);
@@ -84,17 +85,17 @@ protected:
 	void backupVars();
 	void restoreVars();
 
-	int o4_isItemInRoom(ScriptEnv &e);
-	int o4_isVarGT(ScriptEnv &e);
-	int o4_moveItem(ScriptEnv &e);
-	int o4_setRegionToPrev(ScriptEnv &e);
-	int o4_moveAllItems(ScriptEnv &e);
-	int o4_setRegion(ScriptEnv &e);
-	int o4_save(ScriptEnv &e);
-	int o4_restore(ScriptEnv &e);
-	int o4_restart(ScriptEnv &e);
-	int o4_setRegionRoom(ScriptEnv &e);
-	int o4_setRoomPic(ScriptEnv &e);
+	virtual int o_isItemInRoom(ScriptEnv &e) override;
+	virtual int o_isVarGT(ScriptEnv &e);
+	virtual int o_moveItem(ScriptEnv &e) override;
+	virtual int o_setRegionToPrev(ScriptEnv &e);
+	virtual int o_moveAllItems(ScriptEnv &e) override;
+	virtual int o_setRegion(ScriptEnv &e);
+	virtual int o_save(ScriptEnv &e) override;
+	virtual int o_restore(ScriptEnv &e) override;
+	virtual int o_restart(ScriptEnv &e) override;
+	virtual int o_setRegionRoom(ScriptEnv &e);
+	virtual int o_setRoomPic(ScriptEnv &e) override;
 
 	Common::Array<RegionLocation> _regionLocations;
 	Common::Array<RegionInitDataOffset> _regionInitDataOffsets;
diff --git a/engines/adl/adl_v5.cpp b/engines/adl/adl_v5.cpp
index 929ffff..b797e73 100644
--- a/engines/adl/adl_v5.cpp
+++ b/engines/adl/adl_v5.cpp
@@ -65,7 +65,18 @@ AdlEngine_v5::RegionChunkType AdlEngine_v5::getRegionChunkType(const uint16 addr
 	}
 }
 
-int AdlEngine_v5::o5_isNounNotInRoom(ScriptEnv &e) {
+void AdlEngine_v5::setupOpcodeTables() {
+	AdlEngine_v4::setupOpcodeTables();
+
+	_condOpcodes[0x0a] = opcode(&AdlEngine_v5::o_abortScript);
+
+	_actOpcodes[0x0a] = opcode(&AdlEngine_v5::o_dummy);
+	_actOpcodes[0x0b] = opcode(&AdlEngine_v5::o_setTextMode);
+	_actOpcodes[0x0e] = opcode(&AdlEngine_v5::o_dummy);
+	_actOpcodes[0x13] = opcode(&AdlEngine_v5::o_dummy);
+}
+
+int AdlEngine_v5::o_isNounNotInRoom(ScriptEnv &e) {
 	OP_DEBUG_1("\t&& NO_SUCH_ITEMS_IN_ROOM(%s)", itemRoomStr(e.arg(1)).c_str());
 
 	Common::List<Item>::const_iterator item;
@@ -83,7 +94,7 @@ int AdlEngine_v5::o5_isNounNotInRoom(ScriptEnv &e) {
 	return 1;
 }
 
-int AdlEngine_v5::o5_abortScript(ScriptEnv &e) {
+int AdlEngine_v5::o_abortScript(ScriptEnv &e) {
 	OP_DEBUG_0("\t&& ABORT_SCRIPT()");
 
 	_abortScript = true;
@@ -92,13 +103,13 @@ int AdlEngine_v5::o5_abortScript(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine_v5::o5_dummy(ScriptEnv &e) {
+int AdlEngine_v5::o_dummy(ScriptEnv &e) {
 	OP_DEBUG_0("\tDUMMY()");
 
 	return 0;
 }
 
-int AdlEngine_v5::o5_setTextMode(ScriptEnv &e) {
+int AdlEngine_v5::o_setTextMode(ScriptEnv &e) {
 	OP_DEBUG_1("\tSET_TEXT_MODE(%d)", e.arg(1));
 
 	switch (e.arg(1)) {
@@ -126,7 +137,7 @@ int AdlEngine_v5::o5_setTextMode(ScriptEnv &e) {
 	}
 }
 
-int AdlEngine_v5::o5_setRegionRoom(ScriptEnv &e) {
+int AdlEngine_v5::o_setRegionRoom(ScriptEnv &e) {
 	OP_DEBUG_2("\tSET_REGION_ROOM(%d, %d)", e.arg(1), e.arg(2));
 
 	getCurRoom().curPicture = getCurRoom().picture;
@@ -137,7 +148,7 @@ int AdlEngine_v5::o5_setRegionRoom(ScriptEnv &e) {
 	return -1;
 }
 
-int AdlEngine_v5::o5_setRoomPic(ScriptEnv &e) {
+int AdlEngine_v5::o_setRoomPic(ScriptEnv &e) {
 	const byte isFirstTime = restoreRoomState(e.arg(1));
 
 	// CHECKME: More peculiar isFirstTime handling (see also restoreRoomState).
@@ -147,7 +158,7 @@ int AdlEngine_v5::o5_setRoomPic(ScriptEnv &e) {
 	if (isFirstTime != 0xff)
 		getRoom(e.arg(1)).isFirstTime = isFirstTime;
 
-	o4_setRoomPic(e);
+	AdlEngine_v4::o_setRoomPic(e);
 	return 2;
 }
 
diff --git a/engines/adl/adl_v5.h b/engines/adl/adl_v5.h
index 473b244..536f664 100644
--- a/engines/adl/adl_v5.h
+++ b/engines/adl/adl_v5.h
@@ -34,17 +34,20 @@ public:
 protected:
 	AdlEngine_v5(OSystem *syst, const AdlGameDescription *gd);
 
+	// AdlEngine
+	virtual void setupOpcodeTables();
+
 	// AdlEngine_v4
 	virtual RegionChunkType getRegionChunkType(const uint16 addr) const;
 	virtual void initRoomState(RoomState &roomState) const;
 	virtual byte restoreRoomState(byte room);
 
-	int o5_isNounNotInRoom(ScriptEnv &e);
-	int o5_abortScript(ScriptEnv &e);
-	int o5_dummy(ScriptEnv &e);
-	int o5_setTextMode(ScriptEnv &e);
-	int o5_setRegionRoom(ScriptEnv &e);
-	int o5_setRoomPic(ScriptEnv &e);
+	virtual int o_isNounNotInRoom(ScriptEnv &e) override;
+	virtual int o_abortScript(ScriptEnv &e);
+	virtual int o_dummy(ScriptEnv &e);
+	virtual int o_setTextMode(ScriptEnv &e);
+	virtual int o_setRegionRoom(ScriptEnv &e) override;
+	virtual int o_setRoomPic(ScriptEnv &e) override;
 };
 
 } // End of namespace Adl
diff --git a/engines/adl/hires5.cpp b/engines/adl/hires5.cpp
index efe69a7..cf09ceb 100644
--- a/engines/adl/hires5.cpp
+++ b/engines/adl/hires5.cpp
@@ -134,73 +134,12 @@ void HiRes5Engine::animateLights() const {
 	}
 }
 
-typedef Common::Functor1Mem<ScriptEnv &, int, HiRes5Engine> OpcodeH5;
-#define SetOpcodeTable(x) table = &x;
-#define Opcode(x) table->push_back(new OpcodeH5(this, &HiRes5Engine::x))
-#define OpcodeUnImpl() table->push_back(new OpcodeH5(this, 0))
-
 void HiRes5Engine::setupOpcodeTables() {
-	Common::Array<const Opcode *> *table = 0;
-
-	SetOpcodeTable(_condOpcodes);
-	// 0x00
-	OpcodeUnImpl();
-	Opcode(o2_isFirstTime);
-	Opcode(o2_isRandomGT);
-	Opcode(o4_isItemInRoom);
-	// 0x04
-	Opcode(o3_isNounNotInRoom);
-	Opcode(o1_isMovesGT);
-	Opcode(o1_isVarEQ);
-	Opcode(o2_isCarryingSomething);
-	// 0x08
-	Opcode(o4_isVarGT);
-	Opcode(o1_isCurPicEQ);
-	OpcodeUnImpl();
-
-	SetOpcodeTable(_actOpcodes);
-	// 0x00
-	OpcodeUnImpl();
-	Opcode(o1_varAdd);
-	Opcode(o1_varSub);
-	Opcode(o1_varSet);
-	// 0x04
-	Opcode(o1_listInv);
-	Opcode(o4_moveItem);
-	Opcode(o1_setRoom);
-	Opcode(o2_setCurPic);
-	// 0x08
-	Opcode(o2_setPic);
-	Opcode(o1_printMsg);
-	Opcode(o4_setRegionToPrev);
-	Opcode(o_checkItemTimeLimits);
-	// 0x0c
-	Opcode(o4_moveAllItems);
-	Opcode(o1_quit);
-	Opcode(o4_setRegion);
-	Opcode(o4_save);
-	// 0x10
-	Opcode(o4_restore);
-	Opcode(o4_restart);
-	Opcode(o4_setRegionRoom);
-	Opcode(o_startAnimation);
-	// 0x14
-	Opcode(o1_resetPic);
-	Opcode(o1_goDirection<IDI_DIR_NORTH>);
-	Opcode(o1_goDirection<IDI_DIR_SOUTH>);
-	Opcode(o1_goDirection<IDI_DIR_EAST>);
-	// 0x18
-	Opcode(o1_goDirection<IDI_DIR_WEST>);
-	Opcode(o1_goDirection<IDI_DIR_UP>);
-	Opcode(o1_goDirection<IDI_DIR_DOWN>);
-	Opcode(o1_takeItem);
-	// 0x1c
-	Opcode(o1_dropItem);
-	Opcode(o4_setRoomPic);
-	Opcode(o_winGame);
-	OpcodeUnImpl();
-	// 0x20
-	Opcode(o2_initDisk);
+	AdlEngine_v4::setupOpcodeTables();
+
+	_actOpcodes[0x0b] = opcode(&HiRes5Engine::o_checkItemTimeLimits);
+	_actOpcodes[0x13] = opcode(&HiRes5Engine::o_startAnimation);
+	_actOpcodes[0x1e] = opcode(&HiRes5Engine::o_winGame);
 }
 
 bool HiRes5Engine::isInventoryFull() {
@@ -292,7 +231,7 @@ int HiRes5Engine::o_winGame(ScriptEnv &e) {
 	showRoom();
 	playTones(_song, true);
 
-	return o1_quit(e);
+	return o_quit(e);
 }
 
 void HiRes5Engine::runIntro() {
diff --git a/engines/adl/hires6.cpp b/engines/adl/hires6.cpp
index 7f1a285..5cbca1c 100644
--- a/engines/adl/hires6.cpp
+++ b/engines/adl/hires6.cpp
@@ -50,6 +50,7 @@ private:
 	void init();
 	void initGameState();
 	void showRoom();
+	int goDirection(ScriptEnv &e, Direction dir) override;
 	Common::String formatVerbError(const Common::String &verb) const;
 	Common::String formatNounError(const Common::String &verb, const Common::String &noun) const;
 	void loadState(Common::ReadStream &stream);
@@ -61,8 +62,6 @@ private:
 	// Engine
 	bool canSaveGameStateCurrently();
 
-	template <Direction D>
-	int o_goDirection(ScriptEnv &e);
 	int o_fluteSound(ScriptEnv &e);
 
 	static const uint kRegions = 3;
@@ -94,80 +93,16 @@ void HiRes6Engine::gameLoop() {
 	}
 }
 
-typedef Common::Functor1Mem<ScriptEnv &, int, HiRes6Engine> OpcodeH6;
-#define SetOpcodeTable(x) table = &x;
-#define Opcode(x) table->push_back(new OpcodeH6(this, &HiRes6Engine::x))
-#define OpcodeUnImpl() table->push_back(new OpcodeH6(this, 0))
-
 void HiRes6Engine::setupOpcodeTables() {
-	Common::Array<const Opcode *> *table = 0;
-
-	SetOpcodeTable(_condOpcodes);
-	// 0x00
-	OpcodeUnImpl();
-	Opcode(o2_isFirstTime);
-	Opcode(o2_isRandomGT);
-	Opcode(o4_isItemInRoom);
-	// 0x04
-	Opcode(o5_isNounNotInRoom);
-	Opcode(o1_isMovesGT);
-	Opcode(o1_isVarEQ);
-	Opcode(o2_isCarryingSomething);
-	// 0x08
-	Opcode(o4_isVarGT);
-	Opcode(o1_isCurPicEQ);
-	Opcode(o5_abortScript);
-
-	SetOpcodeTable(_actOpcodes);
-	// 0x00
-	OpcodeUnImpl();
-	Opcode(o1_varAdd);
-	Opcode(o1_varSub);
-	Opcode(o1_varSet);
-	// 0x04
-	Opcode(o1_listInv);
-	Opcode(o4_moveItem);
-	Opcode(o1_setRoom);
-	Opcode(o2_setCurPic);
-	// 0x08
-	Opcode(o2_setPic);
-	Opcode(o1_printMsg);
-	Opcode(o5_dummy);
-	Opcode(o5_setTextMode);
-	// 0x0c
-	Opcode(o4_moveAllItems);
-	Opcode(o1_quit);
-	Opcode(o5_dummy);
-	Opcode(o4_save);
-	// 0x10
-	Opcode(o4_restore);
-	Opcode(o1_restart);
-	Opcode(o5_setRegionRoom);
-	Opcode(o5_dummy);
-	// 0x14
-	Opcode(o1_resetPic);
-	Opcode(o_goDirection<IDI_DIR_NORTH>);
-	Opcode(o_goDirection<IDI_DIR_SOUTH>);
-	Opcode(o_goDirection<IDI_DIR_EAST>);
-	// 0x18
-	Opcode(o_goDirection<IDI_DIR_WEST>);
-	Opcode(o_goDirection<IDI_DIR_UP>);
-	Opcode(o_goDirection<IDI_DIR_DOWN>);
-	Opcode(o1_takeItem);
-	// 0x1c
-	Opcode(o1_dropItem);
-	Opcode(o5_setRoomPic);
-	Opcode(o_fluteSound);
-	OpcodeUnImpl();
-	// 0x20
-	Opcode(o2_initDisk);
+	AdlEngine_v5::setupOpcodeTables();
+
+	_actOpcodes[0x1e] = opcode(&HiRes6Engine::o_fluteSound);
 }
 
-template <Direction D>
-int HiRes6Engine::o_goDirection(ScriptEnv &e) {
-	OP_DEBUG_0((Common::String("\tGO_") + dirStr(D) + "()").c_str());
+int HiRes6Engine::goDirection(ScriptEnv &e, Direction dir) {
+	OP_DEBUG_0((Common::String("\tGO_") + dirStr(dir) + "()").c_str());
 
-	byte room = getCurRoom().connections[D];
+	byte room = getCurRoom().connections[dir];
 
 	if (room == 0) {
 		// Don't penalize invalid directions at escapable Garthim encounter





More information about the Scummvm-git-logs mailing list