diff options
Diffstat (limited to 'engines')
22 files changed, 728 insertions, 106 deletions
diff --git a/engines/titanic/game_manager.cpp b/engines/titanic/game_manager.cpp index d29180ff6b..5e6496218f 100644 --- a/engines/titanic/game_manager.cpp +++ b/engines/titanic/game_manager.cpp @@ -30,4 +30,12 @@ CGameManager::CGameManager(CProjectItem *project, CGameView *gameView): // TODO } +void CGameManager::load(SimpleFile *file) { + // TODO +} + +void CGameManager::gameLoaded() { + // TODO +} + } // End of namespace Titanic diff --git a/engines/titanic/game_manager.h b/engines/titanic/game_manager.h index 0c1374e9a3..d776c00048 100644 --- a/engines/titanic/game_manager.h +++ b/engines/titanic/game_manager.h @@ -24,6 +24,7 @@ #define TITANIC_GAME_MANAGER_H #include "common/scummsys.h" +#include "titanic/simple_file.h" namespace Titanic { @@ -36,6 +37,16 @@ private: CGameView *_gameView; public: CGameManager(CProjectItem *project, CGameView *gameView); + + /** + * Load data from a save file + */ + void load(SimpleFile *file); + + /** + * Called after loading a game has finished + */ + void gameLoaded(); }; } // End of namespace Titanic diff --git a/engines/titanic/module.mk b/engines/titanic/module.mk index fc855d2df0..6d1e5461f5 100644 --- a/engines/titanic/module.mk +++ b/engines/titanic/module.mk @@ -15,9 +15,13 @@ MODULE_OBJS := \ string.o \ titanic.o \ video_surface.o \ + objects/dont_save_file_item.o \ objects/file_item.o \ + objects/game_object.o \ objects/list.o \ objects/message_target.o \ + objects/named_item.o \ + objects/pet_control.o \ objects/project_item.o \ objects/saveable_object.o \ objects/tree_item.o diff --git a/engines/titanic/objects/dont_save_file_item.cpp b/engines/titanic/objects/dont_save_file_item.cpp new file mode 100644 index 0000000000..bca66da521 --- /dev/null +++ b/engines/titanic/objects/dont_save_file_item.cpp @@ -0,0 +1,35 @@ +/* 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/dont_save_file_item.h" + +namespace Titanic { + +void CDontSaveFileItem::save(SimpleFile *file, int indent) const { + file->writeNumberLine(0, indent); +} + +void CDontSaveFileItem::load(SimpleFile *file) { + file->readNumber(); +} + +} // End of namespace Titanic diff --git a/engines/titanic/objects/dont_save_file_item.h b/engines/titanic/objects/dont_save_file_item.h new file mode 100644 index 0000000000..99deacc88c --- /dev/null +++ b/engines/titanic/objects/dont_save_file_item.h @@ -0,0 +1,50 @@ +/* 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. + * + */ + +#ifndef TITANIC_DONT_SAVE_FILE_ITEM_H +#define TITANIC_DONT_SAVE_FILE_ITEM_H + +#include "titanic/objects/file_item.h" + +namespace Titanic { + +class CDontSaveFileItem : public CFileItem { +public: + /** + * Return the class name + */ + virtual const char *getClassName() const { return "CDontSaveFileItem"; } + + /** + * 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 + +#endif /* TITANIC_DONT_SAVE_FILE_ITEM_H */ diff --git a/engines/titanic/objects/file_item.cpp b/engines/titanic/objects/file_item.cpp index d49df71fcc..925fc4d000 100644 --- a/engines/titanic/objects/file_item.cpp +++ b/engines/titanic/objects/file_item.cpp @@ -24,5 +24,24 @@ namespace Titanic { +void CFileItem::save(SimpleFile *file, int indent) const { + file->writeNumberLine(0, indent); + CTreeItem::save(file, indent); +} + +void CFileItem::load(SimpleFile *file) { + file->readNumber(); + + CTreeItem::load(file); +} + +CString CFileItem::formFilename() const { + return ""; +} + +CString CFileItem::getFilename() const { + //dynamic_cast<CFileItem *>(getRoot())->formDataPath(); + return _filename; +} } // End of namespace Titanic diff --git a/engines/titanic/objects/file_item.h b/engines/titanic/objects/file_item.h index 2261598ea8..94dd053ae8 100644 --- a/engines/titanic/objects/file_item.h +++ b/engines/titanic/objects/file_item.h @@ -23,13 +23,45 @@ #ifndef TITANIC_FILE_ITEM_H #define TITANIC_FILE_ITEM_H +#include "titanic/string.h" #include "titanic/objects/list.h" #include "titanic/objects/tree_item.h" namespace Titanic { class CFileItem: public CTreeItem { +private: + CString _filename; public: + /** + * Return the class name + */ + virtual const char *getClassName() const { return "CFileItem"; } + + /** + * 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); + + /** + * Returns true if the item is a file item + */ + virtual bool isFileItem() const { return true; } + + /** + * Form a filename for the file item + */ + CString formFilename() const; + + /** + * Get a string? + */ + CString getFilename() const; }; } // End of namespace Titanic diff --git a/engines/titanic/objects/game_object.cpp b/engines/titanic/objects/game_object.cpp new file mode 100644 index 0000000000..a1e1faccce --- /dev/null +++ b/engines/titanic/objects/game_object.cpp @@ -0,0 +1,27 @@ +/* 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/game_object.h" + +namespace Titanic { + +} // End of namespace Titanic diff --git a/engines/titanic/objects/game_object.h b/engines/titanic/objects/game_object.h new file mode 100644 index 0000000000..7e0fba6e87 --- /dev/null +++ b/engines/titanic/objects/game_object.h @@ -0,0 +1,35 @@ +/* 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. + * + */ + +#ifndef TITANIC_GAME_OBJECT_H +#define TITANIC_GAME_OBJECT_H + +#include "titanic/objects/named_item.h" + +namespace Titanic { + +class CGameObject : public CNamedItem { +}; + +} // End of namespace Titanic + +#endif /* TITANIC_PET_CONTROL_H */ diff --git a/engines/titanic/objects/list.cpp b/engines/titanic/objects/list.cpp index 1ebffac51b..4e0178d31c 100644 --- a/engines/titanic/objects/list.cpp +++ b/engines/titanic/objects/list.cpp @@ -25,73 +25,11 @@ 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"); - } -} - -void List::destroyContents() { - for (iterator i = begin(); i != end(); ++i) { - CSaveableObject *obj = *i; - delete obj; - } - - clear(); -} - } // End of namespace Titanic diff --git a/engines/titanic/objects/list.h b/engines/titanic/objects/list.h index ceb471534d..1842d2b5f8 100644 --- a/engines/titanic/objects/list.h +++ b/engines/titanic/objects/list.h @@ -25,10 +25,14 @@ #include "common/scummsys.h" #include "common/list.h" +#include "titanic/simple_file.h" #include "titanic/objects/saveable_object.h" namespace Titanic { +/** + * Base list item class + */ class ListItem: public CSaveableObject { public: /** @@ -47,39 +51,87 @@ public: 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); +template<typename T> +class List : public CSaveableObject, public Common::List<T *> { public: - List(); - /** * Return the class name */ - virtual const char *getClassName() const { return "List"; } + virtual const char *getClassName() const { return nullptr; } /** * Save the data for the class to file */ - virtual void save(SimpleFile *file, int indent) const; + virtual void save(SimpleFile *file, int indent) const { + file->writeNumberLine(0, indent); + + // Write out number of items + file->writeQuotedLine("L", indent); + file->writeNumberLine(Common::List<T *>::size(), indent); + + // Iterate through writing entries + Common::List<T *>::const_iterator i; + for (i = Common::List<T *>::begin(); i != Common::List<T *>::end(); ++i) { + const ListItem *item = *i; + item->saveHeader(file, indent); + item->save(file, indent + 1); + item->saveFooter(file, indent); + } + + } /** * Load the data for the class from file */ - virtual void load(SimpleFile *file); + virtual void load(SimpleFile *file) { + file->readNumber(); + file->readBuffer(); + + Common::List<T *>::clear(); + 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(); + T *newItem = dynamic_cast<T *>(CSaveableObject::createInstance(className)); + if (!newItem) + error("Could not create instance of %s", className.c_str()); + + // Load the item's data and add it to the list + newItem->load(file); + Common::List<T *>::push_back(newItem); + + // Validate the class end footer + if (file->IsClassStart()) + error("Unexpected class start"); + } + } /** * Clear the list and destroy any items in it */ - void destroyContents(); + void destroyContents() { + for (Common::List<T *>::iterator i = Common::List<T *>::begin(); + i != Common::List<T *>::end(); ++i) { + CSaveableObject *obj = *i; + delete obj; + } + + Common::List<T *>::clear(); + } + + /** + * Add a new item to the list of the type the list contains + */ + T *List::add() { + T *item = new T(); + Common::List<T *>::push_back(item); + return item; + } }; } // End of namespace Titanic diff --git a/engines/titanic/objects/message_target.cpp b/engines/titanic/objects/message_target.cpp index 1e727a3686..bd162ff9eb 100644 --- a/engines/titanic/objects/message_target.cpp +++ b/engines/titanic/objects/message_target.cpp @@ -23,5 +23,15 @@ #include "titanic/objects/message_target.h" namespace Titanic { + +void CMessageTarget::save(SimpleFile *file, int indent) const { + file->writeNumberLine(0, indent); + CSaveableObject::save(file, indent); +} + +void CMessageTarget::load(SimpleFile *file) { + file->readNumber(); + CSaveableObject::load(file); +} } // End of namespace Titanic diff --git a/engines/titanic/objects/message_target.h b/engines/titanic/objects/message_target.h index 6afd709211..5e29ddaf78 100644 --- a/engines/titanic/objects/message_target.h +++ b/engines/titanic/objects/message_target.h @@ -28,6 +28,22 @@ namespace Titanic { class CMessageTarget: public CSaveableObject { +public: + /** + * Return the class name + */ + virtual const char *getClassName() const { return "CMessageTarget"; } + + /** + * 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/named_item.cpp b/engines/titanic/objects/named_item.cpp new file mode 100644 index 0000000000..34db645590 --- /dev/null +++ b/engines/titanic/objects/named_item.cpp @@ -0,0 +1,28 @@ +/* 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/named_item.h" + +namespace Titanic { + + +} // End of namespace Titanic diff --git a/engines/titanic/objects/named_item.h b/engines/titanic/objects/named_item.h new file mode 100644 index 0000000000..ee4ad352ed --- /dev/null +++ b/engines/titanic/objects/named_item.h @@ -0,0 +1,35 @@ +/* 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. + * + */ + +#ifndef TITANIC_NAMED_ITEM_H +#define TITANIC_NAMED_ITEM_H + +#include "titanic/objects/tree_item.h" + +namespace Titanic { + +class CNamedItem: public CTreeItem { +}; + +} // End of namespace Titanic + +#endif /* TITANIC_NAMED_ITEM_H */ diff --git a/engines/titanic/objects/pet_control.cpp b/engines/titanic/objects/pet_control.cpp new file mode 100644 index 0000000000..73ef957e78 --- /dev/null +++ b/engines/titanic/objects/pet_control.cpp @@ -0,0 +1,31 @@ +/* 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/pet_control.h" + +namespace Titanic { + +void CPetControl::gameLoaded() { + // TODO +} + +} // End of namespace Titanic diff --git a/engines/titanic/objects/pet_control.h b/engines/titanic/objects/pet_control.h new file mode 100644 index 0000000000..f6c9707df8 --- /dev/null +++ b/engines/titanic/objects/pet_control.h @@ -0,0 +1,40 @@ +/* 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. + * + */ + +#ifndef TITANIC_PET_CONTROL_H +#define TITANIC_PET_CONTROL_H + +#include "titanic/objects/game_object.h" + +namespace Titanic { + +class CPetControl : public CGameObject { +public: + /** + * Called after loading a game has finished + */ + void gameLoaded(); +}; + +} // End of namespace Titanic + +#endif /* TITANIC_PET_CONTROL_H */ diff --git a/engines/titanic/objects/project_item.cpp b/engines/titanic/objects/project_item.cpp index 8211854407..2bd75156d8 100644 --- a/engines/titanic/objects/project_item.cpp +++ b/engines/titanic/objects/project_item.cpp @@ -21,50 +21,89 @@ */ #include "common/savefile.h" +#include "titanic/game_manager.h" #include "titanic/titanic.h" #include "titanic/compressed_file.h" +#include "titanic/objects/dont_save_file_item.h" +#include "titanic/objects/pet_control.h" #include "titanic/objects/project_item.h" namespace Titanic { -CProjectItem::CProjectItem() : _field34(0), _field38(0), _field3C(0) { +void CFileListItem::save(SimpleFile *file, int indent) const { + file->writeNumberLine(0, indent); + file->writeQuotedLine(_name, indent); + + ListItem::save(file, indent); +} + +void CFileListItem::load(SimpleFile *file) { + file->readNumber(); + _name = file->readString(); + + ListItem::load(file); +} + +/*------------------------------------------------------------------------*/ + +CProjectItem::CProjectItem() : _nextRoomNumber(0), _nextMessageNumber(0), + _nextObjectNumber(0), _gameManager(nullptr) { } void CProjectItem::save(SimpleFile *file, int indent) const { file->writeNumberLine(6, indent); + file->writeQuotedLine("Next Avail. Object Number", indent); + file->writeNumberLine(_nextObjectNumber, indent); + file->writeQuotedLine("Next Avail. Message Number", indent); + file->writeNumberLine(_nextMessageNumber, indent); + file->writeQuotedLine("Next Avail. Room Number", indent); + file->writeNumberLine(_nextRoomNumber, indent); + + CTreeItem::save(file, indent); +} + +void CProjectItem::buildFilesList() { + _files.destroyContents(); + CTreeItem *treeItem = getFirstChild(); + while (treeItem) { + if (treeItem->isFileItem()) { + CString name = static_cast<CFileItem *>(treeItem)->getFilename(); + _files.add()->_name = name; + } + + treeItem = getNextSibling(); + } } void CProjectItem::load(SimpleFile *file) { int val = file->readNumber(); - load2(file, val); -} - -void CProjectItem::load2(SimpleFile *file, int val) { + _files.destroyContents(); int count; - _items.destroyContents(); switch (val) { case 1: file->readBuffer(); - _field34 = file->readNumber(); + _nextRoomNumber = file->readNumber(); // Deliberate fall-through case 0: + // Load the list of files count = file->readNumber(); for (int idx = 0; idx < count; ++idx) { - + CString name = file->readString(); + _files.add()->_name = name; } break; case 6: file->readBuffer(); - _field3C = file->readNumber(); + _nextObjectNumber = file->readNumber(); // Deliberate fall-through case 5: file->readBuffer(); - _field38 = file->readNumber(); + _nextMessageNumber = file->readNumber(); // Deliberate fall-through case 4: @@ -73,9 +112,9 @@ void CProjectItem::load2(SimpleFile *file, int val) { case 2: case 3: - _items.load(file); + _files.load(file); file->readBuffer(); - _field34 = file->readNumber(); + _nextRoomNumber = file->readNumber(); break; default: @@ -85,6 +124,14 @@ void CProjectItem::load2(SimpleFile *file, int val) { CTreeItem::load(file); } +CGameManager *CProjectItem::getGameManager() { + return _gameManager; +} + +void CProjectItem::resetGameManager() { + _gameManager = nullptr; +} + void CProjectItem::loadGame(int slotId) { CompressedFile file; Common::InSaveFile *saveFile = nullptr; @@ -102,9 +149,27 @@ void CProjectItem::loadGame(int slotId) { } // Load the contents in - loadData(&file); + CProjectItem *newProject = loadData(&file); + file.IsClassStart(); + getGameManager()->load(&file); file.close(); + + // Clear existing project + clear(); + + // Detach each item under the loaded project, and re-attach them + // to the existing project instance (this) + CTreeItem *item; + while ((item = newProject->getFirstChild()) != nullptr) { + item->detach(); + item->addUnder(this); + } + // Loaded project instance is no longer needed + newProject->destroyAll(); + + // Post-load processing + gameLoaded(); } void CProjectItem::saveGame(int slotId) { @@ -120,7 +185,9 @@ void CProjectItem::saveGame(int slotId) { } void CProjectItem::clear() { - + CTreeItem *item; + while ((item = getFirstChild()) != nullptr) + item->destroyAll(); } CProjectItem *CProjectItem::loadData(SimpleFile *file) { @@ -156,7 +223,6 @@ CProjectItem *CProjectItem::loadData(SimpleFile *file) { // Already created root project item->addUnder(parent); } else { - // TODO: Validate this is correct root = dynamic_cast<CProjectItem *>(item); assert(root); root->_filename = _filename; @@ -197,4 +263,32 @@ void CProjectItem::saveData(SimpleFile *file, CTreeItem *item) const { } } +void CProjectItem::gameLoaded() { + CGameManager *gameManager = getGameManager(); + if (gameManager) + gameManager->gameLoaded(); + + CPetControl *petControl = getPetControl(); + if (petControl) + petControl->gameLoaded(); +} + +CPetControl *CProjectItem::getPetControl() { + CDontSaveFileItem *fileItem = getDontSaveFileItem(); + CTreeItem *treeItem; + + if (!fileItem || (treeItem = fileItem->getLastChild()) == nullptr) + return nullptr; + + while (treeItem) { + CPetControl *petControl = dynamic_cast<CPetControl *>(treeItem); + if (petControl) + return petControl; + + treeItem = treeItem->getPriorSibling(); + } + + return nullptr; +} + } // End of namespace Titanic diff --git a/engines/titanic/objects/project_item.h b/engines/titanic/objects/project_item.h index d769f3dd0f..066dbf69e0 100644 --- a/engines/titanic/objects/project_item.h +++ b/engines/titanic/objects/project_item.h @@ -26,21 +26,56 @@ #include "common/scummsys.h" #include "titanic/simple_file.h" #include "titanic/objects/file_item.h" +#include "titanic/objects/list.h" namespace Titanic { +class CGameManager; +class CPetControl; + +/** + * File list item + */ +class CFileListItem : public ListItem { +public: + CString _name; + + virtual const char *getClassName() const { return "CFileListItem"; } + + /** + * 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); + +}; + +/** + * Filename list + */ +class CFileList: public List<CFileListItem> { +public: + virtual const char *getClassName() const { return "CFileList"; } +}; + + class CProjectItem : public CFileItem { private: CString _filename; - List _items; - int _field34; - int _field38; - int _field3C; + CFileList _files; + int _nextRoomNumber; + int _nextMessageNumber; + int _nextObjectNumber; + CGameManager *_gameManager; /** - * Load data for the project + * Called during save, iterates through the children to do some stuff */ - void load2(SimpleFile *file, int val); + void buildFilesList(); private: /** * Load project data from the passed file @@ -51,6 +86,11 @@ private: * Save project data to the passed file */ void saveData(SimpleFile *file, CTreeItem *item) const; + + /** + * Does post-loading processing + */ + void gameLoaded(); public: CProjectItem(); @@ -70,6 +110,21 @@ public: virtual void load(SimpleFile *file); /** + * Get the game manager for the project + */ + virtual CGameManager *getGameManager(); + + /** + * Get a reference to the PET control + */ + CPetControl *getPetControl(); + + /** + * Resets the game manager field + */ + void resetGameManager(); + + /** * Load the entire project data for a given slot Id */ void loadGame(int slotId); diff --git a/engines/titanic/objects/saveable_object.cpp b/engines/titanic/objects/saveable_object.cpp index 201fe1085e..45f9e132d9 100644 --- a/engines/titanic/objects/saveable_object.cpp +++ b/engines/titanic/objects/saveable_object.cpp @@ -35,8 +35,7 @@ Common::HashMap<Common::String, CSaveableObject::CreateFunction> * #define DEFFN(T) CSaveableObject *Function##T() { return new T(); } #define ADDFN(T) (*_classList)[#T] = Function##T -DEFFN(List); -DEFFN(ListItem); +DEFFN(CFileListItem); DEFFN(CMessageTarget); DEFFN(CTreeItem); DEFFN(CFileItem); @@ -44,8 +43,7 @@ DEFFN(CProjectItem); void CSaveableObject::initClassList() { _classList = new Common::HashMap<Common::String, CreateFunction>(); - ADDFN(List); - ADDFN(ListItem); + ADDFN(CFileListItem); ADDFN(CMessageTarget); ADDFN(CTreeItem); ADDFN(CFileItem); @@ -61,12 +59,10 @@ CSaveableObject *CSaveableObject::createInstance(const Common::String &name) { } 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 the dummy value file->readNumber(); } diff --git a/engines/titanic/objects/tree_item.cpp b/engines/titanic/objects/tree_item.cpp index bf0ae3e735..3902df3d3a 100644 --- a/engines/titanic/objects/tree_item.cpp +++ b/engines/titanic/objects/tree_item.cpp @@ -21,6 +21,8 @@ */ #include "titanic/objects/tree_item.h" +#include "titanic/objects/dont_save_file_item.h" +#include "titanic/objects/file_item.h" namespace Titanic { @@ -38,6 +40,22 @@ void CTreeItem::load(SimpleFile *file) { CMessageTarget::load(file); } +CGameManager *CTreeItem::getGameManager() { + return _parent ? _parent->getGameManager() : nullptr; +} + +CTreeItem *CTreeItem::getRoot() const { + CTreeItem *parent = getParent(); + + if (parent) { + do { + parent = parent->getParent(); + } while (parent->getParent()); + } + + return parent; +} + CTreeItem *CTreeItem::getLastSibling() { CTreeItem *item = this; while (item->getNextSibling()) @@ -52,6 +70,17 @@ CTreeItem *CTreeItem::getLastChild() { return _firstChild->getLastSibling(); } +CDontSaveFileItem *CTreeItem::getDontSaveFileItem() { + CTreeItem *item = getFirstChild(); + while (item) { + CDontSaveFileItem *fileItem = dynamic_cast<CDontSaveFileItem *>(item); + if (fileItem) + return fileItem; + + item = item->getNextSibling(); + } +} + void CTreeItem::addUnder(CTreeItem *newParent) { if (newParent->_firstChild) addSibling(newParent->getLastSibling()); @@ -79,5 +108,44 @@ void CTreeItem::addSibling(CTreeItem *item) { item->_nextSibling = this; } +void CTreeItem::destroyAll() { + destroyOthers(); + detach(); + delete this; +} + +int CTreeItem::destroyOthers() { + if (!_firstChild) + return 0; + + CTreeItem *item = this, *child, *nextSibling; + int total = 0; + + do { + child = item->_firstChild; + nextSibling = item->_nextSibling; + + if (child) + total += child->destroyOthers(); + child->detach(); + delete child; + ++total; + } while ((item = nextSibling) != nullptr); + + return total; +} + +void CTreeItem::detach() { + // Delink this item from any prior and/or next siblings + if (_priorSibling) + _priorSibling->_nextSibling = _nextSibling; + if (_nextSibling) + _nextSibling->_priorSibling = _priorSibling; + + if (_parent && _parent->_firstChild == this) + _parent->_firstChild = _nextSibling; + + _priorSibling = _nextSibling = _parent = nullptr; +} } // End of namespace Titanic diff --git a/engines/titanic/objects/tree_item.h b/engines/titanic/objects/tree_item.h index d3c1d34911..d6450e313a 100644 --- a/engines/titanic/objects/tree_item.h +++ b/engines/titanic/objects/tree_item.h @@ -27,6 +27,9 @@ namespace Titanic { +class CGameManager; +class CDontSaveFileItem; + class CTreeItem: public CMessageTarget { private: CTreeItem *_parent; @@ -53,11 +56,26 @@ public: virtual void load(SimpleFile *file); /** + * Get the game manager for the project + */ + virtual CGameManager *getGameManager(); + + /** + * Returns true if the item is a file item + */ + virtual bool isFileItem() const { return false; } + + /** * Get the parent for the given item */ CTreeItem *getParent() const { return _parent; } /** + * Jumps up through the parents to find the sub-root item + */ + CTreeItem *getRoot() const; + + /** * Get the next sibling */ CTreeItem *getNextSibling() { return _nextSibling; } @@ -83,6 +101,11 @@ public: CTreeItem *getLastChild(); /** + * Get any dont save file item in the immediate children + */ + CDontSaveFileItem *getDontSaveFileItem(); + + /** * Adds the item under another tree item */ void addUnder(CTreeItem *newParent); @@ -96,6 +119,21 @@ public: * Adds the item as a sibling of another item */ void addSibling(CTreeItem *item); + + /** + * Destroys both the item as well as any of it's children + */ + void destroyAll(); + + /** + * Destroys all tree items around the given one + */ + int destroyOthers(); + + /** + * Detach the tree item from any other associated tree items + */ + void detach(); }; } // End of namespace Titanic |