From 62c699fa3ca815a658a930b06ab99f6ce31a881d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 2 Jun 2016 21:22:49 -0400 Subject: TITANIC: New TTsentenceEntries class for holding sentence res data --- engines/titanic/true_talk/tt_npc_script.cpp | 8 +++++-- engines/titanic/true_talk/tt_npc_script.h | 7 ++++-- engines/titanic/true_talk/tt_sentence.cpp | 35 +++++++++++++++++++++++++++++ engines/titanic/true_talk/tt_sentence.h | 34 ++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 4 deletions(-) (limited to 'engines') diff --git a/engines/titanic/true_talk/tt_npc_script.cpp b/engines/titanic/true_talk/tt_npc_script.cpp index 20e7faf5a3..41bf5d8ac4 100644 --- a/engines/titanic/true_talk/tt_npc_script.cpp +++ b/engines/titanic/true_talk/tt_npc_script.cpp @@ -51,7 +51,7 @@ 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), _field60(0), _field64(0), _field68(0), + _subPtr(nullptr), _entriesP(nullptr), _entryCount(0), _field68(0), _field6C(0), _field70(0), _field74(0), _field78(0), _field7C(0), _field80(0), _field2CC(false) { CTrueTalkManager::_v2 = 0; @@ -117,7 +117,7 @@ int TTnpcScript::chooseResponse(TTroomScript *roomScript, TTsentence *sentence, } void TTnpcScript::process(TTroomScript *roomScript, TTsentence *sentence) { - warning("TODO"); + processSentence(_entriesP, _entryCount, roomScript, sentence); } int TTnpcScript::proc8() const { @@ -456,4 +456,8 @@ CPetControl *TTnpcScript::getPetControl(CGameManager *gameManager) { return nullptr; } +void TTnpcScript::processSentence(const TTsentenceEntries *entries, int entryCount, TTroomScript *roomScript, TTsentence *sentence) { + warning("TODO"); +} + } // 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 3b9ffe86f7..a6741e6136 100644 --- a/engines/titanic/true_talk/tt_npc_script.h +++ b/engines/titanic/true_talk/tt_npc_script.h @@ -34,6 +34,7 @@ class CGameManager; class CPetControl; class TTroomScript; class TTsentence; +class TTsentenceEntries; struct TTnpcScriptResponse { uint _tag; @@ -83,8 +84,8 @@ protected: Common::Array _responses; int _valuesPerResponse; byte *_subPtr; - int _field60; - int _field64; + const TTsentenceEntries *_entriesP; + int _entryCount; int _field68; int _field6C; int _field70; @@ -136,6 +137,8 @@ protected: * Returns a pointer to the PET control */ static CPetControl *getPetControl(CGameManager *gameManager); + + void processSentence(const TTsentenceEntries *entries, int entryCount, TTroomScript *roomScript, TTsentence *sentence); public: TTnpcScript(int charId, const char *charClass, int v2, const char *charName, int v3, int val2, int v4, diff --git a/engines/titanic/true_talk/tt_sentence.cpp b/engines/titanic/true_talk/tt_sentence.cpp index c777464f8d..697afddd77 100644 --- a/engines/titanic/true_talk/tt_sentence.cpp +++ b/engines/titanic/true_talk/tt_sentence.cpp @@ -39,6 +39,41 @@ TTsentenceConcept *TTsentenceConcept::addSibling() { /*------------------------------------------------------------------------*/ +bool TTsentenceEntry::load(Common::SeekableReadStream *s) { + if (s->pos() >= s->size()) + return false; + + _field0 = s->readUint32LE(); + _field4 = s->readUint32LE(); + _string8 = readStringFromStream(s); + _fieldC = s->readUint32LE(); + _string10 = readStringFromStream(s); + _string14 = readStringFromStream(s); + _string18 = readStringFromStream(s); + _string1C = readStringFromStream(s); + _field20 = s->readUint32LE(); + _string24 = readStringFromStream(s); + _field28 = s->readUint32LE(); + _field2C = s->readUint32LE(); + _field30 = s->readUint32LE(); + + return true; +} + +/*------------------------------------------------------------------------*/ + +void TTsentenceEntries::load(const CString &resName) { + TTsentenceEntry entry; + Common::SeekableReadStream *r = g_vm->_filesManager->getResource(resName); + + while (entry.load(r)) + push_back(entry); + + delete r; +} + +/*------------------------------------------------------------------------*/ + TTsentence::TTsentence(int inputCtr, const TTstring &line, CScriptHandler *owner, TTroomScript *roomScript, TTnpcScript *npcScript) : _owner(owner), _field2C(1), _inputCtr(inputCtr), _field34(0), diff --git a/engines/titanic/true_talk/tt_sentence.h b/engines/titanic/true_talk/tt_sentence.h index f51ca4bdda..3d1c9f2b74 100644 --- a/engines/titanic/true_talk/tt_sentence.h +++ b/engines/titanic/true_talk/tt_sentence.h @@ -23,6 +23,7 @@ #ifndef TITANIC_TT_SENTENCE_H #define TITANIC_TT_SENTENCE_H +#include "common/array.h" #include "titanic/true_talk/tt_concept_node.h" #include "titanic/true_talk/tt_npc_script.h" #include "titanic/true_talk/tt_room_script.h" @@ -45,6 +46,39 @@ public: TTsentenceConcept *addSibling(); }; +struct TTsentenceEntry { + int _field0; + int _field4; + CString _string8; + int _fieldC; + CString _string10; + CString _string14; + CString _string18; + CString _string1C; + int _field20; + CString _string24; + int _field28; + int _field2C; + int _field30; + + TTsentenceEntry() : _field0(0), _field4(0), _fieldC(0), + _field20(0), _field28(0), _field2C(0), _field30(0) {} + + /** + * Load an entry from the passed stream, and returns true + * if an entry was successfully loaded + */ + bool load(Common::SeekableReadStream *s); +}; + +class TTsentenceEntries : public Common::Array { +public: + /** + * Load a list of entries from the specified resource + */ + void load(const CString &resName); +}; + class TTsentence { private: CScriptHandler *_owner; -- cgit v1.2.3