/*!
* @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
	{
		KARMA_IDEAL,       //!< カルマ:理想
		KARMA_PRAGMATIC,   //!< カルマ:実利
		KARMA_HARMONY,     //!< カルマ:調和
		KARMA_ALOOFNESS,   //!< カルマ:孤高
		KARMA_TEMPERATE,   //!< カルマ:節制
		KARMA_INDULGENT,   //!< カルマ:奔放
		KARMA_CHASTE,      //!< カルマ:貞節
		KARMA_PASSION,     //!< カルマ:情欲
		KARMA_MERCY,       //!< カルマ:慈悲
		KARMA_CRUELTY,     //!< カルマ:冷酷
		KARMA_HONEST,      //!< カルマ:誠実
		KARMA_CLEVER,      //!< カルマ:狡猾
		KARMA_FORGIVING,   //!< カルマ:寛大
		KARMA_AVENGE,      //!< カルマ:執念
		KARMA_GENEROUS,    //!< カルマ:恬淡
		KARMA_GREED,       //!< カルマ:貪欲
		KARMA_MODEST,      //!< カルマ:謙虚
		KARMA_PROUD,       //!< カルマ:傲慢
		KARMA_TRSUTING,    //!< カルマ:純朴
		KARMA_SUSPICION,   //!< カルマ:猜疑
		KARMA_ZEALOTRY,    //!< カルマ:熱心
		KARMA_SCEPTICISM,  //!< カルマ:懐疑
		KARMA_DELIGENT,    //!< カルマ:勤勉
		KARMA_IDLENESS,    //!< カルマ:無為
		KARMA_CREATION,    //!< カルマ:創造
		KARMA_DESTRUCTION, //!< カルマ:破壊
		KARMA_PLEASURE,    //!< カルマ:快楽
		KARMA_PAIN,        //!< カルマ:苦痛
		KARMA_WEALTH,      //!< カルマ:富裕
		KARMA_PRESITIGE,   //!< カルマ:尊厳
		KARMA_ERUDITION,   //!< カルマ:博識
		KARMA_BRAVE,       //!< カルマ:勇猛
		KARMA_DISCRETION,  //!< カルマ:思慮
		KARMA_FORTUNE,     //!< カルマ:天運
		MAX_KARMAS,        //!< カルマ数
	};

	/*! 
	* @class Karma
	* @brief カルマのクラス
	*/
	class Karma : public CreatureTemplate
	{
	private:
		Discipline desciplinePlus; //!< 修養値修正

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

	public:

		/*! 
		* @brief Karmaクラスコンストラクタ(GameElementメンバ対応)
		* @param id GameElementのID
		* @param tag GameElementのタグ
		* @param gameWorld 所属元gameWorld参照ポインタ
		*/
		Karma::Karma(ID id, TAG tag, GameWorld *gameWorld);

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

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

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

}