/*!
* @file GameElement.h
* @brief GameElementクラスと付随要素のプロトタイプ
* @date 2014/02/01
* @author Deskull
* 2013-2014 Sikabane Works.
*/

#pragma once

#include "Deeangband.h"

namespace Deeangband
{
	class GameWorld;

	/*!
	* @struct Color
	* @brief 色指定の構造体
	*/
	typedef struct 
	{
		int r; //!<赤
		int g; //!<緑
		int b; //!<青
		int a; //!<アルファチャンネル
	} Color;

	/*! 
	* @class GameElement
	* @brief ゲームの諸要素の管理を行うスーパークラス
	*/
	class GameElement
	{
	private:

		ID id;   //!< ID
		TAG tag; //!< タグ

		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(id);
			archive & BOOST_SERIALIZATION_NVP(tag);
		}

	public:

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

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

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

		/*! 
		* @brief ダミーデータによる初期化
		* @return なし
		*/
		virtual void GameElement::SetDammyData(void) {}

		/*!
		* @brief IDを設定する
		*/
		void GameElement::SetID(ID newID); 

		/*!
		* @brief IDを取得する
		*/
		ID GameElement::GetID();

		/*!
		* @brief タグを設定する
		*/
		void GameElement::SetTag(TAG newTag);

		/*!
		* @brief タグを取得する
		*/
		TAG GameElement::GetTAG();

		/*!
		* @brief 所属元のGameWorldインスタンスを返す
		* @return GameWorldインスタンスの参照ポインタ
		*/
		GameWorld *GameElement::GetGameWorld();
	};

}