/*!
* @file GameWorld.h
* @brief ゲーム世界のプロトタイプ宣言
* @date 2013/02/01
* @author Deskull
* 2013-2014 Sikabane Works.
*/

#pragma once

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

#include "Authority.h"
#include "Building.h"
#include "Camp.h"
#include "Creature.h"
#include "CreatureTrait.h"
#include "Dungeon.h"
#include "Effect.h"
#include "Feature.h"
#include "FixedArtifact.h"
#include "ItemBase.h"
#include "ItemEgo.h"
#include "ItemTrait.h"
#include "Karma.h"
#include "Quest.h"
#include "Skill.h"
#include "Species.h"
#include "TrapBase.h"

#include "Item.h"
#include "Creature.h"
#include "Floor.h"
#include "Trap.h"

BOOST_CLASS_VERSION(GameWorld, 1);

namespace Deeangband
{

	/*!
	* @class GameWorld
	* @brief ゲーム世界のクラス
	*/
	class GameWorld
	{
	private:

		//静的データリスト
		std::map<TAG, std::shared_ptr<Authority>> authorityList;          /*!<全権能リスト*/
		std::map<TAG, std::shared_ptr<Building>> buildingList;            /*!<全施設リスト*/
		std::map<TAG, std::shared_ptr<Camp>> campList;                    /*!<全陣営リスト*/
		std::map<TAG, std::shared_ptr<CreatureTrait>> creatureTraitList;  /*!<全クリーチャー特性リスト*/
		std::map<TAG, std::shared_ptr<Dungeon>> dungeonList;              /*!<全ダンジョンリスト*/
		std::map<TAG, std::shared_ptr<Effect>> effectList;                /*!<全効果属性リスト*/
		std::map<TAG, std::shared_ptr<Feature>> featureList;              /*!<全地形リスト*/
		std::map<TAG, std::shared_ptr<FixedArtifact>> fixedArtifactList;  /*!<全固定アーティファクトリスト*/
		std::map<TAG, std::shared_ptr<ItemBase>> itemBaseList;            /*!<全アイテムベースリスト*/
		std::map<TAG, std::shared_ptr<ItemEgo>> itemEgoList;              /*!<全アイテムエゴリスト*/
		std::map<TAG, std::shared_ptr<ItemTrait>> itemTraitList;          /*!<全アイテム特性リスト*/
		std::map<TAG, std::shared_ptr<Karma>> karmaList;                  /*!<全カルマリスト*/
		std::map<TAG, std::shared_ptr<Quest>> questList;                  /*!<全クエスト特性リスト*/
		std::map<TAG, std::shared_ptr<Skill>> skillList;                  /*!<全スキルリスト*/
		std::map<TAG, std::shared_ptr<Species>> speciesList;              /*!<全クリーチャー種別リスト*/
		std::map<TAG, std::shared_ptr<TrapBase>> trapBaseList;            /*!<全トラップベース種別リスト*/

		//動的データリスト
		std::map<ID, std::shared_ptr<Item>> itemList;                    /*!<全アイテムリスト*/
		std::map<ID, std::shared_ptr<Creature>> creatureList;            /*!<全クリーチャーリスト*/
		std::map<ID, std::shared_ptr<Floor>> floorList;                  /*!<全フロアリスト*/
		std::map<ID, std::shared_ptr<Trap>> trapList;                    /*!<全トラップリスト*/

		GAME_TIME gameTime; //!<ゲーム時間

		friend class boost::serialization::access;

		/*!
		* @brief クラスのシリアライズ化を設定する
		* @param archive アーカイブ化するクラスのアドレス
		* @param fileVersion ファイルバージョン
		* @return XMLSerializeテンプレート
		*/
		template<class Archive> void serialize(Archive &archive, const unsigned int fileVersion) 
		{
			archive & BOOST_SERIALIZATION_NVP(creatureList);
			archive & BOOST_SERIALIZATION_NVP(itemList);
			archive & BOOST_SERIALIZATION_NVP(floorList);
			archive & BOOST_SERIALIZATION_NVP(trapList);
		}

	public:

		/*!
		* @brief GameWorldクラスのコンストラクタ
		* @param gSurface ゲームのインターフェイスとなる GameSurface 参照
		*/
		GameWorld::GameWorld(void);

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

		/*!
		* @brief GameWorld中に存在する権能を返す
		* @param tag 権能のタグ
		* @return 権能の参照ポインタ、存在しなければNULLを返す。
		*/
		Authority *GameWorld::GetAuthority(TAG tag);

		/*!
		* @brief GameWorld中に存在するクリーチャー特性を返す
		* @param tag クリーチャー特性のタグ
		* @return クリーチャー特性の参照ポインタ、存在しなければNULLを返す。
		*/
		CreatureTrait *GameWorld::GetCreatureTrait(TAG tag);

		/*!
		* @brief GameWorld中に存在する効果属性を返す
		* @param tag 効果属性のタグ
		* @return 効果属性の参照ポインタ、存在しなければNULLを返す。
		*/
		Effect *GameWorld::GetEffect(TAG tag);

		/*!
		* @brief GameWorld中に存在する固定アーティファクトを返す
		* @param tag 効果属性のタグ
		* @return 固定アーティファクトの参照ポインタ、存在しなければNULLを返す。
		*/
		FixedArtifact *GameWorld::GetFixedArtifact(TAG tag);

		/*!
		* @brief GameWorld中に存在する地形を返す
		* @param tag 地形のタグ
		* @return 地形の参照ポインタ、存在しなければNULLを返す。
		*/
		Feature *GameWorld::GetFeature(TAG tag);

		/*!
		* @brief GameWorld中に存在するベースアイテムを返す
		* @param tag ベースアイテムのタグ
		* @return ベースアイテムの参照ポインタ、存在しなければNULLを返す。
		*/
		ItemBase *GameWorld::GetItemBase(TAG tag);

		/*!
		* @brief GameWorld中に存在するアイテムエゴを返す
		* @param tag アイテムエゴのタグ
		* @return アイテムエゴの参照ポインタ、存在しなければNULLを返す。
		*/
		ItemEgo *GameWorld::GetItemEgo(TAG tag);

		/*!
		* @brief GameWorld中に存在するアイテム特性を返す
		* @param tag アイテム特性のタグ
		* @return アイテム特性の参照ポインタ、存在しなければNULLを返す。
		*/
		ItemTrait *GameWorld::GetItemTrait(TAG tag);

		/*!
		* @brief GameWorld中に存在するカルマを返す
		* @param tag カルマのタグ
		* @return カルマの参照ポインタ、存在しなければNULLを返す。
		*/
		Karma *GameWorld::GetKarma(TAG tag);

		/*!
		* @brief GameWorld中に存在するスキルを返す
		* @param tag スキルのタグ
		* @return スキルの参照ポインタ、存在しなければNULLを返す。
		*/
		Skill *GameWorld::GetSkill(TAG tag);

		/*!
		* @brief GameWorld中に存在するスキルを返す
		* @param tag スキルのタグ
		* @return スキルの参照ポインタ、存在しなければNULLを返す。
		*/
		Species *GameWorld::GetSpecies(TAG tag);

		/*!
		* @brief GameWorld中に存在するトラップ種別を返す
		* @param tag トラップ種別のタグ
		* @return トラップ種別の参照ポインタ、存在しなければNULLを返す。
		*/
		TrapBase *GameWorld::GetTrapBase(TAG tag);

		/*!
		* @brief GameWorld中に存在する施設を返す
		* @param tag 施設のタグ
		* @return 施設の参照ポインタ、存在しなければNULLを返す。
		*/
		Building *GameWorld::GetBuilding(TAG tag);

		/*!
		* @brief GameWorld中に存在する陣営を返す
		* @param tag 陣営のタグ
		* @return 陣営の参照ポインタ、存在しなければNULLを返す。
		*/
		Camp *GameWorld::GetCamp(TAG tag);

		/*!
		* @brief GameWorld中に存在するダンジョンを返す
		* @param tag ダンジョンのタグ
		* @return ダンジョンの参照ポインタ、存在しなければNULLを返す。
		*/
		Dungeon *GameWorld::GetDungeon(TAG tag);

		/*!
		* @brief GameWorld中に存在するアイテムを返す
		* @param id アイテムのID
		* @return アイテムの参照ポインタ、存在しなければNULLを返す。
		*/
		Item *GameWorld::GetItem(ID id);

		/*!
		* @brief GameWorld中に存在するフロアを返す
		* @param id フロアのID
		* @return フロアの参照ポインタ、存在しなければNULLを返す。
		*/
		Floor *GameWorld::GetFloor(ID id);

		/*!
		* @brief GameWorld中に存在するクリーチャーを返す
		* @param id クリーチャーのID
		* @return クリーチャーの参照ポインタ、存在しなければNULLを返す。
		*/
		Creature *GameWorld::GetCreature(ID id);

		/*!
		* @brief GameWorld中に存在するクエストを返す
		* @param tag クエストのタグ
		* @return クエストの参照ポインタ、存在しなければNULLを返す。
		*/
		Quest *GameWorld::GetQuest(TAG tag);

		/*!
		* @brief ゲーム時間を返す
		* @return ゲーム時間
		*/
		GAME_TIME GameWorld::GetGameTime(void);

		/*!
		* @brief XMLシリアライズによるゲームデータ保存処理
		* @return なし
		*/
		void GameWorld::XMLSave(void);

	};

}