aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/titanic/true_talk/true_talk_manager.cpp51
-rw-r--r--engines/titanic/true_talk/true_talk_manager.h17
-rw-r--r--engines/titanic/true_talk/tt_named_script.cpp74
-rw-r--r--engines/titanic/true_talk/tt_named_script.h23
-rw-r--r--engines/titanic/true_talk/tt_scripts.cpp57
-rw-r--r--engines/titanic/true_talk/tt_scripts.h32
-rw-r--r--engines/titanic/true_talk/tt_unnamed_script.h2
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,