/*!
* @file Floor.h
* @brief ゲーム中のダンジョンと付随要素のプロトタイプ
* @date 2013/12/11
* @author Deskull
* 2013 Sikabane Works.
*/

#pragma once

#include "stdafx.h"
#include "Deeangband.h"

#include "GameWorld.h"
#include "GameElement.h"
#include "Square.h"

namespace Deeangband
{

	/*!
	* @class Floor
	* @brief フロアのクラス
	*/
	class Floor : public GameElement
	{
	private:
		std::vector<std::vector<std::shared_ptr<Square>>> squares;
		std::vector<std::shared_ptr<Door>> doors;
		MAP_LENGTH width; /*!< フロアの横サイズ*/
		MAP_LENGTH height; /*!< フロアの縦サイズ*/

		friend class boost::serialization::access;

		/*!
		* @brief クラスのシリアライズ化を設定する
		* @param archive アーカイブ化するクラスのアドレス
		* @param fileVersion ファイルバージョン
		* @return XMLSerializeテンプレート
		*/
		template<class Archive> void serialize(Archive &archive, const unsigned int fileVersion) 
		{
			std::vector<Door>::iterator door = array.begin();
			while(door != array.end())
			{
				archive & BOOST_SERIALIZATION_NVP(door);
				door++;
			}		
			archive & BOOST_SERIALIZATION_NVP(width);
			archive & BOOST_SERIALIZATION_NVP(height);
		}

	public:

		/*! 
		* @brief Floorクラスコンストラクタ(GameElementメンバ対応)
		* @param id GameElementのID
		* @param tag GameElementのタグ
		* @param gameWorld 所属元gameWorld参照ポインタ
		*/
		Floor::Floor(ID id, TAG tag, GameWorld *gameWorld);

		Floor::Floor();

		Floor::~Floor();

		/*!
		* @brief フロアの横サイズを得る
		* @return フロアの横サイズ
		*/
		MAP_LENGTH Floor::GetWidth(void);

		/*!
		* @brief フロアの縦サイズを得る
		* @return フロアの縦サイズ
		*/
		MAP_LENGTH Floor::GetHeight(void);

		/*!
		* @brief フロアの該当座標のマスを返す。
		* @return 該当するマスインスタンスの参照ポインタ
		*/
		Square *Floor::GetSquare(MAP_LENGTH x, MAP_LENGTH y);
	};

}