From fa7688a93199f25e84d7c39ca232a4f20a629274 Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Tue, 26 Mar 2019 23:41:23 +0100 Subject: ADL: Refactor opcodes --- engines/adl/adl.cpp | 158 ++++++++++++++++++++----------------------------- engines/adl/adl.h | 75 +++++++++++++---------- engines/adl/adl_v2.cpp | 106 ++++++++------------------------- engines/adl/adl_v2.h | 28 ++++----- engines/adl/adl_v3.cpp | 10 +--- engines/adl/adl_v3.h | 3 +- engines/adl/adl_v4.cpp | 43 +++++++++----- engines/adl/adl_v4.h | 23 +++---- engines/adl/adl_v5.cpp | 25 +++++--- engines/adl/adl_v5.h | 15 +++-- engines/adl/hires5.cpp | 73 ++--------------------- engines/adl/hires6.cpp | 79 +++---------------------- 12 files changed, 232 insertions(+), 406 deletions(-) (limited to 'engines') 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 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 *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); - Opcode(o1_goDirection); - Opcode(o1_goDirection); - // 0x18 - Opcode(o1_goDirection); - Opcode(o1_goDirection); - Opcode(o1_goDirection); - 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::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 -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 - int o1_goDirection(ScriptEnv &e); - int o1_takeItem(ScriptEnv &e); - int o1_dropItem(ScriptEnv &e); - int o1_setRoomPic(ScriptEnv &e); + typedef Common::SharedPtr > Opcode; + + template + Opcode opcode(int (T::*f)(ScriptEnv &)) { + return Opcode(new Common::Functor1Mem(static_cast(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 Opcode; - Common::Array _condOpcodes, _actOpcodes; + Common::Array _condOpcodes, _actOpcodes; // Message strings in data file Common::Array _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 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 *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); - Opcode(o1_goDirection); - Opcode(o1_goDirection); - // 0x18 - Opcode(o1_goDirection); - Opcode(o1_goDirection); - Opcode(o1_goDirection); - 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::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::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 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::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 _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 _regionLocations; Common::Array _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::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 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 *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); - Opcode(o1_goDirection); - Opcode(o1_goDirection); - // 0x18 - Opcode(o1_goDirection); - Opcode(o1_goDirection); - Opcode(o1_goDirection); - 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 - 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 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 *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); - Opcode(o_goDirection); - Opcode(o_goDirection); - // 0x18 - Opcode(o_goDirection); - Opcode(o_goDirection); - Opcode(o_goDirection); - 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 -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 -- cgit v1.2.3