// MapTriggerManager.h: interface for the CMapTriggerManager class.
//
// \brief		// 2011-10-28 by hskim, EP4 [트리거 시스템] - 크리스탈 시스템
// \author		hskim
// \date		2011-10-28
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MAPTRIGGERMANAGER_H__AF36F11A_0D7F_41FE_9EC7_272A4D48B19B__INCLUDED_)
#define AFX_MAPTRIGGERMANAGER_H__AF36F11A_0D7F_41FE_9EC7_272A4D48B19B__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "TickManager.h"
#include "ODBCStatement.h"	// 2013-08-14 by jhseol, 거점전 리뉴얼 - NGC 거점
#include "FieldIOCPSocket.h"		// 2013-08-14 by jhseol, 거점전 리뉴얼 - NGC 거점

class CFieldIOCP;
class CODBCStatement;
class CTriggerFunction;
class CFieldMapChannel;

class CMapTriggerManager : public CTickManager
{
public:
	CMapTriggerManager(DWORD i_nTickInterval = 1000);
	virtual ~CMapTriggerManager();

	void Clear();
	BOOL Create(CFieldIOCP *pFieldIOCP, CODBCStatement *pOdbcStmt);
	BOOL LoadDB(CODBCStatement *pOdbcStmt);
	void Destroy();

	BOOL InsertTrigger(CTriggerFunction *pTriggerFunction);

	int LinkToTriggerFunction(MAP_CHANNEL_INDEX MapChannel, CFieldMapChannel *pFieldMapChannel, vector<CTriggerFunction *> *pvectorTriggerFunction);
	CFieldIOCP *GetFieldIOCP()		{ return m_pFieldIOCP; }

	BOOL ResetEventByMapChannel(MAP_CHANNEL_INDEX MapChannelIndex);		// 2012-12-17 by hskim, NPC 서버 재시작시 - 트리거 시스템 초기화 적용
	
	BOOL SkipEventByTriggerID(INT iMapTriggerID);
	BOOL SkipEventByMapChannelIndex(MAP_CHANNEL_INDEX MapChannelIndex);
	BOOL FixedBuffItemChannelIndex(MAP_CHANNEL_INDEX MapChannelIndex, INT i_nFixedBuffItem);	// 2013-01-21 by jhseol, NGC 전전기지 트리거 시스템	- 테스트용 크리스탈 버프 고정
	// 2013-08-14 by jhseol, 거점전 리뉴얼 - NGC 거점
	void InitOdbcStmt();
	void CountChangeNGCSPWar(BOOL i_bCountPlus = FALSE);	// 진행중인 NGC거점의 수를 가감하는 함수
	BOOL ISPossibleNGCSPCreate();
	void SetNGCSPCreateTime();								// NGC거점 생성시간 설정
	void SetNGCSPCreateTime(ATUM_DATE_TIME i_atCreateTime) {m_atNGCSPCreateTime.SetDateTime(i_atCreateTime);}	// NGC거점 생성시간 강제 설정
	ATUM_DATE_TIME GetNGCSPCreateTime() {return m_atNGCSPCreateTime;}	// NGC거점 생성시간 가져오는 함수
	ATUM_DATE_TIME GetNGCSPWarStartTime() {return m_atNGCSPWarStartTime;}	// NGC거점전 시작시간 가져오는 함수
	ATUM_DATE_TIME GetNGCSPWarFinishTime() {return m_atNGCSPWarFinishTime;}	// NGC거점전 종료시간 가져오는 함수
	BOOL GetNGCSPWarState()	{return m_bPlayingNGCSPWar;}
	void SetMSWarState(BOOL i_bState);
	void SetOutPostWarState(BOOL i_bState);
	void DeleteContribute(MAP_CHANNEL_INDEX i_nMapChannelIndex, UID32_t i_nCUID, INT i_nMonsterNum);
	void StrategyPointDisPlayBySocket(CFieldIOCPSocket *pIOCPSocket);
	// end 2013-08-14 by jhseol, 거점전 리뉴얼 - NGC 거점

protected:
	BOOL CreateSubClass();
	BOOL MixCrystal();		// 크리스탈 랜덤 섞기

protected:
	BOOL InitTickManager();
	void CleanTickManager();

	void DoTickEvent(ATUM_DATE_TIME *pDateTime, TICK_EVENT *pTickEvent);
	void DoEveryTickWork(ATUM_DATE_TIME *pDateTime);
	void DoDailyWork(ATUM_DATE_TIME *pDateTime);
	void DoHourlyWork(ATUM_DATE_TIME *pDateTime);
	void DoMinutelyWork(ATUM_DATE_TIME *pDateTime);
	void DoSecondlyWork(ATUM_DATE_TIME *pDateTime);
	void DoMonthlyWork(ATUM_DATE_TIME *pDateTime);

protected:
	CFieldIOCP *m_pFieldIOCP;

	vector<CTriggerFunction *>			m_vectorTriggerFunction;		// 초기 부팅시 설정되고 변경되지 않는다. 동기화 필요 없음

private:
	vectorTriggerMap					m_vectTriggerMap;				
	vectorTriggerFunctionCrystal		m_vectTriggerFunctionCrystal;
	vectorTriggerCrystalGroup			m_vectTriggerCrystalGroup;
	vectorTriggerCrystalDestroyGroup	m_vectTriggerCrystalDestroyGroup;

	vectorTriggerFunctionNGCInflWar		m_vectTriggerFunctionNGCInflWar;
	vectorTriggerNGCInflWarMonsterGroup	m_vectTriggerNGCInflWarMonsterGroup;

	// 2013-01-21 by jhseol, NGC 전전기지 트리거 시스템
	vectorTriggerFunctionNGCOutPost		m_vectTriggerFunctionNGCOutPost;	// 전진 기지 정보 구조체 벡터
	vectorTriggerOutPostBossKillInfo	m_vectTriggerOutPostBossKillInfo;	// 보스 몬스터 공략정보 구조체 벡터
	vectorTriggerCrystalBuff			m_vectTriggerCrystalBuff;			// 트리거 맵 크리스탈 버프 정보
	// end 2013-01-21 by jhseol, NGC 전전기지 트리거 시스템

	// 2013-08-14 by jhseol, 거점전 리뉴얼 - NGC 거점
	CODBCStatement m_OdbcStmt;
	ATUM_DATE_TIME m_atNGCSPCreateTime;						// NGC거점이 생성되는 시간
	ATUM_DATE_TIME m_atNGCSPWarStartTime;					// NGC거점전이 시작 시간
	ATUM_DATE_TIME m_atNGCSPWarFinishTime;					// NGC거점전이 종료된 시간
	BYTE m_nPlayNGCSPWar;									// 진행중인 NGC거점의 수
	BOOL m_bPlayingNGCSPWar;								// 진행중인지 체크할 변수
	BOOL m_bPlayingMSWar;									// 모선전이 진행중인지 체크할 변수
	BOOL m_bPlayingOutPostWar;								// 전진기기전이 진행중인지 체크할 변수
	BYTE m_nCountOutPostWar;								// 진행중인 전전기기전 카운팅
	BYTE m_nCountMSWar;										// 진행중인 모선전 카운팅
	// end 2013-08-14 by jhseol, 거점전 리뉴얼 - NGC 거점

};

#endif // !defined(AFX_MAPTRIGGERMANAGER_H__AF36F11A_0D7F_41FE_9EC7_272A4D48B19B__INCLUDED_)
