diff options
-rw-r--r-- | engines/adl/adl_v4.cpp | 13 | ||||
-rw-r--r-- | engines/adl/adl_v4.h | 3 | ||||
-rw-r--r-- | engines/adl/adl_v5.cpp | 24 | ||||
-rw-r--r-- | engines/adl/adl_v5.h | 2 |
4 files changed, 33 insertions, 9 deletions
diff --git a/engines/adl/adl_v4.cpp b/engines/adl/adl_v4.cpp index a5d2de264d..494ff52ce4 100644 --- a/engines/adl/adl_v4.cpp +++ b/engines/adl/adl_v4.cpp @@ -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]); } } diff --git a/engines/adl/adl_v4.h b/engines/adl/adl_v4.h index 08cea21181..cca1c6fa98 100644 --- a/engines/adl/adl_v4.h +++ b/engines/adl/adl_v4.h @@ -81,7 +81,8 @@ protected: void loadRegion(byte region); void loadItemPicIndex(Common::ReadStream &stream, uint items); void backupRoomState(byte room); - void restoreRoomState(byte room); + virtual void initRoomState(RoomState &roomState) const; + virtual void restoreRoomState(byte room); void backupVars(); void restoreVars(); diff --git a/engines/adl/adl_v5.cpp b/engines/adl/adl_v5.cpp index 011ef88848..31d0033dea 100644 --- a/engines/adl/adl_v5.cpp +++ b/engines/adl/adl_v5.cpp @@ -33,6 +33,22 @@ AdlEngine_v5::AdlEngine_v5(OSystem *syst, const AdlGameDescription *gd) : AdlEngine_v4(syst, gd) { } +void AdlEngine_v5::initRoomState(RoomState &roomState) const { + roomState.picture = 0xff; + roomState.isFirstTime = 0xff; +} + +void AdlEngine_v5::restoreRoomState(byte room) { + const RoomState &backup = getCurRegion().rooms[room - 1]; + + if (backup.isFirstTime != 0xff) { + getRoom(room).curPicture = getRoom(room).picture = backup.picture; + + if (backup.isFirstTime != 1) + getRoom(room).isFirstTime = false; + } +} + AdlEngine_v5::RegionChunkType AdlEngine_v5::getRegionChunkType(const uint16 addr) const { switch (addr) { case 0x7b00: @@ -181,8 +197,12 @@ int AdlEngine_v5::o5_setTextMode(ScriptEnv &e) { int AdlEngine_v5::o5_setRegionRoom(ScriptEnv &e) { OP_DEBUG_2("\tSET_REGION_ROOM(%d, %d)", e.arg(1), e.arg(2)); - // TODO - return 2; + getCurRoom().curPicture = getCurRoom().picture; + getCurRoom().isFirstTime = false; + switchRegion(e.arg(1)); + _state.room = e.arg(2); + restoreRoomState(_state.room); + return -1; } int AdlEngine_v5::o_winGame(ScriptEnv &e) { diff --git a/engines/adl/adl_v5.h b/engines/adl/adl_v5.h index 7836ec6b04..0c5837f26c 100644 --- a/engines/adl/adl_v5.h +++ b/engines/adl/adl_v5.h @@ -39,6 +39,8 @@ protected: // AdlEngine_v4 virtual RegionChunkType getRegionChunkType(const uint16 addr) const; + virtual void initRoomState(RoomState &roomState) const; + virtual void restoreRoomState(byte room); int o5_isNounNotInRoom(ScriptEnv &e); int o5_abortScript(ScriptEnv &e); |