From 0a6b7fb6a6414caa4d8654a75e07b6a33ef6cce3 Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Tue, 15 Mar 2016 23:18:43 +0100 Subject: ADL: Add loading of room picture index for hires2 --- engines/adl/hires2.cpp | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) (limited to 'engines/adl/hires2.cpp') diff --git a/engines/adl/hires2.cpp b/engines/adl/hires2.cpp index f44dfc4a2b..226a8e33da 100644 --- a/engines/adl/hires2.cpp +++ b/engines/adl/hires2.cpp @@ -110,17 +110,31 @@ void HiRes2Engine::initState() { f.readByte(); // always 1, possibly disk? _state.rooms.push_back(room); } - - loadRoom(_state.room); } -void HiRes2Engine::loadRoom(uint i) { +void HiRes2Engine::loadRoom(byte roomNr) { Common::File f; openFile(f, IDS_HR2_DISK_IMAGE); - Room &room = getRoom(i); + Room &room = getRoom(roomNr); uint offset = TSO(room.track, room.sector, room.offset); f.seek(offset); - _roomData.description = readStringAt(f, offset + f.readByte(), 0xff); + uint16 descOffset = f.readUint16LE(); + /* uint16 commandOffset =*/ f.readUint16LE(); + + // There's no picture count. The original engine always checks at most + // five pictures. We use the description offset to bound our search. + uint16 picCount = (descOffset - 4) / 5; + + for (uint i = 0; i < picCount; ++i) { + Picture2 pic; + pic.nr = f.readByte(); + pic.track = f.readByte(); + pic.sector = f.readByte(); + pic.offset = f.readByte(); + f.readByte(); + _roomData.pictures.push_back(pic); + } + _roomData.description = readStringAt(f, offset + descOffset, 0xff); } void HiRes2Engine::restartGame() { @@ -128,18 +142,24 @@ void HiRes2Engine::restartGame() { } void HiRes2Engine::drawPic(byte pic, Common::Point pos) const { - // Temp hack to show a pic - - Common::File f; - openFile(f, IDS_HR2_DISK_IMAGE); - f.seek(0x1000); + Common::Array::const_iterator roomPic; + + for (roomPic = _roomData.pictures.begin(); roomPic != _roomData.pictures.end(); ++roomPic) { + if (roomPic->nr == pic) { + Common::File f; + openFile(f, IDS_HR2_DISK_IMAGE); + f.seek(TSO(roomPic->track, roomPic->sector, roomPic->offset)); + _graphics->drawPic(f, pos, 0); + } + } - _graphics->drawPic(f, pos, 0); + // Check global pic list here } void HiRes2Engine::showRoom() { + loadRoom(_state.room); _linesPrinted = 0; - drawPic(0, Common::Point()); + drawPic(getCurRoom().curPicture, Common::Point()); _display->updateHiResScreen(); printString(_roomData.description); } -- cgit v1.2.3