/*!
* @file Item.h
* @brief ゲーム中のアイテムと付随要素のプロトタイプ
* @date 2013/12/11
* @author Deskull
* 2013 Sikabane Works.
*/

#pragma once

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

#include "Dice.h"
#include "Effect.h"
#include "GameInstance.h"
#include "ItemBase.h"
#include "ItemTemplate.h"
#include "SavingTable.h"
#include "HaveGameTime.h"
#include "HaveSymbol.h"
#include "HavePosition.h"


namespace Deeangband
{

	/*!
	 * @class Item
	 * @brief アイテムのクラス
	 */
	class Item : public ItemTemplate, public GameInstance, public HaveGameTime, public HavePosition
	{
	private:

		Dice baseDamage; //!< ベースダメージのダイス
		WEIGHT weight; //!< アイテムの重量
		SavingTable baseSaving; //!< 基本セービング修正
		SavingTable plusSaving; //!< 追加セービング修正


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

	public:

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

		/*! 
		* @brief Itemクラスコンストラクタ
		* @param itemBaseIt
		*/
		Item::Item(std::map<TAG, std::shared_ptr<ItemBase>>::iterator itemBaseIt);

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

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

		/*!
		 * @brief 受けた属性効果を処理する
		 * @return 何らかの効果を受けた場合にtrueを返す。
		 */
		bool Item::TakeEffect(Effect *effectPtr, POWER amount);

		/*!
		 * @brief ランダムな能力維持効果を付加する
		 * @param allowDuplicating 既に付加されている効果を重複して処理することを許すならtrue
		 * @return 意味のある付加が実際に行われた場合trueを返す。
		 * 既に全て付加されていたり、allowDuplicatingがtrueの場合の重複付加が行われた場合falseを返す。
		 */
		bool Item::addOneSustain(bool allowDuplicating);

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

	};

}
