/*!
* @file GameElement.h
* @brief GameElementクラスと付随要素のプロトタイプ
* @date 2014/02/01
* @author Deskull
* 2013-2014 Sikabane Works.
*/

#pragma once

#include "Deeangband.h"

namespace Deeangband
{
	class GameWorld;

	/*! 
	* @class GameElement
	* @brief ゲームの諸要素の管理を行うスーパークラス
	*/
	class GameElement
	{
	private:

		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("ValidGenerated", validGenerated);
			}
		}

	protected:

		NAME name; //!< 名前
		DESCRIPTION description; //!< 解説
		bool validGenerated; //!< 正しく生成されたかの判定フラグ

	public:

		/*! 
		* @brief 長さを単位つきでstringに変換する。
		*/
		static std::string GameElement::HeightFormat(HEIGHT height);

		/*! 
		* @brief 重量を単位つきでstringに変換する。
		*/
		static std::string GameElement::WeightFormat(WEIGHT weight); 


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

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

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

		/*!
		* @brief 名前を取得する
		* @return 名前
		*/
		NAME GameElement::GetName(void);

		/*!
		* @brief 解説を取得する
		* @return 解説
		*/
		DESCRIPTION GameElement::GetDescription(void);

		/*!
		* @brief 所属元のGameWorldインスタンスを返す
		* @return GameWorldインスタンスの参照ポインタ
		*/
		GameWorld *GameElement::GetGameWorld(void);

		/*!
		* @brief 所属元のGameWorldインスタンスを返す
		* @return GameWorldインスタンスの参照ポインタ
		*/
		bool GameElement::IsValidGenerated(void);

	};

}

BOOST_CLASS_VERSION(Deeangband::GameElement, 10);
