/*!
* @file Skill.h
* @brief ゲーム中のスキルのプロトタイプ
* @date 2013/12/17
* @author Deskull
* 2013 Sikabane Works.
*/

#pragma once

#include "stdafx.h"
#include "Deeangband.h"
#include "GameElement.h"
#include "Creature.h"

class GameWorld;

BOOST_CLASS_VERSION(Skill, 1);

namespace Deeangband
{

	/*!
	* @class Skill
	* @brief スキルのクラス
	*/
	class Skill : public GameElement
	{
	private:
		std::string name;
		std::string details;

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

	public:

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

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

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

		/*! 
		* @brief ダミーデータによる初期化
		* @return なし
		*/
		void Skill::SetDammyData(void);

		/*! 
		* @brief スキルの名称を返す
		* @return スキル名称
		*/
		std::string Skill::GetName(void);

		/*! 
		* @brief スキルの詳細を返す
		* @return スキル詳細
		*/
		std::string Skill::GetDetails(void);

		/*! 
		* @brief スキルランクを算出する
		* @param creaturePtr 算出したいクリーチャーのインスタンス参照ポインタ
		* @param tag 算出したいスキルのタグ
		* @return スキルランク
		*/
		static SKILL_RANK Skill::CalcSkillRank(Creature *creaturePtr, TAG tag);

	};

}