/*!
* @file ItemTemplate.h
* @brief アイテムのステータステンプレート
* @date 2014/04/04
* @author Deskull
* 2014 Sikabane Works.
*/

#pragma once

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

#include "Dice.h"
#include "Effect.h"
#include "GameElement.h"
#include "HaveSize.h"
#include "HaveSymbol.h"
#include "SavingTable.h"

namespace Deeangband
{

	/*!
	* @class ItemTemplate
	* @brief アイテムのクラス
	*/
	class ItemTemplate : public GameElement, public HaveSize, public HaveSymbol
	{
	protected:

		Dice baseDamage; //!< ベースダメージのダイス
		SavingTable baseSaving; //!< 基本セービング修正
		SavingTable plusSaving; //!< 追加セービング修正

		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_NVP(baseDamage);
				archive & BOOST_SERIALIZATION_NVP(weight);
				archive & BOOST_SERIALIZATION_NVP(baseSaving);
				archive & BOOST_SERIALIZATION_NVP(plusSaving);
			}
		}

	public:

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

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

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

		/*! 
		* @brief 受けた効果を処理する
		* @return 実際に効果が処理された場合TRUEを返す。
		*/
		bool ItemTemplate::TakeEffect(Effect *effectPtr, POWER amount);

		/*! 
		 * @brief ベースダメージダイスを返す
		 * @return ベースダメージダイス
		 */
		Dice ItemTemplate::GetBaseDamage(void);

		/*! 
		 * @brief ベースダメージダイスを返す
		 * @return ベースダメージダイス
		 */
		SavingTable ItemTemplate::GetBaseSaving(void);

		/*! 
		 * @brief ベースダメージダイスを返す
		 * @return ベースダメージダイス
		 */
		SavingTable ItemTemplate::GetPlusSaving(void);

		/*! 
		 * @brief 基本装甲修正を返す
		 * @return 基本装甲修正
		 */
		AC ItemTemplate::GetBaseAC(void);

		/*! 
		 * @brief 追加装甲修正を返す
		 * @return 追加装甲修正
		 */
		AC ItemTemplate::GetPlusAC(void);

		/*! 
		 * @brief 基本回避修正を返す
		 * @return 基本回避修正
		 */
		EV ItemTemplate::GetBaseEV(void);

		/*! 
		 * @brief 追加回避修正を返す
		 * @return 追加回避修正
		 */
		EV ItemTemplate::GetPlusEV(void);

		/*! 
		 * @brief 基本意志修正を返す
		 * @return 基本意志修正
		 */
		VO ItemTemplate::GetBaseVO(void);

		/*! 
		 * @brief 追加意志修正を返す
		 * @return 追加意志修正
		 */
		VO ItemTemplate::GetPlusVO(void);

		/*! 
		 * @brief シンボルを返す
		 * @return シンボル
		 */
		SYMBOL ItemTemplate::GetSymbol(void);

		/*!
		* @brief XMLシリアライズによるゲームデータ保存処理
		* @return なし
		*/
		void ItemTemplate::XMLSave(std::string filename);

	};

}

BOOST_CLASS_VERSION(Deeangband::ItemTemplate, 10);
