//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//------------------------------------------------------------------------------

/** @file
 * ゲームシステムヘッダ
 * @author Junpee
 */

#ifndef GAME_SYSTEM_H_
#define GAME_SYSTEM_H_

class RenderingSystem;
class AnimationSystem;
class CollisionSystem;
class InputSystem;
class SoundSystem;
class BGMSystem;
class PlayerSystem;
class EnemySystem;

class GameTask;
class Stage;
class TitleTask;
class LoadTask;
class Player;

//------------------------------------------------------------------------------
/**
 * ゲームシステム
 */
class GameSystem{
friend class PrismaticUmbrella;
public:
	//--------------------------------------------------------------------------
	/**
	 * インスタンスの取得
	 * @return インスタンス
	 */
	static GameSystem* getInstance(){ return instance_; }

	//--------------------------------------------------------------------------
	// システム
	//--------------------------------------------------------------------------
	/**
	 * レンダリングシステムの取得
	 * @return レンダリングシステム
	 */
	virtual RenderingSystem* getRenderingSystem(){ return renderingSystem_; }

	/**
	 * アニメーションシステムの取得
	 * @return アニメーションシステム
	 */
	virtual AnimationSystem* getAnimationSystem(){ return animationSystem_; }

	/**
	 * コリジョンシステムの取得
	 * @return コリジョンシステム
	 */
	virtual CollisionSystem* getCollisionSystem(){ return collisionSystem_; }

	/**
	 * 入力システムの取得
	 * @return 入力システム
	 */
	virtual InputSystem* getInputSystem(){ return inputSystem_; }

	/**
	 * サウンドシステムの取得
	 * @return サウンドシステム
	 */
	virtual SoundSystem* getSoundSystem(){ return soundSystem_; }

	/**
	 * プレイヤシステムの取得
	 * @return プレイヤシステム
	 */
	virtual PlayerSystem* getPlayerSystem(){ return playerSystem_; }

	/**
	 * 敵システムの取得
	 * @return 敵システム
	 */
	virtual EnemySystem* getEnemySystem(){ return enemySystem_; }

	//--------------------------------------------------------------------------
	// タスク
	//--------------------------------------------------------------------------
	/**
	 * 次のタスク設定
	 * @param nextTask 次のタスク
	 */
	virtual void setNextTask(GameTask* nextTask);

	//--------------------------------------------------------------------------
	/**
	 * 胞子ステージ取得
	 * @return 胞子ステージ
	 */
	virtual Stage* getSporeStage(){ return sporeStage_; }

	//--------------------------------------------------------------------------
	/**
	 * タイトルタスク取得
	 * @return タイトルタスク
	 */
	virtual TitleTask* getTitleTask(){ return titleTask_; }

	//--------------------------------------------------------------------------
	/**
	 * ロードタスク取得
	 * @return ロードタスク
	 */
	virtual LoadTask* getLoadTask(){ return loadTask_; }

	//--------------------------------------------------------------------------
	// 実行
	//--------------------------------------------------------------------------
	/**
	 * 実行
	 */
	virtual void run();

	//--------------------------------------------------------------------------
	// 描画準備
	//--------------------------------------------------------------------------
	/**
	 * 描画準備
	 */
	virtual void renderSetup();

	//--------------------------------------------------------------------------
	// 描画
	//--------------------------------------------------------------------------
	/**
	 * 描画
	 */
	virtual void render();

protected:
	//--------------------------------------------------------------------------
	// 生成、破棄
	//--------------------------------------------------------------------------
	/**
	 * コンストラクタ
	 */
	GameSystem();

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

	//--------------------------------------------------------------------------
	/**
	 * システム入力
	 */
	virtual void systemInput();

private:
	//--------------------------------------------------------------------------
	// コピーコンストラクタの隠蔽
	GameSystem(const GameSystem& copy);

	// 代入コピーの隠蔽
	void operator =(const GameSystem& copy);

	// レンダリングシステム
	RenderingSystem* renderingSystem_;
	// アニメーションシステム
	AnimationSystem* animationSystem_;
	// コリジョンシステム
	CollisionSystem* collisionSystem_;
	// 入力システム
	InputSystem* inputSystem_;
	// サウンドシステム
	SoundSystem* soundSystem_;
	// プレイヤシステム
	PlayerSystem* playerSystem_;
	// 敵システム
	EnemySystem* enemySystem_;

	// カレントタスク
	GameTask* currentTask_;
	// 次のタスク
	GameTask* nextTask_;
	// 胞子ステージ
	Stage* sporeStage_;
	// タイトルタスク
	TitleTask* titleTask_;
	// ロードタスク
	LoadTask* loadTask_;

	// インスタンス
	static GameSystem* instance_;

};

//------------------------------------------------------------------------------
#endif // End of GAME_SYSTEM_H_
//------------------------------------------------------------------------------
