aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic')
-rw-r--r--engines/titanic/true_talk/barbot_script.cpp123
-rw-r--r--engines/titanic/true_talk/barbot_script.h9
-rw-r--r--engines/titanic/true_talk/bellbot_script.cpp4
-rw-r--r--engines/titanic/true_talk/bellbot_script.h4
-rw-r--r--engines/titanic/true_talk/deskbot_script.cpp4
-rw-r--r--engines/titanic/true_talk/deskbot_script.h4
-rw-r--r--engines/titanic/true_talk/doorbot_script.cpp4
-rw-r--r--engines/titanic/true_talk/doorbot_script.h4
-rw-r--r--engines/titanic/true_talk/liftbot_script.cpp4
-rw-r--r--engines/titanic/true_talk/liftbot_script.h4
-rw-r--r--engines/titanic/true_talk/maitred_script.cpp4
-rw-r--r--engines/titanic/true_talk/maitred_script.h4
-rw-r--r--engines/titanic/true_talk/script_support.h6
-rw-r--r--engines/titanic/true_talk/tt_npc_script.cpp6
-rw-r--r--engines/titanic/true_talk/tt_npc_script.h4
15 files changed, 156 insertions, 32 deletions
diff --git a/engines/titanic/true_talk/barbot_script.cpp b/engines/titanic/true_talk/barbot_script.cpp
index cbb58cdd1c..5c0c5fbe82 100644
--- a/engines/titanic/true_talk/barbot_script.cpp
+++ b/engines/titanic/true_talk/barbot_script.cpp
@@ -40,6 +40,55 @@ static const uint ARRAY2[] = {
51899, 51900, 51901, 51902, 51903, 51904, 51905, 51906, 51907, 0
};
+static const TThandleQuoteEntry QUOTES[] = {
+ { 0x00000008, 0x00000000, 0x0003D372 },
+ { 0x00000007, 0x00000000, 0x0003D72B },
+ { 0x00000004, 0x00000000, 0x0003D722 },
+ { 0x00000006, 0x00000000, 0x0003D264 },
+ { 0x00000005, 0x00000000, 0x0003D72F },
+ { 0x00000001, 0x00000032, 0x00000001 },
+ { 0x00000002, 0x00000032, 0x00000001 },
+ { 0x00000003, 0x00000032, 0x00000001 },
+ { 0x00000010, 0x54524156, 0x0003D2B1 },
+ { 0x00000010, 0x0000003C, 0x00000000 },
+ { 0x00000011, 0x00000000, 0x0003D484 },
+ { 0x00000015, 0x00000032, 0x0003D2B2 },
+ { 0x00000012, 0x00000042, 0x0003D499 },
+ { 0x00000013, 0x00000021, 0x0003D31E },
+ { 0x0000001D, 0x00000021, 0x0003D31E },
+ { 0x00000014, 0x00000042, 0x0003D49E },
+ { 0x00000016, 0x0000003C, 0x0003D2B6 },
+ { 0x00000017, 0x00000028, 0x0003D2B5 },
+ { 0x00000018, 0x00000000, 0x0003D35E },
+ { 0x00000019, 0x00000000, 0x0003D35E },
+ { 0x0000001A, 0x0000003C, 0x0003D38B },
+ { 0x0000001B, 0x00000000, 0x0003D2F8 },
+ { 0x00000009, 0x00000019, 0x0003D326 },
+ { 0x0000000A, 0x00000019, 0x0003D314 },
+ { 0x0000000B, 0x00000028, 0x0003D311 },
+ { 0x0000001E, 0x00000000, 0x0003D6F2 },
+ { 0x0000001F, 0x00000000, 0x0003D26C },
+ { 0x0000000C, 0x00000000, 0x0003D2F4 },
+ { 0x0000000D, 0x00000000, 0x0003D2F4 },
+ { 0x0000000E, 0x00000000, 0x0003D2F4 },
+ { 0x0000000F, 0x00000000, 0x0003D2F4 },
+ { 0x00000020, 0x00000019, 0x0003D389 },
+ { 0x00000021, 0x0000000F, 0x0003D29C },
+ { 0x00000022, 0x0000000F, 0x0003D494 },
+ { 0x0000001C, 0x00000032, 0x00000000 },
+ { 0x00000023, 0x00000000, 0x0003D7F8 },
+ { 0x00000024, 0x00000000, 0x0003D7F9 },
+ { 0x00000031, 0x00000000, 0x0003D722 },
+ { 0x00000032, 0x00000000, 0x0003D722 },
+ { 0x00000033, 0x00000000, 0x0003D372 },
+ { 0x00000034, 0x00000000, 0x0003D323 },
+ { 0x0000003E, 0x00000000, 0x0003D163 },
+ { 0x0000003F, 0x00000000, 0x0003D163 },
+ { 0x00000040, 0x00000000, 0x0003D163 },
+ { 0x00000041, 0x00000000, 0x0003D691 },
+ { 0x00000000, 0x00000000, 0x00000000 }
+};
+
BarbotScript::BarbotScript(int val1, const char *charClass, int v2,
const char *charName, int v3, int val2, int v4, int v5, int v6, int v7) :
TTnpcScript(val1, charClass, v2, charName, v3, val2, v4, v5, v6, v7) {
@@ -840,8 +889,8 @@ ScriptChangedResult BarbotScript::scriptChanged(TTscriptBase *roomScript, uint i
return SCR_2;
}
-bool BarbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const {
+int BarbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder) {
switch (tagId) {
case MKTAG('A', 'D', 'V', 'T'):
case MKTAG('A', 'R', 'T', 'I'):
@@ -945,9 +994,64 @@ bool BarbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
default:
break;
}
-
- warning("TODO: handleQuote - %d", tagId);
- return false;
+
+ if (val == 36) {
+ switch (getValue(1)) {
+ case 1:
+ return setResponse(getDialogueId(220837), -1);
+ break;
+ case 2:
+ return setResponse(getDialogueId(220849), -1);
+ default:
+ return setResponse(getDialogueId(220858), -1);
+ }
+ } else if (val == 61 && getValue(1) > 2) {
+ return setResponse(getDialogueId(222301), -1);
+ }
+
+ int loopCounter = 0;
+ for (const TThandleQuoteEntry *qe = QUOTES; qe->_index && loopCounter < 2; ++qe) {
+ if (!qe->_index) {
+ // End of list; start at beginning again
+ ++loopCounter;
+ qe = QUOTES;
+ }
+
+ if (qe->_index == val && (
+ (tagId == 0 && loopCounter == 2) ||
+ (qe->_tagId < MKTAG('A', 'A', 'A', 'A')) ||
+ (qe->_tagId == tagId)
+ )) {
+ uint foundTagId = qe->_tagId;
+ if (foundTagId > 0 && foundTagId < 100) {
+ if (!tagId)
+ foundTagId >>= 1;
+ if (getRandomNumber(100) < foundTagId)
+ return 1;
+ }
+
+ uint dialogueId = qe->_dialogueId;
+ if (dialogueId < 1000) {
+ if (dialogueId >= 3)
+ error("Invalid dialogue index in BarbotScript");
+ const int RANDOM_LIMITS[3] = { 30, 50, 70 };
+ int rangeLimit = RANDOM_LIMITS[dialogueId];
+ int dialRegion = getDialRegion(0);
+
+ if (dialRegion != 1) {
+ rangeLimit = MAX(rangeLimit - 20, 20);
+ }
+
+ dialogueId = (((int)remainder + 25) % 100) > rangeLimit ? 221376 : 221375;
+ }
+
+ addResponse(getDialogueId(dialogueId));
+ applyResponse();
+ return 2;
+ }
+ }
+
+ return 1;
}
int BarbotScript::proc21(int v1, int v2, int v3) {
@@ -1152,4 +1256,13 @@ int BarbotScript::applySentenceIds(int dialogueId, int v34) {
return -2;
}
+int BarbotScript::setResponse(int dialogueId, int state) {
+ addResponse(dialogueId);
+ applyResponse();
+
+ if (state != -1)
+ set34(state);
+ return 2;
+}
+
} // End of namespace Titanic
diff --git a/engines/titanic/true_talk/barbot_script.h b/engines/titanic/true_talk/barbot_script.h
index 90f4d951a6..977d0a1d6b 100644
--- a/engines/titanic/true_talk/barbot_script.h
+++ b/engines/titanic/true_talk/barbot_script.h
@@ -46,6 +46,11 @@ private:
bool isState9() const;
int applySentenceIds(int dialogueId, int v34 = -1);
+
+ /**
+ * Add a response and optionally set the state
+ */
+ int setResponse(int dialogueId, int state = -1);
public:
BarbotScript(int val1, const char *charClass, int v2,
const char *charName, int v3, int val2, int v4, int v5, int v6, int v7);
@@ -65,8 +70,8 @@ public:
*/
virtual ScriptChangedResult scriptChanged(TTscriptBase *roomScript, uint id);
- virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const;
+ virtual int handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder);
virtual int proc21(int v1, int v2, int v3);
virtual int proc22(int id) const;
diff --git a/engines/titanic/true_talk/bellbot_script.cpp b/engines/titanic/true_talk/bellbot_script.cpp
index ecb503cdc3..f4a0a3e824 100644
--- a/engines/titanic/true_talk/bellbot_script.cpp
+++ b/engines/titanic/true_talk/bellbot_script.cpp
@@ -70,8 +70,8 @@ int BellbotScript::proc15() const {
return 0;
}
-bool BellbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const {
+int BellbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder) {
switch (tagId) {
case MKTAG('A', 'D', 'V', 'T'):
case MKTAG('A', 'R', 'T', 'I'):
diff --git a/engines/titanic/true_talk/bellbot_script.h b/engines/titanic/true_talk/bellbot_script.h
index e990e322e5..704bce815e 100644
--- a/engines/titanic/true_talk/bellbot_script.h
+++ b/engines/titanic/true_talk/bellbot_script.h
@@ -55,8 +55,8 @@ public:
virtual int proc15() const;
- virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const;
+ virtual int handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder);
virtual int proc21(int v1, int v2, int v3);
virtual int proc22(int id) const;
diff --git a/engines/titanic/true_talk/deskbot_script.cpp b/engines/titanic/true_talk/deskbot_script.cpp
index 28eff25374..a1d205514a 100644
--- a/engines/titanic/true_talk/deskbot_script.cpp
+++ b/engines/titanic/true_talk/deskbot_script.cpp
@@ -65,8 +65,8 @@ ScriptChangedResult DeskbotScript::scriptChanged(TTscriptBase *roomScript, uint
return SCR_1;
}
-bool DeskbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const {
+int DeskbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder) {
switch (tagId) {
case MKTAG('A', 'D', 'V', 'T'):
case MKTAG('A', 'R', 'T', 'I'):
diff --git a/engines/titanic/true_talk/deskbot_script.h b/engines/titanic/true_talk/deskbot_script.h
index 2cc8145684..efe71de7e2 100644
--- a/engines/titanic/true_talk/deskbot_script.h
+++ b/engines/titanic/true_talk/deskbot_script.h
@@ -53,8 +53,8 @@ public:
*/
virtual ScriptChangedResult scriptChanged(TTscriptBase *roomScript, uint id);
- virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const;
+ virtual int handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder);
virtual int proc21(int v1, int v2, int v3);
virtual int proc22(int id) const;
diff --git a/engines/titanic/true_talk/doorbot_script.cpp b/engines/titanic/true_talk/doorbot_script.cpp
index 04530f1491..8ae19666aa 100644
--- a/engines/titanic/true_talk/doorbot_script.cpp
+++ b/engines/titanic/true_talk/doorbot_script.cpp
@@ -139,8 +139,8 @@ ScriptChangedResult DoorbotScript::scriptChanged(TTscriptBase *roomScript, uint
return SCR_1;
}
-bool DoorbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const {
+int DoorbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder) {
warning("TODO");
return 0;
}
diff --git a/engines/titanic/true_talk/doorbot_script.h b/engines/titanic/true_talk/doorbot_script.h
index 3ec4cfb520..3d2fdfdc26 100644
--- a/engines/titanic/true_talk/doorbot_script.h
+++ b/engines/titanic/true_talk/doorbot_script.h
@@ -69,8 +69,8 @@ public:
*/
virtual ScriptChangedResult scriptChanged(TTscriptBase *roomScript, uint id);
- virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const;
+ virtual int handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder);
virtual int proc21(int v1, int v2, int v3);
virtual int proc22(int id) const;
diff --git a/engines/titanic/true_talk/liftbot_script.cpp b/engines/titanic/true_talk/liftbot_script.cpp
index c91bd73f1a..926d96f658 100644
--- a/engines/titanic/true_talk/liftbot_script.cpp
+++ b/engines/titanic/true_talk/liftbot_script.cpp
@@ -96,8 +96,8 @@ ScriptChangedResult LiftbotScript::scriptChanged(TTscriptBase *roomScript, uint
return SCR_1;
}
-bool LiftbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const {
+int LiftbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder) {
warning("TODO");
return 0;
}
diff --git a/engines/titanic/true_talk/liftbot_script.h b/engines/titanic/true_talk/liftbot_script.h
index 03c4eac8f9..ba917f41c2 100644
--- a/engines/titanic/true_talk/liftbot_script.h
+++ b/engines/titanic/true_talk/liftbot_script.h
@@ -66,8 +66,8 @@ public:
*/
virtual ScriptChangedResult scriptChanged(TTscriptBase *roomScript, uint id);
- virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const;
+ virtual int handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder);
virtual int proc21(int v1, int v2, int v3);
virtual int proc22(int id) const;
diff --git a/engines/titanic/true_talk/maitred_script.cpp b/engines/titanic/true_talk/maitred_script.cpp
index a59583c993..891c66167e 100644
--- a/engines/titanic/true_talk/maitred_script.cpp
+++ b/engines/titanic/true_talk/maitred_script.cpp
@@ -73,8 +73,8 @@ ScriptChangedResult MaitreDScript::scriptChanged(TTscriptBase *roomScript, uint
return SCR_1;
}
-bool MaitreDScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const {
+int MaitreDScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder) {
warning("TODO");
return 0;
}
diff --git a/engines/titanic/true_talk/maitred_script.h b/engines/titanic/true_talk/maitred_script.h
index 91732cddc1..178979c614 100644
--- a/engines/titanic/true_talk/maitred_script.h
+++ b/engines/titanic/true_talk/maitred_script.h
@@ -52,8 +52,8 @@ public:
*/
virtual ScriptChangedResult scriptChanged(TTscriptBase *roomScript, uint id);
- virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const;
+ virtual int handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder);
virtual int proc21(int v1, int v2, int v3);
virtual int proc22(int id) const;
diff --git a/engines/titanic/true_talk/script_support.h b/engines/titanic/true_talk/script_support.h
index c87b553367..50576cab85 100644
--- a/engines/titanic/true_talk/script_support.h
+++ b/engines/titanic/true_talk/script_support.h
@@ -125,6 +125,12 @@ public:
void load(const char *name);
};
+struct TThandleQuoteEntry {
+ uint _index;
+ uint _tagId;
+ uint _dialogueId;
+};
+
} // End of namespace Titanic
#endif /* TITANIC_TT_NPC_SCRIPT_H */
diff --git a/engines/titanic/true_talk/tt_npc_script.cpp b/engines/titanic/true_talk/tt_npc_script.cpp
index dde16d15ca..3fc6d0aec1 100644
--- a/engines/titanic/true_talk/tt_npc_script.cpp
+++ b/engines/titanic/true_talk/tt_npc_script.cpp
@@ -266,9 +266,9 @@ bool TTnpcScript::handleWord(uint id) const {
return true;
}
-bool TTnpcScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const {
- return true;
+int TTnpcScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder) {
+ return 1;
}
uint TTnpcScript::getRangeValue(uint id) {
diff --git a/engines/titanic/true_talk/tt_npc_script.h b/engines/titanic/true_talk/tt_npc_script.h
index 111298ca27..bd5b759480 100644
--- a/engines/titanic/true_talk/tt_npc_script.h
+++ b/engines/titanic/true_talk/tt_npc_script.h
@@ -240,8 +240,8 @@ public:
*/
virtual bool handleWord(uint id) const;
- virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence,
- int val, uint tagId, uint remainder) const;
+ virtual int handleQuote(TTroomScript *roomScript, TTsentence *sentence,
+ uint val, uint tagId, uint remainder);
/**
* Given an Id for a previously registered set of random number values,