aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic')
-rw-r--r--engines/titanic/true_talk/maitred_script.cpp447
-rw-r--r--engines/titanic/true_talk/maitred_script.h7
2 files changed, 452 insertions, 2 deletions
diff --git a/engines/titanic/true_talk/maitred_script.cpp b/engines/titanic/true_talk/maitred_script.cpp
index 57ae517db8..688e635a48 100644
--- a/engines/titanic/true_talk/maitred_script.cpp
+++ b/engines/titanic/true_talk/maitred_script.cpp
@@ -29,6 +29,8 @@ namespace Titanic {
MaitreDScript::MaitreDScript(int val1, const char *charClass, int v2,
const char *charName, int v3, int val2) :
TTnpcScript(val1, charClass, v2, charName, v3, val2, -1, -1, -1, 0) {
+ _answerCtr = 0;
+
CTrueTalkManager::setFlags(9, 1);
CTrueTalkManager::setFlags(10, 0);
CTrueTalkManager::setFlags(11, 0);
@@ -49,6 +51,7 @@ MaitreDScript::MaitreDScript(int val1, const char *charClass, int v2,
void MaitreDScript::setupSentences() {
_mappings.load("Mappings/MaitreD", 1);
_entries.load("Sentences/MaitreD");
+ _sentences1.load("Sentences/MaitreD/1");
_field68 = 0;
_entryCount = 0;
}
@@ -66,8 +69,75 @@ int MaitreDScript::chooseResponse(const TTroomScript *roomScript, const TTsenten
}
int MaitreDScript::process(const TTroomScript *roomScript, const TTsentence *sentence) {
- // TODO
- return 0;
+ if (roomScript->_scriptId != 132)
+ return 2;
+ if (preprocess(roomScript, sentence) == 1)
+ return 1;
+
+ CTrueTalkManager::setFlags(10, 0);
+ setState(0);
+
+ if (getValue(12) == 0) {
+ trigger12(false);
+ _answerCtr = 0;
+
+ if (sentence->contains("restaurant at the end of the universe")
+ || sentence->contains("milliway")
+ || sentence->contains("big bang burger bar")) {
+ addResponse(getDialogueId(260975));
+ applyResponse();
+ } else if (processEntries(&_entries, _entryCount, roomScript, sentence) == 2) {
+ // Do nothing further
+ } else if (sentence->localWord("menu")) {
+ addResponse(getDialogueId(260683));
+ applyResponse();
+ } else if (sentence->localWord("table") && sentence->localWord("other")) {
+ addResponse(getDialogueId(260091));
+ applyResponse();
+ } else if ((sentence->localWord("not") && sentence->localWord("busy"))
+ || (sentence->localWord("no") && sentence->localWord("people"))
+ || sentence->localWord("empty")) {
+ addResponse(getDialogueId(260087));
+ applyResponse();
+ } else if (!defaultProcess(roomScript, sentence)
+ && processEntries(&_sentences1, 0, roomScript, sentence) != 2
+ && processEntries(_defaultEntries, 0, roomScript, sentence) != 2) {
+ addResponse(getDialogueId(260975));
+ applyResponse();
+ }
+
+ return 2;
+ }
+
+ if (++_answerCtr > 50 || sentence->localWord("stop") || sentence->localWord("enough")
+ || sentence->contains("i give up") || sentence->contains("i give in")
+ || sentence->contains("i surrender") || sentence->contains("i submit")) {
+ _answerCtr = 0;
+ trigger12(false);
+ addResponse(getDialogueId(260063));
+ } else if (sentence->localWord("not") && sentence->localWord("fight") &&
+ (sentence->localWord("feel") || sentence->localWord("want")
+ || sentence->localWord("do") || sentence->localWord("will"))) {
+ _answerCtr = 0;
+ trigger12(false);
+ addResponse(getDialogueId(260678));
+ } else if (sentence->contains("touche") || sentence->contains("toushe")) {
+ addResponse(getDialogueId(260098));
+ } else if (sentence->contains("have at you")) {
+ addResponse(getDialogueId(260047));
+ } else if (sentence->contains("en garde") || sentence->contains("on guard")) {
+ addResponse(getDialogueId(260008));
+ } else if ((sentence->localWord("surrender") && !sentence->contains("i surrender"))
+ || (sentence->contains("give up") && !sentence->contains("i give up"))
+ || (sentence->contains("give in") && !sentence->contains("i give in"))
+ || (sentence->contains("submit") && !sentence->contains("i submit"))) {
+ addResponse(getDialogueId(260086));
+ } else {
+ addResponse(getDialogueId(260031));
+ }
+
+ applyResponse();
+ return 2;
}
ScriptChangedResult MaitreDScript::scriptChanged(const TTroomScript *roomScript, uint id) {
@@ -392,4 +462,377 @@ void MaitreDScript::trigger12(bool flag) {
}
}
+int MaitreDScript::preprocess(const TTroomScript *roomScript, const TTsentence *sentence) {
+ if (!roomScript || !sentence || getValue(8))
+ return 1;
+
+ bool ebx = true, edi = false;
+ switch (getValue(10)) {
+ case 1:
+ if (!getValue(11) && !getValue(8)) {
+ addResponse(getDialogueId(260052));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 2:
+ if (sentence->localWord("change") || sentence->localWord("music")) {
+ addResponse(getDialogueId(200684));
+ edi = true;
+ }
+ break;
+
+ case 3:
+ if (sentence->localWord("chance") && (sentence->localWord("another")
+ || sentence->localWord("other") || sentence->localWord("more"))) {
+ addResponse(getDialogueId(260106));
+ } else {
+ addResponse(getDialogueId(260107));
+ }
+ edi = true;
+ break;
+
+ case 4:
+ if (sentence->contains("unless what")) {
+ addResponse(getDialogueId(260099));
+ } else {
+ addResponse(getDialogueId(260131));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 5:
+ addResponse(getDialogueId(260096));
+ edi = true;
+ ebx = false;
+ break;
+
+ case 6:
+ addResponse(getDialogueId(260097));
+ edi = true;
+ ebx = false;
+ break;
+
+ case 7:
+ if (sentence->_field2C == 12) {
+ addResponse(getDialogueId(260089));
+ edi = true;
+ ebx = false;
+ } else {
+ addResponse(getDialogueId(260094));
+ edi = true;
+ CTrueTalkManager::setFlags(11, 1);
+ }
+ break;
+
+ case 8:
+ if (sentence->_field2C == 11 || sentence->_field2C == 13) {
+ trigger12(false);
+ addResponse(getDialogueId(260094));
+ CTrueTalkManager::setFlags(11, 1);
+ } else {
+ setFlags12();
+ addResponse(getDialogueId(260131));
+ }
+ edi = true;
+ break;
+
+ case 9:
+ setFlags12();
+ break;
+
+ case 11:
+ if ((sentence->localWord("say") || sentence->localWord("talk")) ||
+ sentence->localWord("you")) {
+ addResponse(getDialogueId(260216));
+ edi = true;
+ }
+ break;
+
+ case 12:
+ if (sentence->localWord("why") && sentence->localWord("naughty")) {
+ addResponse(getDialogueId(260196));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("what") && sentence->localWord("his")
+ && sentence->localWord("name")) {
+ addResponse(getDialogueId(260197));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("i") && sentence->localWord("meet")) {
+ addResponse(getDialogueId(260198));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("i") && sentence->localWord("speak")) {
+ addResponse(getDialogueId(260206));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 13:
+ if (sentence->localWord("why") || sentence->localWord("please")
+ || sentence->contains("go on") || sentence->localWord("need")
+ || sentence->contains("got to") || sentence->localWord("must")) {
+ addResponse(getDialogueId(260199));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 14:
+ if (sentence->localWord("what") || sentence->localWord("why")
+ || sentence->localWord("kill")) {
+ addResponse(getDialogueId(260200));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("you") && sentence->localWord("kill")) {
+ addResponse(getDialogueId(260574));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("how") && sentence->localWord("kill")) {
+ addResponse(getDialogueId(260557));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 15:
+ if ((sentence->localWord("what") && sentence->localWord("way"))
+ || sentence->localWord("how")) {
+ addResponse(getDialogueId(260201));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 16:
+ addResponse(getDialogueId(sentence->_field2C == 11 ? 260209 : 260210));
+ edi = true;
+ ebx = false;
+ break;
+
+ case 17:
+ if (sentence->localWord("what") && sentence->localWord("mean")) {
+ addResponse(getDialogueId(260222));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("laugh") && sentence->localWord("with")
+ && sentence->localWord("you")) {
+ addResponse(getDialogueId(260221));
+ edi = true;
+ ebx = false;
+ } else {
+ setFlags12();
+ addResponse(getDialogueId(260221));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 18:
+ if (sentence->_field2C == 11) {
+ addResponse(getDialogueId(260232));
+ edi = true;
+ } else if (sentence->_field2C == 12) {
+ addResponse(getDialogueId(260231));
+ edi = true;
+ } else if (sentence->_field2C == 13) {
+ addResponse(getDialogueId(260444));
+ addResponse(getDialogueId(260233));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("what") && sentence->localWord("happen")) {
+ addResponse(getDialogueId(260233));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("why") && sentence->localWord("stressed")) {
+ addResponse(getDialogueId(260245));
+ addResponse(getDialogueId(260233));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("why")) {
+ addResponse(getDialogueId(260453));
+ addResponse(getDialogueId(260233));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 19:
+ if ((sentence->localWord("what") && sentence->localWord("scral"))
+ || (sentence->localWord("what") && sentence->localWord("happen"))
+ || sentence->contains("go on") || sentence->contains("and then")) {
+ addResponse(getDialogueId(260234));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("why") && sentence->localWord("stressed")) {
+ addResponse(getDialogueId(260245));
+ addResponse(getDialogueId(260234));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("why")) {
+ addResponse(getDialogueId(260276));
+ addResponse(getDialogueId(260237));
+ addResponse(getDialogueId(260234));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 20:
+ if ((sentence->localWord("what") && sentence->localWord("leovinus"))
+ || (sentence->localWord("what") && sentence->localWord("happen"))) {
+ addResponse(getDialogueId(260235));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("where") && sentence->localWord("leovinus")) {
+ addResponse(getDialogueId(260236));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("why") && sentence->localWord("stressed")) {
+ addResponse(getDialogueId(260245));
+ addResponse(getDialogueId(260235));
+ edi = true;
+ ebx = false;
+ } else {
+ addResponse(getDialogueId(260237));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 21:
+ case 22:
+ if (sentence->contains("cooking")
+ || (sentence->localWord("what") && sentence->localWord("mean"))) {
+ addResponse(getDialogueId(260238));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("where") && sentence->localWord("now")) {
+ addResponse(getDialogueId(260236));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("why") && sentence->localWord("stressed")) {
+ addResponse(getDialogueId(260245));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("why")) {
+ addResponse(getDialogueId(260239));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 23:
+ if (sentence->_field2C == 11) {
+ addResponse(getDialogueId(260237));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 24:
+ if ((sentence->localWord("can") && sentence->localWord("i")
+ && sentence->localWord("have"))
+ || (sentence->localWord("give") && sentence->localWord("me"))
+ || (sentence->localWord("i") && sentence->localWord("want"))
+ || (sentence->localWord("i") && sentence->localWord("need"))
+ ) {
+ addResponse(getDialogueId(260251));
+ edi = true;
+ }
+
+ case 25:
+ if ((sentence->localWord("open") && sentence->localWord("it"))
+ || (sentence->localWord("how") && sentence->localWord("open"))
+ || (sentence->localWord("how") && sentence->localWord("get") && sentence->localWord("in"))
+ || (sentence->localWord("how") && sentence->localWord("change") && sentence->localWord("music"))
+ ) {
+ addResponse(getDialogueId(260253));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("where") && (sentence->localWord("it")
+ || sentence->localWord("that"))) {
+ addResponse(getDialogueId(260252));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("where") && sentence->localWord("key")) {
+ addResponse(getDialogueId(260254));
+ edi = true;
+ ebx = false;
+ } else if ((sentence->localWord("how") && sentence->localWord("work"))
+ || (sentence->localWord("what") && sentence->localWord("i") && sentence->localWord("do"))) {
+ addResponse(getDialogueId(260259));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 26:
+ if (sentence->localWord("where") && (sentence->localWord("key")
+ || sentence->localWord("it"))) {
+ addResponse(getDialogueId(260254));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("where") && (sentence->localWord("hand")
+ || sentence->localWord("that"))) {
+ addResponse(getDialogueId(260256));
+ edi = true;
+ ebx = false;
+ } else if (sentence->_field2C == 12) {
+ addResponse(getDialogueId(260255));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("why") && sentence->localWord("need")) {
+ addResponse(getDialogueId(260685));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 27:
+ if (sentence->localWord("where") && (sentence->localWord("that")
+ || sentence->localWord("it"))) {
+ addResponse(getDialogueId(260262));
+ edi = true;
+ }
+ break;
+
+ case 28:
+ if (sentence->localWord("why")) {
+ addResponse(getDialogueId(260386));
+ edi = true;
+ ebx = false;
+ } else if (sentence->localWord("insist")) {
+ addResponse(getDialogueId(260387));
+ edi = true;
+ ebx = false;
+ }
+ break;
+
+ case 29:
+ if (sentence->_field2C == 11) {
+ setFlags12();
+ addResponse(getDialogueId(260131));
+ } else {
+ addResponse(getDialogueId(260966));
+ }
+ edi = true;
+ break;
+
+ case 30:
+ if (sentence->_field2C == 11 || sentence->_field2C == 13) {
+ addResponse(getDialogueId(260695));
+ edi = true;
+ } else if (sentence->_field2C == 12) {
+ addResponse(getDialogueId(260696));
+ edi = true;
+ }
+ break;
+ }
+}
+
} // End of namespace Titanic
diff --git a/engines/titanic/true_talk/maitred_script.h b/engines/titanic/true_talk/maitred_script.h
index bed93fa6c1..93004e2021 100644
--- a/engines/titanic/true_talk/maitred_script.h
+++ b/engines/titanic/true_talk/maitred_script.h
@@ -30,6 +30,8 @@ namespace Titanic {
class MaitreDScript : public TTnpcScript {
private:
TTmapEntryArray _states;
+ TTsentenceEntries _sentences1;
+ int _answerCtr;
private:
/**
* Setup sentence data
@@ -56,6 +58,11 @@ private:
* Trigers 12
*/
void trigger12(bool flag);
+
+ /**
+ * Does preprocessing for the sentence
+ */
+ int preprocess(const TTroomScript *roomScript, const TTsentence *sentence);
public:
MaitreDScript(int val1, const char *charClass, int v2,
const char *charName, int v3, int val2);