From c05dfddec32e2eabc49c6bc0ca4bd2d3e90e3e2c Mon Sep 17 00:00:00 2001 From: D G Turner Date: Wed, 11 Jul 2012 13:03:32 +0100 Subject: TEENAGENT: Add Resource code to precompute Dialog Offsets. This should allow the removal of most/all of the hardcoded eseg addresses in the Dialog calls. --- engines/teenagent/resources.cpp | 28 ++++++++++++++++++++++++++++ engines/teenagent/resources.h | 10 +++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/engines/teenagent/resources.cpp b/engines/teenagent/resources.cpp index 623b44c81b..93e8c45c26 100644 --- a/engines/teenagent/resources.cpp +++ b/engines/teenagent/resources.cpp @@ -57,6 +57,32 @@ quick note on varia resources: #define DSEG_SIZE 59280 // 0xe790 #define ESEG_SIZE 35810 // 0x8be2 +void Resources::precomputeDialogOffsets() { + dialogOffsets.push_back(0); + int n = 0; + uint8 current, last = 0xff; + for (uint i = 0; i < eseg.size(); i++) { + current = eseg.get_byte(i); + + if (n == 4) { + dialogOffsets.push_back(i); + n = 0; + } + + if (current != 0x00 && last == 0x00) + n = 0; + + if (current == 0x00) + n++; + + last = current; + } + + debug(1, "Resources::precomputeDialogOffsets() - Found %d dialogs", dialogOffsets.size()); + for (uint i = 0; i < dialogOffsets.size(); i++) + debug(1, "\tDialog #%d: Offset 0x%04x", i, dialogOffsets[i]); +} + bool Resources::loadArchives(const ADGameDescription *gd) { Common::File *dat_file = new Common::File(); if (!dat_file->open("teenagent.dat")) { @@ -73,6 +99,8 @@ bool Resources::loadArchives(const ADGameDescription *gd) { delete dat; + precomputeDialogOffsets(); + FilePack varia; varia.open("varia.res"); font7.load(varia, 7); diff --git a/engines/teenagent/resources.h b/engines/teenagent/resources.h index 88bc3ea94d..d4cde18db8 100644 --- a/engines/teenagent/resources.h +++ b/engines/teenagent/resources.h @@ -52,8 +52,16 @@ public: FilePack off, on, ons, lan000, lan500, sam_mmm, sam_sam, mmm, voices; #endif - Segment cseg, dseg, eseg; + Segment cseg, dseg; Font font7, font8; + + const byte *getDialog(uint16 dialogNum) { return eseg.ptr(dialogOffsets[dialogNum]); } + + Segment eseg; +private: + void precomputeDialogOffsets(); + + Common::Array dialogOffsets; }; } // End of namespace TeenAgent -- cgit v1.2.3