/*!
* @file GameSurface.h
* @brief GameSurfaceクラスとその他付随要素のプロトタイプ
* @date 2013/12/17
* @author Deskull
* 2013 Sikabane Works.
*/

#pragma once

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

#include "GameWorld.h"
#include "Coordinates.h"

namespace Deeangband
{
#include "EngineTypedef.h"

	/*! 
	* @class GameSurface
	* @brief ゲームのメインインターフェイスクラス
	*/
	class GameSurface
	{
	protected:
		GameWorld *gameWorld; //!< 対応するGameWorld

	public:
		GameSurface::GameSurface(void);
		GameSurface::GameSurface(GameWorld *gameWorld);
		virtual GameSurface::~GameSurface(void);

		/*!
		 * @brief ゲームコマンドを受け取る
		 * @return GAME_COMMAND で定義されたコマンド内容
		 */
		virtual GAME_COMMAND GetCommand(const CREATURE_IT& subjectCreatureIt)
		{
			subjectCreatureIt;
			return GAME_COMMAND_STAY;
		}

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

		/*!
		* @brief ゲーム画面表示を更新する。
		* @return なし
		*/
		virtual void GameSurface::Draw(const CREATURE_IT& subjectCreatureIt) { subjectCreatureIt; }

		/*!
		* @brief ゲーム画面にクリーチャー情報を表示する。
		* @param creaturePtr 表示したいクリーチャーのインスタンス参照ポインタ。NULLならば非表示。
		* @return なし
		*/
		virtual void GameSurface::ViewCreatureStatus(Creature *creaturePtr) { creaturePtr; }

		/*!
		 * @brief ゲーム時間表示を更新する
		 * @param currentTime 現在時刻
		 * @return なし
		 */
		virtual void GameSurface::UpdateTimeStatus(GAME_TIME currentTime) { currentTime; }

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

		/*!
		* @brief ゲーム画面表示するフロアを切り替える。
		* @param fieldPtr 表示したいフロアのインスタンス参照ポインタ。NULLならば非表示。
		* @return なし
		*/
		virtual void GameSurface::SetField(Field *fieldPtr) { fieldPtr; }

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

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

		/*!
		 * @brief システムメッセージを表示する
		 * @param message メッセージ
		 * @return なし
		 */
		virtual void GameSurface::SystemMessage(std::string message) { message; }

		/*!
		 * @brief ゲームメッセージを追加する
		 * @param message メッセージ
		 * @return なし
		 */
		virtual void GameSurface::GameMessage(std::string message) { message; }

	};

}