/*!
* @file Species.h
* @brief ゲーム中のクリーチャー種別のプロトタイプ
* @date 2014/02/01
* @author Deskull
* 2014 Sikabane Works.
*/

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

#pragma once

namespace Deeangband
{

	/*!
	* @class Species
	* @brief クリーチャー種別のクラス
	*/
	class Species : public GameElement
	{

	private:

		std::string name;   //!< クリーチャーの名前
		SOUL baseSoul; //!< 基本ソウル量

		HEIGHT averageHeight;    //!< 平均身長
		HEIGHT averageWeight;    //!< 平均体重

		FEED baseFeed; //!< 基本滋養値
		LEVEL divineLevel; //!< 基本神性レベル

		ID baseCamp; //!< 基本所属陣営

		BaseStatusTable baseStatus; //!< 基本ステータス

		std::map<TAG, SKILL_EXP> skillExpList; //!< スキル経験値リスト

		friend class boost::serialization::access;
		template<class Archive> void serialize(Archive &archive, const unsigned int) 
		{
			archive & BOOST_SERIALIZATION_NVP(name);
			archive & BOOST_SERIALIZATION_NVP(baseSoul);
			archive & BOOST_SERIALIZATION_NVP(averageHeight);
			archive & BOOST_SERIALIZATION_NVP(averageWeight);
			archive & BOOST_SERIALIZATION_NVP(baseFeed);
			archive & BOOST_SERIALIZATION_NVP(divineLebel);
			archive & BOOST_SERIALIZATION_NVP(baseCamp);
			archive & BOOST_SERIALIZATION_NVP(baseStatus);
		}

	public:

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

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

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

		/*! 
		* @brief クリーチャー種別の名前を返す
		* @return 名前
		*/
		std::string Species::GetName(void);

		/*! 
		* @brief クリーチャー種別の基本ソウル量を帰す
		* @return ソウル量
		*/
		SOUL Species::GetBaseSoul(void);

		/*! 
		* @brief クリーチャー種別の平均身長を返す
		* @return 平均身長
		*/
		HEIGHT Species::GetAverageHeight(void);

		/*! 
		* @brief クリーチャー種別の平均体重を返す
		* @return 平均体重
		*/
		WEIGHT Species::GetAverageWeight(void);

		/*! 
		* @brief クリーチャー種別の基本滋養度を返す
		* @return 基本滋養度
		*/
		FEED Species::GetBaseFeed(void);

		/*! 
		* @brief クリーチャー種別のスキル基本経験値を返す
		* @param tag 取得したいスキルのタグ
		* @return 該当スキルの基本経験値、全くの未経験ならば0を返す
		*/
		SKILL_EXP Species::GetSkillExp(TAG tag);

		/*! 
		* @brief クリーチャー種別の基本所属陣営を返す
		* @return 基本所属陣営のID
		*/
		ID Species::GetBaseCampID(void);

	};

}