diff options
-rw-r--r-- | engines/titanic/true_talk/barbot_script.cpp | 11 | ||||
-rw-r--r-- | engines/titanic/true_talk/barbot_script.h | 11 | ||||
-rw-r--r-- | engines/titanic/true_talk/bellbot_script.cpp | 11 | ||||
-rw-r--r-- | engines/titanic/true_talk/bellbot_script.h | 10 | ||||
-rw-r--r-- | engines/titanic/true_talk/deskbot_script.cpp | 27 | ||||
-rw-r--r-- | engines/titanic/true_talk/deskbot_script.h | 13 | ||||
-rw-r--r-- | engines/titanic/true_talk/doorbot_script.cpp | 11 | ||||
-rw-r--r-- | engines/titanic/true_talk/doorbot_script.h | 10 | ||||
-rw-r--r-- | engines/titanic/true_talk/liftbot_script.cpp | 9 | ||||
-rw-r--r-- | engines/titanic/true_talk/liftbot_script.h | 8 | ||||
-rw-r--r-- | engines/titanic/true_talk/maitred_script.cpp | 9 | ||||
-rw-r--r-- | engines/titanic/true_talk/maitred_script.h | 8 | ||||
-rw-r--r-- | engines/titanic/true_talk/parrot_script.cpp | 5 | ||||
-rw-r--r-- | engines/titanic/true_talk/parrot_script.h | 4 | ||||
-rw-r--r-- | engines/titanic/true_talk/succubus_script.cpp | 7 | ||||
-rw-r--r-- | engines/titanic/true_talk/succubus_script.h | 6 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_npc_script.cpp | 104 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_npc_script.h | 35 |
18 files changed, 217 insertions, 82 deletions
diff --git a/engines/titanic/true_talk/barbot_script.cpp b/engines/titanic/true_talk/barbot_script.cpp index ab4fbb2384..2bb3a1876f 100644 --- a/engines/titanic/true_talk/barbot_script.cpp +++ b/engines/titanic/true_talk/barbot_script.cpp @@ -25,7 +25,7 @@ namespace Titanic { -int BarbotScript::proc6() const { +int BarbotScript::proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag) { warning("TODO"); return 2; } @@ -59,7 +59,7 @@ bool BarbotScript::proc18() const { return false; } -int BarbotScript::proc21(int v) { +int BarbotScript::proc21(int v1, int v2, int v3) { warning("TODO"); return 0; } @@ -74,8 +74,9 @@ int BarbotScript::proc23() const { return 0; } -void BarbotScript::proc24() { +const int *BarbotScript::getTablePtr(int id) { warning("TODO"); + return nullptr; } int BarbotScript::proc25() const { @@ -90,12 +91,12 @@ void BarbotScript::proc32() { warning("TODO"); } -int BarbotScript::proc36() const { +int BarbotScript::proc36(int tagId) const { warning("TODO"); return 0; } -int BarbotScript::proc37() const { +uint BarbotScript::translateId(uint id) const { warning("TODO"); return 0; } diff --git a/engines/titanic/true_talk/barbot_script.h b/engines/titanic/true_talk/barbot_script.h index ac074e2b94..a55c12bc71 100644 --- a/engines/titanic/true_talk/barbot_script.h +++ b/engines/titanic/true_talk/barbot_script.h @@ -33,22 +33,23 @@ public: 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) {} - virtual int proc6() const; + virtual int proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag); virtual void proc7(int v1, int v2); virtual int proc10() const; virtual int proc15() const; virtual bool proc16() const; virtual bool proc17() const; virtual bool proc18() const; - virtual int proc21(int v); + virtual int proc21(int v1, int v2, int v3); virtual int proc22() const; virtual int proc23() const; - virtual void proc24(); + virtual const int *getTablePtr(int id); virtual int proc25() const; virtual void proc26(); virtual void proc32(); - virtual int proc36() const; - virtual int proc37() const; + virtual int proc36(int val) const; + + virtual uint translateId(uint id) const; }; } // End of namespace Titanic diff --git a/engines/titanic/true_talk/bellbot_script.cpp b/engines/titanic/true_talk/bellbot_script.cpp index ccd83d011f..794e67130f 100644 --- a/engines/titanic/true_talk/bellbot_script.cpp +++ b/engines/titanic/true_talk/bellbot_script.cpp @@ -40,7 +40,7 @@ BellbotScript::BellbotScript(int val1, const char *charClass, int v2, _array[1] = 0; } -int BellbotScript::proc6() const { +int BellbotScript::proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag) { warning("TODO"); return 2; } @@ -74,7 +74,7 @@ bool BellbotScript::proc18() const { return 0; } -int BellbotScript::proc21(int v) { +int BellbotScript::proc21(int v1, int v2, int v3) { warning("TODO"); return 0; } @@ -89,8 +89,9 @@ int BellbotScript::proc23() const { return 0; } -void BellbotScript::proc24() { +const int *BellbotScript::getTablePtr(int id) { warning("TODO"); + return nullptr; } int BellbotScript::proc25() const { @@ -101,12 +102,12 @@ int BellbotScript::proc25() const { void BellbotScript::proc26() { } -int BellbotScript::proc36() const { +int BellbotScript::proc36(int id) const { warning("TODO"); return 0; } -int BellbotScript::proc37() const { +uint BellbotScript::translateId(uint id) const { warning("TODO"); return 0; } diff --git a/engines/titanic/true_talk/bellbot_script.h b/engines/titanic/true_talk/bellbot_script.h index d759583513..d7fbab3a8f 100644 --- a/engines/titanic/true_talk/bellbot_script.h +++ b/engines/titanic/true_talk/bellbot_script.h @@ -38,21 +38,21 @@ public: BellbotScript(int val1, const char *charClass, int v2, const char *charName, int v3, int val2); - virtual int proc6() const; + virtual int proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag); virtual void proc7(int v1, int v2); virtual int proc10() const; virtual int proc15() const; virtual bool proc16() const; virtual bool proc17() const; virtual bool proc18() const; - virtual int proc21(int v); + virtual int proc21(int v1, int v2, int v3); virtual int proc22() const; virtual int proc23() const; - virtual void proc24(); + virtual const int *getTablePtr(int id); virtual int proc25() const; virtual void proc26(); - virtual int proc36() const; - virtual int proc37() const; + virtual int proc36(int val) const; + virtual uint translateId(uint id) const; }; } // End of namespace Titanic diff --git a/engines/titanic/true_talk/deskbot_script.cpp b/engines/titanic/true_talk/deskbot_script.cpp index 65a13b5ce1..dbe2664e99 100644 --- a/engines/titanic/true_talk/deskbot_script.cpp +++ b/engines/titanic/true_talk/deskbot_script.cpp @@ -41,9 +41,21 @@ DeskbotScript::DeskbotScript(int val1, const char *charClass, int v2, _field74 = 0; } -int DeskbotScript::proc6() const { - warning("TODO"); - return 2; +int DeskbotScript::proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag) { + for (uint idx = 0; idx < _tags.size(); ++idx) { + const TTnpcScriptTag &scriptTag = _tags[idx]; + uint currTag = (idx == 0) ? MKTAG('P', 'K', 'U', 'P') : scriptTag._tag; + + if (currTag == tag) { + int valIndex = getRandomNumber(scriptTag.size()) - 1; + uint diagId = getDialogueId(scriptTag._values[valIndex]); + addResponse(diagId); + applyResponse(); + break; + } + } + + return SS_1; } void DeskbotScript::proc7(int v1, int v2) { @@ -75,7 +87,7 @@ bool DeskbotScript::proc18() const { return 0; } -int DeskbotScript::proc21(int v) { +int DeskbotScript::proc21(int v1, int v2, int v3) { warning("TODO"); return 0; } @@ -90,8 +102,9 @@ int DeskbotScript::proc23() const { return 0; } -void DeskbotScript::proc24() { +const int *DeskbotScript::getTablePtr(int id) { warning("TODO"); + return nullptr; } int DeskbotScript::proc25() const { @@ -102,12 +115,12 @@ int DeskbotScript::proc25() const { void DeskbotScript::proc26() { } -int DeskbotScript::proc36() const { +int DeskbotScript::proc36(int id) const { warning("TODO"); return 0; } -int DeskbotScript::proc37() const { +uint DeskbotScript::translateId(uint id) const { warning("TODO"); return 0; } diff --git a/engines/titanic/true_talk/deskbot_script.h b/engines/titanic/true_talk/deskbot_script.h index 8db1a80a9c..f2de881777 100644 --- a/engines/titanic/true_talk/deskbot_script.h +++ b/engines/titanic/true_talk/deskbot_script.h @@ -23,30 +23,33 @@ #ifndef TITANIC_DESKBOT_SCRIPT_H #define TITANIC_DESKBOT_SCRIPT_H +#include "common/array.h" #include "titanic/true_talk/tt_npc_script.h" namespace Titanic { class DeskbotScript : public TTnpcScript { +private: + Common::Array<TTnpcScriptTag> _tags; public: DeskbotScript(int val1, const char *charClass, int v2, const char *charName, int v3, int val2); - virtual int proc6() const; + virtual int proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag); virtual void proc7(int v1, int v2); virtual int proc10() const; virtual int proc15() const; virtual bool proc16() const; virtual bool proc17() const; virtual bool proc18() const; - virtual int proc21(int v); + virtual int proc21(int v1, int v2, int v3); virtual int proc22() const; virtual int proc23() const; - virtual void proc24(); + virtual const int *getTablePtr(int id); virtual int proc25() const; virtual void proc26(); - virtual int proc36() const; - virtual int proc37() const; + virtual int proc36(int val) const; + virtual uint translateId(uint id) const; virtual void proc38(); virtual void proc39(); diff --git a/engines/titanic/true_talk/doorbot_script.cpp b/engines/titanic/true_talk/doorbot_script.cpp index 43b9e46335..9d35f697f9 100644 --- a/engines/titanic/true_talk/doorbot_script.cpp +++ b/engines/titanic/true_talk/doorbot_script.cpp @@ -25,7 +25,7 @@ namespace Titanic { -int DoorbotScript::proc6() const { +int DoorbotScript::proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag) { warning("TODO"); return 2; } @@ -59,7 +59,7 @@ bool DoorbotScript::proc18() const { return 0; } -int DoorbotScript::proc21(int v) { +int DoorbotScript::proc21(int v1, int v2, int v3) { warning("TODO"); return 0; } @@ -74,8 +74,9 @@ int DoorbotScript::proc23() const { return 0; } -void DoorbotScript::proc24() { +const int *DoorbotScript::getTablePtr(int id) { warning("TODO"); + return nullptr; } int DoorbotScript::proc25() const { @@ -90,12 +91,12 @@ void DoorbotScript::proc32() { warning("TODO"); } -int DoorbotScript::proc36() const { +int DoorbotScript::proc36(int id) const { warning("TODO"); return 0; } -int DoorbotScript::proc37() const { +uint DoorbotScript::translateId(uint id) const { warning("TODO"); return 0; } diff --git a/engines/titanic/true_talk/doorbot_script.h b/engines/titanic/true_talk/doorbot_script.h index c812d3129a..82897b7bfc 100644 --- a/engines/titanic/true_talk/doorbot_script.h +++ b/engines/titanic/true_talk/doorbot_script.h @@ -35,22 +35,22 @@ public: 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) {} - virtual int proc6() const; + virtual int proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag); virtual void proc7(int v1, int v2); virtual int proc10() const; virtual int proc15() const; virtual bool proc16() const; virtual bool proc17() const; virtual bool proc18() const; - virtual int proc21(int v); + virtual int proc21(int v1, int v2, int v3); virtual int proc22() const; virtual int proc23() const; - virtual void proc24(); + virtual const int *getTablePtr(int id); virtual int proc25() const; virtual void proc26(); virtual void proc32(); - virtual int proc36() const; - virtual int proc37() const; + virtual int proc36(int val) const; + virtual uint translateId(uint id) const; }; } // End of namespace Titanic diff --git a/engines/titanic/true_talk/liftbot_script.cpp b/engines/titanic/true_talk/liftbot_script.cpp index c30d226c89..b1577b3979 100644 --- a/engines/titanic/true_talk/liftbot_script.cpp +++ b/engines/titanic/true_talk/liftbot_script.cpp @@ -25,7 +25,7 @@ namespace Titanic { -int LiftbotScript::proc6() const { +int LiftbotScript::proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag) { warning("TODO"); return 2; } @@ -64,7 +64,7 @@ bool LiftbotScript::proc18() const { return 0; } -int LiftbotScript::proc21(int v) { +int LiftbotScript::proc21(int v1, int v2, int v3) { warning("TODO"); return 0; } @@ -79,8 +79,9 @@ int LiftbotScript::proc23() const { return 0; } -void LiftbotScript::proc24() { +const int *LiftbotScript::getTablePtr(int id) { warning("TODO"); + return nullptr; } int LiftbotScript::proc25() const { @@ -95,7 +96,7 @@ void LiftbotScript::proc32() { warning("TODO"); } -int LiftbotScript::proc37() const { +uint LiftbotScript::translateId(uint id) const { warning("TODO"); return 0; } diff --git a/engines/titanic/true_talk/liftbot_script.h b/engines/titanic/true_talk/liftbot_script.h index 7bb355a666..8c2ae3210c 100644 --- a/engines/titanic/true_talk/liftbot_script.h +++ b/engines/titanic/true_talk/liftbot_script.h @@ -33,7 +33,7 @@ public: 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) {} - virtual int proc6() const; + virtual int proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag); virtual void proc7(int v1, int v2); virtual int proc9() const; virtual int proc10() const; @@ -41,14 +41,14 @@ public: virtual bool proc16() const; virtual bool proc17() const; virtual bool proc18() const; - virtual int proc21(int v); + virtual int proc21(int v1, int v2, int v3); virtual int proc22() const; virtual int proc23() const; - virtual void proc24(); + virtual const int *getTablePtr(int id); virtual int proc25() const; virtual void proc26(); virtual void proc32(); - virtual int proc37() const; + virtual uint translateId(uint id) const; }; } // End of namespace Titanic diff --git a/engines/titanic/true_talk/maitred_script.cpp b/engines/titanic/true_talk/maitred_script.cpp index 35f1efa68c..5581c6b605 100644 --- a/engines/titanic/true_talk/maitred_script.cpp +++ b/engines/titanic/true_talk/maitred_script.cpp @@ -39,7 +39,7 @@ MaitreDScript::MaitreDScript(int val1, const char *charClass, int v2, CTrueTalkManager::setFlags(16, 0); } -int MaitreDScript::proc6() const { +int MaitreDScript::proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag) { warning("TODO"); return 2; } @@ -68,7 +68,7 @@ bool MaitreDScript::proc18() const { return 0; } -int MaitreDScript::proc21(int v) { +int MaitreDScript::proc21(int v1, int v2, int v3) { warning("TODO"); return 0; } @@ -83,8 +83,9 @@ int MaitreDScript::proc23() const { return 0; } -void MaitreDScript::proc24() { +const int *MaitreDScript::getTablePtr(int id) { warning("TODO"); + return nullptr; } int MaitreDScript::proc25() const { @@ -95,7 +96,7 @@ int MaitreDScript::proc25() const { void MaitreDScript::proc26() { } -int MaitreDScript::proc37() const { +uint MaitreDScript::translateId(uint id) const { warning("TODO"); return 0; } diff --git a/engines/titanic/true_talk/maitred_script.h b/engines/titanic/true_talk/maitred_script.h index bd3e440ea9..14505ca616 100644 --- a/engines/titanic/true_talk/maitred_script.h +++ b/engines/titanic/true_talk/maitred_script.h @@ -32,19 +32,19 @@ public: MaitreDScript(int val1, const char *charClass, int v2, const char *charName, int v3, int val2); - virtual int proc6() const; + virtual int proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag); virtual void proc7(int v1, int v2); virtual int proc10() const; virtual bool proc16() const; virtual bool proc17() const; virtual bool proc18() const; - virtual int proc21(int v); + virtual int proc21(int v1, int v2, int v3); virtual int proc22() const; virtual int proc23() const; - virtual void proc24(); + virtual const int *getTablePtr(int id); virtual int proc25() const; virtual void proc26(); - virtual int proc37() const; + virtual uint translateId(uint id) const; }; } // End of namespace Titanic diff --git a/engines/titanic/true_talk/parrot_script.cpp b/engines/titanic/true_talk/parrot_script.cpp index e97d32dd30..a6b37bfc57 100644 --- a/engines/titanic/true_talk/parrot_script.cpp +++ b/engines/titanic/true_talk/parrot_script.cpp @@ -25,7 +25,7 @@ namespace Titanic { -int ParrotScript::proc6() const { +int ParrotScript::proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag) { warning("TODO"); return 2; } @@ -54,8 +54,9 @@ int ParrotScript::proc23() const { return 0; } -void ParrotScript::proc24() { +const int *ParrotScript::getTablePtr(int id) { warning("TODO"); + return nullptr; } int ParrotScript::proc25() const { diff --git a/engines/titanic/true_talk/parrot_script.h b/engines/titanic/true_talk/parrot_script.h index 246ceb4234..0add5d9dfe 100644 --- a/engines/titanic/true_talk/parrot_script.h +++ b/engines/titanic/true_talk/parrot_script.h @@ -33,13 +33,13 @@ public: 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) {} - virtual int proc6() const; + virtual int proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag); virtual void proc7(int v1, int v2); virtual int proc10() const; virtual bool proc17() const; virtual bool proc18() const; virtual int proc23() const; - virtual void proc24(); + virtual const int *getTablePtr(int id); virtual int proc25() const; virtual void proc26(); }; diff --git a/engines/titanic/true_talk/succubus_script.cpp b/engines/titanic/true_talk/succubus_script.cpp index 0c1f6700ee..436b779432 100644 --- a/engines/titanic/true_talk/succubus_script.cpp +++ b/engines/titanic/true_talk/succubus_script.cpp @@ -25,7 +25,7 @@ namespace Titanic { -int SuccUBusScript::proc6() const { +int SuccUBusScript::proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag) { warning("TODO"); return 2; } @@ -49,7 +49,7 @@ bool SuccUBusScript::proc18() const { return 0; } -int SuccUBusScript::proc21(int v) { +int SuccUBusScript::proc21(int v1, int v2, int v3) { warning("TODO"); return 0; } @@ -59,8 +59,9 @@ int SuccUBusScript::proc23() const { return 0; } -void SuccUBusScript::proc24() { +const int *SuccUBusScript::getTablePtr(int id) { warning("TODO"); + return nullptr; } int SuccUBusScript::proc25() const { diff --git a/engines/titanic/true_talk/succubus_script.h b/engines/titanic/true_talk/succubus_script.h index 6917d0a8b1..8a078c2639 100644 --- a/engines/titanic/true_talk/succubus_script.h +++ b/engines/titanic/true_talk/succubus_script.h @@ -36,14 +36,14 @@ public: TTnpcScript(val1, charClass, v2, charName, v3, val2, v4, v5, v6, v7), _field2D0(0) {} - virtual int proc6() const; + virtual int proc6(TTnpcScript *npcScript, TTsentence *sentence, uint tag); virtual void proc7(int v1, int v2); virtual int proc10() const; virtual bool proc17() const; virtual bool proc18() const; - virtual int proc21(int v); + virtual int proc21(int v1, int v2, int v3); virtual int proc23() const; - virtual void proc24(); + virtual const int *getTablePtr(int id); virtual int proc25() const; virtual void proc26(); }; diff --git a/engines/titanic/true_talk/tt_npc_script.cpp b/engines/titanic/true_talk/tt_npc_script.cpp index 7020794d1a..bbd75a4854 100644 --- a/engines/titanic/true_talk/tt_npc_script.cpp +++ b/engines/titanic/true_talk/tt_npc_script.cpp @@ -27,6 +27,17 @@ namespace Titanic { +int TTnpcScriptTag::size() const { + for (int idx = 0; idx < 4; ++idx) { + if (_values[idx] == 0) + return idx; + } + + return 4; +} + +/*------------------------------------------------------------------------*/ + TTnpcScriptBase::TTnpcScriptBase(int charId, const char *charClass, int v2, const char *charName, int v3, int val2, int v4, int v5, int v6, int v7) : TTscriptBase(0, charClass, v2, charName, v3, v4, v5, v6, v7), @@ -40,9 +51,9 @@ TTnpcScript::TTnpcScript(int charId, const char *charClass, int v2, TTnpcScriptBase(charId, charClass, v2, charName, v3, val2, v4, v5, v6, v7), _subPtr(nullptr), _field60(0), _field64(0), _field68(0), _field6C(0), _field70(0), _field74(0), _field78(0), - _field7C(0), _field80(0) { + _field7C(0), _field80(0), _field2CC(false) { CTrueTalkManager::_v2 = 0; - Common::fill(&_array[0], &_array[147], 0); + Common::fill(&_array[0], &_array[146], 0); if (!CTrueTalkManager::_v10) { Common::fill(&CTrueTalkManager::_v11[0], &CTrueTalkManager::_v11[41], 0); @@ -53,7 +64,8 @@ TTnpcScript::TTnpcScript(int charId, const char *charClass, int v2, } void TTnpcScript::resetFlags() { - Common::fill(&_array[26], &_array[146], 0); + Common::fill(&_array[20], &_array[140], 0); + _field2CC = false; } void TTnpcScript::randomizeFlags() { @@ -109,16 +121,18 @@ bool TTnpcScript::proc18() const { return true; } -void TTnpcScript::proc19(int v) { +uint TTnpcScript::proc19(uint v) { warning("TODO"); + return 0; } void TTnpcScript::proc20(int v) { warning("TODO"); } -int TTnpcScript::proc21(int v) { - return v; +int TTnpcScript::proc21(int v1, int v2, int v3) { + // TODO + return v1; } int TTnpcScript::proc22() const { @@ -216,11 +230,11 @@ int TTnpcScript::getDialLevel(uint dialNum, bool flag) { return 0; } -int TTnpcScript::proc36() const { +int TTnpcScript::proc36(int id) const { return 0; } -int TTnpcScript::proc37() const { +uint TTnpcScript::translateId(uint id) const { return 0; } @@ -284,4 +298,78 @@ int TTnpcScript::getValue(int testNum) { } } +uint TTnpcScript::getRandomNumber(int max) const { + return 1 + g_vm->getRandomNumber(max - 1); +} + +uint TTnpcScript::getDialogueId(uint tagId) { + if (tagId < 200000) + return tagId; + + // Perform any script specific translation + uint origId = tagId; + if (tagId >= 290000 && tagId <= 290263) + tagId = translateId(tagId); + if (!tagId) + return 0; + + if (!_field2CC) { + _field2CC = true; + int val = translateByArray(tagId); + if (val > 0) { + if (proc36(val)) + return 4; + } + } + + uint oldTagId = tagId; + tagId = proc19(tagId); + if (tagId != oldTagId) + tagId = proc19(tagId); + + oldTagId = proc23(); + int v21 = proc21(origId, tagId, oldTagId); + if (!v21) + return 0; + + int idx = 0; + const int *tableP; + for (;;) { + tableP = getTablePtr(idx++); + if (!tableP) + return 0; + + if (*tableP == v21) + break; + } + uint newVal = tableP[oldTagId + 1]; + + idx = 0; + int *arrP = &_array[26]; + while (idx < 4 && arrP[idx]) + ++idx; + if (idx == 4) + return newVal; + + _array[26] = origId; + idx = 0; + arrP = &_array[30]; + while (idx < 4 && arrP[idx]) + ++idx; + if (idx == 4) + return newVal; + + arrP[idx] = newVal; + return newVal; +} + +int TTnpcScript::translateByArray(int id) { + for (uint idx = 1, arrIndex = 35; idx < 15; ++idx, arrIndex += 8) { + if (_array[idx - 1] == id && _array[idx] == 0) + return idx; + } + + return -1; +} + } // End of namespace Titanic diff --git a/engines/titanic/true_talk/tt_npc_script.h b/engines/titanic/true_talk/tt_npc_script.h index 833a958249..d52da2ed73 100644 --- a/engines/titanic/true_talk/tt_npc_script.h +++ b/engines/titanic/true_talk/tt_npc_script.h @@ -31,6 +31,16 @@ namespace Titanic { class TTroomScript; class TTsentence; +struct TTnpcScriptTag { + uint _tag; + uint _values[4]; + + /** + * Returns the size of the values list plus 1 + */ + int size() const; +}; + class TTnpcScriptBase : public TTscriptBase { protected: int _field54; @@ -59,6 +69,8 @@ public: }; class TTnpcScript : public TTnpcScriptBase { +private: + int translateByArray(int id); protected: byte *_subPtr; int _field60; @@ -70,7 +82,8 @@ protected: int _field78; int _field7C; int _field80; - int _array[147]; + int _array[146]; + bool _field2CC; protected: void resetFlags(); @@ -82,6 +95,16 @@ protected: * Perform test on various state values */ int getValue(int testNum); + + /** + * Gets a random number between 1 and a given max + */ + uint getRandomNumber(int max) const; + + /** + * Returns a dialogue Id by script tag value Id + */ + uint getDialogueId(uint tagId); public: TTnpcScript(int charId, const char *charClass, int v2, const char *charName, int v3, int val2, int v4, @@ -108,12 +131,12 @@ public: virtual bool proc16() const; virtual bool proc17() const; virtual bool proc18() const; - virtual void proc19(int v); + virtual uint proc19(uint v); virtual void proc20(int v); - virtual int proc21(int v); + virtual int proc21(int v1, int v2, int v3); virtual int proc22() const; virtual int proc23() const; - virtual void proc24() = 0; + virtual const int *getTablePtr(int id) = 0; virtual int proc25() const; virtual void proc26(); virtual void save(SimpleFile *file); @@ -130,8 +153,8 @@ public: */ virtual int getDialLevel(uint dialNum, bool flag = true); - virtual int proc36() const; - virtual int proc37() const; + virtual int proc36(int val) const; + virtual uint translateId(uint id) const; void preLoad(); |