/*!
* @file Discipline.h
* @brief 修養のプロトタイプ宣言
* @date 2014/03/04
* @author Deskull
* 2014 Sikabane Works.
*/

#pragma once

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

namespace Deeangband
{

	/*!
	* @brief 修養属性の列挙体
	*/
	typedef enum DISCIPLINE_TYPE
	{
		DISCIPLINE_TYPE_GOOD,    //!< 修養属性:善
		DISCIPLINE_TYPE_EVIL,    //!< 修養属性:悪
		DISCIPLINE_TYPE_ORDER,   //!< 修養属性:秩序
		DISCIPLINE_TYPE_CHAOS,   //!< 修養属性:混沌
		DISCIPLINE_TYPE_BALANCE, //!< 修養属性:天秤
		MAX_DISCIPLINE_TYPES,    //!< 修養属性数
	} DISCIPLINE_TYPE;


	/*! 
	* @class Discipline
	* @brief 修養のクラス
	*/
	class Discipline
	{
	private:

		NAME name;
		int disciplinePoint[MAX_DISCIPLINE_TYPES];

		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 <= 10)
			{
				archive & boost::serialization::make_nvp("Point", disciplinePoint);
			}
			else
			{
				archive & boost::serialization::make_nvp("Good", disciplinePoint[DISCIPLINE_TYPE_GOOD]);
				archive & boost::serialization::make_nvp("Evil", disciplinePoint[DISCIPLINE_TYPE_EVIL]);
				archive & boost::serialization::make_nvp("Order", disciplinePoint[DISCIPLINE_TYPE_ORDER]);
				archive & boost::serialization::make_nvp("Chaos", disciplinePoint[DISCIPLINE_TYPE_CHAOS]);
				archive & boost::serialization::make_nvp("Balance", disciplinePoint[DISCIPLINE_TYPE_BALANCE]);
			}
		}


	public:

		/*! 
		* @brief Disciplineクラスのコンストラクタ
		* @param good 善の修養値
		* @param evil 悪の修養値
		* @param order 秩序の修養値
		* @param chaos 混沌の修養値
		* @param balance 天秤の修養値
		*/
		Discipline::Discipline(int good, int evil, int order, int chaos, int balance);

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

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

		/*! 
		* @brief 修養値を取得する
		* @param typ 修養値の種別
		* @return 修養値
		*/
		const DISCIPLINE_POINT Discipline::GetPoint(DISCIPLINE_TYPE typ);

		/*! 
		* @brief 修養ランクを取得する
		* @param typ 修養値の種別
		* @return 修養ランク
		*/
		const DISCIPLINE_POINT Discipline::GetRank(DISCIPLINE_TYPE typ);

		/*! 
		* @brief 修養値を設定する
		* @param typ 修養値の種別
		* @param point 代入値
		* @return なし
		*/
		void Discipline::SetPoint(DISCIPLINE_TYPE typ, int point);

		/*! 
		* @brief 修養値を設定する
		* @param good 善の修養値
		* @param evil 悪の修養値
		* @param order 秩序の修養値
		* @param chaos 混沌の修養値
		* @param balance 天秤の修養値
		* @return なし
		*/
		void Discipline::SetPoint(int good, int evil, int order, int chaos, int balance);

		/*! 
		* @brief 修養値を加減算する
		* @param typ 修養値の種別
		* @param point 加算値
		* @return なし
		*/
		void Discipline::PlusPoint(DISCIPLINE_TYPE typ, int point);

		/*!
		* @brief +演算子による修養値全加算
		* @param plus 加算元
		*/
		Discipline Discipline::operator+(const Discipline& plus);  

		/*!
		* @brief +=演算子による修養値全加算
		* @param plus 加算元
		*/
		Discipline& Discipline::operator+=(const Discipline& plus);

		/*!
		* @brief 修養名を返す
		* @return 修養名
		*/
		std::string Discipline::GetName(void);

	};

}

BOOST_CLASS_VERSION(Deeangband::Discipline, 11);
