diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/titanic/true_talk/barbot_script.cpp | 123 | ||||
-rw-r--r-- | engines/titanic/true_talk/barbot_script.h | 9 | ||||
-rw-r--r-- | engines/titanic/true_talk/bellbot_script.cpp | 4 | ||||
-rw-r--r-- | engines/titanic/true_talk/bellbot_script.h | 4 | ||||
-rw-r--r-- | engines/titanic/true_talk/deskbot_script.cpp | 4 | ||||
-rw-r--r-- | engines/titanic/true_talk/deskbot_script.h | 4 | ||||
-rw-r--r-- | engines/titanic/true_talk/doorbot_script.cpp | 4 | ||||
-rw-r--r-- | engines/titanic/true_talk/doorbot_script.h | 4 | ||||
-rw-r--r-- | engines/titanic/true_talk/liftbot_script.cpp | 4 | ||||
-rw-r--r-- | engines/titanic/true_talk/liftbot_script.h | 4 | ||||
-rw-r--r-- | engines/titanic/true_talk/maitred_script.cpp | 4 | ||||
-rw-r--r-- | engines/titanic/true_talk/maitred_script.h | 4 | ||||
-rw-r--r-- | engines/titanic/true_talk/script_support.h | 6 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_npc_script.cpp | 6 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_npc_script.h | 4 |
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, |