/*!
* @file GameSurfaceSDL.h
* @brief GameSurfaceSDLクラスとその他付随要素のプロトタイプ
* @date 2014/02/19
* @author Deskull
* 2014 Sikabane Works.
*/

#pragma once

#include "stdafx.h"

#include <SDL.h>
#include <SDL_image.h>
//#include <SDL_gfx.h>
#include <SDL_ttf.h>

#include "GameElement.h"
#include "GameSurface.h"

BOOST_CLASS_VERSION(GameSurfaceSDL, 1);

namespace Deeangband
{

	/*! 
	* @class GameSurfaceSDL
	* @brief ゲームのメインインターフェイスクラス(SDL実装)
	*/
	class GameSurfaceSDL : public GameSurface
	{
	private:

		SDL_Renderer *renderer;     //!< SDL用レンダラ参照ポインタ
		SDL_Window *window;         //!< SDLウィンドウ参照ポインタ

		Creature *viewCreaturePtr;       //!< 現在のステータス表示対象となるCreature参照ポインタ
		Creature *sideStatusCreatutePtr; //!< 現在のステータス簡易表示対象となるCreature参照ポインタ
		Field *viewFieldPtr;       //!< 描画対象となるField参照
		Coordinates focusPoint;    //!< フロアの描画左上地点

		TTF_Font* font;  //!< 描画標準ポインタ
		SDL_Color color; //!< カラー標準ポインタ

		SDL_RWops *rwop;
		std::string currentMessage; //!< 現在表示中のメッセージstring
		std::string error;
		SDL_Rect src;
		SDL_Rect title;

		SDL_Surface *windowSurface;  //!< ゲームウィンドウのSurface参照

		SDL_Surface *titleSurface;   //!< ゲームタイトルグラフィックのSurface参照
		SDL_Surface *messageSurface; //!< メッセージグラフィックのSurface参照
		SDL_Surface *creatureStatusSurface;  //!< クリーチャーステータス表示のSurface参照
		SDL_Surface *creatureSideStatusSurface;  //!< サイドクリーチャーステータス表示のSurface参照

		void GameSurfaceSDL::pushAnyKey(void);
		void GameSurfaceSDL::initInterfaces(void);

		void GameSurfaceSDL::drawCreatureStatus(Creature *creaturePtr);

		/*!
		* @brief フロアを描画する
		* @param fieldPtr 表示したいフロアの構造体参照ポインタ
		* @param gameWorld GameWorld参照ポインタ
		* @param x 左上起点のX座標
		* @param y 左上起点のY座標
		* @param w 表示のマス幅
		* @param h 表示のマス高さ
		* @return なし
		*/
		void GameSurfaceSDL::drawField(GameWorld *gameWorld, Field *fieldPtr, int x, int y, int w, int h);

		/*!
		* @brief サイドステータス表示を更新する
		* @param creaturePtr 更新元クリーチャー参照ポインタ
		* @return なし
		*/
		void GameSurfaceSDL::updateSideCreatureStatus(Creature *creaturePtr);

		/*!
		* @brief サイドステータスを描画する
		* @return なし
		*/
		void GameSurfaceSDL::drawSideCreatureStatus(void);

		/*!
		* @brief メッセージを描画する
		* @return なし
		*/
		void GameSurfaceSDL::drawSystemMessage(void);

	public:

		/*!
		* @brief ゲーム画面を再描画する
		* @return なし
		*/
		void GameSurfaceSDL::Redraw(void);

		/*!
		* @brief 指定されたクリーチャーのステータスを表示する
		* @param creaturePtr 表示したいクリーチャーの参照ポインタ
		* @return なし
		*/
		void GameSurfaceSDL::ViewCreatureStatus(Creature *creaturePtr);

		/*!
		* @brief ゲーム画面左にプレイヤー簡略情報を表示する。
		* @param creaturePtr 表示したいクリーチャーのインスタンス参照ポインタ。NULLならば非表示。
		* @return なし
		*/
		void GameSurfaceSDL::SetSideStatusCreature(Creature *creaturePtr);

		/*!
		* @brief 表示するフロアを切り替える
		* @param fieldPtr 表示したいフロアの参照ポインタ
		* @return なし
		*/
		void GameSurfaceSDL::SetField(Field *fieldPtr);

		/*!
		* @brief コンストラクタ
		* @param gameWorld 処理したいGameWorldインスタンス
		*/
		GameSurfaceSDL::GameSurfaceSDL(GameWorld *gameWorld);

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

		/*!
		* @brief プレイヤーからコマンドを取得する
		* @return ゲームコマンドID
		*/
		GAME_COMMAND GameSurfaceSDL::GetCommand(void);

		/*!
		* @brief フロア表示のフォーカスを変更する
		* @param x 基準X座標
		* @param y 基準Y座標
		* @return なし
		*/
		void GameSurfaceSDL::FocusField(int x, int y);

		/*!
		* @brief フロア表示のフォーカスを変更する
		* @param coord 基準座標
		* @return なし
		*/
		void GameSurfaceSDL::FocusField(Coordinates coord);

		/*!
		* @brief 標準メッセージを表示する
		* @param message メッセージ
		* @return なし
		*/
		void GameSurfaceSDL::SystemMessage(std::string message);

	};

}