From d435f5b4ebd0d2fe0a8d8ac260d69fb67ed7650f Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Sun, 17 Apr 2016 14:07:52 +0200 Subject: ADL: Fix item rendering in hires6 --- engines/adl/adl_v2.cpp | 2 -- engines/adl/adl_v2.h | 3 +-- engines/adl/adl_v3.cpp | 29 ++++++++++++++++++++++++++++- engines/adl/adl_v3.h | 11 +++++++++++ engines/adl/hires6.cpp | 36 ++++++++++++++++++++---------------- engines/adl/hires6.h | 1 - 6 files changed, 60 insertions(+), 22 deletions(-) (limited to 'engines') diff --git a/engines/adl/adl_v2.cpp b/engines/adl/adl_v2.cpp index 6a3cb2529c..4fdf796701 100644 --- a/engines/adl/adl_v2.cpp +++ b/engines/adl/adl_v2.cpp @@ -357,8 +357,6 @@ DataBlockPtr AdlEngine_v2::readDataBlockPtr(Common::ReadStream &f) const { if (track == 0 && sector == 0 && offset == 0 && size == 0) return DataBlockPtr(); - applyDataBlockOffset(track, sector); - return _disk->getDataBlock(track, sector, offset, size); } diff --git a/engines/adl/adl_v2.h b/engines/adl/adl_v2.h index 164af7dcb3..508af91731 100644 --- a/engines/adl/adl_v2.h +++ b/engines/adl/adl_v2.h @@ -54,8 +54,7 @@ protected: virtual void showRoom(); void takeItem(byte noun); - virtual void applyDataBlockOffset(byte &track, byte §or) const { } - DataBlockPtr readDataBlockPtr(Common::ReadStream &f) const; + virtual DataBlockPtr readDataBlockPtr(Common::ReadStream &f) const; void checkTextOverflow(char c); diff --git a/engines/adl/adl_v3.cpp b/engines/adl/adl_v3.cpp index a017f9aeb6..623db661bc 100644 --- a/engines/adl/adl_v3.cpp +++ b/engines/adl/adl_v3.cpp @@ -31,7 +31,7 @@ namespace Adl { AdlEngine_v3::AdlEngine_v3(OSystem *syst, const AdlGameDescription *gd) : AdlEngine_v2(syst, gd), - _curDisk(1) { + _curDisk(0) { } Common::String AdlEngine_v3::loadMessage(uint idx) const { @@ -49,6 +49,33 @@ Common::String AdlEngine_v3::getItemDescription(const Item &item) const { return _itemDesc[item.id - 1]; } +void AdlEngine_v3::applyDiskOffset(byte &track, byte §or) const { + sector += _diskOffsets[_curDisk].sector; + if (sector >= 16) { + sector -= 16; + ++track; + } + + track += _diskOffsets[_curDisk].track; +} + +DataBlockPtr AdlEngine_v3::readDataBlockPtr(Common::ReadStream &f) const { + byte track = f.readByte(); + byte sector = f.readByte(); + byte offset = f.readByte(); + byte size = f.readByte(); + + if (f.eos() || f.err()) + error("Error reading DataBlockPtr"); + + if (track == 0 && sector == 0 && offset == 0 && size == 0) + return DataBlockPtr(); + + applyDiskOffset(track, sector); + + return _disk->getDataBlock(track, sector, offset, size); +} + typedef Common::Functor1Mem OpcodeV3; #define SetOpcodeTable(x) table = &x; #define Opcode(x) table->push_back(new OpcodeV3(this, &AdlEngine_v3::x)) diff --git a/engines/adl/adl_v3.h b/engines/adl/adl_v3.h index b36c97ec67..16f61eaa77 100644 --- a/engines/adl/adl_v3.h +++ b/engines/adl/adl_v3.h @@ -32,6 +32,11 @@ namespace Common{ class RandomSource; } +struct DiskOffset { + byte track; + byte sector; +}; + namespace Adl { class AdlEngine_v3 : public AdlEngine_v2 { @@ -46,6 +51,11 @@ protected: virtual Common::String loadMessage(uint idx) const; Common::String getItemDescription(const Item &item) const; + // AdlEngine_v2 + virtual DataBlockPtr readDataBlockPtr(Common::ReadStream &f) const; + + void applyDiskOffset(byte &track, byte §or) const; + int o3_isVarGT(ScriptEnv &e); int o3_isItemInRoom(ScriptEnv &e); int o3_isNounNotInRoom(ScriptEnv &e); @@ -58,6 +68,7 @@ protected: Common::Array _itemDesc; byte _curDisk; + Common::Array _diskOffsets; }; } // End of namespace Adl diff --git a/engines/adl/hires6.cpp b/engines/adl/hires6.cpp index c3c4138bf0..c44a917a1b 100644 --- a/engines/adl/hires6.cpp +++ b/engines/adl/hires6.cpp @@ -164,6 +164,15 @@ void HiRes6Engine::init() { desc.volume = stream->readByte(); _diskDataDesc.push_back(desc); } + + // DataBlockPtr offsets for each disk + stream.reset(_boot->createReadStream(0x3, 0xf, 0x03)); + for (uint i = 0; i < sizeof(disks); ++i) { + DiskOffset offset; + offset.track = stream->readByte(); + offset.sector = stream->readByte(); + _diskOffsets.push_back(offset); + } } void HiRes6Engine::loadDisk(byte disk) { @@ -173,15 +182,23 @@ void HiRes6Engine::loadDisk(byte disk) { if (!_disk->open(disks[disk])) error("Failed to open disk image '%s'", disks[disk]); + _curDisk = 0; + + // Load item picture data (indexed on boot disk) + StreamPtr stream(_boot->createReadStream(0xb, 0xd, 0x08)); + _itemPics.clear(); + for (uint i = 0; i < IDI_HR6_NUM_ITEM_PICS; ++i) { + stream->readByte(); + _itemPics.push_back(readDataBlockPtr(*stream)); + } + _curDisk = disk; byte track = _diskDataDesc[disk].track; byte sector = _diskDataDesc[disk].sector; uint offset = _diskDataDesc[disk].offset; - applyDataBlockOffset(track, sector); - - StreamPtr stream; + applyDiskOffset(track, sector); for (uint block = 0; block < 7; ++block) { stream.reset(_disk->createReadStream(track, sector, offset, 1)); @@ -261,14 +278,6 @@ void HiRes6Engine::loadDisk(byte disk) { } } } - - // Load item picture data (indexed on boot disk) - stream.reset(_boot->createReadStream(0xb, 0xd, 0x08)); - _itemPics.clear(); - for (uint i = 0; i < IDI_HR6_NUM_ITEM_PICS; ++i) { - stream->readByte(); - _itemPics.push_back(readDataBlockPtr(*stream)); - } } void HiRes6Engine::initGameState() { @@ -354,11 +363,6 @@ void HiRes6Engine::showRoom() { _linesPrinted = 0; } -void HiRes6Engine::applyDataBlockOffset(byte &track, byte §or) const { - // FIXME: this uses a table - ++track; -} - void HiRes6Engine::printString(const Common::String &str) { Common::String s; uint found = 0; diff --git a/engines/adl/hires6.h b/engines/adl/hires6.h index aa3dbf5e77..27aa95675d 100644 --- a/engines/adl/hires6.h +++ b/engines/adl/hires6.h @@ -77,7 +77,6 @@ private: // AdlEngine_v2 void printString(const Common::String &str); - void applyDataBlockOffset(byte &track, byte §or) const; void loadDisk(byte disk); -- cgit v1.2.3