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

#pragma once

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

class Camp;
class Species;
class Floor;
class Feature;

namespace Deeangband
{

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

	/*! 
	* @class Dungeon
	* @brief ダンジョンのクラス
	*/
	class Dungeon : public GameElement
	{
	private:

		std::list<FixedFloorTable> fixFloorTableList; //!< 固定フロアのリスト
		DEPTH minDepth;      //!< 開始階層
		DEPTH maxDepth;      //!< 最深階層
		ID outerWallFeature; //!< 基本外壁地形ID
		ID innerWallFeature; //!< 基本内壁地形ID
		ID controlCamp;      //!< 所有陣営ID
		ID gurdianSpecies;   //!< ダンジョンの守護者ID

		friend class boost::serialization::access;

		/*!
		* @brief クラスのシリアライズ化を設定する
		* @param archive アーカイブ化するクラスのアドレス
		* @param fileVersion ファイルバージョン
		* @return XMLSerializeテンプレート
		*/
		template<class Archive> void serialize(Archive &archive, const unsigned int fileVersion) 
		{
			archive & BOOST_SERIALIZATION_NVP(mixDepth);
			archive & BOOST_SERIALIZATION_NVP(maxDepth);
			archive & BOOST_SERIALIZATION_NVP(outerWallFeature);
			archive & BOOST_SERIALIZATION_NVP(innerWallFeature);
			archive & BOOST_SERIALIZATION_NVP(controlCamp);
			archive & BOOST_SERIALIZATION_NVP(GetGurdianSpecies);
		}


	public:

		/*! 
		* @brief Dungeonクラスコンストラクタ(GameElementメンバ対応)
		* @param id GameElementのID
		* @param tag GameElementのタグ
		* @param gameWorld 所属元gameWorld参照ポインタ
		*/
		Dungeon::Dungeon(ID id, TAG tag, GameWorld *gameWorld);

		Dungeon::Dungeon(void);

		Dungeon::~Dungeon(void);

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

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

		/*!
		* @brief ダンジョンの基本外壁地形を返す
		* @return ダンジョンの基本外壁地形ID
		*/
		ID GetOuterWallFeatureID(void);

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

		/*!
		* @brief ダンジョンの基本内壁地形を返す
		* @return ダンジョンの基本内壁地形参照ID
		*/
		ID GetInnerWallFeatureID(void);

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

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

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

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

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

	};

}