diff options
Diffstat (limited to 'engines/adl/adl_v4.cpp')
-rw-r--r-- | engines/adl/adl_v4.cpp | 84 |
1 files changed, 55 insertions, 29 deletions
diff --git a/engines/adl/adl_v4.cpp b/engines/adl/adl_v4.cpp index dcf0f997c9..e8ee798199 100644 --- a/engines/adl/adl_v4.cpp +++ b/engines/adl/adl_v4.cpp @@ -127,7 +127,7 @@ void AdlEngine_v4::loadState(Common::ReadStream &stream) { if (size != expectedSize) error("Variable count mismatch (expected %i; found %i)", expectedSize, size); - for (uint i = getRegion(1).vars.size(); i < size; ++i) + for (uint i = getRegion(1).vars.size(); i < _state.vars.size(); ++i) _state.vars[i] = stream.readByte(); if (stream.err() || stream.eos()) @@ -139,6 +139,7 @@ void AdlEngine_v4::loadState(Common::ReadStream &stream) { } void AdlEngine_v4::saveState(Common::WriteStream &stream) { + getCurRoom().isFirstTime = false; backupVars(); backupRoomState(_state.room); @@ -189,24 +190,23 @@ Common::String AdlEngine_v4::getItemDescription(const Item &item) const { return _itemDesc[item.id - 1]; } -DiskImage *AdlEngine_v4::loadDisk(byte volume) const { +Common::String AdlEngine_v4::getDiskImageName(byte volume) const { const ADGameFileDescription *ag; - for (ag = _gameDescription->desc.filesDescriptions; ag->fileName; ag++) { - if (ag->fileType == volume) { - DiskImage *disk = new DiskImage(); - if (!disk->open(ag->fileName)) - error("Failed to open %s", ag->fileName); - return disk; - } - } + for (ag = _gameDescription->desc.filesDescriptions; ag->fileName; ag++) + if (ag->fileType == volume) + return ag->fileName; error("Disk volume %d not found", volume); } void AdlEngine_v4::insertDisk(byte volume) { delete _disk; - _disk = loadDisk(volume); + _disk = new DiskImage(); + + if (!_disk->open(getDiskImageName(volume))) + error("Failed to open disk volume %d", volume); + _currentVolume = volume; } @@ -238,6 +238,11 @@ void AdlEngine_v4::loadRegionInitDataOffsets(Common::ReadStream &stream, uint re } } +void AdlEngine_v4::initRoomState(RoomState &roomState) const { + roomState.picture = 1; + roomState.isFirstTime = 1; +} + void AdlEngine_v4::initRegions(const byte *roomsPerRegion, uint regions) { _state.regions.resize(regions); @@ -247,12 +252,8 @@ void AdlEngine_v4::initRegions(const byte *roomsPerRegion, uint regions) { regn.vars.resize(24); regn.rooms.resize(roomsPerRegion[r]); - for (uint rm = 0; rm < roomsPerRegion[r]; ++rm) { - // TODO: hires6 uses 0xff and has slightly different - // code working on these values - regn.rooms[rm].picture = 1; - regn.rooms[rm].isFirstTime = 1; - } + for (uint rm = 0; rm < roomsPerRegion[r]; ++rm) + initRoomState(regn.rooms[rm]); } } @@ -273,6 +274,27 @@ void AdlEngine_v4::adjustDataBlockPtr(byte &track, byte §or, byte &offset, b fixupDiskOffset(track, sector); } +AdlEngine_v4::RegionChunkType AdlEngine_v4::getRegionChunkType(const uint16 addr) const { + switch (addr) { + case 0x9000: + return kRegionChunkMessages; + case 0x4a80: + return kRegionChunkGlobalPics; + case 0x4000: + return kRegionChunkVerbs; + case 0x1800: + return kRegionChunkNouns; + case 0x0e00: + return kRegionChunkRooms; + case 0x7b00: + return kRegionChunkRoomCmds; + case 0x9500: + return kRegionChunkGlobalCmds; + default: + return kRegionChunkUnknown; + } +} + void AdlEngine_v4::loadRegion(byte region) { if (_currentVolume != _regionInitDataOffsets[region - 1].volume) { insertDisk(_regionInitDataOffsets[region - 1].volume); @@ -302,29 +324,29 @@ void AdlEngine_v4::loadRegion(byte region) { stream.reset(_disk->createReadStream(track, sector, offset, size / 256 + 1)); stream->skip(4); - switch (addr) { - case 0x9000: { + switch (getRegionChunkType(addr)) { + case kRegionChunkMessages: { // Messages _messages.clear(); uint count = size / 4; loadMessages(*stream, count); break; } - case 0x4a80: { + case kRegionChunkGlobalPics: { // Global pics _pictures.clear(); loadPictures(*stream); break; } - case 0x4000: + case kRegionChunkVerbs: // Verbs loadWords(*stream, _verbs, _priVerbs); break; - case 0x1800: + case kRegionChunkNouns: // Nouns loadWords(*stream, _nouns, _priNouns); break; - case 0x0e00: { + case kRegionChunkRooms: { // Rooms uint count = size / 14 - 1; stream->skip(14); // Skip invalid room 0 @@ -333,12 +355,11 @@ void AdlEngine_v4::loadRegion(byte region) { loadRooms(*stream, count); break; } - case 0x7b00: - // TODO: hires6 has global and room lists swapped + case kRegionChunkRoomCmds: // Room commands readCommands(*stream, _roomCommands); break; - case 0x9500: + case kRegionChunkGlobalCmds: // Global commands readCommands(*stream, _globalCommands); break; @@ -375,11 +396,16 @@ void AdlEngine_v4::backupRoomState(byte room) { backup.picture = getRoom(room).picture; } -void AdlEngine_v4::restoreRoomState(byte room) { +byte AdlEngine_v4::restoreRoomState(byte room) { const RoomState &backup = getCurRegion().rooms[room - 1]; - getRoom(room).isFirstTime = backup.isFirstTime; - getRoom(room).picture = backup.picture; + if (backup.isFirstTime != 1) { + getRoom(room).curPicture = getRoom(room).picture = backup.picture; + getRoom(room).isFirstTime = false; + return 0; + } + + return 1; } void AdlEngine_v4::backupVars() { |