aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2016-06-05 21:51:53 -0400
committerPaul Gilbert2016-07-15 19:20:11 -0400
commit9d92a5a6a468889e39b1b8d4f696fde3769da79c (patch)
tree76d1842faac860553e53e8ef5f95629a6807e021
parent289856dce3868de36c985f1df94ce3d1f3bff99b (diff)
downloadscummvm-rg350-9d92a5a6a468889e39b1b8d4f696fde3769da79c.tar.gz
scummvm-rg350-9d92a5a6a468889e39b1b8d4f696fde3769da79c.tar.bz2
scummvm-rg350-9d92a5a6a468889e39b1b8d4f696fde3769da79c.zip
TITANIC: Fleshing out usage of TTscriptArrayItem in TTnpcScript
-rw-r--r--engines/titanic/true_talk/deskbot_script.cpp3
-rw-r--r--engines/titanic/true_talk/deskbot_script.h3
-rw-r--r--engines/titanic/true_talk/doorbot_script.cpp3
-rw-r--r--engines/titanic/true_talk/doorbot_script.h3
-rw-r--r--engines/titanic/true_talk/liftbot_script.cpp3
-rw-r--r--engines/titanic/true_talk/liftbot_script.h4
-rw-r--r--engines/titanic/true_talk/maitred_script.cpp3
-rw-r--r--engines/titanic/true_talk/maitred_script.h4
-rw-r--r--engines/titanic/true_talk/tt_npc_script.cpp85
-rw-r--r--engines/titanic/true_talk/tt_npc_script.h33
-rw-r--r--engines/titanic/true_talk/tt_quotes_tree.cpp2
-rw-r--r--engines/titanic/true_talk/tt_quotes_tree.h2
12 files changed, 120 insertions, 28 deletions
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<TTnpcScriptResponse> _responses;
int _valuesPerResponse;
- byte *_subPtr;
+ Common::Array<TTscriptArrayItem> _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