/*!
* @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 HavePosition
	* @brief シンボル保持抽象クラス
	*/
	class HavePosition
	{
	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("Position", position);
				archive & boost::serialization::make_nvp("Field", field);
			}
		}

	protected:

		Coordinates position; //!< 所在座標
		ID fieldID; //!< 現在フロアID

	public:

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

		/*! 
		* @brief HavePositionクラスコンストラクタ
		* @param coordinates 初期座標
		*/
		HavePosition::HavePosition(Coordinates *coordinates);

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

		/*! 
		* @brief HavePositionクラスコンストラクタ
		* @param fieldID 初期フィールドID
		* @param coordinates 初期座標
		*/
		HavePosition::HavePosition(ID fieldID, Coordinates *coordinates);

		/*! 
		* @brief HavePositionクラスコンストラクタ
		* @param fieldID 初期フィールドID
		* @param x 初期x座標
		* @param y 初期y座標
		*/
		HavePosition::HavePosition(ID fieldID, int x, int 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
		*/
		int HavePosition::Move(ID fieldID, int x, int y);

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

BOOST_CLASS_VERSION(Deeangband::HavePosition, 10);
