From 368a3722a3cae2326efaf124608605058b274cd5 Mon Sep 17 00:00:00 2001 From: Jussi Pitkanen Date: Thu, 16 Jun 2011 12:34:40 +0300 Subject: AGI: Implement loader for V1 words.tok dictionary --- engines/agi/agi.h | 1 + engines/agi/loader_v1.cpp | 19 ++++++++----------- engines/agi/words.cpp | 30 ++++++++++++++++++++++++++++-- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/engines/agi/agi.h b/engines/agi/agi.h index 368aecfca2..3e644dace8 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -1024,6 +1024,7 @@ public: public: int showWords(); int loadWords(const char *); + int loadWords_v1(Common::File &f); void unloadWords(); int findWord(const char *word, int *flen); void dictionaryWords(char *); diff --git a/engines/agi/loader_v1.cpp b/engines/agi/loader_v1.cpp index ab350cd920..02a20c9bc8 100644 --- a/engines/agi/loader_v1.cpp +++ b/engines/agi/loader_v1.cpp @@ -26,33 +26,25 @@ #define IMAGE_SIZE 368640 // = 40 * 2 * 9 * 512 = tracks * sides * sectors * sector size #define SECTOR_OFFSET(s) ((s) * 512) - #define DDP_BASE_SECTOR 0x1C2 - #define DDP_LOGDIR_SEC SECTOR_OFFSET(171) + 5 #define DDP_LOGDIR_MAX 43 - #define DDP_PICDIR_SEC SECTOR_OFFSET(180) + 5 #define DDP_PICDIR_MAX 30 - #define DDP_VIEWDIR_SEC SECTOR_OFFSET(189) + 5 #define DDP_VIEWDIR_MAX 171 - #define DDP_SNDDIR_SEC SECTOR_OFFSET(198) + 5 #define DDP_SNDDIR_MAX 64 - #define BC_LOGDIR_SEC SECTOR_OFFSET(90) + 5 #define BC_LOGDIR_MAX 118 - #define BC_VIEWDIR_SEC SECTOR_OFFSET(96) + 5 #define BC_VIEWDIR_MAX 180 - #define BC_PICDIR_SEC SECTOR_OFFSET(93) + 8 #define BC_PICDIR_MAX 117 - #define BC_SNDDIR_SEC SECTOR_OFFSET(99) + 5 #define BC_SNDDIR_MAX 29 +#define BC_WORDS SECTOR_OFFSET(0x26D) + 5 namespace Agi { @@ -321,9 +313,14 @@ int AgiLoader_v1::loadObjects(const char *fname) { return _vm->loadObjects(fname); } -// TODO: Find the disk image equivalent. int AgiLoader_v1::loadWords(const char *fname) { - return _vm->loadWords(fname); + if (_vm->getGameID() == GID_BC) { + Common::File f; + f.open(_filenameDisk0); + f.seek(BC_WORDS, SEEK_SET); + return _vm->loadWords_v1(f); + } + return errOK; } } diff --git a/engines/agi/words.cpp b/engines/agi/words.cpp index 4004abd697..8b53e9d3a3 100644 --- a/engines/agi/words.cpp +++ b/engines/agi/words.cpp @@ -36,6 +36,33 @@ static char *myStrndup(const char *src, int n) { return tmp; } +int AgiEngine::loadWords_v1(Common::File &f) { + char str[64]; + int k; + + // Loop through alphabet, as words in the dictionary file are sorted by + // first character + f.seek(f.pos() + 26 * 2, SEEK_SET); + do { + // Read next word + for (k = 0; k < (int)sizeof(str) - 1; k++) { + str[k] = f.readByte(); + if (str[k] == 0 || (uint8)str[k] == 0xFF) + break; + } + + // And store it in our internal dictionary + if (k > 0) { + AgiWord *w = new AgiWord; + w->word = myStrndup(str, k + 1); + w->id = f.readUint16LE(); + _game.words[str[0] - 'a'].push_back(w); + } + } while((uint8)str[0] != 0xFF); + + return errOK; +} + int AgiEngine::loadWords(const char *fname) { Common::File fp; @@ -50,8 +77,7 @@ int AgiEngine::loadWords(const char *fname) { for (int i = 0; i < 26; i++) { fp.seek(i * 2, SEEK_SET); int offset = fp.readUint16BE(); - if (offset == 0) - continue; + if (offset == 0) continue; fp.seek(offset, SEEK_SET); int k = fp.readByte(); while (!fp.eos() && !fp.err()) { -- cgit v1.2.3