#ifndef _G_SHOT_MANAGER_
#define _G_SHOT_MANAGER_

#include <hpllib/cycle/HPLObjectManager.h>

#include "GShot.h"
#include "GShotSetting.h"

/** ショット処理
  */
class GShotManager : public HPLObjectManager<GShot> {
public:
	std::map<std::string, int> m_mapLabelMap;			//! 文字列をタイプ番号に変換
	std::map<int, GShotSetting> m_mapShotSettingMap;	//! ショットの設定

	bool m_bIsHitToPlayer;

	// メンバ変数
private:
	std::map<int,int> m_mapTypeAndSequenceIDMapping;		//! タイプからシーケンスIDを取得するマッピング
	std::list<GShot*> m_Adds;							//! 追加用リスト
	std::vector<float> shotPowerList;				//! ショットダメージ量

	// Constructor/Destructor
public:
	GShotManager();
	virtual ~GShotManager();

	// Operations
public:
	/** 種類からシーケンスIDを取得します。
	  */
	int getSequenceID( int nType );

	/** 動かします
	  */
	void process( bool bIsMove, bool bIsAI );

	/** 作成します。実体は本関数内でリストに追加されます。
	  */ 
	GShot* create( int nType, HPLVector& vCenter, int nParentID,
		int nFaceDirection);

	/** 移動します。
	  */
	void algorithm( GShot* lpShot );

	/** 対象1体あたりの当たり判定処理
	  * @retval	当たった場合true
	  */
	bool checkHitToOneTarget( GShot* lpShot, GPlayer* lpPlayer );

	/** 対象へのあたり判定を行います。
	  */
	void checkHitToTarget( GShot* lpShot );

	/**
		ホーミング能力がある場合ホーミング処理を行う
	*/
	void homing( GShot* lpShot );

	/**
		@param shot 跳ね返される弾
		@param isKillShot 弾をかき消すかどうか
		@param reflectPowerRate 反射後の攻撃力変化割合
		@param parentID 反射する本体のID
	*/
	void reflect( GShot* lpShot, bool bIsKillShot,
		float fReflectPowerRate,
		int nParentID); 

private:
	/** 爆発の定型
	  */
	GShot* createExplosion( GShot* lpShot );

	/** ダメージ量取得
	  */
	float getShotPower(int t);

};

#endif
