
//==============================================================
//! @file      CProtagonistCharacter.h
//! @brief     CProtagonistCharacterクラスの宣言
//==============================================================


// メンバ変数はなるべく少なく、
// 今のところ基底クラスに二つと、このクラスに3つ。

#ifndef __CPROTAGONISTCHARACTER_H__
#define __CPROTAGONISTCHARACTER_H__

#include "..\CommonIncludes.h"
#include "..\01_BaseClasses\CCharacterBase.h"
#include "..\02_DerivedClasses\Scenes\CConquestScene.h"


// protagonist（意味：主人公）
// Drawメソッドを読んで画像を表示するとき
// 座標を180pixel右に動かすので注意。
class CProtagonistCharacter : public CCharacterBase
{
public:
	CProtagonistCharacter( void );
	~CProtagonistCharacter( void );
	void Run( CImageManager*   arg_pinImageManager,
	          CAllKeysState*   arg_pinAllKeysState,
	          CMapCellManager* arg_pinMapCellManager );
	
	bool GetRequestSituationExistence();
	
	CConquestScene::ESituationType GetRequestSituationType();
	
	CMapCellManager::ESwitchType GetRequestSwitchType();
	
private:
	enum EFacingDirection {
		FORWARD,
		BACK,
		LEFT, // 向かって左
		RIGHT, // 向かって右
	};
	
	enum EStepDirection {
		UP_STEP,
		DOWN_STEP,
		LEFT_STEP,
		RIGHT_STEP,
	};
	
	enum ECommand {
		UP_STEP_COMMAND,
		DOWN_STEP_COMMAND,
		LEFT_STEP_COMMAND,
		RIGHT_STEP_COMMAND,
	};
	
	struct tag_ProtagonistState {
		int iX;
		int iY;
		
		// グリッド座標
		int iGrid_X;
		int iGrid_Y;
		
		// 予約座標
		int iAdvance_X;
		int iAdvance_Y;
		
		// 予約座標（グリッド）
		int iAdvanceGrid_X;
		int iAdvanceGrid_Y;
		
		// 現在何フレーム目か。
		int iCurrentStepFrame;
		
		// 現在向いている方向
		EFacingDirection eFacingDirection;
		
		// ステップ方向
		EStepDirection eStepMoveDirection;
		
		
		// ステップ移動中か否か
		bool bStepMoveIdle;
		
		// 進みたい場所が進行可能エリア
		bool bEnableStep;
		
		// 先行入力があるか。
		bool bAdvanceInput;
		
		// ステップ方向、一度だけ先行入力を受け付ける。
		std::queue<ECommand> qeCommand;
	};
	
	//const static int WIDTH  = 60;
	//const static int HEIGHT = 60;
	
	// 初期位置
	const static int INITIAL_POSITION_X = 3;
	const static int INITIAL_POSITION_Y = 7;
	
	// 主人公は一度方向キーを押下されるとステップ移動する。
	// 何フレーム掛けて移動するかを定義する必要がある。
	const static int STEPMOVE_CYCLE_FRAME = 6;
	
	const static int STEPMOVE_QUANTITY[ STEPMOVE_CYCLE_FRAME ];
	
	// 初回起動フラグ
	bool m_bGenerate;
	
	// シチュエーション変更要求フラグ
	bool m_bRequestSituationExistence;
	
	// シチュエーション変更要求内容
	CConquestScene::ESituationType m_eRequestSituationType;
	
	// 移動するマップセルがどの方角のものか。
	CMapCellManager::ESwitchType m_eRequestSwitchType;
	
	
	void StateInitialize( tag_ProtagonistState* arg_SprotagonistState );
	
	void CheckKeys( tag_ProtagonistState* arg_SprotagonistState,
	                CAllKeysState*        arg_pinAllKeysState );
	
	void SetStepMoveDirection( tag_ProtagonistState* arg_SprotagonistState,
	                           CMapCellManager* arg_pinMapCellManager );
	
	CMapCellManager::EMapObjectType CheckDestination(
	                                    tag_ProtagonistState* arg_SprotagonistState,
	                                    CMapCellManager* arg_pinMapCellManager );
	
	void Calculate( tag_ProtagonistState* arg_SprotagonistState,
	                CMapCellManager* arg_pinMapCellManager );
	
	void Draw( CImageManager* arg_pinImageManager,
	           tag_ProtagonistState* arg_SprotagonistState );
	
};


#endif


