/*!
* @file Dungeon.h
* @brief ゲーム中のダンジョンと付随要素のプロトタイプ
* @date 2013/12/11
* @author Deskull
* 2013 Sikabane Works.
*/

#pragma once

#include "stdafx.h"
#include "Deeangband.h"
#include "GameElement.h"

#include "Coordinates.h"
#include "Field.h"

class Camp;
class Species;
class Floor;

namespace Deeangband
{

	typedef struct FixedFieldTable FixedFieldTable;
	/*!
	* @brief 固定フロア生成テーブル
	*/
	struct FixedFieldTable
	{
		bool StaticFixed; //!<静的固定
		ID FixedFieldID;  //!<生成される固定フロアのID
		DEPTH MinDepth;   //!<生成最低階層
		DEPTH MaxDepth;   //!<生成最大階層
		NUMBER MinNum;    //!<最低生成数
		NUMBER MaxNum;    //!<最大生成数
		PPM Probability;  //!<生成確率
	};

	/*! 
	* @class Dungeon
	* @brief ダンジョンのクラス
	* @details
	* <H1>概要</H1>
	* Dungeonクラスは、ゲーム中に存在するダンジョンの特性を定義する。
	* <H2>ステータス要素</H2>
	* ダンジョンは以下のステータス要素を持っている。
	* <ul>
	* <li>開始階層/MinDepth</li>
	* <li>最深階層/MaxDepth</li>
	* <li>基本外壁地形タグ/OuterWallFloor</li>
	* <li>基本内壁地形タグ/InnerWallFloor</li>
	* <li>所有陣営タグ/ControlCamp</li>
	* <li>ダンジョンの守護者タグ/GuardianSpecies</li>
	* <li>ダンジョンの基本サイズ/BaseSize</li>
	* </ul>
	*/
	class Dungeon : public GameElement
	{
	private:

		std::list<FixedFieldTable> fixFieldTableList; //!< 固定フロアのリスト
		DEPTH minDepth;       //!< 開始階層
		DEPTH maxDepth;       //!< 最深階層
		TAG outerWallFloor; //!< 基本外壁地形タグ
		TAG innerWallFloor; //!< 基本内壁地形タグ
		TAG floorFloor;     //!< 基本床地形タグ
		TAG controlCamp;      //!< 所有陣営タグ
		TAG guardianSpecies;  //!< ダンジョンの守護者タグ
		Coordinates baseSize; //!< ダンジョンの基本サイズ

		friend class boost::serialization::access;

		/*!
		* @brief クラスのシリアライズを設定する
		* @param archive アーカイブ化するクラスのアドレス
		* @param version ファイルバージョン
		* @return XMLSerializeテンプレート
		*/
		template<class Archive> void serialize(Archive &archive, const unsigned int version) 
		{
			if(version >= 0)
			{
				archive & boost::serialization::make_nvp("Name", name);
				archive & boost::serialization::make_nvp("Description", description);
				archive & boost::serialization::make_nvp("MinDepth", minDepth);
				archive & boost::serialization::make_nvp("MaxDepth", maxDepth);
				archive & boost::serialization::make_nvp("OuterWallFeature", outerWallFloor);
				archive & boost::serialization::make_nvp("InnerWallFeature", innerWallFloor);
				archive & boost::serialization::make_nvp("FloorFeature", floorFloor);
				archive & boost::serialization::make_nvp("ControllCamp", controlCamp);
				archive & boost::serialization::make_nvp("GuardianSpecies", guardianSpecies);
				archive & boost::serialization::make_nvp("BaseSize", baseSize);
			}
		}


	public:

		/*! 
		* @brief Dungeonクラスコンストラクタ
		*/
		Dungeon::Dungeon(void);

		/*! 
		* @brief Dungeonクラスデストラクタ
		*/
		Dungeon::~Dungeon(void);

		/*! 
		* @brief ダミーデータによる初期化
		* @return なし
		*/
		void Dungeon::WipeData(void);

		/*!
		* @brief ダンジョンの最低階層を返す
		* @return ダンジョンの最低階層 
		*/
		DEPTH Dungeon::GetMinDepth(void);

		/*!
		* @brief ダンジョンの最高階層を返す
		* @return ダンジョンの最高階層 
		*/
		DEPTH Dungeon::GetMaxDepth(void);

		/*!
		* @brief ダンジョンの基本外壁地形を返す
		* @return ダンジョンの基本外壁地形タグ
		*/
		TAG Dungeon::GetOuterWallFloorTag(void);

		/*!
		* @brief ダンジョンの基本外壁地形を返す
		* @return ダンジョンの基本外壁地形参照ポインタ
		*/
		Floor *Dungeon::GetOuterWallFloorPtr(void);

		/*!
		* @brief ダンジョンの基本内壁地形を返す
		* @return ダンジョンの基本内壁地形参照タグ
		*/
		TAG Dungeon::GetInnerWallFloorTag(void);

		/*!
		* @brief ダンジョンの基本内壁地形を返す
		* @return ダンジョンの基本内壁地形参照ポインタ
		*/
		Floor *Dungeon::GetInnerWallFloorPtr(void);

		/*!
		* @brief ダンジョンの基本床地形を返す
		* @return ダンジョンの基本床地形参照タグ
		*/
		TAG Dungeon::GetFloorFloorTag(void);

		/*!
		* @brief ダンジョンを所有する陣営を返す
		* @return ダンジョンの所有陣営ID
		*/
		ID GetControlCampID(void);

		/*!
		* @brief ダンジョンを所有する陣営を返す
		* @return ダンジョンの所有陣営参照ポインタ
		*/
		Camp *GetControlCampPtr(void);

		/*!
		* @brief ダンジョン守護者クリーチャー種別を返す
		* @return ダンジョンの所有陣営参照ID
		*/
		ID Dungeon::GetGurdianSpeciesID(void);

		/*!
		* @brief ダンジョン守護者クリーチャー種別を返す
		* @return ダンジョンの所有陣営参照ポインタ
		*/
		Species *Dungeon::GetGurdianSpeciesPtr(void);

		/*!
		* @brief ダンジョンの基本サイズを返す
		* @return ダンジョンの基本サイズ
		*/
		Coordinates Dungeon::GetBaseSize(void);

	};

}

BOOST_CLASS_VERSION(Deeangband::Dungeon, 10);
