diff options
-rw-r--r-- | engines/titanic/true_talk/script_handler.h | 10 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_parser.cpp | 72 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_parser.h | 10 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_sentence.cpp | 63 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_sentence.h | 14 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_vocab.cpp | 2 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_vocab.h | 1 |
7 files changed, 123 insertions, 49 deletions
diff --git a/engines/titanic/true_talk/script_handler.h b/engines/titanic/true_talk/script_handler.h index 62cf9d0ad4..1c0824869c 100644 --- a/engines/titanic/true_talk/script_handler.h +++ b/engines/titanic/true_talk/script_handler.h @@ -53,16 +53,16 @@ private: CExeResources &_resources; int _field10; CScriptHandlerSub1 _sub1; - TTparser _parser; int _inputCtr; - TTconcept *_concept1P; - TTconcept *_concept2P; - TTconcept *_concept3P; - TTconcept *_concept4P; int _field30; public: + TTparser _parser; TTvocab *_vocab; TTscriptBase *_script; + TTconcept *_concept1P; + TTconcept *_concept2P; + TTconcept *_concept3P; + TTconcept *_concept4P; public: CScriptHandler(CTitleEngine *owner, int val1, int val2); ~CScriptHandler(); diff --git a/engines/titanic/true_talk/tt_parser.cpp b/engines/titanic/true_talk/tt_parser.cpp index cb12e04afb..02ecf0aedd 100644 --- a/engines/titanic/true_talk/tt_parser.cpp +++ b/engines/titanic/true_talk/tt_parser.cpp @@ -50,29 +50,21 @@ TTparser::~TTparser() { delete _currentWordP; } -void TTparser::loadArrays() { - Common::SeekableReadStream *r; - r = g_vm->_filesManager->getResource("TEXT/REPLACEMENTS1"); - while (r->pos() < r->size()) - _replacements1.push_back(readStringFromStream(r)); - delete r; - - r = g_vm->_filesManager->getResource("TEXT/REPLACEMENTS2"); +void TTparser::loadArray(StringArray &arr, const CString &name) { + Common::SeekableReadStream *r = g_vm->_filesManager->getResource(name); while (r->pos() < r->size()) - _replacements2.push_back(readStringFromStream(r)); - delete r; - - r = g_vm->_filesManager->getResource("TEXT/REPLACEMENTS3"); - while (r->pos() < r->size()) - _replacements3.push_back(readStringFromStream(r)); + arr.push_back(readStringFromStream(r)); delete r; +} - r = g_vm->_filesManager->getResource("TEXT/PHRASES"); - while (r->pos() < r->size()) - _phrases.push_back(readStringFromStream(r)); - delete r; +void TTparser::loadArrays() { + loadArray(_replacements1, "TEXT/REPLACEMENTS1"); + loadArray(_replacements2, "TEXT/REPLACEMENTS2"); + loadArray(_replacements3, "TEXT/REPLACEMENTS3"); + loadArray(_phrases, "TEXT/PHRASES"); + loadArray(_pronouns, "TEXT/PRONOUNS"); - r = g_vm->_filesManager->getResource("TEXT/NUMBERS"); + Common::SeekableReadStream *r = g_vm->_filesManager->getResource("TEXT/NUMBERS"); while (r->pos() < r->size()) { NumberEntry ne; ne._text = readStringFromStream(r); @@ -81,7 +73,6 @@ void TTparser::loadArrays() { _numbers.push_back(ne); } delete r; - } int TTparser::preprocess(TTsentence *sentence) { @@ -490,7 +481,8 @@ int TTparser::findFrames(TTsentence *sentence) { TTstring *line = sentence->_normalizedLine.copy(); TTstring wordString; - for (;;) { + int status = 0; + for (int ctr = 1; !status; ++ctr) { // Keep stripping words off the start of the passed input wordString = line->tokenize(" \n"); if (wordString.empty()) @@ -500,17 +492,23 @@ int TTparser::findFrames(TTsentence *sentence) { TTword *word = _owner->_vocab->getWord(wordString, &word); sentence->storeVocabHit(srcWord); - if (word) { - // TODO - } else { - + if (!word && ctr == 1) { + word = new TTword(wordString, WC_UNKNOWN, 0); } + + for (TTword *currP = word; currP && !status; currP = currP->_nextP) + status = processRequests(currP); + + word->deleteSiblings(); + delete word; } + if (!status) { + status = fn1(); + } - // TODO delete line; - return 0; + return status; } int TTparser::loadRequests(TTword *word) { @@ -767,10 +765,10 @@ int TTparser::considerRequests(TTword *word) { } else { switch (nodeP->_tag) { case CHECK_COMMAND_FORM: - if (_sentenceSub->_field4 && _sentence->_field2C == 1 && - !_sentenceSub->_conceptP) { + if (_sentenceSub->_concept1P && _sentence->_field2C == 1 && + !_sentenceSub->_concept0P) { concept = new TTconcept(_sentence->_npcScript, ST_NPC_SCRIPT); - _sentenceSub->_conceptP = concept; + _sentenceSub->_concept0P = concept; _sentenceSub->_field18 = 3; } @@ -788,7 +786,7 @@ int TTparser::considerRequests(TTword *word) { break; case OBJECT_IS_TO: - flag = fn3(&_sentenceSub->_field8, 3); + flag = fn3(&_sentenceSub->_concept2P, 3); break; case SEEK_ACTOR: @@ -828,6 +826,11 @@ int TTparser::considerRequests(TTword *word) { return status; } +int TTparser::processRequests(TTword *word) { + // TODO + return 0; +} + void TTparser::addToConceptList(TTword *word) { TTconcept *concept = new TTconcept(word, ST_UNKNOWN_SCRIPT); addConcept(concept); @@ -851,6 +854,11 @@ int TTparser::addConcept(TTconcept *concept) { return SS_VALID; } +int TTparser::fn1() { + // TODO + return 0; +} + int TTparser::fn2(TTword *word) { switch (word->_id) { case 600: @@ -873,7 +881,7 @@ int TTparser::fn2(TTword *word) { } } -bool TTparser::fn3(int *v, int v2) { +bool TTparser::fn3(TTconcept **v, int v2) { // TODO return false; } diff --git a/engines/titanic/true_talk/tt_parser.h b/engines/titanic/true_talk/tt_parser.h index 675bdd6345..a8bb906559 100644 --- a/engines/titanic/true_talk/tt_parser.h +++ b/engines/titanic/true_talk/tt_parser.h @@ -76,6 +76,11 @@ private: TTconcept *_currentConceptP; private: /** + * Load the data for a given array resource + */ + void loadArray(StringArray &arr, const CString &name); + + /** * Loads the various replacement string data arrays */ void loadArrays(); @@ -139,6 +144,7 @@ private: int loadRequests(TTword *word); int considerRequests(TTword *word); + int processRequests(TTword *word); void addToConceptList(TTword *word); int fn2(TTword *word); @@ -154,7 +160,8 @@ private: */ int addConcept(TTconcept *concept); - bool fn3(int *v, int v2); + int fn1(); + bool fn3(TTconcept **v, int v2); public: CScriptHandler *_owner; TTsentenceSub *_sentenceSub; @@ -163,6 +170,7 @@ public: int _field10; int _field14; TTword *_currentWordP; + StringArray _pronouns; public: TTparser(CScriptHandler *owner); ~TTparser(); diff --git a/engines/titanic/true_talk/tt_sentence.cpp b/engines/titanic/true_talk/tt_sentence.cpp index 40e3bb09e2..9558c546c3 100644 --- a/engines/titanic/true_talk/tt_sentence.cpp +++ b/engines/titanic/true_talk/tt_sentence.cpp @@ -21,13 +21,16 @@ */ #include "titanic/true_talk/tt_sentence.h" +#include "titanic/true_talk/tt_concept.h" #include "titanic/true_talk/script_handler.h" +#include "titanic/titanic.h" namespace Titanic { -TTsentenceSubBase::TTsentenceSubBase() : _conceptP(nullptr), _field4(0), - _field8(0), _fieldC(0), _field10(0), _field14(0), _field18(0), - _field1C(0), _nextP(nullptr), _field24(0) { +TTsentenceSubBase::TTsentenceSubBase() : _concept0P(nullptr), + _concept1P(nullptr), _concept2P(nullptr), _concept3P(nullptr), + _concept4P(nullptr), _concept5P(nullptr), _field18(0), + _field1C(0), _nextP(nullptr), _field24(0) { } void TTsentenceSubBase::deleteSiblings() { @@ -40,6 +43,60 @@ void TTsentenceSubBase::deleteSiblings() { _nextP = nullptr; } +TTconcept **TTsentenceSubBase::setConcept(int conceptIndex, TTconcept *src) { + TTconcept **conceptPP = nullptr; + switch (conceptIndex) { + case 1: + conceptPP = &_concept1P; + break; + case 2: + conceptPP = &_concept2P; + break; + case 3: + conceptPP = &_concept3P; + break; + case 4: + conceptPP = &_concept4P; + break; + case 5: + conceptPP = &_concept5P; + break; + default: + break; + } + + bool isPronoun = false; + StringArray &pronouns = g_vm->_scriptHandler->_parser._pronouns; + for (uint idx = 0; idx < pronouns.size() && !isPronoun; ++idx) { + isPronoun = pronouns[idx] == src->getText(); + } + + CScriptHandler &scrHandler = *g_vm->_exeResources._owner; + if (!isPronoun) { + switch (conceptIndex) { + case 0: + delete scrHandler._concept2P; + scrHandler._concept2P = new TTconcept(*src); + break; + + case 1: + delete scrHandler._concept4P; + scrHandler._concept4P = new TTconcept(*src); + break; + + case 2: + delete scrHandler._concept1P; + scrHandler._concept1P = new TTconcept(*src); + break; + + default: + break; + } + } + + return conceptPP; +} + /*------------------------------------------------------------------------*/ TTsentenceSub *TTsentenceSub::addSibling() { diff --git a/engines/titanic/true_talk/tt_sentence.h b/engines/titanic/true_talk/tt_sentence.h index e6d0d0c2b3..3a4fd6c685 100644 --- a/engines/titanic/true_talk/tt_sentence.h +++ b/engines/titanic/true_talk/tt_sentence.h @@ -36,12 +36,12 @@ class TTword; class TTsentenceSubBase { public: - TTconcept *_conceptP; - int _field4; - int _field8; - int _fieldC; - int _field10; - int _field14; + TTconcept *_concept0P; + TTconcept *_concept1P; + TTconcept *_concept2P; + TTconcept *_concept3P; + TTconcept *_concept4P; + TTconcept *_concept5P; int _field18; int _field1C; TTsentenceSubBase *_nextP; @@ -57,6 +57,8 @@ public: void set18(int val) { _field18 = val; } int get18() const { return _field18; } bool is24() const { return _field24 == 0; } + + TTconcept **setConcept(int conceptIndex, TTconcept *src); }; class TTsentenceSub : public TTsentenceSubBase { diff --git a/engines/titanic/true_talk/tt_vocab.cpp b/engines/titanic/true_talk/tt_vocab.cpp index eb3d52331f..062b598609 100644 --- a/engines/titanic/true_talk/tt_vocab.cpp +++ b/engines/titanic/true_talk/tt_vocab.cpp @@ -34,7 +34,7 @@ namespace Titanic { TTvocab::TTvocab(int val): _headP(nullptr), _tailP(nullptr), _word(nullptr),
_fieldC(0), _field10(0), _vocabMode(val) {
- _field14 = load("STVOCAB.TXT");
+ load("STVOCAB.TXT");
}
TTvocab::~TTvocab() {
diff --git a/engines/titanic/true_talk/tt_vocab.h b/engines/titanic/true_talk/tt_vocab.h index c84acbe741..fc7ee2e102 100644 --- a/engines/titanic/true_talk/tt_vocab.h +++ b/engines/titanic/true_talk/tt_vocab.h @@ -36,7 +36,6 @@ private: TTword *_word; int _fieldC; int _field10; - int _field14; int _vocabMode; private: /** |