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

#include "stdafx.h"
#include "Camp.h"
#include "Species.h"
#include "Feature.h"
#include "GameElement.h"
#include "Deeangband.h"

#pragma once

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

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);

};
