/*!
* @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 Floor;

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

		template<class Archive> void serialize(Archive &archive, const unsigned int) 
		{
		}

	public:

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

		Square::Square(std::map<TAG, std::shared_ptr<Floor>>::iterator& floorIt);


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

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

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

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

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

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

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

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

		/*!
		 * @brief 地形が壁で遮蔽されているかを返す
		 * @return 遮蔽されているならば true
		 */
		bool Square::IsWall(void);

		/*!
		 * @brief テレポート先にできるかを返す
		 * @return テレポート先に出来るなら true
		 */
		bool Square::IsTeleportableTarget(void);

	};

}

