diff options
Diffstat (limited to 'engines/adl/adl_v5.cpp')
-rw-r--r-- | engines/adl/adl_v5.cpp | 117 |
1 files changed, 26 insertions, 91 deletions
diff --git a/engines/adl/adl_v5.cpp b/engines/adl/adl_v5.cpp index 7e7c6e40ac..795899c070 100644 --- a/engines/adl/adl_v5.cpp +++ b/engines/adl/adl_v5.cpp @@ -30,43 +30,24 @@ namespace Adl { AdlEngine_v5::AdlEngine_v5(OSystem *syst, const AdlGameDescription *gd) : - AdlEngine_v3(syst, gd), - _curDisk(0) { + AdlEngine_v4(syst, gd) { } -Common::String AdlEngine_v5::loadMessage(uint idx) const { - Common::String str = AdlEngine_v2::loadMessage(idx); - - for (uint i = 0; i < str.size(); ++i) { - const char *xorStr = "AVISDURGAN"; - str.setChar(str[i] ^ xorStr[i % strlen(xorStr)], i); +AdlEngine_v5::RegionChunkType AdlEngine_v5::getRegionChunkType(const uint16 addr) const { + switch (addr) { + case 0x7b00: + return kRegionChunkGlobalCmds; + case 0x9500: + return kRegionChunkRoomCmds; + default: + return AdlEngine_v4::getRegionChunkType(addr); } - - return str; -} - -Common::String AdlEngine_v5::getItemDescription(const Item &item) const { - return _itemDesc[item.id - 1]; } -void AdlEngine_v5::applyDiskOffset(byte &track, byte §or) const { - sector += _diskOffsets[_curDisk].sector; - if (sector >= 16) { - sector -= 16; - ++track; - } - - track += _diskOffsets[_curDisk].track; -} - -void AdlEngine_v5::adjustDataBlockPtr(byte &track, byte §or, byte &offset, byte &size) const { - applyDiskOffset(track, sector); -} - -typedef Common::Functor1Mem<ScriptEnv &, int, AdlEngine_v5> OpcodeV4; +typedef Common::Functor1Mem<ScriptEnv &, int, AdlEngine_v5> OpcodeV5; #define SetOpcodeTable(x) table = &x; -#define Opcode(x) table->push_back(new OpcodeV4(this, &AdlEngine_v5::x)) -#define OpcodeUnImpl() table->push_back(new OpcodeV4(this, 0)) +#define Opcode(x) table->push_back(new OpcodeV5(this, &AdlEngine_v5::x)) +#define OpcodeUnImpl() table->push_back(new OpcodeV5(this, 0)) void AdlEngine_v5::setupOpcodeTables() { Common::Array<const Opcode *> *table = 0; @@ -76,14 +57,14 @@ void AdlEngine_v5::setupOpcodeTables() { OpcodeUnImpl(); Opcode(o2_isFirstTime); Opcode(o2_isRandomGT); - Opcode(o5_isItemInRoom); + Opcode(o4_isItemInRoom); // 0x04 Opcode(o5_isNounNotInRoom); Opcode(o1_isMovesGT); Opcode(o1_isVarEQ); Opcode(o2_isCarryingSomething); // 0x08 - Opcode(o5_isVarGT); + Opcode(o4_isVarGT); Opcode(o1_isCurPicEQ); Opcode(o5_skipOneCommand); @@ -95,7 +76,7 @@ void AdlEngine_v5::setupOpcodeTables() { Opcode(o1_varSet); // 0x04 Opcode(o1_listInv); - Opcode(o5_moveItem); + Opcode(o4_moveItem); Opcode(o1_setRoom); Opcode(o2_setCurPic); // 0x08 @@ -111,7 +92,7 @@ void AdlEngine_v5::setupOpcodeTables() { // 0x10 Opcode(o2_restore); Opcode(o1_restart); - Opcode(o5_setDisk); + Opcode(o5_setRegionRoom); Opcode(o5_dummy); // 0x14 Opcode(o1_resetPic); @@ -126,45 +107,12 @@ void AdlEngine_v5::setupOpcodeTables() { // 0x1c Opcode(o1_dropItem); Opcode(o1_setRoomPic); - Opcode(o5_sound); + Opcode(o_winGame); OpcodeUnImpl(); // 0x20 Opcode(o2_initDisk); } -int AdlEngine_v5::o5_isVarGT(ScriptEnv &e) { - OP_DEBUG_2("\t&& VARS[%d] > %d", e.arg(1), e.arg(2)); - - if (getVar(e.arg(1)) > e.arg(2)) - return 2; - - return -1; -} - -int AdlEngine_v5::o5_skipOneCommand(ScriptEnv &e) { - OP_DEBUG_0("\t&& SKIP_ONE_COMMAND()"); - - _skipOneCommand = true; - setVar(2, 0); - - return -1; -} - -// FIXME: Rename "isLineArt" and look at code duplication -int AdlEngine_v5::o5_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)); - - if (e.arg(2) != IDI_ANY && item.isLineArt != _curDisk) - return -1; - - if (item.room == roomArg(e.arg(2))) - return 2; - - return -1; -} - int AdlEngine_v5::o5_isNounNotInRoom(ScriptEnv &e) { OP_DEBUG_1("\t&& NO_SUCH_ITEMS_IN_ROOM(%s)", itemRoomStr(e.arg(1)).c_str()); @@ -183,23 +131,13 @@ int AdlEngine_v5::o5_isNounNotInRoom(ScriptEnv &e) { return 1; } -int AdlEngine_v5::o5_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)); - - Item &item = getItem(e.arg(1)); - - if (item.room == _roomOnScreen) - _picOnScreen = 0; +int AdlEngine_v5::o5_skipOneCommand(ScriptEnv &e) { + OP_DEBUG_0("\t&& SKIP_ONE_COMMAND()"); - // Set items that move from inventory to a room to state "dropped" - if (item.room == IDI_ANY && room != IDI_VOID_ROOM) - item.state = IDI_ITEM_DROPPED; + _skipOneCommand = true; + setVar(2, 0); - item.room = room; - item.isLineArt = _curDisk; - return 2; + return -1; } int AdlEngine_v5::o5_dummy(ScriptEnv &e) { @@ -225,18 +163,15 @@ int AdlEngine_v5::o5_setTextMode(ScriptEnv &e) { return 1; } -int AdlEngine_v5::o5_setDisk(ScriptEnv &e) { - OP_DEBUG_2("\tSET_DISK(%d, %d)", e.arg(1), e.arg(2)); +int AdlEngine_v5::o5_setRegionRoom(ScriptEnv &e) { + OP_DEBUG_2("\tSET_REGION_ROOM(%d, %d)", e.arg(1), e.arg(2)); // TODO - // Arg 1: disk - // Arg 2: room - return 2; } -int AdlEngine_v5::o5_sound(ScriptEnv &e) { - OP_DEBUG_0("\tSOUND()"); +int AdlEngine_v5::o_winGame(ScriptEnv &e) { + OP_DEBUG_0("\tWIN_GAME()"); // TODO |