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

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

#pragma once

namespace Deeangband
{

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

	private:

		SOUL baseSoul; //!< 基本ソウル量

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

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

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

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

		NUMBER currentCreationNumber; //!< 現在生成数
		NUMBER currentDeadNumber; //!< 現在死亡数
		NUMBER maxCreationNumber; //!< 最大生成数

		TAG baseFirstRace; //!< 基本種族タグ1
		TAG baseSecondRace; //!< 基本種族タグ2

		std::vector<TAG> authorityTags; //!< 権能タグ配列

		template<class Archive> void serialize(Archive &archive, const unsigned int version) 
		{
			if(version >= 0)
			{
				archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(GameElement);
				archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(HaveSymbol);
				archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(HaveSize);
			}
		}

	public:

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

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

		/*! 
		* @brief データ初期化
		*/
		void Species::WipeData(void);

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

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

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

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

		/*! 
		* @brief 所持権能の一覧を返す
		* @return 所持権能一覧のvector
		*/
		std::vector<TAG> GetAuthorityTags(void);

		/*! 
		* @brief 第一種族のタグを返す
		* @return 第一種族のタグ
		*/
		TAG GetFirstRaceTag(void);

		/*! 
		* @brief 第二種族のタグを返す
		* @return 第二種族のタグ
		*/
		TAG GetSecondtRaceTag(void);

	};

}

