aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic
diff options
context:
space:
mode:
authorPaul Gilbert2016-05-23 21:37:48 -0400
committerPaul Gilbert2016-07-15 19:15:08 -0400
commitd537a25bd705d803d6fb0dc8202c8ef88460cd2c (patch)
tree12659a76db6694a61eb5d987838dc5a78dd8f206 /engines/titanic
parent938ec867fe6d172c4489bb28ab4a2609004459dc (diff)
downloadscummvm-rg350-d537a25bd705d803d6fb0dc8202c8ef88460cd2c.tar.gz
scummvm-rg350-d537a25bd705d803d6fb0dc8202c8ef88460cd2c.tar.bz2
scummvm-rg350-d537a25bd705d803d6fb0dc8202c8ef88460cd2c.zip
TITANIC: Added TTsentenceSubBase setHandlerConcept
Diffstat (limited to 'engines/titanic')
-rw-r--r--engines/titanic/true_talk/script_handler.h10
-rw-r--r--engines/titanic/true_talk/tt_parser.cpp72
-rw-r--r--engines/titanic/true_talk/tt_parser.h10
-rw-r--r--engines/titanic/true_talk/tt_sentence.cpp63
-rw-r--r--engines/titanic/true_talk/tt_sentence.h14
-rw-r--r--engines/titanic/true_talk/tt_vocab.cpp2
-rw-r--r--engines/titanic/true_talk/tt_vocab.h1
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:
/**