/*!
* @file CreatureTemplate.h
* @brief CreatureTemplateクラスとその他付随要素のプロトタイプ
* @date 2013/12/11
* @author Deskull
* 2013 Sikabane Works.
*/

#pragma once

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

#include "BaseStatusTable.h"
#include "GameElement.h"
#include "HaveSize.h"
#include "Discipline.h"

namespace Deeangband
{

	/*!
	* @class CreatureTemplate
	* @brief 種族、職業、選択、特性など、クリーチャーに包括的修正を与える要素をまとめる基本クラス
	*/
	class CreatureTemplate : public GameElement
	{
	private:

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

	protected:
		NAME name; //!<テンプレート名称
		DESCRIPTION description; //!<詳細記述
		BaseStatusTable statusPlus; //!<ステータス修正
		Discipline disciplinePlus; //!<修養値修正

	public:

		/*! 
		* @brief CreatureTemplateクラスコンストラクタ(デフォルト値入力)
		*/
		CreatureTemplate::CreatureTemplate(void);

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

		/*! 
		* @brief CreatureTemplateのデータ消去
		*/
		void CreatureTemplate::WipeData(void);

		/*! 
		* @brief 基本ステータス修正を返す
		* @return 基本ステータス修正構造体の参照ポインタ
		*/
		BaseStatusTable* CreatureTemplate::GetStatusPlus(void);

		/*! 
		* @brief 基本修養値修正を返す
		* @return 基本修養値修正構造体の参照ポインタ
		*/
		Discipline* CreatureTemplate::GetDisciplinePlus(void);

		/*! 
		* @brief 指定のスキルをクリーチャーが保持しているかを返す
		* @param tag スキルのタグ
		* @return 所持しているならばTRUEを返す
		*/
		bool CreatureTemplate::HasSkill(TAG tag);

	};

}

BOOST_CLASS_VERSION(Deeangband::CreatureTemplate, 10);
