Skip to content

Commit

Permalink
ADL: Fix item rendering in hires6
Browse files Browse the repository at this point in the history
  • Loading branch information
waltervn committed Jun 6, 2016
1 parent 12fe7da commit d435f5b
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 22 deletions.
2 changes: 0 additions & 2 deletions engines/adl/adl_v2.cpp
Expand Up @@ -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);
}

Expand Down
3 changes: 1 addition & 2 deletions engines/adl/adl_v2.h
Expand Up @@ -54,8 +54,7 @@ class AdlEngine_v2 : public AdlEngine {
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);

Expand Down
29 changes: 28 additions & 1 deletion engines/adl/adl_v3.cpp
Expand Up @@ -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 {
Expand All @@ -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))
Expand Down
11 changes: 11 additions & 0 deletions engines/adl/adl_v3.h
Expand Up @@ -32,6 +32,11 @@ namespace Common{
class RandomSource;
}

struct DiskOffset {
byte track;
byte sector;
};

namespace Adl {

class AdlEngine_v3 : public AdlEngine_v2 {
Expand All @@ -46,6 +51,11 @@ class AdlEngine_v3 : public AdlEngine_v2 {
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);
Expand All @@ -58,6 +68,7 @@ class AdlEngine_v3 : public AdlEngine_v2 {

Common::Array<Common::String> _itemDesc;
byte _curDisk;
Common::Array<DiskOffset> _diskOffsets;
};

} // End of namespace Adl
Expand Down
36 changes: 20 additions & 16 deletions engines/adl/hires6.cpp
Expand Up @@ -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) {
Expand All @@ -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));
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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;
Expand Down
1 change: 0 additions & 1 deletion engines/adl/hires6.h
Expand Up @@ -77,7 +77,6 @@ class HiRes6Engine : public AdlEngine_v3 {

// AdlEngine_v2
void printString(const Common::String &str);
void applyDataBlockOffset(byte &track, byte &sector) const;

void loadDisk(byte disk);

Expand Down

0 comments on commit d435f5b

Please sign in to comment.