#ifndef _G_PLAYER_
#define _G_PLAYER_

#include "GBasePlayer.h"

#ifdef _DXLIB
#include <DXPlayer.h>
#else
#include <hpllib/game/player/HPLPlayer.h>
#endif

//#include <hpllib/math/HPLMath.h>


/*namespace BuildType{
	enum{
		Missiler,
		FobokoP,
		FobokoF,
		BigMissiler,
		AllySlime,
		Evigen,

		MAX_NUM,
	};
};

class BuildData{
public:
	// アイコンシーケンス
	int iconSequenceID;

	// 
	int type;

	// 価格
	int mineralNum;
	int coinNum;
	int evilElementNum;

	int enemyType;

	// 生産完了までにかかるループ数。
	// 全体でループ数×8フレームかかる
	int loopNum;
public:
	BuildData(int t);
	~BuildData(){}
};*/

class GPlayer: public 
#ifdef _DXLIB
	DXPlayer
#else
	HPLPlayer
#endif
	, public GBasePlayer{

public:
	std::string		m_Name;				//! 名前
	HPLCounter		m_RespawnWaitCounter;	//! リスポーンするまでのカウンタ
	
	HPLCounter		m_DamageRecoveryCounter;	//! ダメージ後、復帰するまでの時間

private:
	int				m_nStockNum;		//! 残りストック
	int				m_nFirstStockNum;	//! 最大ストック数（与えられた最初のストック数）
private:
	// Getter/Setter
public:
	/**	stock num  */
	int getStockNum() {
		return this->m_nStockNum;
	}
	/**	stock num  */
	int setStockNum( int nStockNum ) {
		// 範囲内に納める
		if( nStockNum < 0 ) {
			nStockNum = 0;
		}
		//if( nStockNum >= this->m_nFirstStockNum ) {
		//	nStockNum = this->m_nFirstStockNum
		//}
		//nStockNum = HPLMath::getNewNumber( 
		//	nStockNum, 0, this->m_nFirstStockNum );

		this->m_nStockNum = nStockNum;
		return this->m_nStockNum;
	}
	/**	fist stock num  */
	int resetStockNum() {
		this->m_nStockNum = this->m_nFirstStockNum;
		return this->m_nStockNum;
	}
	/**	fist stock num  */
	void setFirstStockNum( int nStockNum ) {
		this->m_nFirstStockNum = nStockNum;
	}
	
	// コンストラクタ/デストラクタ
public:
	/** コンストラクタ
	  * @param[in]	t	プレイヤータイプ
	  *
	  */
	//GPlayer(int t);
	GPlayer();
	

	/** デストラクタ
	  */
	virtual ~GPlayer();

	/** jump
	  */
	void jump();

	void die(HPLShootingObject* damageSource);

	void damage(float dmg, HPLShootingObject* damageSource,
		bool isInv, int damageState);

#ifdef _DXLIB
	void draw();
#else
	void draw(HPLSDLImageManager* imageManager);
#endif

	HPLSequence* getSequence();

	int getSequenceID();

	void changeState(int st);

	int rollBackState();


	/**
	*/
	void checkJump();

	void changeType(int t);

	/**
		通常のDAMAGE,DAMAGE_ELEC,DEADに移行しない状態か？
	*/
	bool isSpecialState();

	/**
		敵や弾と接触しなくなる状態である
	*/
	bool isIgnoreAfterDie();

	/**
		この状態の間は物理的に吹っ飛ばない
	*/
	bool isNoImpactState();

	/**
		プレイヤーが操作できなくなる状態か？
	*/
	bool isNoPlayerControllableState();

	/**
		継続してダメージを受ける状態
	*/
	bool isSlipDamageState();

	bool isJumpableState();

	/**
		移動キーを押しても歩行グラフィックにならないパターン
	*/
	bool isNoChangeWhenWalk();

	bool isJumpableType();

	/**	
		
	*/
/*	bool isHitToShot();
	bool isHitToEnemy();
	bool isHitToNeutral();
*/
//	HPLSequencePair* getWeaponSequencePair();
};

#endif
