/*!
* @file Race.h
* @brief ゲーム中の種族情報のプロトタイプ
* @date 2014/03/01
* @author Deskull
* 2014 Sikabane Works.
*/

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

namespace Deeangband
{

	/*! 
	* @class Race
	* @brief 種族情報のクラス
	* @details
	* <h1>概要</h1>
	* <p>種族(race)は、クリーチャーの最も上位な種類分けの一つとして、特性(trait)の付与やステータス修正を与える。</p>
	* <ul><li>種族の適用の形には純潔種族、混血種族、変異種族の三種がある。</li></ul>
	* <h2>変愚蛮怒からの変化</h2>
	* <ul>
	* <li>プレイヤーだけでなく、モンスター自身が種族を持つようになった。
	* <ul>
	* <li>それに伴い種族にクイスルスルグ、モルドなど完全に人型を逸脱した種族も追加されている。プレイアブルにするかは検討中。</li>
	* </ul>
	* </li>
	* <li>アンデッド系ないし人造種族は独立した種族にするのではなく、前身の種族に「吸血鬼」「スケルトン」「ゴーレム」「アンドロイド」などの「付与特性」を与える。
	* <ul>
	* <li>種族名称はそれに伴い「元ドワーフの吸血鬼」「エルフ型アンドロイド」などになる。</li>
	* </ul>
	* </li>
	* </ul>
	* <h2>適用分類</h2>
	* <h3>純血種族</h3>
	* <p>その種族の純潔であることを指す。そのまま「純血修正」が付与される。</p>
	* <h3>混血種族</h3>
	* <p>二種類の種族の混血であることを指す。双方の種族が持つ「混血修正」の上乗せ、ないし平均値が適用される。</p>
	* <ul>
	* <li>全種族のかけ合わせができる訳ではない。</li>
	* <li>一部の有名どころの混血種族には独自の名前が与えられる。（特別な特性付加も検討するかも知れないが現状は特に考えていない）</li>
	* </ul>
	* <h3>変異種族</h3>
	* <p>ビーストマンのレベル経過やカオス属性攻撃の副作用などにより、その種族的特性が副次的に付加されたことを指す。複数の種族の「混血修正」の上乗せ、ないし平均値が適用される。</p>
	*/
	class Race : public CreatureTemplate
	{
	private:

		NAME name;
		BASE_STATUS pureStatusPlus[CS_MAX]; /*!<純血ステータス修正*/
		BASE_STATUS halfStatusPlus[CS_MAX]; /*!<混血ステータス修正*/

		/*!
		* @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(pureStatusPlus);
			archive & BOOST_SERIALIZATION_NVP(halfStatusPlus);
		}

	public:

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

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

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

		/*! 
		* @brief 種族名を取得する
		* @return 種族名
		*/
		NAME Race::GetName(void);

	};

}