From 9d92a5a6a468889e39b1b8d4f696fde3769da79c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 5 Jun 2016 21:51:53 -0400 Subject: TITANIC: Fleshing out usage of TTscriptArrayItem in TTnpcScript --- engines/titanic/true_talk/deskbot_script.cpp | 3 +- engines/titanic/true_talk/deskbot_script.h | 3 +- engines/titanic/true_talk/doorbot_script.cpp | 3 +- engines/titanic/true_talk/doorbot_script.h | 3 +- engines/titanic/true_talk/liftbot_script.cpp | 3 +- engines/titanic/true_talk/liftbot_script.h | 4 +- engines/titanic/true_talk/maitred_script.cpp | 3 +- engines/titanic/true_talk/maitred_script.h | 4 +- engines/titanic/true_talk/tt_npc_script.cpp | 85 +++++++++++++++++++++++----- engines/titanic/true_talk/tt_npc_script.h | 33 ++++++++++- engines/titanic/true_talk/tt_quotes_tree.cpp | 2 +- engines/titanic/true_talk/tt_quotes_tree.h | 2 +- 12 files changed, 120 insertions(+), 28 deletions(-) (limited to 'engines') diff --git a/engines/titanic/true_talk/deskbot_script.cpp b/engines/titanic/true_talk/deskbot_script.cpp index ce643f5f38..6edaa142be 100644 --- a/engines/titanic/true_talk/deskbot_script.cpp +++ b/engines/titanic/true_talk/deskbot_script.cpp @@ -57,7 +57,8 @@ int DeskbotScript::proc15() const { return 0; } -bool DeskbotScript::proc16() const { +bool DeskbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence, + int val, uint tagId, uint remainder) const { warning("TODO"); return 0; } diff --git a/engines/titanic/true_talk/deskbot_script.h b/engines/titanic/true_talk/deskbot_script.h index a5fb11e92e..f7a46c99e3 100644 --- a/engines/titanic/true_talk/deskbot_script.h +++ b/engines/titanic/true_talk/deskbot_script.h @@ -36,7 +36,8 @@ public: virtual void proc7(int v1, int v2); virtual int proc10() const; virtual int proc15() const; - virtual bool proc16() const; + virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence, + int val, uint tagId, uint remainder) const; virtual bool proc17() const; virtual bool proc18() const; virtual int proc21(int v1, int v2, int v3); diff --git a/engines/titanic/true_talk/doorbot_script.cpp b/engines/titanic/true_talk/doorbot_script.cpp index 2b248ac601..e65d744605 100644 --- a/engines/titanic/true_talk/doorbot_script.cpp +++ b/engines/titanic/true_talk/doorbot_script.cpp @@ -108,7 +108,8 @@ int DoorbotScript::proc15() const { return 0; } -bool DoorbotScript::proc16() const { +bool DoorbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence, + int val, uint tagId, uint remainder) const { warning("TODO"); return 0; } diff --git a/engines/titanic/true_talk/doorbot_script.h b/engines/titanic/true_talk/doorbot_script.h index 72e24db104..42fcb19fa4 100644 --- a/engines/titanic/true_talk/doorbot_script.h +++ b/engines/titanic/true_talk/doorbot_script.h @@ -48,7 +48,8 @@ public: virtual void proc7(int v1, int v2); virtual int proc10() const; virtual int proc15() const; - virtual bool proc16() const; + virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence, + int val, uint tagId, uint remainder) const; virtual bool proc17() const; virtual bool proc18() const; virtual int proc21(int v1, int v2, int v3); diff --git a/engines/titanic/true_talk/liftbot_script.cpp b/engines/titanic/true_talk/liftbot_script.cpp index 3a64733f2f..63900709dd 100644 --- a/engines/titanic/true_talk/liftbot_script.cpp +++ b/engines/titanic/true_talk/liftbot_script.cpp @@ -84,7 +84,8 @@ int LiftbotScript::proc15() const { return 0; } -bool LiftbotScript::proc16() const { +bool LiftbotScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence, + int val, uint tagId, uint remainder) const { warning("TODO"); return 0; } diff --git a/engines/titanic/true_talk/liftbot_script.h b/engines/titanic/true_talk/liftbot_script.h index 9e2a9ff3f8..b3ab5295d7 100644 --- a/engines/titanic/true_talk/liftbot_script.h +++ b/engines/titanic/true_talk/liftbot_script.h @@ -43,7 +43,9 @@ public: virtual int proc9() const; virtual int proc10() const; virtual int proc15() const; - virtual bool proc16() const; + virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence, + int val, uint tagId, uint remainder) const; + virtual bool proc17() const; virtual bool proc18() const; virtual int proc21(int v1, int v2, int v3); diff --git a/engines/titanic/true_talk/maitred_script.cpp b/engines/titanic/true_talk/maitred_script.cpp index c417940eb7..b13e059d81 100644 --- a/engines/titanic/true_talk/maitred_script.cpp +++ b/engines/titanic/true_talk/maitred_script.cpp @@ -62,7 +62,8 @@ int MaitreDScript::proc10() const { return 0; } -bool MaitreDScript::proc16() const { +bool MaitreDScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence, + int val, uint tagId, uint remainder) const { warning("TODO"); return 0; } diff --git a/engines/titanic/true_talk/maitred_script.h b/engines/titanic/true_talk/maitred_script.h index 389e3887ab..05c16ecde5 100644 --- a/engines/titanic/true_talk/maitred_script.h +++ b/engines/titanic/true_talk/maitred_script.h @@ -39,7 +39,9 @@ public: virtual void proc7(int v1, int v2); virtual int proc10() const; - virtual bool proc16() const; + virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence, + int val, uint tagId, uint remainder) const; + virtual bool proc17() const; virtual bool proc18() const; virtual int proc21(int v1, int v2, int v3); diff --git a/engines/titanic/true_talk/tt_npc_script.cpp b/engines/titanic/true_talk/tt_npc_script.cpp index 86494e8d3c..40e95e5d97 100644 --- a/engines/titanic/true_talk/tt_npc_script.cpp +++ b/engines/titanic/true_talk/tt_npc_script.cpp @@ -40,6 +40,17 @@ int TTnpcScriptResponse::size() const { /*------------------------------------------------------------------------*/ +TTscriptArrayItem::TTscriptArrayItem(uint id, const uint *arrayP, bool flag1, bool flag2) : + _id(id), _arrayP(arrayP), _nextP(nullptr) { + _flags = 0; + if (flag1) + _flags |= SF_1; + if (flag2) + _flags |= SF_2; +} + +/*------------------------------------------------------------------------*/ + 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), @@ -51,9 +62,8 @@ TTnpcScriptBase::TTnpcScriptBase(int charId, const char *charClass, int v2, TTnpcScript::TTnpcScript(int charId, const char *charClass, int v2, const char *charName, int v3, int val2, int v4, int v5, int v6, int v7) : TTnpcScriptBase(charId, charClass, v2, charName, v3, val2, v4, v5, v6, v7), - _subPtr(nullptr), _entriesP(nullptr), _entryCount(0), _field68(0), - _field6C(0), _field70(0), _field74(0), _field78(0), - _field7C(0), _field80(0), _field2CC(false) { + _entriesP(nullptr), _entryCount(0), _field68(0), _field6C(0), _field70(0), + _field74(0), _field78(0), _field7C(0), _field80(0), _field2CC(false) { CTrueTalkManager::_v2 = 0; Common::fill(&_dialValues[0], &_dialValues[DIALS_ARRAY_COUNT], 0); Common::fill(&_array[0], &_array[136], 0); @@ -136,7 +146,6 @@ int TTnpcScript::proc12() const { return 1; } - bool TTnpcScript::loadQuotes() { // Original did a load of a global quotes here the first time // this method is called. ScummVM implementation has refactored @@ -160,7 +169,8 @@ int TTnpcScript::proc15() const { return 0; } -bool TTnpcScript::proc16() const { +bool TTnpcScript::handleQuote(TTroomScript *roomScript, TTsentence *sentence, + int val, uint tagId, uint remainder) const { return true; } @@ -240,8 +250,14 @@ void TTnpcScript::saveBody(SimpleFile *file) { int v = proc31(); file->writeNumber(v); - if (v > 0 && _subPtr) { - warning("TODO"); + if (v > 0) { + for (uint idx = 0; idx < _arrayItems.size(); ++idx) { + const TTscriptArrayItem &item = _arrayItems[idx]; + if (item._flags == SF_1 && item._val) { + file->writeNumber(item._id); + file->writeNumber(item._val); + } + } } } @@ -252,15 +268,25 @@ void TTnpcScript::loadBody(SimpleFile *file) { for (int index = 0; index < count; index += 2) { int v = file->readNumber(); - if (_subPtr) { - error("TODO - %d", v); + for (uint idx = 0; idx < _arrayItems.size(); ++idx) { + TTscriptArrayItem &item = _arrayItems[idx]; + if (!item._id) { + item._id = v; + break; + } } } } -int TTnpcScript::proc31() { - warning("TODO"); - return 0; +int TTnpcScript::proc31() const { + int count = 0; + for (uint idx = 0; idx < _arrayItems.size(); ++idx) { + const TTscriptArrayItem &item = _arrayItems[idx]; + if (item._flags != SF_1 && item._val) + ++count; + } + + return count * 2; } void TTnpcScript::setDialRegion(int dialNum, int region) { @@ -325,9 +351,8 @@ uint TTnpcScript::translateId(uint id) const { } void TTnpcScript::preLoad() { - if (_subPtr) { - error("TODO"); - } + for (uint idx = 0; idx < _arrayItems.size(); ++idx) + _arrayItems[idx]._val = 0; } int TTnpcScript::getRoom54(int roomId) { @@ -535,4 +560,34 @@ int TTnpcScript::processSentence(const TTsentenceEntries *entries, uint entryCou return 1; } +bool TTnpcScript::defaultProcess(TTroomScript *roomScript, TTsentence *sentence) { + uint remainder; + TTtreeResult results[32]; + const TTstring &line = sentence->_normalizedLine; + + uint tagId = g_vm->_trueTalkManager->_quotes.find(line.c_str()); + int val = g_vm->_trueTalkManager->_quotesTree.search(line.c_str(), TREE_1, results, tagId, &remainder); + + if (val > 0) { + if (!handleQuote(roomScript, sentence, val, tagId, remainder)) + return true; + } + + // TODO + return false; +} + +void TTnpcScript::addArrayItem(uint id, const uint *arrayP, bool flag1, bool flag2) { + _arrayItems.push_back(TTscriptArrayItem(id, arrayP, flag1, flag2)); +} + +TTscriptArrayItem *TTnpcScript::findArrayItem(uint id) { + for (uint idx = 0; idx < _arrayItems.size(); ++idx) { + if (_arrayItems[idx]._id == id) + return &_arrayItems[idx]; + } + + return nullptr; +} + } // 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 7362d4db87..2dd721e61a 100644 --- a/engines/titanic/true_talk/tt_npc_script.h +++ b/engines/titanic/true_talk/tt_npc_script.h @@ -30,6 +30,8 @@ namespace Titanic { #define DIALS_ARRAY_COUNT 10 +enum ScriptArrayFlag { SF_1 = 1, SF_2 = 2 }; + class CGameManager; class CPetControl; class TTroomScript; @@ -47,6 +49,18 @@ struct TTnpcScriptResponse { int size() const; }; +struct TTscriptArrayItem { + uint _id; + const uint *_arrayP; + TTscriptArrayItem *_nextP; + uint _val; + int _flags; + + TTscriptArrayItem() : _id(0), _arrayP(nullptr), _nextP(nullptr), + _val(0), _flags(0) {} + TTscriptArrayItem(uint id, const uint *arrayP, bool flag1, bool flag2); +}; + class TTnpcScriptBase : public TTscriptBase { protected: int _field54; @@ -84,7 +98,7 @@ private: protected: Common::Array _responses; int _valuesPerResponse; - byte *_subPtr; + Common::Array _arrayItems; const TTsentenceEntries *_entriesP; int _entryCount; int _field68; @@ -139,7 +153,19 @@ protected: */ static CPetControl *getPetControl(CGameManager *gameManager); + /** + * Adds a new item to the entries list + */ + void addArrayItem(uint id, const uint *arrayP, bool flag1, bool flag2); + + /** + * Finds an array item by Id + */ + TTscriptArrayItem *findArrayItem(uint id); + int processSentence(const TTsentenceEntries *entries, uint entryCount, TTroomScript *roomScript, TTsentence *sentence); + + bool defaultProcess(TTroomScript *roomScript, TTsentence *sentence); public: TTnpcScript(int charId, const char *charClass, int v2, const char *charName, int v3, int val2, int v4, @@ -184,7 +210,8 @@ public: virtual void selectResponse(int id); virtual int proc15() const; - virtual bool proc16() const; + virtual bool handleQuote(TTroomScript *roomScript, TTsentence *sentence, + int val, uint tagId, uint remainder) const; virtual bool proc17() const; virtual bool proc18() const; virtual uint proc19(uint v); @@ -199,7 +226,7 @@ public: virtual void load(SimpleFile *file); virtual void saveBody(SimpleFile *file); virtual void loadBody(SimpleFile *file); - virtual int proc31(); + virtual int proc31() const; /** * Sets a given dial to be pointing in a specified region (0 to 2) diff --git a/engines/titanic/true_talk/tt_quotes_tree.cpp b/engines/titanic/true_talk/tt_quotes_tree.cpp index 8641ab9a1d..1f073b83f2 100644 --- a/engines/titanic/true_talk/tt_quotes_tree.cpp +++ b/engines/titanic/true_talk/tt_quotes_tree.cpp @@ -60,7 +60,7 @@ void TTquotesTree::load() { } int TTquotesTree::search(const char *str, QuoteTreeNum treeNum, - TTtreeResult *buffer, uint tagId, int *remainder) { + TTtreeResult *buffer, uint tagId, uint *remainder) { const TTquotesTreeEntry *bTree = &_entries[TABLE_INDEXES[treeNum]]; if (!search1(&str, bTree, buffer, tagId) || !buffer->_treeItemP) return -1; diff --git a/engines/titanic/true_talk/tt_quotes_tree.h b/engines/titanic/true_talk/tt_quotes_tree.h index fa0e9edf2a..d7ca798ae8 100644 --- a/engines/titanic/true_talk/tt_quotes_tree.h +++ b/engines/titanic/true_talk/tt_quotes_tree.h @@ -76,7 +76,7 @@ public: void load(); int search(const char *str, QuoteTreeNum treeNum, - TTtreeResult *buffer, uint tagId, int *remainder); + TTtreeResult *buffer, uint tagId, uint *remainder); }; } // End of namespace Titanic -- cgit v1.2.3