/*!
* @file GameCampaign.h
* @brief ゲームキャンペーンのプロトタイプ宣言
* @date 2013/12/22
* @author Deskull
* 2013 Sikabane Works.
*/

#pragma once

#include "stdafx.h"
#include "GameElement.h"
#include "Coordinates.h"

namespace Deeangband
{

	/*!
	* @class GameCampaign
	* @brief ゲームキャンペーンのクラス
	* @details
	* <div>
	* キャンペーン(Campaign)は、D'angbandの最も大きなゲームの主体であり、 ゲームの*勝利*条件と各自ゲームルールのオプション選択、強制選択、クエストによって構成される。
	* <ul>
	* <li>変愚以前の*bandでは冥王『モルゴス』ないし『混沌のサーペント』の打倒が条件であった*勝利*条件は、D'angbandではこのキャンペーン毎によって変化する。</li>
	* </ul>
	* </div>
	*/
	class GameCampaign : GameElement
	{
	private:

		TAG startFixedField;       //!<プレイヤーの開始固定フロア
		Coordinates startPosition; //!<プレイヤーの開始位置
		TAG startDungeon;          //!<プレイヤーの開始ダンジョン
		DEPTH startDepth;          //!<プレイヤーの開始階層
		TAG finalQuest;            //!<最終クエストタグ

		friend class boost::serialization::access;

		/*!
		* @brief クラスのシリアライズを設定する
		* @param archive アーカイブ化するクラスのアドレス
		* @param version ファイルバージョン
		* @return XMLSerializeテンプレート
		*/
		template<class Archive> void serialize(Archive &archive, const unsigned int version) 
		{
			archive & boost::serialization::make_nvp("Name", Name);
			archive & boost::serialization::make_nvp("StartPosition", startPosition);
			archive & boost::serialization::make_nvp("StartFixedField", startFixedField);
			archive & boost::serialization::make_nvp("StartDungeon", startDungeon);
			archive & boost::serialization::make_nvp("StartDepth", startDepth);
			archive & boost::serialization::make_nvp("finalQuest", finalQuest);
		}


	public:

		/*! 
		* @brief GameCampaign クラスコンストラクタ
		*/
		GameCampaign::GameCampaign(void);

		/*! 
		* @brief GameCampaign クラスデストラクタ
		*/
		GameCampaign::~GameCampaign(void);

		/*! 
		* @brief GameCampaign クラスのデータ消去
		*/
		void GameCampaign::WipeData(void);

		/*!
		* @brief 新しいゲーム世界を生成する
		* @todo GenerateGameWorld()によるゲーム世界生成処理の実装
		* @return 生成処理に成功したらtrueを返す。
		*/
		bool GameCampaign::GenerateGameWorld(GameWorld *gameWorldPtr);
	};

}

BOOST_CLASS_VERSION(Deeangband::GameCampaign, 10);
