//@STATE=作成中
//@DESCRIPTION ---------------------------------------------------------------
// GameImpl.h: GameImpl クラスのインターフェイス
//	履歴：
// $Log: GameImpl.h,v $
// Revision 1.1  2001/10/28 21:40:36  fujiwara
// DLLに分割
//
// Revision 1.11  2001/07/09 20:30:08  fujiwara
// 例外処理の組み込み
//
// Revision 1.10  2001/07/01 01:03:44  fujiwara
// const の見直し
// 配置エディタは途中経過
//
// Revision 1.9  2001/06/10 21:17:54  fujiwara
// 地上用追加
//
// Revision 1.8  2001/06/03 09:22:32  fujiwara
// 地上敵クラスおよび雑魚敵の微調整
//
// Revision 1.7  2001/05/29 01:12:54  fujiwara
// 雑魚キャラ(飛行物）の作成。配置エディタのバグ修正
//
// Revision 1.6  2001/05/17 12:34:10  fujiwara
// 地上敵サンプル作成
//
// Revision 1.5  2001/05/13 20:04:24  fujiwara
// メモリーリークが発生したので取り除く。
// 自弾のサウンドテスト
//
// Revision 1.4  2001/05/12 12:48:28  fujiwara
// 配置エディタ作成に伴う変更・追加
//
// Revision 1.3  2001/05/12 00:50:33  fujiwara
// ＣＶＳを導入し、ログ表示を追加
//
//@DESCRIPTION_END -----------------------------------------------------------
//@AUTHOR=S.F.
// Copyright (C) 2000 Satoshi Fujiwara. All Rights Reserved.
///////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_GAME_H__41F747F0_5498_488A_AE73_BC66B991D0ED__INCLUDED_)
#define AFX_GAME_H__41F747F0_5498_488A_AE73_BC66B991D0ED__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "AbstractScene.h"
#include "Game.h"

namespace sf {
	namespace application {
		
		namespace disposition {
			class Controller;
		}
		
		namespace player {
			namespace bullet{
				class Bullets;
				class GroundBullets;
			}
		}
		
		namespace enemy {
			class Enemys;
			class Bullets;
			class Armys;
		};

		namespace effect {
			class Effects;
		};

		namespace scene {


class GameImpl : public AbstractScene,public sf::system::input::keyboard::Listener,public Game
{
public:
	// LIFECYCLE //
	
	GameImpl();
	virtual ~GameImpl();
	
	// OPERATOR //
	
	// OPERATIONS //

	// 移動
	void move(void);
	
	// シーン終了イベント
	void endOfScene(Scene * const pScene);
	// 終了キー押下イベント
	void exitKeyPressed(Scene * const pScene);
	// キー押下イベント 
	void keyDown(const DWORD keyCode,const DWORD extKeyCode);
	// キーアップイベント
	void keyUp(const DWORD keyCode,const DWORD extKeyCode){};
	// キーボードイベントを受信するか
	const bool isListeningKeyboard(void) const {return mbKeyboardListening;};
	// Inputデバイス消滅イベント
	void keyboardTalkerIsDeleted(void){mpInput = NULL;};
	// プレイヤー情報表示
	void printPlayerInfo();
	// データエディット時情報表示
	void printEditInfo();
	// ゲームデータロード
	void load(const char * const pFileName);

	// ACCESS //
	const TYPE type() const{return GAME;};
		
	// 背景 //
	sf::system::console::Background* const background(void){return &mBackground;};
	
	// 自機 //
	sf::application::Character * const player(void){return mpMyShip;};
	
	// 難易度 
	const DIFFICULTY difficulty(void) const { return mDifficulty;};
	void difficulty(const DIFFICULTY value);
	
	// 現在の難易度
	const float currentDifficulty(void) const {return mCurrentDifficulty;};
	void currentDifficulty(float value)
	{	if(value > (float)HARD)
			mCurrentDifficulty = (float)HARD;
		else
			mCurrentDifficulty = value;
	};

	// ステージ No 
	void stageNo(const int value)
	{	int tmp = value;
		if(value < 0) tmp = 0;
		if(value > mStageMax ) tmp = mStageMax;
		mStageNo = tmp;
	};
	const int stageNo() const {return mStageNo;};
	
	// スクロール速度 
	void scrollSpeed(const float value){mScrollSpeed = value * sf::system::instance()->deltaTime();};
	const float scrollSpeed(void) const {return mScrollSpeed;}; 
	
	// スコア
	void score(const int value){mScore = value;};
	const int score(void) const {return mScore;};
	
	// スクロールY 位置 
	void scrollY(const float value){
		mBackground.offsetY(value);
		mScrollY = mBackground.offsetY();};
	const float scrollY(void) const {return mScrollY;};
	
	// リスタート位置の設定 
	void restartPosition(const float value){mRestartPosition = value;};
	const float restartPosition(void) const {return mRestartPosition;};

	// 配置データ制御オブジェクト 
	sf::application::disposition::Controller* const controllerPtr(void) 
	{ return mpController;};

	// 状態 
	void state(const STATE value){mState = value;};
	const STATE state(void) const {return mState;};

	// タイマ
	const int timer (void) const {return mTimer;};
	
	// INQUIRY 

private:

	void main();
	void initialize();
	void resetObjects();
	void loadStageData();
	void over();
	void clear();
	void restart();

	int mTimer;
	STATE mState;


	bool mbKeyboardListening;
	
	player::Ship* mpMyShip;
	player::bullet::Bullets *mpBullets;
	player::bullet::GroundBullets *mpGroundBullets;
	enemy::Enemys *mpEnemys;
	enemy::Bullets *mpEnemyBullets;
	enemy::Armys *mpArmys;
	Scene * mpStart;
	effect::Effects *mpEffects;

	sf::system::console::Background mBackground;
	sf::application::disposition::Controller* mpController;
	
	float mScrollY;
	float mScrollSpeed;
	float mRestartPosition;
	bool mbEdit;

	DIFFICULTY mDifficulty;
	float mCurrentDifficulty;
	int mStageNo;
	int mScore;
	int mStageMax;
	int mBgmId;

	std::vector<Data> mStageData;
};
		}
	}
}

#endif // !defined(AFX_GAME_H__41F747F0_5498_488A_AE73_BC66B991D0ED__INCLUDED_)
