diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/titanic/true_talk/true_talk_manager.cpp | 51 | ||||
-rw-r--r-- | engines/titanic/true_talk/true_talk_manager.h | 17 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_named_script.cpp | 74 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_named_script.h | 23 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_scripts.cpp | 57 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_scripts.h | 32 | ||||
-rw-r--r-- | engines/titanic/true_talk/tt_unnamed_script.h | 2 |
7 files changed, 215 insertions, 41 deletions
diff --git a/engines/titanic/true_talk/true_talk_manager.cpp b/engines/titanic/true_talk/true_talk_manager.cpp index d48a4d3b3d..416a4e2a72 100644 --- a/engines/titanic/true_talk/true_talk_manager.cpp +++ b/engines/titanic/true_talk/true_talk_manager.cpp @@ -22,6 +22,8 @@ #include "titanic/true_talk/true_talk_manager.h" +#define MKTAG_BE(a3,a2,a1,a0) ((uint32)((a3) | ((a2) << 8) | ((a1) << 16) | ((a0) << 24))) + namespace Titanic { int CTrueTalkManager::_v1; @@ -41,14 +43,31 @@ CTrueTalkManager::CTrueTalkManager(CGameManager *owner) : } void CTrueTalkManager::save(SimpleFile *file) const { - + saveStatics(file); + + saveNPC(file, 101); + saveNPC(file, 103); + saveNPC(file, 104); + saveNPC(file, 105); + saveNPC(file, 111); + saveNPC(file, 100); + saveNPC(file, 112); + saveNPC(file, 107); + file->writeNumber(0); } void CTrueTalkManager::load(SimpleFile *file) { loadStatics(file); - int count = file->readNumber(); - //TODO + // Iterate through loading characters + int charId = file->readNumber(); + while (charId) { + uint ident = MKTAG_BE('U', 'R', 'A', 'H'); + + do { + + } while (1); + } } void CTrueTalkManager::loadStatics(SimpleFile *file) { @@ -75,6 +94,24 @@ void CTrueTalkManager::loadStatics(SimpleFile *file) { } } +void CTrueTalkManager::saveStatics(SimpleFile *file) { + file->writeNumber(10); + file->writeNumber(_v1); + file->writeNumber(_v2); + file->writeNumber(_v3); + file->writeNumber(_v4 ? 1 : 0); + file->writeNumber(_v5 ? 1 : 0); + file->writeNumber(_v6); + file->writeNumber(_v7); + file->writeNumber(_v8 ? 1 : 0); + file->writeNumber(_v9); + file->writeNumber(_v10 ? 1 : 0); + + file->writeNumber(41); + for (int idx = 0; idx < 41; ++idx) + file->writeNumber(_v11[idx]); +} + void CTrueTalkManager::setFlags(int index, int val) { switch (index) { case 1: @@ -110,5 +147,13 @@ void CTrueTalkManager::setFlags(int index, int val) { } } +void CTrueTalkManager::saveNPC(SimpleFile *file, int charId) const { + TTNamedScript *script = _scripts.getNamedScript(charId); + if (script) { + script->save(file); + file->writeNumber(MKTAG_BE('U', 'R', 'A', 'H')); + file->writeNumber(MKTAG_BE('A', 'K', 'E', 'R')); + } +} } // End of namespace Titanic diff --git a/engines/titanic/true_talk/true_talk_manager.h b/engines/titanic/true_talk/true_talk_manager.h index 7bf0f5f331..cd70af3113 100644 --- a/engines/titanic/true_talk/true_talk_manager.h +++ b/engines/titanic/true_talk/true_talk_manager.h @@ -37,7 +37,17 @@ private: CTitleEngine _titleEngine; TTScripts _scripts; private: - void loadStatics(SimpleFile *file); + /** + * Loads the statics for the class + */ + static void loadStatics(SimpleFile *file); + + /** + * Saves the statics associated with the class + */ + static void saveStatics(SimpleFile *file); + + void saveNPC(SimpleFile *file, int charId) const; public: static int _v1; static int _v2; @@ -64,6 +74,11 @@ public: * Load the data for the class from file */ void load(SimpleFile *file); + + /** + * Returns the scripts for the manager + */ + TTScripts &getScripts() { return _scripts; } }; } // End of namespace Titanic diff --git a/engines/titanic/true_talk/tt_named_script.cpp b/engines/titanic/true_talk/tt_named_script.cpp index 8d225f1b28..129727c62b 100644 --- a/engines/titanic/true_talk/tt_named_script.cpp +++ b/engines/titanic/true_talk/tt_named_script.cpp @@ -26,17 +26,17 @@ namespace Titanic { -TTNamedScriptBase::TTNamedScriptBase(int val1, const char *charClass, int v2, +TTNamedScriptBase::TTNamedScriptBase(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), - _val1(val1), _field54(0), _val2(val2) { + _charId(charId), _field54(0), _val2(val2) { } /*------------------------------------------------------------------------*/ -TTNamedScript::TTNamedScript(int val1, const char *charClass, int v2, +TTNamedScript::TTNamedScript(int charId, const char *charClass, int v2, const char *charName, int v3, int val2, int v4, int v5, int v6, int v7) : - TTNamedScriptBase(val1, charClass, v2, charName, v3, val2, v4, v5, v6, v7) { + TTNamedScriptBase(charId, charClass, v2, charName, v3, val2, v4, v5, v6, v7) { CTrueTalkManager::_v2 = 0; Common::fill(&_array[0], &_array[147], 0); @@ -139,24 +139,66 @@ int TTNamedScript::proc25() const { void TTNamedScript::proc26() { } -void TTNamedScript::save1(SimpleFile *file) { - error("TODO"); +void TTNamedScript::save(SimpleFile *file) { + file->writeNumber(charId()); + saveBody(file); + + file->writeNumber(4); + file->writeNumber(_field70); + file->writeNumber(_field74); + file->writeNumber(_field78); + file->writeNumber(_field7C); + + file->writeNumber(10); + for (int idx = 0; idx < 10; ++idx) + file->writeNumber(_array[idx]); } -void TTNamedScript::proc28(int v) { - warning("TODO"); +void TTNamedScript::load(SimpleFile *file) { + loadBody(file); + + int count = file->readNumber(); + _field70 = file->readNumber(); + _field74 = file->readNumber(); + _field78 = file->readNumber(); + _field7C = file->readNumber(); + + for (int idx = count; idx > 4; --idx) + file->readNumber(); + + count = file->readNumber(); + for (int idx = 0; idx < count; ++idx) { + int v = file->readNumber(); + if (idx < 10) + _array[idx] = v; + } } -void TTNamedScript::save2(SimpleFile *file) { - error("TODO"); +void TTNamedScript::saveBody(SimpleFile *file) { + int v = proc31(); + file->writeNumber(v); + + if (v > 0 && _subPtr) { + warning("TODO"); + } } -void TTNamedScript::proc30(int v) { - warning("TODO"); +void TTNamedScript::loadBody(SimpleFile *file) { + int count = file->readNumber(); + preLoad(); + + for (int index = 0; index < count; index += 2) { + int v = file->readNumber(); + + if (_subPtr) { + error("TODO - %d", v); + } + } } -void TTNamedScript::proc31() { +int TTNamedScript::proc31() { warning("TODO"); + return 0; } void TTNamedScript::proc32() { @@ -185,4 +227,10 @@ int TTNamedScript::proc37() const { return 0; } +void TTNamedScript::preLoad() { + if (_subPtr) { + error("TODO"); + } +} + } // End of namespace Titanic diff --git a/engines/titanic/true_talk/tt_named_script.h b/engines/titanic/true_talk/tt_named_script.h index b747cee498..968ec2222e 100644 --- a/engines/titanic/true_talk/tt_named_script.h +++ b/engines/titanic/true_talk/tt_named_script.h @@ -31,11 +31,12 @@ namespace Titanic { class TTNamedScriptBase : public TTScriptBase { protected: - int _val1; int _field54; int _val2; public: - TTNamedScriptBase(int val1, const char *charClass, int v2, + int _charId; +public: + TTNamedScriptBase(int charId, const char *charClass, int v2, const char *charName, int v3, int val2, int v4, int v5, int v6, int v7); @@ -46,11 +47,13 @@ public: virtual int proc10() const = 0; virtual int proc11() const = 0; virtual int proc12() const = 0; + + int charId() const { return _charId; } }; class TTNamedScript : public TTNamedScriptBase { protected: - int _field5C; + byte *_subPtr; int _field60; int _field64; int _field68; @@ -66,7 +69,7 @@ protected: void randomizeFlags(); public: - TTNamedScript(int val1, const char *charClass, int v2, + TTNamedScript(int charId, const char *charClass, int v2, const char *charName, int v3, int val2, int v4, int v5, int v6, int v7); @@ -92,17 +95,19 @@ public: virtual void proc24() = 0; virtual int proc25() const; virtual void proc26(); - virtual void save1(SimpleFile *file); - virtual void proc28(int v); - virtual void save2(SimpleFile *file); - virtual void proc30(int v); - virtual void proc31(); + virtual void save(SimpleFile *file); + virtual void load(SimpleFile *file); + virtual void saveBody(SimpleFile *file); + virtual void loadBody(SimpleFile *file); + virtual int proc31(); virtual void proc32(); virtual void proc33(int v1, int v2); virtual int proc34(); virtual int proc35(int v1, int v2); virtual int proc36() const; virtual int proc37() const; + + void preLoad(); }; } // End of namespace Titanic diff --git a/engines/titanic/true_talk/tt_scripts.cpp b/engines/titanic/true_talk/tt_scripts.cpp index 981fe66933..8e34ec5d2b 100644 --- a/engines/titanic/true_talk/tt_scripts.cpp +++ b/engines/titanic/true_talk/tt_scripts.cpp @@ -32,6 +32,30 @@ #include "titanic/true_talk/succubus_script.h" namespace Titanic { + +TTNamedScript *TTNamedScriptList::findById(int charId) const { + for (TTNamedScriptList::const_iterator i = begin(); i != end(); ++i) { + const TTNamedScriptListItem *item = *i; + if (item->_script->_charId == charId) + return item->_script; + } + + return nullptr; +} + +/*------------------------------------------------------------------------*/ + +TTUnnamedScript *TTUnnamedScriptList::findById(int scriptId) const { + for (TTUnnamedScriptList::const_iterator i = begin(); i != end(); ++i) { + const TTUnnamedScriptListItem *item = *i; + if (item->_item->_scriptId == scriptId) + return item->_item; + } + + return nullptr; +} + +/*------------------------------------------------------------------------*/ TTScripts::TTScripts(CTitleEngine *titleEngine) : _titleEngine(titleEngine), _field24(0), _field28(0) { @@ -40,23 +64,36 @@ TTScripts::TTScripts(CTitleEngine *titleEngine) : addScript(new TTUnnamedScript(scriptNum)); // Load named scripts - addScript(new DoorbotScript(104, "Doorbot", 0, "Fentible", 11, 1, -1, -1, -1, 0)); - addScript(new BellbotScript(101, "Bellbot", 0, "Krage", 8, 1)); - addScript(new LiftbotScript(105, "LiftBot", 0, "Nobby", 11, 1, -1, -1, -1, 0)); - addScript(new DeskbotScript(103, "DeskBot", 0, "Marsinta", 11, 2)); - addScript(new BarbotScript(100, "Barbot", 0, "Fortillian", 9, 1, -1, -1, -1, 0)); - addScript(new ParrotScript(107, "Parrot", 0, "The Parrot", 5, 1, -1, -1, -1, 0)); - addScript(new MaitreDScript(112, "MaitreDBot", 0, "Dastrogaaar", 8, 1)); - addScript(new SuccUBusScript(111, "Succubus", 0, "Shorbert", 9, 1, -1, -1, -1, 0)); + addScript(new DoorbotScript(104, "Doorbot", 0, "Fentible", 11, 1, -1, -1, -1, 0), 100); + addScript(new BellbotScript(101, "Bellbot", 0, "Krage", 8, 1), 110); + addScript(new LiftbotScript(105, "LiftBot", 0, "Nobby", 11, 1, -1, -1, -1, 0), 103); + addScript(new DeskbotScript(103, "DeskBot", 0, "Marsinta", 11, 2), 110); + addScript(new BarbotScript(100, "Barbot", 0, "Fortillian", 9, 1, -1, -1, -1, 0), 112); + addScript(new ParrotScript(107, "Parrot", 0, "The Parrot", 5, 1, -1, -1, -1, 0), 111); + addScript(new MaitreDScript(112, "MaitreDBot", 0, "Dastrogaaar", 8, 1), 132); + addScript(new SuccUBusScript(111, "Succubus", 0, "Shorbert", 9, 1, -1, -1, -1, 0), 110); } -void TTScripts::addScript(TTNamedScript *script) { +void TTScripts::addScript(TTNamedScript *script, int scriptId) { script->proc13(); - _namedScripts.push_back(new TTNamedScriptListItem(script)); + + // Find the unnamed script this is associated with + TTUnnamedScript *unnamedScript = getUnnamedScript(scriptId); + assert(unnamedScript); + + _namedScripts.push_back(new TTNamedScriptListItem(script, unnamedScript)); } void TTScripts::addScript(TTUnnamedScript *script) { _unnamedScripts.push_back(new TTUnnamedScriptListItem(script)); } +TTUnnamedScript *TTScripts::getUnnamedScript(int scriptId) const { + return _unnamedScripts.findById(scriptId); +} + +TTNamedScript *TTScripts::getNamedScript(int charId) const { + return _namedScripts.findById(charId); +} + } // End of namespace Titanic diff --git a/engines/titanic/true_talk/tt_scripts.h b/engines/titanic/true_talk/tt_scripts.h index e47a7b2f87..5934eb3625 100644 --- a/engines/titanic/true_talk/tt_scripts.h +++ b/engines/titanic/true_talk/tt_scripts.h @@ -31,19 +31,33 @@ namespace Titanic { class CTitleEngine; -PTR_LIST_ITEM(TTNamedScript); +class TTNamedScriptListItem : public ListItem { +public: + TTNamedScript *_script; + TTUnnamedScript *_unnamedScript; +public: + TTNamedScriptListItem() : _script(nullptr), _unnamedScript(nullptr) {} + TTNamedScriptListItem(TTNamedScript *script, TTUnnamedScript *unnamedScript) : + _script(script), _unnamedScript(unnamedScript) {} + virtual ~TTNamedScriptListItem() { delete _script; } +}; + PTR_LIST_ITEM(TTUnnamedScript); class TTNamedScriptList : public List<TTNamedScriptListItem> { +public: + TTNamedScript *findById(int charId) const; }; -class TTUnamedScriptList : public List<TTUnnamedScriptListItem> { +class TTUnnamedScriptList : public List<TTUnnamedScriptListItem> { +public: + TTUnnamedScript *findById(int scriptId) const; }; class TTScripts { private: TTNamedScriptList _namedScripts; - TTUnamedScriptList _unnamedScripts; + TTUnnamedScriptList _unnamedScripts; CTitleEngine *_titleEngine; int _field24; int _field28; @@ -51,7 +65,7 @@ private: /** * Add a named script to the named scripts list */ - void addScript(TTNamedScript *script); + void addScript(TTNamedScript *script, int charId); /** * Add an unnamed script to the unnamed scripts list @@ -59,6 +73,16 @@ private: void addScript(TTUnnamedScript *script); public: TTScripts(CTitleEngine *titleEngine); + + /** + * Return a pointer to the specified script + */ + TTUnnamedScript *getUnnamedScript(int scriptId) const; + + /** + * Return a pointer to the specified named character script + */ + TTNamedScript *getNamedScript(int charId) const; }; } // End of namespace Titanic diff --git a/engines/titanic/true_talk/tt_unnamed_script.h b/engines/titanic/true_talk/tt_unnamed_script.h index f4702166b1..eeba200193 100644 --- a/engines/titanic/true_talk/tt_unnamed_script.h +++ b/engines/titanic/true_talk/tt_unnamed_script.h @@ -28,7 +28,7 @@ namespace Titanic { class TTUnnamedScriptBase : public TTScriptBase { -protected: +public: int _scriptId; public: TTUnnamedScriptBase(int scriptId, const char *charClass, const char *charName, |