aboutsummaryrefslogtreecommitdiff
path: root/engines/adl
diff options
context:
space:
mode:
authorWalter van Niftrik2019-03-26 23:41:23 +0100
committerWalter van Niftrik2019-03-30 23:18:02 +0100
commitfa7688a93199f25e84d7c39ca232a4f20a629274 (patch)
treebcb44cb7606e0bd515a69cf3a724061e0408ff14 /engines/adl
parent658af785d1d6cb448e1dcf0251f80e2e9f62794a (diff)
downloadscummvm-rg350-fa7688a93199f25e84d7c39ca232a4f20a629274.tar.gz
scummvm-rg350-fa7688a93199f25e84d7c39ca232a4f20a629274.tar.bz2
scummvm-rg350-fa7688a93199f25e84d7c39ca232a4f20a629274.zip
ADL: Refactor opcodes
Diffstat (limited to 'engines/adl')
-rw-r--r--engines/adl/adl.cpp158
-rw-r--r--engines/adl/adl.h75
-rw-r--r--engines/adl/adl_v2.cpp106
-rw-r--r--engines/adl/adl_v2.h28
-rw-r--r--engines/adl/adl_v3.cpp10
-rw-r--r--engines/adl/adl_v3.h3
-rw-r--r--engines/adl/adl_v4.cpp43
-rw-r--r--engines/adl/adl_v4.h23
-rw-r--r--engines/adl/adl_v5.cpp25
-rw-r--r--engines/adl/adl_v5.h15
-rw-r--r--engines/adl/hires5.cpp73
-rw-r--r--engines/adl/hires6.cpp79
12 files changed, 232 insertions, 406 deletions
diff --git a/engines/adl/adl.cpp b/engines/adl/adl.cpp
index f4f306aa8f..17fdd28892 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 143b07471c..b7a2ff583f 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 4089ab3e30..84829a7f29 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 861694a434..564b4dc8f1 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 46af211695..88884b79c2 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 ab56d4e7d2..3bb890875b 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 c06099b98d..dabee63e1a 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 efb58b250b..0c90c02307 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 929ffff7f4..b797e73901 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 473b244993..536f664f31 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 efe69a7e58..cf09cebeb8 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 7f1a285d71..5cbca1caa2 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