From ddf1151a534cf215cc0ffe972163489c319bdc63 Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Fri, 18 Mar 2016 15:40:36 +0100 Subject: ADL: Add new class for second generation ADL --- engines/adl/adl_v2.cpp | 126 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 engines/adl/adl_v2.cpp (limited to 'engines/adl/adl_v2.cpp') diff --git a/engines/adl/adl_v2.cpp b/engines/adl/adl_v2.cpp new file mode 100644 index 0000000000..55ea15dba1 --- /dev/null +++ b/engines/adl/adl_v2.cpp @@ -0,0 +1,126 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "adl/adl_v2.h" + +namespace Adl { + +AdlEngine_v2::AdlEngine_v2(OSystem *syst, const AdlGameDescription *gd) : + AdlEngine(syst, gd) { +} + +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(); + OpcodeUnImpl(); + OpcodeUnImpl(); + Opcode(o2_isItemInRoom); + // 0x04 + OpcodeUnImpl(); + Opcode(o1_isMovesGrEq); + 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(o2_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); +} + +int AdlEngine_v2::o2_isItemInRoom(ScriptEnv &e) { + byte room = e.arg(2); + + if (room == IDI_CUR_ROOM) + room = _state.room; + + if (getItem(e.arg(1)).room != room) + return -1; + + return 2; +} + +int AdlEngine_v2::o2_moveItem(ScriptEnv &e) { + byte room = e.arg(2); + + if (room == IDI_CUR_ROOM) + room = _state.room; + + Item &item = getItem(e.arg(1)); + + // Not implemented: set redraw flag if item room == displayed room + + // Set items that move from inventory to a room to state "dropped" + if (item.room == IDI_NONE && room != IDI_VOID_ROOM) + item.state = IDI_ITEM_MOVED; + + item.room = room; + return 2; +} + +} // End of namespace Adl -- cgit v1.2.3