From 72add4230f881a8e2cb57475eda9692242f59611 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 18 May 2016 23:24:50 -0400 Subject: TITANIC: Finished TTvocab getPrefixedWord --- engines/titanic/true_talk/tt_parser.cpp | 2 +- engines/titanic/true_talk/tt_string.h | 2 +- engines/titanic/true_talk/tt_synonym.cpp | 5 +++ engines/titanic/true_talk/tt_synonym.h | 1 + engines/titanic/true_talk/tt_vocab.cpp | 57 ++++++++++++++++++++++++-------- engines/titanic/true_talk/tt_vocab.h | 8 ++++- engines/titanic/true_talk/tt_word.cpp | 14 ++++++++ engines/titanic/true_talk/tt_word.h | 14 +++++++- 8 files changed, 85 insertions(+), 18 deletions(-) (limited to 'engines') diff --git a/engines/titanic/true_talk/tt_parser.cpp b/engines/titanic/true_talk/tt_parser.cpp index 1658a27b55..efed166a6b 100644 --- a/engines/titanic/true_talk/tt_parser.cpp +++ b/engines/titanic/true_talk/tt_parser.cpp @@ -474,7 +474,7 @@ int TTparser::findFrames(TTsentence *sentence) { TTstring wordString; for (;;) { // Keep stripping words off the start of the passed input - TTstring wordString = line->tokenize(" \n"); + wordString = line->tokenize(" \n"); if (wordString.empty()) break; diff --git a/engines/titanic/true_talk/tt_string.h b/engines/titanic/true_talk/tt_string.h index 3cc1e5ec40..faf1d6dc71 100644 --- a/engines/titanic/true_talk/tt_string.h +++ b/engines/titanic/true_talk/tt_string.h @@ -86,7 +86,7 @@ public: bool hasPrefix(const CString &str) const { return _data->_string.hasPrefix(str); } - bool hasPrefix(const const char *str) const { + bool hasPrefix(const char *str) const { return _data->_string.hasPrefix(str); } bool hasSuffix(const CString &str) const { diff --git a/engines/titanic/true_talk/tt_synonym.cpp b/engines/titanic/true_talk/tt_synonym.cpp index 636b4438f1..0f56c5cb22 100644 --- a/engines/titanic/true_talk/tt_synonym.cpp +++ b/engines/titanic/true_talk/tt_synonym.cpp @@ -42,6 +42,11 @@ TTsynonym::TTsynonym(int mode, const char *str, FileHandle file) : _file = file; } +TTsynonym::TTsynonym(int mode, TTstring *str) : TTstringNode() { + _string = *str; + initialize(mode); +} + TTsynonym *TTsynonym::copyFrom(const TTsynonym *src) { if (src->_field1C) { _field1C = 5; diff --git a/engines/titanic/true_talk/tt_synonym.h b/engines/titanic/true_talk/tt_synonym.h index e95a6d4faa..d5dc2be09e 100644 --- a/engines/titanic/true_talk/tt_synonym.h +++ b/engines/titanic/true_talk/tt_synonym.h @@ -38,6 +38,7 @@ public: TTsynonym(); TTsynonym(const TTsynonym *src); TTsynonym(int mode, const char *str, FileHandle file); + TTsynonym(int mode, TTstring *str); /** * Copies data from one synonym to another diff --git a/engines/titanic/true_talk/tt_vocab.cpp b/engines/titanic/true_talk/tt_vocab.cpp index dfe894dcd1..5145e4f1b9 100644 --- a/engines/titanic/true_talk/tt_vocab.cpp +++ b/engines/titanic/true_talk/tt_vocab.cpp @@ -208,7 +208,7 @@ TTword *TTvocab::getPrimeWord(TTstring &str, TTword **srcWord) const { return newWord; } -void TTvocab::fn1(TTstring &str) { +TTword *TTvocab::getPrefixedWord(TTstring &str) { TTstring tempStr(str); TTword *word = nullptr; int prefixLen = 0; @@ -221,28 +221,57 @@ void TTvocab::fn1(TTstring &str) { prefixLen = 5; } else if (tempStr.hasPrefix("over") || tempStr.hasPrefix("post") || tempStr.hasPrefix("self")) { prefixLen = 4; - } + } + if (prefixLen) { // Known prefix found, so scan for word without prefix tempStr.deletePrefix(prefixLen); word = getPrimeWord(tempStr); if (word) tempStr = str; - } else { - if (tempStr.hasPrefix("anti")) - prefixLen = 4; - else if (tempStr.hasPrefix("counter")) - prefixLen = 7; - - if (prefixLen) { - tempStr.deletePrefix(prefixLen); - word = getPrimeWord(tempStr); - if (word) - tempStr = str; + + } else if (tempStr.hasPrefix("anti") || tempStr.hasPrefix("counter")) { + prefixLen = tempStr[0] == 'a' ? 4 : 7; + + tempStr.deletePrefix(prefixLen); + word = getPrimeWord(tempStr); + if (!word) + tempStr = str; + else if (word->_wordMode == 8) { + delete word; + word = nullptr; } + + } else if (tempStr.hasPrefix("hyper") || tempStr.hasPrefix("super") || + tempStr.hasPrefix("ultra")) { + tempStr.deletePrefix(5); + word = getPrimeWord(tempStr); + + if (!word) + tempStr = str; + else if (word->_wordMode == 8) { + int val1 = word->proc15(); + int val2 = word->proc15(); + + if (val2 < 5) { + if (--val1 > 0) + word->unkFn1(val1); + } else if (++val1 < 11) { + word->unkFn1(val1); + } + } + } + + if (word) { + // Set the original word on either the found word or synonym + if (word->hasSynonyms()) + word->setSynStr(&str); + else + word->_string = str; } - // TODO + delete tempStr; + return word; } } // End of namespace Titanic diff --git a/engines/titanic/true_talk/tt_vocab.h b/engines/titanic/true_talk/tt_vocab.h index 16515cee26..8b2a080ce9 100644 --- a/engines/titanic/true_talk/tt_vocab.h +++ b/engines/titanic/true_talk/tt_vocab.h @@ -67,7 +67,13 @@ public: */ TTword *getPrimeWord(TTstring &str, TTword **srcWord = nullptr) const; - void fn1(TTstring &str); + /** + * Checks the passed word for common prefixes, and checks for a word + * match for the word without the given prefix + * @param str Word to check + * @returns New word instance for found match, or nullptr otherwise + */ + TTword *getPrefixedWord(TTstring &str); }; } // End of namespace Titanic diff --git a/engines/titanic/true_talk/tt_word.cpp b/engines/titanic/true_talk/tt_word.cpp index a09af4ab34..bc029d001a 100644 --- a/engines/titanic/true_talk/tt_word.cpp +++ b/engines/titanic/true_talk/tt_word.cpp @@ -109,6 +109,16 @@ void TTword::setSyn(TTsynonym *synP) { _synP = synP; } +int TTword::setSynStr(TTstring *str) { + if (str->empty()) + return 4; + + TTstring *newStr = new TTstring(*str); + TTsynonym *newSyn = new TTsynonym(4, newStr); + setSyn(newSyn); + return 0; +} + void TTword::appendNode(TTsynonym *node) { if (_synP) _synP->addNode(node); @@ -172,6 +182,10 @@ TTword *TTword::copy() { return new TTword(this); } +void TTword::unkFn1(int val) { + // TODO: This method seems to reference a field beyond the size of TTword +} + FileHandle TTword::getSynFile() const { return _synP ? _synP->_file : HANDLE_STDIN; } diff --git a/engines/titanic/true_talk/tt_word.h b/engines/titanic/true_talk/tt_word.h index 885409ccb0..7f0f916677 100644 --- a/engines/titanic/true_talk/tt_word.h +++ b/engines/titanic/true_talk/tt_word.h @@ -32,7 +32,6 @@ namespace Titanic { class TTword { protected: TTstringStatus _status; - int _wordMode; int _field1C; int _field20; int _field24; @@ -49,6 +48,7 @@ public: TTword *_nextP; TTsynonym *_synP; TTstring _string; + int _wordMode; public: TTword(TTstring &str, int mode, int val2); TTword(TTword *src); @@ -68,6 +68,16 @@ public: */ void setSyn(TTsynonym *synP); + /** + * Set a new synonym string + */ + int setSynStr(TTstring *str); + + /** + * Returns true if synonyms have been set for the word + */ + bool hasSynonyms() const { return _synP != nullptr; } + /** * Either sets the first synonym for a word, or adds it to an existing one */ @@ -99,6 +109,8 @@ public: */ virtual TTword *copy(); + void unkFn1(int val); + virtual bool proc2(int val) const { return false; } virtual int proc3() const { return -1; } virtual void proc4() {} -- cgit v1.2.3