/// @file GameCore.h
#ifndef GAMECORE_H
#define GAMECORE_H

#include "../state/StartState.h"

/**
	@brief 게임에 핵심적인 Runner 클래스

	게임엔진을 작동시키는 핵심적인 Runner 클래스입니다.\n
	게임의 정보는 State라는 클래스로 캡슐화 되어있으며,	시작지점으로 StartState 클래스를 이용합니다.\n
	GameCoreClass의 run 멤버함수는 각각의 스테이트(상태)들을 스테이트패턴으로 작동시키는 핵심함수입니다.
*/
class GameCore {
	public:
		GameCore(LayerInfo* _pLayerInfo){
			pLayerInfo_ = _pLayerInfo;
		}
		~GameCore(){}

		/// @brief GameBaseRunner대신에 수행되는 게임엔진 핵심함수
		void run(){
			
			pState_ = new StartState;
			pState_->initState(pLayerInfo_);

			MSG msg;
			ZeroMemory( &msg, sizeof(msg) );
			while( msg.message != WM_QUIT ){
				if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ){
					TranslateMessage( &msg );
					DispatchMessage( &msg );
				}else{
					pState_->cache();
					pState_->input();
					pState_->process();
					pState_->render();
					if(pLayerInfo_->bStateChanged){
						GameState* tmpState = pState_;
						pState_ = pState_->changeState();
						delete tmpState; tmpState = NULL;

						pState_->initState(pLayerInfo_);
					}
				}
			}
			delete pState_; pState_ = NULL;
		}

	private:
		GameCore(){}
		LayerInfo* pLayerInfo_;
		GameState* pState_;

};

#endif