/*!
* @file Effect.h
* @brief 効果属性のプロトタイプ宣言
* @date 2013/12/22
* @author Deskull
* 2013 Sikabane Works.
*/

#pragma once

#include "stdafx.h"
#include "GameElement.h"

namespace Deeangband
{

	/*! 範囲タイプの列挙体 */
	typedef enum ZoneType 
	{
		ZONETYPE_SELF,   //!<セルフ型
		ZONETYPE_BOLT,   //!<ボルト型
		ZONETYPE_BEAM,   //!<ビーム型
		ZONETYPE_BALL,   //!<ボール型
		ZONETYPE_BREATH, //!<ブレス型
		ZONETYPE_WAVE,   //!<ウェーブ型
		ZONETYPE_STORM,  //!<ストーム型
		ZONETYPE_SPRASH, //!<スプラッシュ型
		ZONETYPE_SWARM,  //!<スウォーム型
	} ZoneType;

	/*!
	* @class Effect
	* @brief 効果属性のクラス
	* @details
	* <h1>概略</h1>
	* <p>効果(Effect)は指定された地点のクリーチャー、アイテム、地形に対して一定の処理を行う。</p>
	* <h2>変愚蛮怒からの変化</h2>
	* <p>細かな追加や修正を行う。特に魔法的な効果の中で多重実装になっていたものを統廃合する予定。</p>
	* <h2>影響範囲</h2>
	* 影響範囲(Zone)は発動特性やトラップの作用などにより発生する効果(Effect)の作用範囲を示す。
	* <h3>変愚蛮怒からの変化</h3>
	* <ul>
	* <li>作用そのものについては若干を除き、大きな変化はない。</li>
	* <li>「八方手裏剣」や「虚無招来」など固定的に8方向になっていたものを射程範囲内の地点に飛ぶスプラッシュ型ないしチェイン型に変更する程度。</li>
	* <li>多重実装が頻繁に繰り返されていたものをcast_[ self / bolt / beam / grenade / ball / breath / wave / storm / chain]()にまでまとめなおす。</li>
	* <li>レイシャルな魔法などに確率やレベルに応じてボルト型がビーム型やウェーブ型になるものがあったが、全て別の発動特性として切り分ける。</li>
	* </ul>
	* <h3>種別</h3>
	* <ul>
	* <li>セルフ型(Self type)</li>
	* <li>ボルト型(Bolt type)</li>
	* <li>ビーム型(Beam type)</li>
	* <li>グレネード型(Grenade type)</li>
	* <li>ボール型(Ball type)</li>
	* <li>ブレス型(Breath type)</li>
	* <li>ウェーブ型(Wave type)</li>
	* <li>ストーム型(Storm type)</li>
	* <li>スプラッシュ型(Splash type)</li>
	* <li>チェイン型(Chain type)</li>
	* <li>スウォーム型(Swarm type)</li>
	* </ul>
	*/
	class Effect : public GameElement
	{
	private:

		std::string name;

		friend class boost::serialization::access;

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

	public:

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

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

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

		/*! 
		* @brief 効果属性名を返す
		* @return 効果属性名
		*/
		std::string Effect::GetName(void);

	};

}