/*!
* @file Coordinates.h
* @brief Coordinatesクラスとその他付随要素の定義
* @date 2014/01/26
* @author Deskull
* 2014 Sikabane Works.
*/

#pragma once

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

BOOST_CLASS_VERSION(Coordinates, 1);

namespace Deeangband
{

	/*! 
	* @class Coordinates
	* @brief ゲーム座標のクラス
	* @details
	* <H1>概要</H1>
	* CoordinatesクラスはFieldによる二次元座標中に配置される各種オブジェクトの座標処理を定義する。
	* <H2>ステータス要素</H2>
	* ゲーム座標は以下のステータス要素を持っている。
	* <ul>
	* <li>X座標/FX</li>
	* <li>Y座標/FY</li>
	* </ul>
	*/
	class Coordinates
	{
	private:
		int fx; //!< X座標
		int fy; //!< Y座標

		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("X", fx);
				archive & boost::serialization::make_nvp("Y", fy);
			}
		}

	public:

		/*! 
		* @brief Coordinatesクラスのコンストラクタ
		* @param x X座標
		* @param y Y座標
		*/
		Coordinates::Coordinates(int x, int y);

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

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

		/*
		* @brief 座標を設定する
		* @param x X座標
		* @param y Y座標
		*/
		void Coordinates::Set(int x, int y);

		/*
		* @brief X座標を得る
		* @return X座標
		*/
		int Coordinates::GetX(void);

		/*
		* @brief Y座標を得る
		* @return Y座標を得る
		*/
		int Coordinates::GetY(void);

		/*!
		* @brief +演算子による座標代入
		* @param plus 加算元
		*/
		Coordinates Coordinates::operator=(const Coordinates& plus);  

		/*!
		* @brief +演算子による座標加算
		* @param plus 加算元
		*/
		Coordinates Coordinates::operator+(const Coordinates& plus);  

		/*!
		* @brief +=演算子による座標加算
		* @param plus 加算元
		*/
		Coordinates& Coordinates::operator+=(const Coordinates& plus);

	};

}

BOOST_CLASS_VERSION(Deeangband::Coordinates, 10);
