#ifndef _G_SHOT_
#define _G_SHOT_

#include <hpllib/game/shot/HPLShot.h>
#include <hpllib/math/HPLMatrix.h>
#include <hpllib/game/block/HPLBlock.h>

#include "GPlayer.h"

class GShot: public HPLShot{
public:
	bool	m_bIsBounceToNoHit;		//! ブロックに1回でもヒットすると、敵に当たらなくなる
	bool	m_bIsAliveAfterHit;		//! 敵に当たった後も生き続ける

	bool	m_bIsHitToBlock;		//! ブロックにヒットする稼動kあ
	bool	m_bIsHoming;			//! ホーミングするか
	int		m_nParentType;			//! 発射したオブジェクトの種類
	bool	m_bIsDirectionDraw;		//! 方向によって絵を変えるか
	std::vector<HPLCounter*> m_vecStepCounterList;	//! ステップカウンタリスト
//	bool isReflectedShot_;		//! 発射された弾か？

	// Constructor/Destructor
public:
	GShot(int t);
	virtual ~GShot();

	// Getter/Setter
public:
	/** 炎属性か
	  */
	bool isFire();
	/** 電気属性か
	  */
	bool isElec();
	/** 爆発属性か
	  */
	bool isExplosion();
	/**
		物（敵やプレイヤー）にぶつかったときに消えるかどうか
	*/
	bool isDieWhenHitToObject();

	/** 近接攻撃か
	  */
	bool isMelee();

	// Operation
public:
	/** 地形との当り判定チェック&移動処理
	  * @param[in]	lpBlockMatrix	ブロックマトリクス
	  * @param[in]	lpBlockMap		衝突の有無をまとめたブロックリスト
	  */
	//bool collision( HPLMatrix<int>* lpBlockMatrix,
	//	std::map<int, HPLBlock*>* lpBlockMap );

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



	/////////////////////////////////////////////////////
	/////////////////////////////////////////////////////
	//! 死亡
	void die(HPLShootingObject* damageSource);

	//! ダメージ
	void damage(float dmg, HPLShootingObject* damageSource);





	/////////////////////////////////////////////////////
	/////////////////////////////////////////////////////
	//	他のオブジェクトとの関係変化
	/**
		接触時の行動(攻撃)
		敵のattackRect(デフォルトはhitRectと同じ)と
		プレイヤーのhitRectが接触した場合の行動
	*/
	void attackToPlayer( GPlayer* player);

	/** シーケンス取得
	  */
	HPLSequence* getSequence();
	int getSequenceID();
	void changeState( int t );
	/**
		剣やなんかで跳ね返す事が出来るか？
	*/
	bool isReflectable();

	/** ブロックにヒットするとバウンドするか？
	  */
	bool isBoundWhenHitToBlock();

	/** ブロックに接触すると消えるか？
	  */
	bool isDieWhenHitToBlock();
};

#endif
