From 70092f7f25085ab512002694894ae5cdf1d5ed1c Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Mon, 26 Jun 2017 11:36:45 +0200 Subject: ADL: Merge hires2 and hires0 classes --- engines/adl/hires0.cpp | 143 ------------------------------------------------- engines/adl/hires2.cpp | 120 +++++++++++++++++++++++------------------ engines/adl/module.mk | 1 - 3 files changed, 68 insertions(+), 196 deletions(-) delete mode 100644 engines/adl/hires0.cpp diff --git a/engines/adl/hires0.cpp b/engines/adl/hires0.cpp deleted file mode 100644 index 0165170699..0000000000 --- a/engines/adl/hires0.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* 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/textconsole.h" - -#include "adl/adl_v2.h" -#include "adl/graphics.h" -#include "adl/disk.h" - -namespace Adl { - -#define IDS_HR0_DISK_IMAGE "MISSION.NIB" - -#define IDI_HR0_NUM_ROOMS 43 -#define IDI_HR0_NUM_MESSAGES 142 -#define IDI_HR0_NUM_VARS 40 -#define IDI_HR0_NUM_ITEM_PICS 2 -#define IDI_HR0_NUM_ITEM_OFFSETS 16 - -// Messages used outside of scripts -#define IDI_HR0_MSG_CANT_GO_THERE 110 -#define IDI_HR0_MSG_DONT_UNDERSTAND 112 -#define IDI_HR0_MSG_ITEM_DOESNT_MOVE 114 -#define IDI_HR0_MSG_ITEM_NOT_HERE 115 -#define IDI_HR0_MSG_THANKS_FOR_PLAYING 113 - -class HiRes0Engine : public AdlEngine_v2 { -public: - HiRes0Engine(OSystem *syst, const AdlGameDescription *gd) : - AdlEngine_v2(syst, gd) { } - ~HiRes0Engine() { } - -private: - // AdlEngine - void init(); - void initGameState(); -}; - -void HiRes0Engine::init() { - _graphics = new GraphicsMan_v2(*_display); - - _disk = new DiskImage(); - if (!_disk->open(IDS_HR0_DISK_IMAGE)) - error("Failed to open disk image '" IDS_HR0_DISK_IMAGE "'"); - - _disk->setSectorLimit(13); - - // TODO: all these strings/offsets/etc are the same as hires2 - - StreamPtr stream(_disk->createReadStream(0x1f, 0x2, 0x00, 2)); - loadMessages(*stream, IDI_HR0_NUM_MESSAGES); - - // Read parser messages - stream.reset(_disk->createReadStream(0x1a, 0x1)); - _strings.verbError = readStringAt(*stream, 0x4f); - _strings.nounError = readStringAt(*stream, 0x8e); - _strings.enterCommand = readStringAt(*stream, 0xbc); - - // Read time string - stream.reset(_disk->createReadStream(0x19, 0x7, 0xd7)); - _strings_v2.time = readString(*stream, 0xff); - - // Read line feeds - stream.reset(_disk->createReadStream(0x19, 0xb, 0xf8, 1)); - _strings.lineFeeds = readString(*stream); - - // Read opcode strings - stream.reset(_disk->createReadStream(0x1a, 0x6, 0x00, 2)); - _strings_v2.saveInsert = readStringAt(*stream, 0x5f); - _strings_v2.saveReplace = readStringAt(*stream, 0xe5); - _strings_v2.restoreInsert = readStringAt(*stream, 0x132); - _strings_v2.restoreReplace = readStringAt(*stream, 0x1c2); - _strings.playAgain = readStringAt(*stream, 0x225); - _strings.pressReturn = readStringAt(*stream, 0x25f); - - _messageIds.cantGoThere = IDI_HR0_MSG_CANT_GO_THERE; - _messageIds.dontUnderstand = IDI_HR0_MSG_DONT_UNDERSTAND; - _messageIds.itemDoesntMove = IDI_HR0_MSG_ITEM_DOESNT_MOVE; - _messageIds.itemNotHere = IDI_HR0_MSG_ITEM_NOT_HERE; - _messageIds.thanksForPlaying = IDI_HR0_MSG_THANKS_FOR_PLAYING; - - // Load global picture data - stream.reset(_disk->createReadStream(0x19, 0xa, 0x80, 0)); - loadPictures(*stream); - - // Load item picture data - stream.reset(_disk->createReadStream(0x1e, 0x9, 0x05)); - loadItemPictures(*stream, IDI_HR0_NUM_ITEM_PICS); - - // Load commands from executable - stream.reset(_disk->createReadStream(0x1d, 0x7, 0x00, 2)); - readCommands(*stream, _roomCommands); - - stream.reset(_disk->createReadStream(0x1f, 0x7, 0x00, 3)); - readCommands(*stream, _globalCommands); - - // Load dropped item offsets - stream.reset(_disk->createReadStream(0x1b, 0x4, 0x15)); - loadDroppedItemOffsets(*stream, IDI_HR0_NUM_ITEM_OFFSETS); - - // Load verbs - stream.reset(_disk->createReadStream(0x19, 0x0, 0x00, 3)); - loadWords(*stream, _verbs, _priVerbs); - - // Load nouns - stream.reset(_disk->createReadStream(0x22, 0x2, 0x00, 2)); - loadWords(*stream, _nouns, _priNouns); -} - -void HiRes0Engine::initGameState() { - _state.vars.resize(IDI_HR0_NUM_VARS); - - StreamPtr stream(_disk->createReadStream(0x21, 0x5, 0x0e, 2)); - loadRooms(*stream, IDI_HR0_NUM_ROOMS); - - stream.reset(_disk->createReadStream(0x21, 0x0)); - loadItems(*stream); -} - -Engine *HiRes0Engine_create(OSystem *syst, const AdlGameDescription *gd) { - return new HiRes0Engine(syst, gd); -} - -} // End of namespace Adl diff --git a/engines/adl/hires2.cpp b/engines/adl/hires2.cpp index ac1ee57fac..9f76b0f49f 100644 --- a/engines/adl/hires2.cpp +++ b/engines/adl/hires2.cpp @@ -33,63 +33,42 @@ namespace Adl { -#define IDS_HR2_DISK_IMAGE "WIZARD.DSK" - -#define IDI_HR2_NUM_ROOMS 135 -#define IDI_HR2_NUM_MESSAGES 255 -#define IDI_HR2_NUM_VARS 40 -#define IDI_HR2_NUM_ITEM_PICS 38 -#define IDI_HR2_NUM_ITEM_OFFSETS 16 - -// Messages used outside of scripts -#define IDI_HR2_MSG_CANT_GO_THERE 123 -#define IDI_HR2_MSG_DONT_UNDERSTAND 19 -#define IDI_HR2_MSG_ITEM_DOESNT_MOVE 242 -#define IDI_HR2_MSG_ITEM_NOT_HERE 4 -#define IDI_HR2_MSG_THANKS_FOR_PLAYING 239 - -class HiRes2Engine : public AdlEngine_v2 { +class HiResBaseEngine : public AdlEngine_v2 { public: - HiRes2Engine(OSystem *syst, const AdlGameDescription *gd) : AdlEngine_v2(syst, gd) { } + HiResBaseEngine(OSystem *syst, const AdlGameDescription *gd, const byte numRooms, const byte numMsgs, const byte numItemPics); private: // AdlEngine - void runIntro(); void init(); void initGameState(); -}; - -void HiRes2Engine::runIntro() { - // This only works for the 16-sector re-release. The original - // release is not supported at this time, because we don't have - // access to it. - _disk->setSectorLimit(0); - StreamPtr stream(_disk->createReadStream(0x00, 0xd, 0x17, 1)); - - _display->setMode(DISPLAY_MODE_TEXT); - Common::String str = readString(*stream); - - if (stream->eos() || stream->err()) - error("Error reading disk image"); - - _display->printString(str); - delay(2000); + const byte _numRooms, _numMsgs, _numItemPics; +}; - _disk->setSectorLimit(13); +HiResBaseEngine::HiResBaseEngine(OSystem *syst, const AdlGameDescription *gd, const byte numRooms, const byte numMsgs, const byte numItemPics) : + AdlEngine_v2(syst, gd), + _numRooms(numRooms), + _numMsgs(numMsgs), + _numItemPics(numItemPics) { + + _messageIds.cantGoThere = 110; + _messageIds.dontUnderstand = 112; + _messageIds.itemDoesntMove = 114; + _messageIds.itemNotHere = 115; + _messageIds.thanksForPlaying = 113; } -void HiRes2Engine::init() { +void HiResBaseEngine::init() { _graphics = new GraphicsMan_v2(*_display); _disk = new DiskImage(); - if (!_disk->open(IDS_HR2_DISK_IMAGE)) - error("Failed to open disk image '" IDS_HR2_DISK_IMAGE "'"); + if (!_disk->open(getDiskImageName(0))) + error("Failed to open disk image '%s'", getDiskImageName(0).c_str()); _disk->setSectorLimit(13); StreamPtr stream(_disk->createReadStream(0x1f, 0x2, 0x00, 4)); - loadMessages(*stream, IDI_HR2_NUM_MESSAGES); + loadMessages(*stream, _numMsgs); // Read parser messages stream.reset(_disk->createReadStream(0x1a, 0x1)); @@ -114,30 +93,24 @@ void HiRes2Engine::init() { _strings.playAgain = readStringAt(*stream, 0x225); _strings.pressReturn = readStringAt(*stream, 0x25f); - _messageIds.cantGoThere = IDI_HR2_MSG_CANT_GO_THERE; - _messageIds.dontUnderstand = IDI_HR2_MSG_DONT_UNDERSTAND; - _messageIds.itemDoesntMove = IDI_HR2_MSG_ITEM_DOESNT_MOVE; - _messageIds.itemNotHere = IDI_HR2_MSG_ITEM_NOT_HERE; - _messageIds.thanksForPlaying = IDI_HR2_MSG_THANKS_FOR_PLAYING; - // Load global picture data stream.reset(_disk->createReadStream(0x19, 0xa, 0x80, 0)); loadPictures(*stream); // Load item picture data stream.reset(_disk->createReadStream(0x1e, 0x9, 0x05)); - loadItemPictures(*stream, IDI_HR2_NUM_ITEM_PICS); + loadItemPictures(*stream, _numItemPics); // Load commands from executable stream.reset(_disk->createReadStream(0x1d, 0x7, 0x00, 4)); readCommands(*stream, _roomCommands); - stream.reset(_disk->createReadStream(0x1f, 0x7, 0x00, 2)); + stream.reset(_disk->createReadStream(0x1f, 0x7, 0x00, 3)); readCommands(*stream, _globalCommands); // Load dropped item offsets stream.reset(_disk->createReadStream(0x1b, 0x4, 0x15)); - loadDroppedItemOffsets(*stream, IDI_HR2_NUM_ITEM_OFFSETS); + loadDroppedItemOffsets(*stream, 16); // Load verbs stream.reset(_disk->createReadStream(0x19, 0x0, 0x00, 3)); @@ -148,18 +121,61 @@ void HiRes2Engine::init() { loadWords(*stream, _nouns, _priNouns); } -void HiRes2Engine::initGameState() { - _state.vars.resize(IDI_HR2_NUM_VARS); +void HiResBaseEngine::initGameState() { + _state.vars.resize(40); StreamPtr stream(_disk->createReadStream(0x21, 0x5, 0x0e, 7)); - loadRooms(*stream, IDI_HR2_NUM_ROOMS); + loadRooms(*stream, _numRooms); stream.reset(_disk->createReadStream(0x21, 0x0, 0x00, 2)); loadItems(*stream); } +class HiRes2Engine : public HiResBaseEngine { +public: + HiRes2Engine(OSystem *syst, const AdlGameDescription *gd); + +private: + // AdlEngine + void runIntro(); +}; + +HiRes2Engine::HiRes2Engine(OSystem *syst, const AdlGameDescription *gd) : + HiResBaseEngine(syst, gd, 135, 255, 38) { + + _messageIds.cantGoThere = 123; + _messageIds.dontUnderstand = 19; + _messageIds.itemDoesntMove = 242; + _messageIds.itemNotHere = 4; + _messageIds.thanksForPlaying = 239; +} + +void HiRes2Engine::runIntro() { + // This only works for the 16-sector re-release. The original + // release is not supported at this time, because we don't have + // access to it. + _disk->setSectorLimit(0); + StreamPtr stream(_disk->createReadStream(0x00, 0xd, 0x17, 1)); + + _display->setMode(DISPLAY_MODE_TEXT); + + Common::String str = readString(*stream); + + if (stream->eos() || stream->err()) + error("Error reading disk image"); + + _display->printString(str); + delay(2000); + + _disk->setSectorLimit(13); +} + Engine *HiRes2Engine_create(OSystem *syst, const AdlGameDescription *gd) { return new HiRes2Engine(syst, gd); } +Engine *HiRes0Engine_create(OSystem *syst, const AdlGameDescription *gd) { + return new HiResBaseEngine(syst, gd, 43, 142, 2); +} + } // End of namespace Adl diff --git a/engines/adl/module.mk b/engines/adl/module.mk index 10d5060d99..30c64b5ade 100644 --- a/engines/adl/module.mk +++ b/engines/adl/module.mk @@ -11,7 +11,6 @@ MODULE_OBJS := \ disk.o \ display.o \ graphics.o \ - hires0.o \ hires1.o \ hires2.o \ hires4.o \ -- cgit v1.2.3