aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/core/project_item.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic/core/project_item.cpp')
-rw-r--r--engines/titanic/core/project_item.cpp64
1 files changed, 54 insertions, 10 deletions
diff --git a/engines/titanic/core/project_item.cpp b/engines/titanic/core/project_item.cpp
index 18b0c42815..bf31388963 100644
--- a/engines/titanic/core/project_item.cpp
+++ b/engines/titanic/core/project_item.cpp
@@ -25,7 +25,9 @@
#include "titanic/game_manager.h"
#include "titanic/titanic.h"
#include "titanic/core/dont_save_file_item.h"
+#include "titanic/core/node_item.h"
#include "titanic/core/project_item.h"
+#include "titanic/core/view_item.h"
#include "titanic/pet_control/pet_control.h"
namespace Titanic {
@@ -177,7 +179,7 @@ void CProjectItem::loadGame(int slotId) {
newProject->destroyAll();
// Post-load processing
- gameLoaded();
+ postLoad();
}
void CProjectItem::saveGame(int slotId) {
@@ -251,7 +253,6 @@ void CProjectItem::saveData(SimpleFile *file, CTreeItem *item) const {
item->saveHeader(file, 0);
item->save(file, 1);
item->saveFooter(file, 0);
-
CTreeItem *child = item->getFirstChild();
if (child) {
@@ -271,14 +272,14 @@ void CProjectItem::saveData(SimpleFile *file, CTreeItem *item) const {
}
}
-void CProjectItem::gameLoaded() {
+void CProjectItem::postLoad() {
CGameManager *gameManager = getGameManager();
if (gameManager)
- gameManager->gameLoaded();
+ gameManager->postLoad(this);
CPetControl *petControl = getPetControl();
if (petControl)
- petControl->gameLoaded();
+ petControl->postLoad();
}
CPetControl *CProjectItem::getPetControl() const {
@@ -300,10 +301,10 @@ CPetControl *CProjectItem::getPetControl() const {
}
CRoomItem *CProjectItem::findFirstRoom() const {
- return dynamic_cast<CRoomItem *>(findChildInstance(*CRoomItem::_type));
+ return dynamic_cast<CRoomItem *>(findChildInstance(CRoomItem::_type));
}
-CTreeItem *CProjectItem::findChildInstance(ClassDef &classDef) const {
+CTreeItem *CProjectItem::findChildInstance(ClassDef *classDef) const {
CTreeItem *treeItem = getFirstChild();
if (treeItem == nullptr)
return nullptr;
@@ -322,10 +323,10 @@ CTreeItem *CProjectItem::findChildInstance(ClassDef &classDef) const {
}
CRoomItem *CProjectItem::findNextRoom(CRoomItem *priorRoom) const {
- return dynamic_cast<CRoomItem *>(findSiblingInstanceOf(*CRoomItem::_type, priorRoom));
+ return dynamic_cast<CRoomItem *>(findSiblingInstanceOf(CRoomItem::_type, priorRoom));
}
-CTreeItem *CProjectItem::findSiblingInstanceOf(ClassDef &classDef, CTreeItem *startItem) const {
+CTreeItem *CProjectItem::findSiblingInstanceOf(ClassDef *classDef, CTreeItem *startItem) const {
CTreeItem *treeItem = startItem->getParent()->getNextSibling();
if (treeItem == nullptr)
return nullptr;
@@ -335,7 +336,7 @@ CTreeItem *CProjectItem::findSiblingInstanceOf(ClassDef &classDef, CTreeItem *st
CDontSaveFileItem *CProjectItem::getDontSaveFileItem() const {
for (CTreeItem *treeItem = getFirstChild(); treeItem; treeItem = treeItem->getNextSibling()) {
- if (treeItem->isInstanceOf(*CDontSaveFileItem::_type))
+ if (treeItem->isInstanceOf(CDontSaveFileItem::_type))
return dynamic_cast<CDontSaveFileItem *>(treeItem);
}
@@ -346,4 +347,47 @@ CRoomItem *CProjectItem::findHiddenRoom() {
return dynamic_cast<CRoomItem *>(findByName("HiddenRoom"));
}
+CViewItem *CProjectItem::findView(int roomNumber, int nodeNumber, int viewNumber) {
+ CTreeItem *treeItem = getFirstChild();
+ CRoomItem *roomItem = nullptr;
+
+ // Scan for the specified room
+ if (treeItem) {
+ do {
+ CTreeItem *childItem = treeItem->getFirstChild();
+ CRoomItem *rItem = dynamic_cast<CRoomItem *>(childItem);
+ if (rItem && rItem->_roomNumber == roomNumber) {
+ roomItem = rItem;
+ break;
+ }
+ } while ((treeItem = treeItem->getNextSibling()) != nullptr);
+ }
+ if (!roomItem)
+ return nullptr;
+
+ // Scan for the specified node within the room
+ CNodeItem *nodeItem = nullptr;
+
+ CNodeItem *nItem = dynamic_cast<CNodeItem *>(
+ roomItem->findChildInstanceOf(CNodeItem::_type));
+ for (; nItem && !nodeItem; nItem = dynamic_cast<CNodeItem *>(
+ findNextInstanceOf(CNodeItem::_type, nItem))) {
+ if (nItem->_nodeNumber == nodeNumber)
+ nodeItem = nItem;
+ }
+ if (!nodeItem)
+ return nullptr;
+
+ // Scan for the specified view within the node
+ CViewItem *viewItem = dynamic_cast<CViewItem *>(
+ nodeItem->findChildInstanceOf(CViewItem::_type));
+ for (; viewItem; viewItem = dynamic_cast<CViewItem *>(
+ findNextInstanceOf(CViewItem::_type, viewItem))) {
+ if (viewItem->_viewNumber == viewNumber)
+ return viewItem;
+ }
+
+ return nullptr;
+}
+
} // End of namespace Titanic