aboutsummaryrefslogtreecommitdiff
path: root/engines/adl/hires5.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/adl/hires5.cpp')
-rw-r--r--engines/adl/hires5.cpp90
1 files changed, 89 insertions, 1 deletions
diff --git a/engines/adl/hires5.cpp b/engines/adl/hires5.cpp
index 4f1d5a28b8..4d52d2822c 100644
--- a/engines/adl/hires5.cpp
+++ b/engines/adl/hires5.cpp
@@ -36,19 +36,107 @@ namespace Adl {
class HiRes5Engine : public AdlEngine_v4 {
public:
- HiRes5Engine(OSystem *syst, const AdlGameDescription *gd) : AdlEngine_v4(syst, gd) { }
+ HiRes5Engine(OSystem *syst, const AdlGameDescription *gd) :
+ AdlEngine_v4(syst, gd) { }
private:
// AdlEngine
+ void runIntro();
void init();
void initGameState();
+
+ static const uint kRegions = 41;
+ static const uint kItems = 69;
};
+void HiRes5Engine::runIntro() {
+ insertDisk(2);
+
+ StreamPtr stream(_disk->createReadStream(0x10, 0x0, 0x00, 31));
+
+ _display->setMode(DISPLAY_MODE_HIRES);
+ _display->loadFrameBuffer(*stream);
+ _display->updateHiResScreen();
+
+ inputKey();
+
+ _display->home();
+ _display->setMode(DISPLAY_MODE_TEXT);
+
+ stream.reset(_disk->createReadStream(0x03, 0xc, 0x34, 1));
+ Common::String menu(readString(*stream));
+
+ while (!g_engine->shouldQuit()) {
+ _display->home();
+ _display->printString(menu);
+
+ Common::String cmd(inputString());
+
+ // We ignore the backup and format menu options
+ if (!cmd.empty() && cmd[0] == APPLECHAR('1'))
+ break;
+ };
+}
+
void HiRes5Engine::init() {
_graphics = new Graphics_v2(*_display);
+
+ insertDisk(2);
+
+ StreamPtr stream(_disk->createReadStream(0x5, 0x0, 0x02));
+ loadRegionLocations(*stream, kRegions);
+
+ stream.reset(_disk->createReadStream(0xd, 0x2, 0x04));
+ loadRegionInitDataOffsets(*stream, kRegions);
+
+ stream.reset(_disk->createReadStream(0x7, 0xe));
+ _strings.verbError = readStringAt(*stream, 0x4f);
+ _strings.nounError = readStringAt(*stream, 0x8e);
+ _strings.enterCommand = readStringAt(*stream, 0xbc);
+
+ stream.reset(_disk->createReadStream(0x7, 0xc));
+ _strings.lineFeeds = readString(*stream);
+
+ // TODO: opcode strings
+
+ _messageIds.cantGoThere = 110;
+ _messageIds.dontUnderstand = 112;
+ _messageIds.itemDoesntMove = 114;
+ _messageIds.itemNotHere = 115;
+ _messageIds.thanksForPlaying = 113;
+
+ stream.reset(_disk->createReadStream(0xe, 0x1, 0x13, 4));
+ loadItemDescriptions(*stream, kItems);
+
+ stream.reset(_disk->createReadStream(0xb, 0xa, 0x05, 1));
+ loadItemPicIndex(*stream, kItems);
+
+ if (stream->eos() || stream->err())
+ error("Error reading item index");
}
void HiRes5Engine::initGameState() {
+ _state.vars.resize(40);
+
+ insertDisk(2);
+
+ StreamPtr stream(_disk->createReadStream(0x5, 0x1, 0x00, 3));
+ loadItems(*stream);
+
+ // A combined total of 1213 rooms
+ static const byte rooms[kRegions] = {
+ 6, 16, 24, 57, 40, 30, 76, 40,
+ 54, 38, 44, 21, 26, 42, 49, 32,
+ 59, 69, 1, 1, 1, 1, 1, 18,
+ 25, 13, 28, 28, 11, 23, 9, 31,
+ 6, 29, 29, 34, 9, 10, 95, 86,
+ 1
+ };
+
+ initRegions(rooms, kRegions);
+
+ loadRegion(1);
+ _state.room = 5;
}
Engine *HiRes5Engine_create(OSystem *syst, const AdlGameDescription *gd) {