/*!
* @file Karma.h
* @brief カルマのプロトタイプ宣言
* @date 2014/02/01
* @author Deskull
* 2014 Sikabane Works.
*/

#pragma once

#include "stdafx.h"
#include "CreatureTemplate.h"
#include "Discipline.h"
#include "Deeangband.h"

namespace Deeangband
{

	/*! 
	* @brief カルマの一覧列挙
	*/
	enum KARMA_TYPE
	{
		VANILLA_IDEAL,       //!< カルマ:理想
		VANILLA_PRAGMATIC,   //!< カルマ:実利
		VANILLA_HARMONY,     //!< カルマ:調和
		VANILLA_ALOOFNESS,   //!< カルマ:孤高
		VANILLA_TEMPERATE,   //!< カルマ:節制
		VANILLA_INDULGENT,   //!< カルマ:奔放
		VANILLA_CHASTE,      //!< カルマ:貞節
		VANILLA_PASSION,     //!< カルマ:情欲
		VANILLA_MERCY,       //!< カルマ:慈悲
		VANILLA_CRUELTY,     //!< カルマ:冷酷
		VANILLA_HONEST,      //!< カルマ:誠実
		VANILLA_CLEVER,      //!< カルマ:狡猾
		VANILLA_FORGIVING,   //!< カルマ:寛大
		VANILLA_AVENGE,      //!< カルマ:執念
		VANILLA_GENEROUS,    //!< カルマ:恬淡
		VANILLA_GREED,       //!< カルマ:貪欲
		VANILLA_MODEST,      //!< カルマ:謙虚
		VANILLA_PROUD,       //!< カルマ:傲慢
		VANILLA_TRSUTING,    //!< カルマ:純朴
		VANILLA_SUSPICION,   //!< カルマ:猜疑
		VANILLA_ZEALOTRY,    //!< カルマ:熱心
		VANILLA_SCEPTICISM,  //!< カルマ:懐疑
		VANILLA_DELIGENT,    //!< カルマ:勤勉
		VANILLA_IDLENESS,    //!< カルマ:無為
		VANILLA_CREATION,    //!< カルマ:創造
		VANILLA_DESTRUCTION, //!< カルマ:破壊
		VANILLA_PLEASURE,    //!< カルマ:快楽
		VANILLA_PAIN,        //!< カルマ:苦痛
		VANILLA_WEALTH,      //!< カルマ:富裕
		VANILLA_PRESITIGE,   //!< カルマ:尊厳
		VANILLA_ERUDITION,   //!< カルマ:博識
		VANILLA_BRAVE,       //!< カルマ:勇猛
		VANILLA_DISCRETION,  //!< カルマ:思慮
		VANILLA_FORTUNE,     //!< カルマ:天運
		MAX_KARMAS,        //!< カルマ数
	};

	/*! 
	* @class Karma
	* @brief カルマのクラス
	* @details 
	* <H1>概要</H1>
	* <p>Karmaクラスは、名前通りクリーチャーの業(カルマ)の種別を定義するものである。</p>
	* <p>「カルマ」は変愚の「徳」のシステムの発展を目指したもので、クリーチャーが行った行為に基づいて、
	* 値が増減し、その状態量に応じて善、悪、秩序、混沌、天秤で構成された修養値も変化していく。</p>
	* <p>カルマの中にはそれぞれ対になっているもの同士があり、この場合双方のカルマ値は常に正負を違えて、
	* 絶対値が同じになる。</p>
	*/
	class Karma : public CreatureTemplate
	{
	private:

		Discipline desciplinePlus; //!< 修養値修正
		TAG antiKarma; //!< 対立カルマ

		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("descipline_plus", desciplinePlus);
			}
		}

	public:

		/*! 
		* @brief Karmaクラスコンストラクタ(初期値代入)
		*/
		Karma::Karma(void);

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

		/*! 
		* @brief Karmaクラスのデータ消去
		*/
		void Karma::WipeData(void);

		/*! 
		* @brief 修養値修正を返す
		* @return 修養値の参照ポインタ
		*/
		const Discipline* Karma::GetDiscipline(void);
	};

}

BOOST_CLASS_VERSION(Deeangband::Karma, 10);
