
#include "..\..\00_HeaderFiles\00_ManagementClasses\CSceneManager.h"

#include "..\..\00_HeaderFiles\02_DerivedClasses\Scenes\CTitleScene.h"
#include "..\..\00_HeaderFiles\02_DerivedClasses\Scenes\CConquestScene.h"
#include "..\..\00_HeaderFiles\02_DerivedClasses\Scenes\CTerminalScene.h"

CSceneManager::CSceneManager( void )
{
	// 生成を二度しようとしたときはプログラムを終了させる。
	static bool bFirstGeneration = true;
	if ( bFirstGeneration )
	{
		// 初期化処理はこのスコープに記述する。
		m_eCurrentSceneType = ESceneType::TITLE;
		m_pinCurrentScene = new CTitleScene();
		
		bFirstGeneration = false;
		return;
	}
	
	MessageBox( NULL,
	            "CSceneManagerクラスを二度生成しようとしました。",
	            "",
	            MB_OK );
	
	assert( false );
}

void CSceneManager::Run( CImageManager* arg_pinImageManager,
                         CAllKeysState* arg_pinAllKeysState )
{
	// 現在実行中のシーンクラスに設定されているシーン変更の要望を
	// 問い合わせし、SetScene関数で設定する。
	// （シーンクラス側からシーン管理クラスにアクセスすると
	//   依存関係で複雑になるため）
	ESceneType e = m_pinCurrentScene->GetRequestScene();
	if ( e != ESceneType::TOTAL )
	{
		SetScene( e );
	}
	
	m_pinCurrentScene->Run( arg_pinImageManager, arg_pinAllKeysState );
}

void CSceneManager::SetScene( ESceneType arg_eNewSceneType )
{
	// 現在のシーンタイプを変更。
	m_eCurrentSceneType = arg_eNewSceneType;
	
	// 現在のシーンを削除し再設定。
	delete m_pinCurrentScene;

	switch( arg_eNewSceneType ) {
	case ESceneType::TITLE :
		m_pinCurrentScene = new CTitleScene();
		break;
		
	case ESceneType::CONQUEST :
		m_pinCurrentScene = new CConquestScene();
		break;
		
	case ESceneType::TERMINAL :
		m_pinCurrentScene = new CTerminalScene();
		break;
	}
}


