aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic')
-rw-r--r--engines/titanic/module.mk1
-rw-r--r--engines/titanic/objects/list.cpp88
-rw-r--r--engines/titanic/objects/list.h (renamed from engines/titanic/list.h)40
-rw-r--r--engines/titanic/objects/saveable_object.cpp10
-rw-r--r--engines/titanic/objects/saveable_object.h6
-rw-r--r--engines/titanic/simple_file.cpp19
-rw-r--r--engines/titanic/simple_file.h16
7 files changed, 166 insertions, 14 deletions
diff --git a/engines/titanic/module.mk b/engines/titanic/module.mk
index 17805e171a..abd351250d 100644
--- a/engines/titanic/module.mk
+++ b/engines/titanic/module.mk
@@ -13,6 +13,7 @@ MODULE_OBJS := \
titanic.o \
video_surface.o \
objects/file_item.o \
+ objects/list.o \
objects/message_target.o \
objects/project_item.o \
objects/saveable_object.o \
diff --git a/engines/titanic/objects/list.cpp b/engines/titanic/objects/list.cpp
new file mode 100644
index 0000000000..ddcddb04dd
--- /dev/null
+++ b/engines/titanic/objects/list.cpp
@@ -0,0 +1,88 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "titanic/objects/list.h"
+
+namespace Titanic {
+
+void ListItem::save(SimpleFile *file, int indent) const {
+ // Should always be overriden in descendents, so just write a dummy value
+ file->writeNumberLine(0, indent);
+}
+
+void ListItem::load(SimpleFile *file) {
+ // Should always be overriden in descendents, so just read the dummy value
+ file->readNumber();
+}
+
+/*------------------------------------------------------------------------*/
+
+List::List() {
+}
+
+void List::save(SimpleFile *file, int indent) const {
+ file->writeNumberLine(0, indent);
+ saveItems(file, indent);
+}
+
+void List::load(SimpleFile *file) {
+ file->readNumber();
+ loadItems(file);
+}
+
+void List::saveItems(SimpleFile *file, int indent) const {
+ // Write out number of items
+ file->writeQuotedLine("L", indent);
+ file->writeNumberLine(size(), indent);
+
+ // Iterate through writing entries
+ List::const_iterator i;
+ for (i = begin(); i != end(); ++i) {
+ const ListItem *item = *i;
+ item->saveHeader(file, indent);
+ item->save(file, indent + 1);
+ item->saveFooter(file, indent);
+ }
+}
+
+void List::loadItems(SimpleFile *file) {
+ file->readBuffer();
+ uint count = file->readNumber();
+
+ for (uint idx = 0; idx < count; ++idx) {
+ // Validate the class start header
+ if (!file->IsClassStart())
+ error("Unexpected class end");
+
+ // Get item's class name and use it to instantiate an item
+ CString className = file->readString();
+ CSaveableObject *newItem = CSaveableObject::createInstance(className);
+ if (!newItem)
+ error("Could not create instance of %s", className.c_str());
+
+ // Validate the class end footer
+ if (file->IsClassStart())
+ error("Unexpected class start");
+ }
+}
+
+} // End of namespace Titanic
diff --git a/engines/titanic/list.h b/engines/titanic/objects/list.h
index bea3776f0f..f98912795d 100644
--- a/engines/titanic/list.h
+++ b/engines/titanic/objects/list.h
@@ -30,11 +30,51 @@
namespace Titanic {
class ListItem: public CSaveableObject {
+public:
+ /**
+ * Return the class name
+ */
+ virtual const char *getClassName() const { return "ListItem"; }
+
+ /**
+ * Save the data for the class to file
+ */
+ virtual void save(SimpleFile *file, int indent) const;
+
+ /**
+ * Load the data for the class from file
+ */
+ virtual void load(SimpleFile *file);
};
class List : public CSaveableObject, Common::List<ListItem *> {
+private:
+ /**
+ * Write out the contents of the list
+ */
+ void saveItems(SimpleFile *file, int indent) const;
+
+ /**
+ * Read in the contents of a list
+ */
+ void loadItems(SimpleFile *file);
public:
+ List();
+
+ /**
+ * Return the class name
+ */
+ virtual const char *getClassName() const { return "List"; }
+
+ /**
+ * Save the data for the class to file
+ */
+ virtual void save(SimpleFile *file, int indent) const;
+ /**
+ * Load the data for the class from file
+ */
+ virtual void load(SimpleFile *file);
};
} // End of namespace Titanic
diff --git a/engines/titanic/objects/saveable_object.cpp b/engines/titanic/objects/saveable_object.cpp
index caa5192d19..25bd1645b5 100644
--- a/engines/titanic/objects/saveable_object.cpp
+++ b/engines/titanic/objects/saveable_object.cpp
@@ -22,10 +22,10 @@
#include "titanic/objects/saveable_object.h"
#include "titanic/objects/file_item.h"
+#include "titanic/objects/list.h"
#include "titanic/objects/message_target.h"
#include "titanic/objects/project_item.h"
#include "titanic/objects/tree_item.h"
-#include "titanic/list.h"
namespace Titanic {
@@ -60,21 +60,21 @@ CSaveableObject *CSaveableObject::createInstance(const Common::String &name) {
return (*_classList)[name]();
}
-void CSaveableObject::save(SimpleFile *file, int indent) {
+void CSaveableObject::save(SimpleFile *file, int indent) const {
// Should always be overriden in descendents, so just write a dummy value
file->writeNumberLine(0, indent);
}
void CSaveableObject::load(SimpleFile *file) {
- // Should always be overriden in descendents, so just read a dummy value
+ // Should always be overriden in descendents, so just read the dummy value
file->readNumber();
}
-void CSaveableObject::saveHeader(SimpleFile *file, int indent) {
+void CSaveableObject::saveHeader(SimpleFile *file, int indent) const {
file->writeClassStart(getClassName(), indent);
}
-void CSaveableObject::saveFooter(SimpleFile *file, int indent) {
+void CSaveableObject::saveFooter(SimpleFile *file, int indent) const {
file->writeClassEnd(indent);
}
diff --git a/engines/titanic/objects/saveable_object.h b/engines/titanic/objects/saveable_object.h
index e99d8c5525..4e7d949191 100644
--- a/engines/titanic/objects/saveable_object.h
+++ b/engines/titanic/objects/saveable_object.h
@@ -58,7 +58,7 @@ public:
/**
* Save the data for the class to file
*/
- virtual void save(SimpleFile *file, int indent);
+ virtual void save(SimpleFile *file, int indent) const;
/**
* Load the data for the class from file
@@ -69,13 +69,13 @@ public:
* Write out a header definition for the class to file
* prior to saving the actual data for the class
*/
- virtual void saveHeader(SimpleFile *file, int indent);
+ virtual void saveHeader(SimpleFile *file, int indent) const;
/**
* Writes out a footer for the class after it's data has
* been written to file
*/
- virtual void saveFooter(SimpleFile *file, int indent);
+ virtual void saveFooter(SimpleFile *file, int indent) const;
};
} // End of namespace Titanic
diff --git a/engines/titanic/simple_file.cpp b/engines/titanic/simple_file.cpp
index 9f371b2009..cf95aca269 100644
--- a/engines/titanic/simple_file.cpp
+++ b/engines/titanic/simple_file.cpp
@@ -196,6 +196,14 @@ double SimpleFile::readFloat() {
return floatValue;
}
+void SimpleFile::readBuffer(char *buffer, size_t count) {
+ CString tempString = readString();
+ if (buffer) {
+ strncpy(buffer, tempString.c_str(), count);
+ buffer[count - 1] = '\0';
+ }
+}
+
void SimpleFile::writeLine(const CString &str) {
write(str.c_str(), str.size());
write("\r\n", 2);
@@ -244,6 +252,12 @@ void SimpleFile::writeQuotedString(const CString &str) {
write("\" ", 2);
}
+void SimpleFile::writeQuotedLine(const CString &str, int indent) {
+ writeIndent(indent);
+ writeQuotedString(str);
+ write("\n", 1);
+}
+
void SimpleFile::writeNumber(int val) {
CString str = CString::format("%ld ", val);
write(str.c_str(), str.size());
@@ -260,14 +274,15 @@ void SimpleFile::writeIndent(uint indent) {
write("\t", 1);
}
-bool SimpleFile::IsClassEnd() {
+bool SimpleFile::IsClassStart() {
char c;
do {
safeRead(&c, 1);
} while (Common::isSpace(c));
- return c == '}';
+ assert(c == '{' || c == '}');
+ return c == '{';
}
void SimpleFile::writeClassStart(const CString &classStr, int indent) {
diff --git a/engines/titanic/simple_file.h b/engines/titanic/simple_file.h
index 17dd82a130..65b0ac6f31 100644
--- a/engines/titanic/simple_file.h
+++ b/engines/titanic/simple_file.h
@@ -100,12 +100,15 @@ public:
double readFloat();
/**
+ * Read a string and copy it into an optionally passed buffer
+ */
+ void readBuffer(char *buffer = nullptr, size_t count = 0);
+
+ /**
* Write a string line
*/
void writeLine(const CString &str);
-
-
/**
* Write a string
*/
@@ -117,6 +120,11 @@ public:
void writeQuotedString(const CString &str);
/**
+ * Write a quoted string line
+ */
+ void writeQuotedLine(const CString &str, int indent);
+
+ /**
* Write a number to file
*/
void writeNumber(int val);
@@ -134,9 +142,9 @@ public:
/**
* Validates that the following non-space character is either
* an opening or closing squiggly bracket denoting a class
- * definition start or end. Returns true if it's a class end
+ * definition start or end. Returns true if it's a class start
*/
- bool IsClassEnd();
+ bool IsClassStart();
/**
* Write the starting header for a class definition