/*!
* @file HavePosition.h
* @brief シンボル保持抽象クラスのプロトタイプ宣言
* @date 2014/06/11
* @author Deskull
* 2014 Sikabane Works.
*/

#pragma once

#include "stdafx.h"
#include "Coordinates.h"
#include "Deeangband.h"

namespace Deeangband
{

	class Field;

	/*! 
	 * @class HavePosition
	 * @brief シンボル保持抽象クラス
	 */
	class HavePosition
	{
	private:


		/*!
		 * @brief クラスのシリアライズを設定する
		 * @param archive アーカイブ化するクラスのアドレス
		 * @param version ファイルバージョン
		 * @return XMLSerializeテンプレート
		 */
		template<class Archive> void serialize(Archive &archive, const unsigned int version) 
		{
			if(version >= 0)
			{
			}
		}

	protected:

		Coordinates position; //!< 所在座標
		ID fieldID; //!< 現在フロアID
		std::shared_ptr<Field> fieldPtr; //!< 現在フロア参照ポインタ

	public:

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

		/*! 
		 * @brief HavePositionクラスコンストラクタ
		 * @param x 初期x座標
		 * @param y 初期y座標
		 */
		HavePosition::HavePosition(MAP_LENGTH x, MAP_LENGTH y);

		/*! 
		 * @brief HavePositionクラスコンストラクタ
		 * @param fieldIt 初期フィールドイテレータ参照
		 * @param x 初期x座標
		 * @param y 初期y座標
		 */
		HavePosition::HavePosition(std::map<ID, std::shared_ptr<Field>>::iterator fieldIt, MAP_LENGTH x, MAP_LENGTH y);


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

		/*! 
		 * @brief HavePositionデータ初期化
		 */
		void HavePosition::WipeData(void);

		/*!
		 * @brief 現在座標を返す
		 * @return 現在座標
		 */
		Coordinates HavePosition::GetPosition(void);

		/*!
		 * @brief 現在のクリーチャーが居るフィールドのIDを返す。
		 * @return 現在いるフィールドのID
		 */
		ID HavePosition::GetFieldID(void);

		/*!
		 * @brief 所定フロアの所定座標に移動する
		 * @param fieldID 移動先フロアID
		 * @param x 移動先x座標
		 * @param y 移動先y座標
		 * @return 移動できなかった場合のエラーID
		 */
		ACTION_RESULT HavePosition::Move(ID fieldID, MAP_POSITION x, MAP_POSITION y);

		/*!
		 * @brief 所定フロアの所定座標に移動する
		 * @param fieldID 移動先フロアID
		 * @param coord 移動先座標
		 * @return 移動できなかった場合のエラーID
		 */
		ACTION_RESULT HavePosition::Move(ID fieldID, Coordinates coord);
	};
}

