#pragma once

#include "Common.h"

namespace MyBot
{
	/// 빌드 전략과 전투 전략은 각각 독립적으로 병행 실행이 가능
	/// 빌드 전략, 전투 전략은 한번에 1가지만 선택해서 실행 가능

	/// 빌드 전략
	/// 무슨 테크트리를 높이고 무슨 유닛을 더 많이 생산하고 무슨 업그레이드를 우선적으로 수행할지에 대한 방향성
	/// 게임 시작 시기에는 통계를 통해 빌드 전략을 결정하고,
	/// 게임 중에는 아군과 적군의 상황을 판단해서, 유닛간 상성, 아군의 승리에 유리한 쪽으로, 빌드 전략을 변경한다
	///
	/// 확장 은 게임 초중반에는 빌드 전략의 일부로 들어가기도 하지만
	/// 게임 중후반에는 빌드 전략과 무관하게 일상적인 타스크로서 수행한다
	enum BuildStrategy {
		
		/// 초반 빌드 : 해처리 / 스포닝풀 / 가스를 언제 만들 것인가

		Zerg_Build_Test = 0,

		/// 저그 - 빠른 저글링
		Zerg_Build_4Drone_Spawing_Pool = 10,				

		/// 저그 - 저저전. 9드론 스포닝풀 저글링 방어. 1해처리로 빠른 뮤탈
		Zerg_Build_9Drone_SpawningPool_1Hatchery_Fast_Mutal = 11,	

		/// 저그 - 저저전. 9드론 스포닝풀 저글링 방어
		Zerg_Build_9Drone_SpawningPool_1Hatchery = 12,

		/// 저그 - 저테전. 9번째 드론으로 스포닝풀, 가스부터 건설. 가장 빠른 뮤탈
		Zerg_Build_9Drone_SpawningPool_2Hatchery_Fast_Mutal = 20,


		/// 저그 - 저테전. 13번째 드론으로 스포닝풀, 가스부터 건설. 빠른 뮤탈
		Zerg_Build_12Drone_SpawningPool_2Hatchery_Fast_Mutal = 21,

		/// 저그 - 저테전. 12번째 드론으로 앞마당 해처리부터 건설
		Zerg_Build_12Drone_2Hatchery_Fast_Mutal = 22,	

		/// 저그 - 저프전. 9드론 앞마당 히드라
		Zerg_Build_9Drone_Hatchery = 23, 

		/// 저그 - 저프전. 9드론 스포닝풀 저글링 2해처리 뮤탈
		Zerg_Build_9Drone_SpawningPool_Expansion_2Hatchery_Fast_Mutal = 24,

		/// 저그 - 프로토스전. 9드론 트윈해처리 히드라 러커
		Zerg_Build_9Drone_SpawningPool_TwinHatchery_Mutal = 25,

		/// 저그 - 프로토스전. 12드론 트윈해처리 히드라 러커
		Zerg_Build_12Drone_TwinHatchery_HydraLurker = 26,

		/// 저그 - 프로토스전. 12드론 스포닝풀 2해처리
		Zerg_Build_12Drone_SpawningPool_2Hatchery = 27,

		/// 저그 - 프로토스전. 빠른 3군데 멀티
		Zerg_Build_Triple_Multi = 28,

		/// 초반 이후 빌드 : 무슨 유닛을 주력으로 계속 뽑을 것인가 (다른 유닛은 조금씩만)

		Zerg_Build_Zergling_Only = 31,						///< 저그 - 지상전 위주로 저글링
		Zerg_Build_Zergling_Hydralisk = 35,					///< 저그 - 지상전 위주로 저글링, 히드라
		Zerg_Build_Zergling_Hydralisk_Defiler = 36,					///< 저그 - 지상전 위주로 저글링, 히드라
		Zerg_Build_Zergling_Hydralisk_Lurker = 40,			///< 저그 - 지상전 위주로 저글링, 히드라, 러커
		Zerg_Build_Zergling_Hydralisk_Lurker_Defiler = 41,	///< 저그 - 지상전 위주로 저글링, 히드라, 러커, 디파일러
		Zerg_Build_Zergling_Lurker_Defiler = 45,			///< 저그 - 지상전 위주로 저글링, (히드라 안만들고) 러커, 디파일러
		Zerg_Build_Zergling_Lurker_Mutalisk = 46,			///< 저그 - 저글링, (히드라 안만들고) 러커, 뮤탈
		
		Zerg_Build_Air_Focused = 51,						///< 저그 - 저글링, 뮤탈, 스커지

		Terran_Build_Bionic = 61,							///< 테란 - 바이오닉
		Terran_Build_Mechanic = 62,							///< 테란 - 메카닉

		//Terran_Build_Bunker_Rush = 41,					///< 테란 - 아군 기지 근처에 공격용 벙커
		//Terran_Build_Bunker_Defense = 42,					///< 테란 - 방어용 벙커 1개 이상
		//Terran_Build_Chokepoint_Blocking = 43,				///< 테란 - 완전히 입구 막기
		//Terran_Build_Mechanic_Vulture = 44,					///< 테란 - 벌처 위주
		//Terran_Build_Mechanic_VultureTank = 45,				///< 테란 - 벌처 탱크 위주
		//Terran_Build_Mechanic_Goliath = 46,					///< 테란 - 골리앗 위주
		//Terran_Build_Mechanic_Dropship = 47,				///< 테란 - 벌처, 탱크 + 드랍쉽
		//Terran_Build_Bionic_Marine = 48,					///< 테란 - 마린 / 메딕 / 파이어뱃 
		//Terran_Build_Bionic_Marine_Dropship = 49,			///< 테란 - 마린 / 메딕 / 파이어뱃 + 드랍쉽
		//Terran_Build_Double_Command_Center = 50,			///< 테란 - 더블 커맨드

		Protoss_Build_Hardcore_Zealot = 71,					///< 프로토스 - 질럿
		Protoss_Build_Zealot_Dragoon = 75,					///< 프로토스 - 지상군 
		Protoss_Build_Ground_Templar = 75,					///< 프로토스 - 지상군 + 하이템플러 / 다크템플러 / 아칸
		Protoss_Build_Ground_Reaver = 76,					///< 프로토스 - 지상군 + 리버
		Protoss_Build_Air_Carrier = 79,							///< 프로토스 - 캐리어 위주
		//Protoss_Build_Cannon_Rush = 71,						///< 프로토스 - 아군 기지 근처에 공격용 캐논
		//Protoss_Build_Cannon_Defence = 72,					///< 프로토스 - 방어용 캐논 2개 이상
		//Protoss_Build_Cannon_Stargate = 73,					///< 프로토스 - 방어용 캐논 + 스타게이트 (커세어 + 캐리어)
		//Protoss_Build_Zealot_Dragoon = 75,					///< 프로토스 - 질럿 드라군 조합
		//Protoss_Build_Zealot_Dragoon_Templar = 76,			///< 프로토스 - 질럿 드라군 하이템플러 다크템플러 조합
		//Protoss_Build_Zealot_Dragoon_Templar_Reaver = 77,	///< 프로토스 - 질럿 드라군 하이템플러 다크템플러 리버 셔틀 조합
		//Protoss_Build_Double_Nexus = 78,					///< 프로토스 - 더블 넥서스
		//Protoss_Build_Many_Dragoon = 79,					///< 프로토스 - 드라군 위주 운영

		BuildStrategy_Unknown = 99							///< 모름
	};

	/// 전투 전략
	/// 공격과 방어를 무슨 유닛들로 수행할지에 대한 방향성
	/// 게임 시작 시기에는 통계를 통해 전투 전략을 결정하고,
	/// 게임 중에는 아군과 적군의 상황을 판단해서, 유닛간 상성, 아군의 승리에 유리한 쪽으로, 전투 전략을 변경한다
	/// 
	/// 빌드 전략과 전투 전략은 서로 연관성이 깊어서, 정찰 및 상황 판단을 해서 거의 동시에 결정한다
	/// 
	enum CombatStrategy {

		Zerg_Combat_4Drone_Zergling_Rush = 11,				///< 저그 - 4드론 저글링 러시

		Zerg_Combat_Front_Ground_Rush = 21,					///< 저그 - 저글링, 히드라, 러커 등으로 정면 공격

		Zerg_Combat_Front_Defense_Mutalisk_BackRush = 31,	///< 저그 - 정면은 성큰/저글링 등 지상유닛으로 막고, 뮤탈로 후방 / 멀티 공격
		//Zerg_Combat_Front_Defense_Lurker_BackRush = 22,		///< 저그 - 정면은 성큰/저글링 등 지상유닛으로 막고, 러커로 후방 / 멀티 공격
		
		//Zerg_Combat_Mutalisk_BackRush = 31,					///< 저그 - 뮤정면 공격
		//Zerg_Combat_Front_Blockade = 32,					///< 저그 - 저글링, 히드라, 러커 등 지상유닛으로 적 입구 봉쇄


		Terran_Combat_Front_Ground_Rush = 41,				///< 테란 - 정면 러시
		//Terran_Combat_Front_Defense_BackRush = 42,			///< 테란 - 드랍쉽 후방공격

		//Terran_Combat_Bunker_Rush = 41,					///< 테란 - 벙커 마린 SCV 러시
		//Terran_Combat_Mechanic_Vulture_FrontRush = 42,	///< 테란 - 벌처 위주로 정면 공격
		//Terran_Combat_Mechanic_BackRush = 43,				///< 테란 - 벌처, 탱크등을 드랍쉽에 실어서 후방 / 멀티 공격
		//Terran_Combat_Bionic_Marine_FrontRush = 44,		///< 테란 - 마린 / 메딕 / 파이어뱃 위주로 정면 공격
		//Terran_Combat_Bionic_Marine_BackRush = 45,		///< 테란 - 마린 / 메딕 / 파이어뱃 위주, 드랍쉽으로 후방 / 멀티 공격

		Protoss_Combat_Front_Ground_Rush = 71,				///< 프로토스 - 정면 러시
		//Protoss_Combat_Carrier_Rush = 72,					///< 프로토스 - 캐리어 러시

		//Protoss_Combat_Fast_Cannon_BackRush = 71,			///< 프로토스 - 몰래 캐논 러시
		//Protoss_Combat_Cannon_Defence_Carrier_Rush = 72,	///< 프로토스 - 정면은 캐논 등으로 막고, 캐리어 생산
		//Protoss_Combat_Corsair_Splash_Rush = 73,			///< 프로토스 - 빠르게 커세어 생산, 질럿 하이템플러 아칸 등 스플래시 공격
		//Protoss_Combat_Hardcore_Zealot_Rush = 74,			///< 프로토스 - 발업 질럿 러시

		CombatStrategy_Unknown = 99							///< 모름
	};


	/// 타스크 목표
	/// 빌드 전략, 전투 전략에 따라 생성되는, 비교적 단기적이고 지속적으로 추적 관리가 되어야 하는 업무
	/// 여러개의 타스크가 항상 가동 중이고, 타스트 완료시 타스크가 삭제된다
	/// 
	/// 빌드 전략에 따라 생성되는 타스크 : 건물 건설. 테크 리서치. 업그레이드. 변태.
	///
	/// 전투 전략에 따라 생성 / 변경되는 타스크 : 방어건물 건설. 드랍. 후방 공격. 정면 공격.
	///
	/// TODO : 이 타스크에 어느 어느 유닛을 할당할지 정해야 한다
	/// 드롭의 경우 어느어느 유닛들.  
	/// 방어의 경우 몇몇개의 유닛들만으로 방어
	/// 
	enum TaskGoalType {

		// 정찰 관련 타스크
		
		Figure_Out_Enemy_Race,					///< 적 종족을 알아낸다 : 오버로드 / 드론 / 저글링 사용
		Figure_Out_Enemy_BaseLocation,			///< 적 본진을 알아낸다 : 오버로드 / 드론 / 저글링 사용
		Scout_Enemy_MainBaseLocation,				///< 적 본진을 정찰한다 : 오버로드 / 저글링 / 스커지 / 퀸 사용
		Scout_Enemy_First_Expansion,			///< 적 앞마당을 정찰한다 : 오버로드 / 저글링 / 스커지 / 퀸 사용
		Scout_Enemy_Other_Expansion,			///< 적 다른 확장기지를 정찰한다 : 오버로드 / 저글링 / 스커지 / 퀸 사용
		Scout_Enemy_Chokepoint,					///< 적 길목을 정찰한다 : 오버로드 / 저글링 / 스커지 / 퀸 사용
		Scout_Empty_BaseLocations,				///< 점령되지 않은 멀티 위치들을 정찰한다 : 오버로드 / 저글링 / 스커지만 사용
		Eliminate_Enemy_Player,					///< 적군을 Eliminate 시킨다

		// 빌드 관련 타스크

		Build_Unit_Another,						///< 유닛을 생산한다
		Build_Unit_By_Limit,					///< 유닛을 생산한다
		Build_Tech,								///< 테크 리서치를 한다
		Build_Upgrade,							///< 업그레이드를 어느 수준까지 한다

		// 멀티 확장 관련 타스크
		Build_Expansion_On_Ground,				///< 확장 기지를 건설한다
		Build_Expansion_On_Island,				///< 섬 확장 기지를 건설한다


		// 방어 관련 타스크
		Attack_Enemy_Worker_In_Main_Region,		///< 아군 진영에서 적군 일꾼 유닛을 제거한다 - 드론 or 저글링으로 대응
		Attack_Enemy_Dangerous_Building_In_Main_Region,	///< 아군 진영에서 적군 건물 유닛을 제거한다 - 드론 or 저글링으로 대응

		Block_And_Hold_On_ChokePoint,			///< 게임 초반에 길목을 완전히 막고 Hold 해있는다. Mutalisk 나 Lurker 건설을 들키지 않기 위함

		Attack_Enemy_Ground_Unit_In_Our_Region,	///< 아군 진영에서 적군 지상 유닛을 제거한다 
		Kill_Enemy_Air_Unit_In_Main_Region,		///< 아군 진영에서 적군 공중 유닛을 제거한다 : 오버로드, 테란 Lifted 건물, 그외 비행 유닛들
		Move_Every_Overlord_To_MainBaseLocation,		///< 아군 오버로드를 안전한 곳에 피신시켜놓는다

		Defense_Position_With_Zergling,			///< 길목 주위를 방어한다
		Defense_Position_With_SunkenColonies,	///< 성큰콜로니로 길목을 방어한다		
		Attack_With_Lurker_Drop,				///< 럴커로 아군 길목 방어
		Defense_Position_With_Hydralisk,		///< 히드라로 아군 길목 방어


		Burrow_On_Position,						///< 특정 지점에 버로우 시킨다

		Burrow_On_Empty_BaseLocation,			///< 럴커를 적군의 예상 멀티 위치에 버로우 시킨다

		Burrow_And_Ambush_Attack_With_Lurker,	///< 럴커를 적군의 예상 경로에 버로우 시킨다

		// 공격 관련 타스크
		Attack_Enemy_BaseLocation_With_Early_Zergling_Unit,		///< 적군 진영을 향해 정면 공격한다
		Attack_Enemy_BaseLocation_With_Ground_Unit,				///< 적군 진영을 향해 정면 공격한다
		AttackEnemyUnits,										///< 적군 유닛들을 공격한다

		Attack_Enemy_BaseLocation_With_Mutalisk,				///< 적군 일꾼을 목표로 뮤탈리스크로 후방 공격 들어간다. 

		Kill_Unit_Urgently,						///< 긴급하게 특정 유닛을 제거한다 (Broodling 등 전용)
		Kill_Some_UnitType,						///< 특정 UnitType을 찾아다니며 제거한다 
		
		Transport_Defiler_Throuth_Overlord,		///< 아군 디파일러를 오버로드로 이동시킨다

		SlaughterEnemyWorkersWithZergling,		///< 적군 일꾼만을 목표로 후방 공격 들어간다. 저글링으로
		SlaughterEnemyWorkersWithLurkerDrop,	///< 적군 일꾼만을 목표로 후방 공격 들어간다. 러커 드랍으로	

		Spray_Plague_On_Enemy_Buildings,		///< 적군 건물들을 향해 Plague를 미리 뿌려놓는다
		Spray_Plague_On_Enemy_Units,			///< 적군 유닛들을 향해 Plague를 미리 뿌려놓는다


		TaskGoalType_Undefined
	};

	struct StrategicTask {

		TaskGoalType taskGoal;

		BWAPI::UnitType targetUnitType;
		BWAPI::TechType targetTechType;
		BWAPI::UpgradeType targetUpgradeType;
		BWAPI::Unit targetUnit;
		BWAPI::Position targetPosition;
		int targetCount;

		std::set<BWAPI::Unit> assignedUnitList;
		BWAPI::Unitset assignedUnitSet;
		bool isUrgent;

		StrategicTask(TaskGoalType _taskGoal,
			BWAPI::UnitType _targetUnitType = BWAPI::UnitTypes::None,
			BWAPI::TechType _targetTechType = BWAPI::TechTypes::None,
			BWAPI::UpgradeType _targetUpgradeType = BWAPI::UpgradeTypes::None,
			BWAPI::Unit _targetUnit = nullptr,
			BWAPI::Position _targetPosition = BWAPI::Positions::None,
			int _targetCount = 1,
			bool _isUrgent = false)
			: taskGoal(_taskGoal)
			, targetUnitType(_targetUnitType)
			, targetTechType(_targetTechType)
			, targetUpgradeType(_targetUpgradeType)
			, targetUnit(_targetUnit)
			, targetPosition(_targetPosition)
			, targetCount(_targetCount)
			, isUrgent(_isUrgent)
		{
		}

		void setTargetPosition(BWAPI::Position _targetPosition)
		{
			targetPosition = _targetPosition;
		}

		// targetCount 및 isUrgent 는 == 체크에서 제외
		const bool operator == (const StrategicTask & rhs) const
		{
			return (taskGoal == rhs.taskGoal)
				&& (targetUnitType.getID() == rhs.targetUnitType.getID())
				&& (targetTechType.getID() == rhs.targetTechType.getID())
				&& (targetUpgradeType.getID() == rhs.targetUpgradeType.getID())
				&& (targetUnit == rhs.targetUnit)
				&& (targetPosition == rhs.targetPosition)
				;
		}

		// find 등 대부분의 경우 사용
		// targetCount 및 isUrgent 는 < 체크에서 제외
		const bool operator < (const StrategicTask & rhs) const
		{
			if (taskGoal == rhs.taskGoal) {

				if (targetUnitType.getID() == rhs.targetUnitType.getID()) {

					if (targetTechType.getID() == rhs.targetTechType.getID()) {

						if (targetUpgradeType.getID() == rhs.targetUpgradeType.getID()) {

							if (targetPosition == rhs.targetPosition) {
								return false;
							}
							else {
								return (targetPosition < rhs.targetPosition);
							}
						}
						else {
							return (targetUpgradeType.getID() < rhs.targetUpgradeType.getID());
						}
					}
					else {
						return (targetTechType.getID() < rhs.targetTechType.getID());
					}
				}
				else {
					return (targetUnitType.getID() < rhs.targetUnitType.getID());
				}
			}
			else {
				return (taskGoal < rhs.taskGoal);
			}

			/*
			if (taskGoal < rhs.taskGoal) {

				if (targetUnitType.getID() < rhs.targetUnitType.getID()) {

					if (targetTechType.getID() < rhs.targetTechType.getID()) {

						if (targetUpgradeType.getID() < rhs.targetUpgradeType.getID()) {

							if (targetPosition < rhs.targetPosition) {
								return true;
							}
							else {
								return false;
							}
						}
						else {
							return false;
						}
					}
					else {
						return false;
					}
				}
				else {
					return false;
				}
			}
			else {
				return false;
			}
			*/
		}
	};

	namespace StrategicTaskUtil {
		std::string getTaskGoalTypeString(TaskGoalType taskGoalType);
		std::string toString(StrategicTask task);
	}



	/// 불필요할 듯 : unit 과 command 로 이미 BWAPI 에서 매핑관계가 지정, 저장되고 유지된다
	/// 적군에 대해서는 파악 불가능

	/// 아군 유닛과  targetUnit 혹은 targetPosition 간 매핑관계
	/// 어느 아군 유닛이 어느 적군 유닛을 공격하는지를 저장해놔서, 스커지가 각각 다른 유닛에게 공격하는 등 컨트롤을 보다 잘 수행할 수 있게 한다
	enum MissionType {
		Move = 10, ///< 공격하지 않고, move 한다
		MovePoint = 12, ///< 공격하지 않고, move 한다. 정확히 그 자리로
		Return_Home = 11, ///< 메인 베이스로 돌아온다
		Attack = 21, ///< 대상 유닛의 위치가 보이면 그 유닛만 attack 하고, 안보이면 최종 위치로 move 한다
		AttackMove = 22, ///< 대상 유닛의 위치가 보이면 그 유닛을 향해 attackMove 하고, 안보이면 최종 위치로 attackMove 한다
		MoveRoundAboutWay = 12, ///< 우회한다
		Parasite = 51, ///< Parasite 기술 시전
		Spawn_Broodlings = 52, ///< Spawn_Broodlings 기술 시전
		Ensnare = 53, ///< Ensnare 기술 시전
		Burrow = 61,
		Patrol = 62,
		KillWorker = 71,
		Patrol_BaseLocations = 13,
		Attack_BaseLocation = 23,
		Eliminate_BaseLocation = 24,
		Wait = 17,
		MoveAndHoldPosition = 14, ///< move 한 후 고정
		HoldPosition = 15, ///< hold. 뮤탈 짤짤이
		Stop = 16,
		AttackEveryFrame = 25, ///< 계속 공격
		Mission_Undefined = 0
	};

	struct Mission {
		MissionType missionType;
		BWAPI::Unit targetUnit;
		BWAPI::Position targetPosition;
		BWTA::BaseLocation* targetBaseLocation;
		BWTA::Region* targetRegion;
		int missionSetFrame; ///< 언제 임무를 지정했는가

		// TODO : 유닛 임무수행 상태
		//int					state;				///< 부대 상태 (드랍 탑재, 이동, 드랍 강하, 드랍 공격.   이동중. 도착해서 임무수행중)

		Mission()
			: missionType(MissionType::Mission_Undefined)
			, targetUnit(nullptr)
			, targetPosition(BWAPI::Positions::None)
			, targetBaseLocation(nullptr)
			, targetRegion(nullptr)
		{
			missionSetFrame = BWAPI::Broodwar->getFrameCount();
		}

		/// _targetPosition : 타겟 좌표. 이걸로 다른 유닛이 여러개 지정되지 않도록 구분
		Mission(MissionType _missionType, BWAPI::Position _position = BWAPI::Positions::None)
			: missionType(_missionType)
			, targetUnit(nullptr)
			, targetPosition(_position)
			, targetBaseLocation(nullptr)
			, targetRegion(nullptr)
		{
			missionSetFrame = BWAPI::Broodwar->getFrameCount();
		}

		Mission(MissionType _missionType, BWAPI::Unit _targetUnit, BWAPI::Position _position = BWAPI::Positions::None)
			: missionType(_missionType)
			, targetUnit(_targetUnit)
			, targetPosition(_position)
		{
			missionSetFrame = BWAPI::Broodwar->getFrameCount();
		}

		/// _targetBaseLocation : 타겟 BaseLocation. 이걸로 다른 유닛이 여러개 지정되지 않도록 구분
		/// _targetPosition : 실제 타겟 좌표
		Mission(MissionType _missionType, BWTA::BaseLocation* _targetBaseLocation, BWAPI::Position _targetPosition)
			: missionType(_missionType)
			, targetUnit(nullptr)
			, targetPosition(_targetPosition)
			, targetBaseLocation(_targetBaseLocation)
			, targetRegion(_targetBaseLocation->getRegion())
		{
			missionSetFrame = BWAPI::Broodwar->getFrameCount();
		}

		Mission(MissionType _missionType, BWTA::Region* _targetRegion)
			: missionType(_missionType)
			, targetUnit(nullptr)
			, targetPosition(_targetRegion->getCenter())
			, targetBaseLocation(nullptr)
			, targetRegion(_targetRegion)
		{
			for (BWTA::BaseLocation* baseLocation : _targetRegion->getBaseLocations()){
				targetBaseLocation = baseLocation;
				break;
			}
			missionSetFrame = BWAPI::Broodwar->getFrameCount();
		}
		
		const bool operator == (const Mission & rhs) const
		{
			if (missionType == rhs.missionType
				&& targetUnit == rhs.targetUnit
				&& targetPosition == rhs.targetPosition
				&& targetBaseLocation == rhs.targetBaseLocation
				&& targetRegion == rhs.targetRegion) 
			{
				return true;
			}
			else {
				return false;
			}
		}

	};

	enum LocationStatus {
		My_MainBase,						///< 아군 본진
		My_Occupied,						///< 아군 점령지역
		Enemy_MainBase,						///< 적군 본진
		Enemy_Occupied,						///< 적군 점령지역
		LocationStatus_Unknown				///< 기본 상태
	};

	struct LocationInfo {
		LocationStatus locationStatus;
		int lastVisibleTime;
		int lastDangerousLevel;

		LocationInfo(LocationStatus _locationStatus = LocationStatus::LocationStatus_Unknown) {
			locationStatus = _locationStatus;
			lastVisibleTime = -1;
			lastDangerousLevel = 0;
		}
	};

}

