From f6211e515117017951a037b5355ee1accdc902f4 Mon Sep 17 00:00:00 2001 From: Yohann Ferreira Date: Mon, 30 Jun 2014 15:33:03 +0200 Subject: [PATCH] This time really fixed the Dungeon temple and portal behaviour. Made the destruction of those rooms not crash the game anymore, and their respective room objects not duplicated when being destroyed. --- source/RoomDungeonTemple.cpp | 25 +++++++++++++++++++++++-- source/RoomDungeonTemple.h | 13 ++++++++++--- source/RoomPortal.cpp | 16 ++++++++++++++++ source/RoomPortal.h | 3 +++ 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/source/RoomDungeonTemple.cpp b/source/RoomDungeonTemple.cpp index 58fd3cc14..4ddca7eb7 100644 --- a/source/RoomDungeonTemple.cpp +++ b/source/RoomDungeonTemple.cpp @@ -25,16 +25,37 @@ #include "RoomObject.h" RoomDungeonTemple::RoomDungeonTemple(): - mWaitTurns(0) + mWaitTurns(0), + mTempleObject(NULL) { mType = dungeonTemple; } +void RoomDungeonTemple::absorbRoom(Room* room) +{ + Room::absorbRoom(room); + + // Get back the temple mesh reference + if (!mRoomObjects.empty()) + { + mTempleObject = mRoomObjects.begin()->second; + } + else + { + // Make sure the reference gets updated when createMesh() is called + mTempleObject = NULL; + } +} + void RoomDungeonTemple::createMesh() { Room::createMesh(); - loadRoomObject("DungeonTempleObject"); + // Don't recreate the portal if it's already done. + if (mTempleObject != NULL) + return; + + mTempleObject = loadRoomObject("DungeonTempleObject"); createRoomObjectMeshes(); } diff --git a/source/RoomDungeonTemple.h b/source/RoomDungeonTemple.h index e71fd31ad..295529e32 100644 --- a/source/RoomDungeonTemple.h +++ b/source/RoomDungeonTemple.h @@ -28,14 +28,21 @@ class RoomDungeonTemple: public Room void createMesh(); void destroyMesh(); + //! \brief Get back a reference to the temple mesh after calling Room::absorbRoom() + void absorbRoom(Room* room); + /*! \brief Counts down a timer until it reaches 0, - * then it spawns a kobold of the color of this dungeon temple - * at the center of the dungeon temple, and resets the timer. - */ + * then it spawns a kobold of the color of this dungeon temple + * at the center of the dungeon temple, and resets the timer. + */ void produceKobold(); private: + //! \brief The number of turns to wait before producing a worker int mWaitTurns; + + //! \brief The reference of the temple room object + RoomObject* mTempleObject; }; #endif // ROOMDUNGEONTEMPLE_H diff --git a/source/RoomPortal.cpp b/source/RoomPortal.cpp index 2d25aae64..90fdad071 100644 --- a/source/RoomPortal.cpp +++ b/source/RoomPortal.cpp @@ -39,6 +39,22 @@ RoomPortal::RoomPortal() : mType = portal; } +void RoomPortal::absorbRoom(Room* room) +{ + Room::absorbRoom(room); + + // Get back the portal mesh reference + if (!mRoomObjects.empty()) + { + mPortalObject = mRoomObjects.begin()->second; + } + else + { + // Make sure the reference gets updated when createMesh() is called + mPortalObject = NULL; + } +} + void RoomPortal::createMesh() { Room::createMesh(); diff --git a/source/RoomPortal.h b/source/RoomPortal.h index 9a375832e..a35a40afd 100644 --- a/source/RoomPortal.h +++ b/source/RoomPortal.h @@ -34,6 +34,9 @@ class RoomPortal: public Room void addCoveredTile(Tile* t, double nHP = defaultRoomTileHP); void removeCoveredTile(Tile* t); + //! \brief Get back a reference to the portal mesh after calling Room::absorbRoom() + void absorbRoom(Room* room); + //! \brief In addition to the standard upkeep, check to see if a new creature should be spawned. bool doUpkeep();