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

#pragma once

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

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

#include "GameSurface.h"

BOOST_CLASS_VERSION(GameSurfaceSDL, 1);

namespace Deeangband
{

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

		SDL_Renderer *renderer; 
		SDL_RWops *rwop;
		std::string error;
		SDL_Window *window;
		TTF_Font* font;
		SDL_Surface *titleSurface;
		SDL_Color color;
		SDL_Rect src;
		SDL_Rect title;
		Coordinates focusPoint;

		void pushAnyKey(void);
		void initInterfaces(void);
		void drawCreatureStatus(Creature *creaturePtr);

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

	public:

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

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

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

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

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

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

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

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

	};

}