/*!
 * @file Creature.h
 * @brief ゲーム中のクリーチャーと付随要素のプロトタイプ
 * @date 2013/12/11
 * @author Deskull
 * 2013 Sikabane Works.
 */

#pragma once

#include "stdafx.h"
#include "BaseStatusTable.h"
#include "Coordinates.h"
#include "Discipline.h"
#include "Effect.h"
#include "Floor.h"
#include "Item.h"
#include "GameElement.h"
#include "SavingTable.h"
#include "Species.h"

/*!
 * @class Creature
 * @brief クリーチャーのクラス
 */
class Creature : public GameElement
{
private:

	static const SOUL soulLevel[CREATURE_MAX_LEVEL]; //!< 必要ソウルレベルテーブル

	string name;      //!< クリーチャーの名前
	HP currentHp;     //!< 現在のHP
	HP max_hp;        //!< 現在の最大HP
	MP currentMp;     //!< 現在のMP
	MP maxMp;         //!< 現在の最大MP
	MP maxMaxMp;      //!< 本来の最大MP
	SOUL currentSoul; //!< 現在のソウル値
	SOUL maxSoul;     //!< ソウル最大到達値

	HEIGHT height;    //!< 身長
	HEIGHT weight;    //!< 体重

	FEED currentFeed; //!< 現在滋養値
	FEED maxFeed;     //!< 最大滋養値

	Discipline currentDiscipilne; /*!< 現在の修養値 */
	LEVEL divineLevel; //!< 神性レベル

	BaseStatusTable currentStatus; /*!< 現在のステータス */
	BaseStatusTable maxStatus;     /*!< 通常のステータス */
	BaseStatusTable maxMaxStatus;  /*!< 限界のステータス */

	SavingTable savings; /*!< セービング */

	ID floorID; /*!< 現在いるフロアID */
	Coordinates position; /*!< 現座標 */
	map<ID, TAG, Item> itemList; /*!< 所持アイテムリスト */
	char symbol; /*!< シンボルキャラ */
	Color symbolColor; /*!< シンボルカラー */
	ID tileID ;/*!< タイルID */

	HP hpTable[CREATURE_MAX_LEVEL]; //!< ヒットダイスに基づき生成されたレベル毎の基本HP

	/*!
	 * @brief クリーチャー死亡時の処理を行う
	 */
	void Creature::die(void);

	/*!
	 * @brief クリーチャーの現HPを増減させる
	 */
	void Creature::calcHP(HP amount);

	/*!
	 * @brief クリーチャーの現MPを増減させる
	 */
	void Creature::calcMP(MP amount);

	/*!
	 * @brief クリーチャーの現HPを設定する
	 */
	void Creature::setHP(HP amount);

	/*!
	 * @brief クリーチャーの現MPを設定する
	 */
	void Creature::setMP(MP amount);

	/*!
	 * @brief クリーチャーを所定フロアの所定座標に移動する
	 * @param floorID 移動先フロアID
	 * @param x 移動先x座標
	 * @param y 移動先y座標
	 * @return 移動できなかった場合のエラーID
	 */
	int Creature::move(ID floor_ID, int x, int y);

	/*!
	 * @brief クリーチャーを所定フロアの所定座標に移動する
	 * @param floorID 移動先フロアID
	 * @param coord 移動先座標
	 * @return 移動できなかった場合のエラーID
	 */
	int Creature::move(ID floor_ID, Coordinates coord);

	/*!
	 * @brief クリーチャーのレベル毎基本HPを再計算する
	 */
	void Creature::calcHPTable(void);

public:

	/*! 
	 * @brief Creatureクラスコンストラクタ(GameElementメンバ対応)
	 * @param speciesPtr 生成元となるクリーチャー種別
	 * @param id GameElementのID
	 * @param TAG GameElementのタグ
	 * @param gameWorld 所属元gameWorld参照ポインタ
	 */
	Creature::Creature(Species *speciesPtr, ID id, TAG tag, GameWorld *gameWorld);

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

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

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

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

	/*!
	 * @brief クリーチャーが生存している状態かを返す
	 * @return 生存しているならばtrueを返す
	 */
	bool Creature::IsAlive(void);

	/*!
	 * @brief 受けた属性効果を処理する
	 * @param effectPtr
	 * @param amount
	 */
	bool Creature::TakeEffect(Effect* effectPtr, POWER amount);

	/*! 
	 * @brief クリーチャーの現レベルを返す
	 * @return クリーチャーの現レベル
	 */
	LEVEL Creature::GetLevel(void);

	/*!
	 * @brief クリーチャーの現HPを返す
	 * @return クリーチャーの現HP
	 */
	const HP Creature::GetCurHP(void);

	/*!
	 * @brief クリーチャーの現最大HPを返す
	 * @return クリーチャーの現最大HP
	 */
	const HP Creature::GetMaxHP(void);

	/*!
	 * @brief クリーチャーの通常最大HPを返す
	 * @return クリーチャーの通常最大HP
	 */
	const HP Creature::GetNorMaxHP(void);

	/*!
	 * @brief クリーチャーの現MPを返す
	 * @return クリーチャーの現MP
	 */
	const MP Creature::GetCurMP(void);

	/*!
	 * @brief クリーチャーの現最大MPを返す
	 * @return クリーチャーの現最大MP
	 */
	const MP Creature::GetMaxMP(void);

	/*!
	 * @brief クリーチャーの通常最大MPを返す
	 * @return クリーチャーの通常最大MP
	 */
	const MP Creature::GetNorMaxMP(void);

	/*!
	 * @brief クリーチャーの現装甲セービング値を返す
	 * @return クリーチャーの現装甲セービング値
	 */
	const AC Creature::GetArmorSaving(void);

	/*!
	 * @brief クリーチャーの現回避セービング値を返す
	 * @return クリーチャーの現回避セービング値
	 */
	const EV Creature::GetEvasionSaving(void);

	/*!
	 * @brief クリーチャーの現意思セービング値を返す
	 * @return クリーチャーの現意思セービング値
	 */
	const VO Creature::GetVolitionSaving(void);

	/*!
	 * @brief クリーチャーの現在位置を返す
	 * @return クリーチャー現在位置を示すCoordinates
	 */
	const Coordinates *Creature::getCorrdinates(void);

	/*!
	 * @brief クリーチャーの所持品リストを返す
	 * @return クリーチャー所持品リストマップ
	 */
	const map<ID, TAG, Item> *Creature::getItemList(void);

	/*!
	 * @brief クリーチャーの現ソウル値を返す
	 * @return クリーチャーの現ソウル値
	 */
	const SOUL Creature::GetCurrentSoul(void);

	/*!
	 * @brief クリーチャーのソウル最大到達値を返す
	 * @return クリーチャーのソウル最大到達値
	 */
	const SOUL Creature::GetMaxSoul(void);

	/*!
	 * @brief クリーチャーの現基礎能力値を返す
	 * @param stat 取得したい基礎能力値ID
	 * @return 基礎能力値の現在値
	 */
	const BASE_STATUS Creature::GetCurrentStatus(CREATURE_STATUS stat);

	/*!
	 * @brief クリーチャーの平常基礎能力値を返す
	 * @param stat 取得したい平常能力値ID
	 * @return 基礎能力値の平常値
	 */
	const BASE_STATUS Creature::GetMaxStatus(CREATURE_STATUS stat);

	/*!
	 * @brief クリーチャーの限界基礎能力値を返す
	 * @param stat 取得したい限界能力値ID
	 * @return 基礎能力値の限界値
	 */
	const BASE_STATUS Creature::GetMaxMAXStatus(CREATURE_STATUS stat);

	/*!
	 * @brief クリーチャーの現在修養値を返す
	 * @param stat 取得したい現在修養値のID
	 * @return 現在修養値
	 */
	const int Creature::GetDiscipilnePoint(DISCIPLINE_TYPE typ);

	/*!
	 * @brief クリーチャーの現在修養ランクを返す
	 * @param stat 取得したい現在修養ランクのID
	 * @return 現在修養ランク
	 */
	const int Creature::GetDiscipilneRank(DISCIPLINE_TYPE typ);

	/*!
	 * @brief クリーチャーの身長を返す
	 * @param stat 取得したい現在修養ランクのID
	 * @return 身長
	 */
	const HEIGHT Creature::GetHeight(void);

	/*!
	 * @brief クリーチャーの体重を返す
	 * @return 体重
	 */
	const WEIGHT Creature::GetWeight(void);

	/*!
	 * @brief クリーチャーの体格値を返す
	 * @return 体格値
	 */
	const BODY_SIZE Creature::GetSize(void);

	/*!
	 * @brief ソウル値の新規加算処理
	 * @plus 新規加算ソウル量
	 * @return なし
	 */
	void Creature::GainSoul(SOUL plus);

	/*!
	 * @brief ソウル値の喪失処理
	 * @plus 喪失ソウル量
	 * @return なし
	 */
	void Creature::LostSoul(SOUL amount);

	/*!
	 * @brief クリーチャーの神性レベルを返す
	 * @return 神性レベル
	 */
	const LEVEL Creature::GetDivineLevel(void);

	/*!
	 * @brief 現在滋養値を返す
	 * @return 現在滋養値
	 */
	const FEED Creature::GetCurrentFeedPoint(void);

	/*!
	 * @brief 最大滋養値を返す
	 * @return 最大滋養値
	 */
	const FEED Creature::GetMaxFeedPoint(void);

};

