aboutsummaryrefslogtreecommitdiff
path: root/engines/adl/adl_v4.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/adl/adl_v4.cpp')
-rw-r--r--engines/adl/adl_v4.cpp84
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 &sector, 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() {