aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorWalter van Niftrik2016-04-17 14:07:52 +0200
committerWalter van Niftrik2016-06-06 20:35:49 +0200
commitd435f5b4ebd0d2fe0a8d8ac260d69fb67ed7650f (patch)
treec0c8187d55951806ee0712f2ce7f8fff2e295133 /engines
parent12fe7dabab6d8256f5c50e77c84c33cb769a907b (diff)
downloadscummvm-rg350-d435f5b4ebd0d2fe0a8d8ac260d69fb67ed7650f.tar.gz
scummvm-rg350-d435f5b4ebd0d2fe0a8d8ac260d69fb67ed7650f.tar.bz2
scummvm-rg350-d435f5b4ebd0d2fe0a8d8ac260d69fb67ed7650f.zip
ADL: Fix item rendering in hires6
Diffstat (limited to 'engines')
-rw-r--r--engines/adl/adl_v2.cpp2
-rw-r--r--engines/adl/adl_v2.h3
-rw-r--r--engines/adl/adl_v3.cpp29
-rw-r--r--engines/adl/adl_v3.h11
-rw-r--r--engines/adl/hires6.cpp36
-rw-r--r--engines/adl/hires6.h1
6 files changed, 60 insertions, 22 deletions
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 &sector) 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 &sector) 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<ScriptEnv &, int, AdlEngine_v3> 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 &sector) const;
+
int o3_isVarGT(ScriptEnv &e);
int o3_isItemInRoom(ScriptEnv &e);
int o3_isNounNotInRoom(ScriptEnv &e);
@@ -58,6 +68,7 @@ protected:
Common::Array<Common::String> _itemDesc;
byte _curDisk;
+ Common::Array<DiskOffset> _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 &sector) 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 &sector) const;
void loadDisk(byte disk);