From ca47d3bb2273f5fde754bb51ef500e0eca3a25ed Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Sun, 10 Apr 2016 10:35:10 +0200 Subject: ADL: Decrypt hires6 messages --- engines/adl/adl_v3.cpp | 125 +++++++++++++++++++++++++++++++++++++++++++++++++ engines/adl/adl_v3.h | 53 +++++++++++++++++++++ engines/adl/hires6.h | 6 +-- engines/adl/module.mk | 1 + 4 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 engines/adl/adl_v3.cpp create mode 100644 engines/adl/adl_v3.h diff --git a/engines/adl/adl_v3.cpp b/engines/adl/adl_v3.cpp new file mode 100644 index 0000000000..608c22b871 --- /dev/null +++ b/engines/adl/adl_v3.cpp @@ -0,0 +1,125 @@ +/* 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 "common/random.h" +#include "common/error.h" + +#include "adl/adl_v3.h" +#include "adl/display.h" +#include "adl/graphics.h" + +namespace Adl { + +AdlEngine_v3::AdlEngine_v3(OSystem *syst, const AdlGameDescription *gd) : + AdlEngine_v2(syst, gd) { +} + +Common::String AdlEngine_v3::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); + } + + return str; +} + +typedef Common::Functor1Mem OpcodeV3; +#define SetOpcodeTable(x) table = &x; +#define Opcode(x) table->push_back(new OpcodeV3(this, &AdlEngine_v3::x)) +#define OpcodeUnImpl() table->push_back(new OpcodeV3(this, 0)) + +void AdlEngine_v3::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 + Opcode(o3_isVarGT); + 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 + 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); +} + +int AdlEngine_v3::o3_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; +} + +} // End of namespace Adl diff --git a/engines/adl/adl_v3.h b/engines/adl/adl_v3.h new file mode 100644 index 0000000000..c0b7fad3a5 --- /dev/null +++ b/engines/adl/adl_v3.h @@ -0,0 +1,53 @@ +/* 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. + * + */ + +#ifndef ADL_ADL_V3_H +#define ADL_ADL_V3_H + +#include "adl/adl_v2.h" + +// Note: this version of ADL redraws only when necessary, but +// this is not currently implemented. + +namespace Common{ +class RandomSource; +} + +namespace Adl { + +class AdlEngine_v3 : public AdlEngine_v2 { +public: + virtual ~AdlEngine_v3() { } + +protected: + AdlEngine_v3(OSystem *syst, const AdlGameDescription *gd); + + // AdlEngine + virtual void setupOpcodeTables(); + virtual Common::String loadMessage(uint idx) const; + + int o3_isVarGT(ScriptEnv &e); +}; + +} // End of namespace Adl + +#endif diff --git a/engines/adl/hires6.h b/engines/adl/hires6.h index c4e279dad7..395e85232f 100644 --- a/engines/adl/hires6.h +++ b/engines/adl/hires6.h @@ -25,7 +25,7 @@ #include "common/str.h" -#include "adl/adl_v2.h" +#include "adl/adl_v3.h" #include "adl/disk.h" namespace Common { @@ -48,9 +48,9 @@ namespace Adl { #define IDI_HR6_MSG_ITEM_NOT_HERE 254 #define IDI_HR6_MSG_THANKS_FOR_PLAYING 252 -class HiRes6Engine : public AdlEngine_v2 { +class HiRes6Engine : public AdlEngine_v3 { public: - HiRes6Engine(OSystem *syst, const AdlGameDescription *gd) : AdlEngine_v2(syst, gd) { } + HiRes6Engine(OSystem *syst, const AdlGameDescription *gd) : AdlEngine_v3(syst, gd) { } private: // AdlEngine diff --git a/engines/adl/module.mk b/engines/adl/module.mk index c726a6b28a..7ab37efc67 100644 --- a/engines/adl/module.mk +++ b/engines/adl/module.mk @@ -3,6 +3,7 @@ MODULE := engines/adl MODULE_OBJS := \ adl.o \ adl_v2.o \ + adl_v3.o \ console.o \ detection.o \ disk.o \ -- cgit v1.2.3