From c1715779fa626c2d28a944019c14df690128b22f Mon Sep 17 00:00:00 2001
From: Marek Kochanowicz <sirherrbatka@gmail.com>
Date: Thu, 26 Dec 2013 12:59:43 +0100
Subject: [PATCH] Added door check with related methods.

---
 .../opencs/model/tools/referenceablecheck.cpp | 40 +++++++++++++++++--
 .../opencs/model/tools/referenceablecheck.hpp |  2 +
 apps/opencs/model/world/refiddata.cpp         |  6 +++
 apps/opencs/model/world/refiddata.hpp         |  1 +
 4 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/apps/opencs/model/tools/referenceablecheck.cpp b/apps/opencs/model/tools/referenceablecheck.cpp
index c8a310e9f3..03efb59cc5 100644
--- a/apps/opencs/model/tools/referenceablecheck.cpp
+++ b/apps/opencs/model/tools/referenceablecheck.cpp
@@ -17,7 +17,8 @@ CSMTools::ReferenceableCheckStage::ReferenceableCheckStage(const CSMWorld::RefId
     mArmorsSzie(0),
     mClothingSize(0),
     mContainersSize(0),
-    mCreaturesSize(0)
+    mCreaturesSize(0),
+    mDoorsSize(0)
 {
     setSizeVariables();
 }
@@ -32,6 +33,7 @@ void CSMTools::ReferenceableCheckStage::setSizeVariables()
     mClothingSize = mReferencables.getClothing().getSize();
     mContainersSize = mReferencables.getContainers().getSize();
     mCreaturesSize = mReferencables.getCreatures().getSize();
+    mDoorsSize = mReferencables.getDoors().getSize();
 }
 
 void CSMTools::ReferenceableCheckStage::perform(int stage, std::vector< std::string >& messages)
@@ -92,6 +94,14 @@ void CSMTools::ReferenceableCheckStage::perform(int stage, std::vector< std::str
     }
 
     stage -= mContainersSize;
+    
+    if (stage < mDoorsSize)
+    {
+      doorCheck(stage, mReferencables.getDoors(), messages);
+      return;
+    }
+    
+    stage -= mDoorsSize;
 }
 
 int CSMTools::ReferenceableCheckStage::setup()
@@ -491,10 +501,32 @@ void CSMTools::ReferenceableCheckStage::creatureCheck(int stage, const CSMWorld:
     }
 
     //TODO, find meaning of other values
-    /* 
-    if (Creature.mData.mGold < 0)
+    if (Creature.mData.mGold < 0) //It seems that this is for gold in merchant creatures
     {
         messages.push_back(id.toString() + "|" + Creature.mId + " has negative gold ");
     }
-    */
+}
+
+void CSMTools::ReferenceableCheckStage::doorCheck(int stage, const CSMWorld::RefIdDataContainer< ESM::Door >& records, std::vector< std::string >& messages)
+{
+    const CSMWorld::RecordBase& baserecord = records.getRecord(stage);
+
+    if (baserecord.isDeleted())
+    {
+        return;
+    }
+
+    const ESM::Door& Door= (static_cast<const CSMWorld::Record<ESM::Door>&>(baserecord)).get();
+    CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Door, Door.mId);
+    
+    //usual, name and model
+    if (Door.mName.empty())
+    {
+        messages.push_back(id.toString() + "|" + Door.mId + " has an empty name");
+    }
+
+    if (Door.mModel.empty())
+    {
+        messages.push_back(id.toString() + "|" + Door.mId + " has no model");
+    }
 }
diff --git a/apps/opencs/model/tools/referenceablecheck.hpp b/apps/opencs/model/tools/referenceablecheck.hpp
index 72af4e0ff7..3a0b2a4b8c 100644
--- a/apps/opencs/model/tools/referenceablecheck.hpp
+++ b/apps/opencs/model/tools/referenceablecheck.hpp
@@ -25,6 +25,7 @@ namespace CSMTools
             void clothingCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Clothing>& records, std::vector<std::string>& messages);
             void containerCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Container>& records, std::vector<std::string>& messages);
             void creatureCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Creature>& records, std::vector<std::string>& messages);
+            void doorCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Door>& records, std::vector<std::string>& messages);
 
             void setSizeVariables();
 
@@ -39,6 +40,7 @@ namespace CSMTools
 	    int mClothingSize;
 	    int mContainersSize;
 	    int mCreaturesSize;
+	    int mDoorsSize;
     };
 }
 #endif // REFERENCEABLECHECKSTAGE_H
diff --git a/apps/opencs/model/world/refiddata.cpp b/apps/opencs/model/world/refiddata.cpp
index 266741155d..83ff79cc8b 100644
--- a/apps/opencs/model/world/refiddata.cpp
+++ b/apps/opencs/model/world/refiddata.cpp
@@ -271,3 +271,9 @@ const CSMWorld::RefIdDataContainer< ESM::Creature >& CSMWorld::RefIdData::getCre
 {
     return mCreatures;
 }
+
+const CSMWorld::RefIdDataContainer< ESM::Door >& CSMWorld::RefIdData::getDoors() const
+{
+    return mDoors;
+}
+
diff --git a/apps/opencs/model/world/refiddata.hpp b/apps/opencs/model/world/refiddata.hpp
index 6af433be26..87818c9c9e 100644
--- a/apps/opencs/model/world/refiddata.hpp
+++ b/apps/opencs/model/world/refiddata.hpp
@@ -229,6 +229,7 @@ namespace CSMWorld
 	    const RefIdDataContainer<ESM::Clothing>& getClothing() const;
 	    const RefIdDataContainer<ESM::Container>& getContainers() const;
 	    const RefIdDataContainer<ESM::Creature>& getCreatures() const;
+	    const RefIdDataContainer<ESM::Door>& getDoors() const;
     };
 }