/*!
 * @file GameEngine.h
 * @brief ゲームエンジンのプロトタイプ宣言
 * @date 2013/04/13
 * @author Deskull
 * 2013-2014 Sikabane Works.
 */

#pragma once

#include "stdafx.h"
#include <mutex>
#include "Deeangband.h"

#include "Coordinates.h"
#include "Direction.h"
#include "GameWorld.h"
#include "GameSurface.h"
#include "GameSurfaceSDL.h"


namespace Deeangband
{
#include "EngineTypedef.h"

	class GameCampaign;
	class GameLogger;

	class GameEngine
	{
	private:
		GameWorld *gameWorld; //!< GameWorldの参照ポインタ
		GameSurface *gameSurface; //!< GameSurfaceの参照ポインタ
		GameLogger *gameLogger; //!< GameLoggerの参照ポインタ
		std::mutex mutex;


	public:
		GameEngine::GameEngine();
		GameEngine::~GameEngine();

		/*!
		 * @brief 描画処理メインループ
		 * @return なし
		 */
		void GameEngine::DrawingLoop(void);

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

		/*!
		 * @brief クリーチャー同士の白兵戦を処置する
		 * @param creaturePtr 攻撃側クリーチャーの参照ポインタ
		 * @param targetPtr 目標側クリーチャーの参照ポインタ
		 * @return 移動が白兵処理が行われたらtrue
		 */
		bool GameEngine::CombatCreatures(Creature *attackerPtr, Creature *targetPtr);

		/*!
		 * @brief クリーチャーの死亡状態を走査、処理する
		 * @return 死亡処理を行ったクリーチャーの総数
		 */
		int GameEngine::ProcessDeadCreatures();

	};
}
