/*!
* @file Square.h
* @brief ゲーム中のマスと付随要素のプロトタイプ
* @date 2013/12/11
* @author Deskull
* 2013 Sikabane Works.
*/

#pragma once

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

namespace Deeangband
{

	/*! 
	* @class Square
	* @brief マスのクラス
	*/
	class Square : public GameElement, public HaveInventory, public HaveHp
	{
	private:
		TAG floorTag;     //!<床地形タグ
		TAG spaceTag;     //!<空間地形タグ
		TAG airTag;       //!<大気地形タグ

		friend class boost::serialization::access;
		template<class Archive> void serialize(Archive &archive, const unsigned int) 
		{
			archive & boost::serialization::make_nvp("Floor", floorTag);
			archive & boost::serialization::make_nvp("HP", hitPoint);
			archive & boost::serialization::make_nvp("MaxHP", maxPoint);
		}

	public:

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

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

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

		/*!
		* @brief 所属するフロアのポインタを返す。
		*/
		Field* GetFieldPtr(void);

		/*!
		* @brief 地形タグをセットする。
		* @param tag セットするタグ
		* @return タグの変更ができた場合trueを返す。
		* @todo 正規のタグかどうか判定する機能を実装する。
		*/
		bool Square::SetFloorTag(TAG tag);

		/*!
		* @brief 対応する床地形のタグを返す。
		* @return 対応する床地形タグ
		*/
		TAG GetFloorTag(void);

		/*!
		* @brief 対応する床地形のタグを返す。
		* @return 対応する床地形タグ
		*/
		TAG GetAirTag(void);

		/*!
		* @brief 対応する空間地形のタグを返す。
		* @return 対応する床地形タグ
		*/
		TAG GetSpaceTag(void);

		/*!
		* @brief 対応する地形のポインタを返す。
		* @return 対応する地形の参照ポインタ
		*/
		Floor* GetFloorPtr(void);

	};

}

BOOST_CLASS_VERSION(Deeangband::Square, 10);
