/*!
* @file Trap.h
* @brief ゲーム中のトラップのプロトタイプ
* @date 2014/01/26
* @author Deskull
* 2014 Sikabane Works.
*/

#pragma once

#include "stdafx.h"
#include "Coordinates.h"
#include "GameInstance.h"
#include "TrapBase.h"

namespace Deeangband
{

	/*! 
	* @class Trap
	* @brief トラップのクラス
	* @details
	* <H1>概要</H1>
	* Trapクラスは、フロアに配置されるトラップの自体を定義する。
	* <H2>ステータス要素</H2>
	* トラップは以下のステータス要素を持っている。
	* <ul>
	* <li>配置フロアID/FieldID</li>
	* <li>配置座標/Position</li>
	* <li>現在耐久度/CurrentHP</li>
	* <li>最大耐久度/MaxHP</li>
	* <li>解除難度/Difficulty</li>
	* </ul>
	*/
	class Trap : public GameInstance
	{
	private:

		TAG trapBaseTag; //!<トラップベースタグ
		Coordinates position; //!<所在座標
		HP curHP; //!<現在耐久度
		HP maxHP; //!<最大耐久度
		POWER difficulty; //!<解除難度

		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("TrapBaseTag", trapBaseTag);
				archive & boost::serialization::make_nvp("Position", position);
				archive & boost::serialization::make_nvp("CurHP", curHP);
				archive & boost::serialization::make_nvp("MaxHP", maxHP);
				archive & boost::serialization::make_nvp("Difficulty", difficulty);
			}
		}

	public:

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

		/*! 
		* @brief Trapクラスコンストラクタ
		*/
		Trap::Trap(std::map<TAG, boost::shared_ptr<TrapBase>>::iterator trapBaseIt, Coordinates *position);

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

		/*! 
		* @brief ダミーデータの設定
		* @return なし
		*/
		void Trap::WipeData(void);

	};

}

BOOST_CLASS_VERSION(Deeangband::Trap, 10);
