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

#pragma once

#include "stdafx.h"
#include "Authority.h"
#include "Building.h"
#include "Camp.h"
#include "Creature.h"
#include "CreatureTrait.h"
#include "Dice.h"
#include "Dungeon.h"
#include "Deeangband.h"
#include "Effect.h"
#include "Feature.h"
#include "FixedArtifact.h"
#include "Floor.h"
#include "GameSurface.h"
#include "Item.h"
#include "ItemBase.h"
#include "ItemEgo.h"
#include "ItemTrait.h"
#include "Karma.h"
#include "Skill.h"
#include "Species.h"
#include "Trap.h"
#include "TrapBase.h"

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

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

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

public:

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

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

	/*!
	 * @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 TAG アイテムのタグ
	 * @return アイテムの参照ポインタ、存在しなければNULLを返す。
	 */
	Item *GameWorld::GetItem(ID id);

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

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

	/*
	 * @brief プレイ処理メインループ
	 * @return ゲーム終了コード
	 */
	PLAY_EXIT_CODE PlayLoop(void);

	/*
	 * @brief 受け取ったゲームコマンドを処理する
	 * @param command 実行するゲームコマンド
	 * @return ゲーム終了コード
	 */
	PLAY_EXIT_CODE DoGameCommand(GAME_COMMAND command);
};
