
#ifndef __CMAPCELLMANAGER_H__
#define __CMAPCELLMANAGER_H__

#include "..\CommonIncludes.h"
#include "..\..\00_HeaderFiles\00_ManagementClasses\CImageManager.h"

//==============================================================
//! @class CMapCellManager
//! @brief マップセルの管理をするクラス
//! 
//! 【マップセル】…このゲームでは、画面の端まで行くと
//!                 別のマップに移動するシステムになっています。
//!                 全体マップを小分けにした、一画面で表示される範囲を、
//!                 マップセルと呼ぶこととしています。
//! 
//! 【グリッド座標】…pixel座標をマップチップの長さで
//!                   割った座標のことをさします。
//!                   
//!                   例）
//!                       下から3列、左から5行目→（120, 360）（pixel座標）
//!                                             →（  2,   6）（グリッド座標）
//!                   
//!                   配列の要素数と対応していますが、Y→Xの順番で
//!                   指定することに注意する必要があります。
//!                   
//!                   例）
//!                       vveMapCellData[ 2 ][ 6 ];
//! 
//==============================================================
class CMapCellManager
{
public:
	
	//==============================================================
	//! @enum  EMapObjectType
	//! 
	//!     マップセルに配置されるものの種類です。
	//==============================================================
	enum EMapObjectType {
		WALL,          //<! 侵入不可能
		EMPTY,         //<! 何もなし、移動可能
		OUTSIDE_TOP,   //<! 画面より上
		OUTSIDE_UNDER, //<! 画面より下
		
		OTHER,
	};
	
	//==============================================================
	//! @enum  ESwitchType
	//! 
	//!     移動先のマップセルの種類です。
	//==============================================================
	enum ESwitchType {
		TOP,
		UNDER,
	};
	
	const static int MAP_CHIP_LENGTH      =  60;
	
	//! x座標0〜179はメニュー画面なので、マップはx座標180から
	const static int BEGIN_COLUMN         = 180;
	
	//! マップチップは横に8列並べます。
	const static int TOTAL_COLUMN         =   8;
	
	//! マップチップは縦に9行並べます。
	const static int TOTAL_ROW            =   9;
	
	//! 原点OのX座標
	const static int COORDINATES_ORIGIN_X =   0;
	
	//! 原点OのY座標
	const static int COORDINATES_ORIGIN_Y =   0;
	
	CMapCellManager( void );
	~CMapCellManager( void );
	
	//==============================================================
	//! @brief     指定した座標に配置されている物のタイプを取得します。
	//! 
	//!     CMapCellManagerクラスはマップセルの配列の中から
	//!     現在画面に表示されているマップセルの同名のメンバ関数に問い合わせます。
	//!     ですので、実際の処理を行うのはCMapCellクラスです。
	//!     
	//!     pixel座標ではなく、配列の要素数として使えるグリッド座標を
	//!     引数として渡す必要があります。
	//!     
	//!     第3引数と第4引数に、変位座標を指定できます。
	//!     
	//!     使用例）
	//!         左下から数えて6列7行目の場所から、
	//!         一つ上のグリッド座標に配置されている物のタイプ
	//!         
	//!         GetMapCellDataByGrid( 6, 5, 0, 1);
	//!     
	//==============================================================
	EMapObjectType GetMapCellDataByGrid( 
	                                     int arg_iBase_X_ByGrid,
	                                     int arg_iBase_Y_ByGrid,
	                                     int arg_iVariation_X_ByGrid,
	                                     int arg_iVariation_Y_ByGrid
	                                   );
	
	//! 現在画面に表示されているマップセルを実行します。
	void Run( CImageManager* arg_pinImageManager,
	          CAllKeysState* arg_pinAllKeysState );
	
	void SwitchMapCell( ESwitchType arg_eSwitchType );
	
private:
	const static int MAPCELL_TOTAL = 20;
	const static int MAP_STATUS[ MAPCELL_TOTAL ][ TOTAL_ROW ][ TOTAL_COLUMN ];
	
	//! 現在画面に表示されているマップセル。
	int m_iCurrentMapCell;
	
	std::vector< CMapCell > m_vinMapCell;
	
	//! ピクセル座標からグリッド座標に変換します。
	int PixelToMapGrid( int arg_pixel ) const ;
	
};

#endif
