#ifndef _G_COMMON_WORK_
#define _G_COMMON_WORK_

#include "GPlayer.h"
#include "GObjectPlacer.h"
#include "GSetting.h"
#include "GGame.h"
#include "GEffect.h"

class GCommonWork {
public:
	int					m_nWinnerForceID;			//! 勝利者
	GGame				m_Game;						//! ゲーム関連データ
	GObjectPlacer		m_ObjectPlacer;				//! オブジェクト設置
	GSetting			m_Setting;					//!	ファイルに保存した設定

	std::vector<int> m_vecPlayerSequenceNumbers;	//! 各プレイヤーが持っているシーケンス数

private:
	int					m_nGameSceneType;			//! ゲームシーンの使いまわしタイプ

	// Constructor
public:
	GCommonWork();
	~GCommonWork();

	// Getter/Setter
public:
	//! m_nGameSceneType
	int getGameSceneType() {
		return this->m_nGameSceneType;
	}
	//! 別シーン→GAMEの遷移以外で使用しないこと
	void setGameSceneType( int nGameSceneType ) {
		this->m_nGameSceneType = nGameSceneType;
	}

	// Operations
public:
	/** 次のセットアップをする
	  * ・攻撃アルゴリズム登録
	  */
	void setup();

	/** ジャンプ可能な状態か確認。移動処理も行う
	  * @param[in]	lpoPlayer		プレイヤー
	  * @param[in]	lpvCenter			プレイヤーの中心座標
	  * @param[in]	lpvVelocityAngle	移動方向と移動量
	  */
	void jumpCheck(HPLShootingObject* lpPlayer, HPLVector* lpvCenter, HPLVector* lpvVelocityAngle);

	/** マップ読み込み
	  * @param[in]	nIndex	読み込むマップインデックス
	  */
	void setupMap( int nIndex );

	/////////////////////////
	// 共通化済み
	/**
	  * 二つのオブジェクトの当り判定を行う
	  * 通常版
	  * @param[in]	lpoObject1
	  * @param[in]	lpoObject2
	  * @retval	true	接触時
	  */
	bool isHit( HPLShootingObject* lpoObject1, HPLShootingObject* lpoObject2 );

	/**
	  * 二つの「範囲」が共有部分を持つか判定（値の範囲）
	  * @param[in]	aMin
	  * @param[in]	aMax
	  * @param[in]	bMin
	  * @param[in]	bMax
	  * @retval	true	共有部分有り
	  */
	bool isShare(float aMin, float aMax, float bMin, float bMax);

	/** 相手を吹き飛ばす
	  * @param[in]		lpoBlower		吹き飛ばす側
	  * @param[in,out]	lpoTarget		吹き飛ばされる側
	  */
	void blowAway( HPLShootingObject* lpoBlower, HPLShootingObject* lpoTarget,
		float fSpeed);
	/////////////////////////

	/** オブジェクトの種類にあわせたchangeState()を呼び出す
	  * changeState()はプロジェクト固有のため
	  * @param[in]	
	  */
	void changeState(HPLShootingObject* obj, int newState);

	/** えびげんのシーケンスID取得
	  * @param[in]		lpoObject	対象のオブジェクト
	  * @retval			int			シーケンスID
	  */
	int getEvigenSequenceID(HPLShootingObject* lpoObject);

	/** ダメージシーケンスID取得
	  * @param[in]		lpoObject	対象のオブジェクト
	  * @retval			int			シーケンスID
	  */
	int getDamageSequenceID(HPLShootingObject* lpoObject);

	/**
	  * えびげんの手持ち武器表示
	  * @param[in]	lpoEvigen		えびげん
	  * @param[in]	lpsWeaponSprite	表示用スプライト
	  * @param[in]	fLeft			えびげんの左上座標
	  * @param[in]	fTop				
	  * @param[in]	bIsUp			ミニガンで持ち上げているかどうか
	  */
	void drawEvigenWeapon(HPLShootingObject* lpoEvigen,
									HPLSprite* lpsWeaponSprite,
									float fLeft, float fTop,
									bool bIsUp);

	/** 空中でのダメージステートを設定
	  * 吹っ飛んでいる方向と向いている方向が同じか逆かで、ステートが異なる
	  * 
	  * @param[int,out]	obj	対象のオブジェクト
	  */
	void setDamageFlyingState(HPLShootingObject* obj);

	/** プレイヤーなのか敵なのか判別して取得
	  */
	HPLSequence* getSequenceFromObject( HPLShootingObject* lpObject );

	void rollBack( HPLShootingObject* lpObject );

	void drawNumbers( int nLeft, int nTop, int nNum );

	/** プレイヤーにダメージを与えて吹き飛ばします
	  * @param[in]	lpDamageSource		弾、敵、他のプレイヤー
	  * @param[in]	lpTargetPlayer		ダメージを与える対象のプレイヤー
	  * @param[in]	fSpeed				吹っ飛ばしスピード
	  * @param[in]	fDamage				加えるダメージ量
	  */
	void hitToPlayer( HPLShootingObject* lpDamageSource, GPlayer* lpTargetPlayer, float fSpeed, float fDamage );

	/** プレイヤーの種類をランダムにする
	  * @param[in]	bIsExceptController		操作しているプレイヤーについては除外
	  */
	void randomPlayers( bool bIsExceptController );

	GEffect* createEffect(int nType,
		const HPLVector& vFrom,
		const HPLVector& vTo,
		int nCreateEnemyType, int nForceID );

	/** プレイヤーの武器を表示
	  * @param[in]		nPlayerType
	  * @param[in]		state
	  * @param[in,out]	m_lpEvigenWeaponSprite
	  * @param[in,out]	m_lpDurandalSprite
	  */
	void drawPlayerWeapon(GPlayer& player, int nLeft, int nTop );
/*		int nPlayerType, HPLState state,
		HPLSprite* m_lpEvigenWeaponSprite,
		HPLSprite* m_lpDurandalSprite,
		int nFaceDirection,
		int left, int top,
		int nSequenceID);*/
	HPLSequencePair* getWeaponSequencePair(GPlayer& lpPlayer);

	/** プレイヤーのデフォルト描画
	  * @param[in]		lpPlayer		対象
	  * @param[in]		bIsEnemy		生成された敵ならtrue
	  * @param[in]		nGameSceneType	どの場面の操作か
	  */
	void defaultPlayerProcess( GPlayer* lpPlayer, bool bIsEnemy );

	/** 敵がサンドバックのステージ
	  */
	bool isTestStage();

	/** 使いまわしのゲームシーンを初期化
	  */
	void changeGameSceneType( int nGameSceneType );

	/** 量産キャラ発生させられる環境か
	  */
	bool isEnemyCreatable();
};

#endif
