#pragma once
#include "user.h"
#include "TimeEvent.h"
#if (EVENT_DDAY == 1) && (GS_CASTLE == 1)
#define DDAY_USERPERGENS_MAX 100
#define DDAY_MONNORMAL_MAX 500
#define DDAY_MAX_WINNER 10
struct DDayBlockArea
{
BYTE btStartX;
BYTE btStartY;
BYTE btEndX;
BYTE btEndY;
};
class DDayEvent
{
public:
enum DDayState
{
DDayState_CLOSE = 0,
DDayState_OPEN = 1,
DDayState_READY = 2,
DDayState_PLAYING = 3,
DDayState_END = 4,
DDayState_OCCUPIED = 5,
};
struct USER_INFO
{
int aIndex;
bool bKeep;
};
struct SortList
{
int iPos;
int iVal;
};
DDayEvent(void);
~DDayEvent(void);
void ProtocolCore(int aIndex,BYTE * lpRecv,BYTE protoEx);
void NpcTalk(LPOBJ lpNPC, LPOBJ lpObj);
void ReqEnterMap(int aIndex);
int GetLeftTime();
void LoadConfig(char * szConfig);
void LoadIni(char * szConfig);
DDayEvent::DDayState GetState();
int GetStateTime();
void SetState(DDayEvent::DDayState _eState);
void RunState();
void MoveToArea(int aIndex);
int User_InDDayType( LPOBJ lpObj );
void User_Remove(LPOBJ lpObj);
BOOL CheckPos(GENS_TYPE _eGens,BYTE _X,BYTE _Y);
void InitMonster();
void MonsterKilled(LPOBJ lpObj, LPOBJ lpKillerFinnal);
BOOL CheckPK(LPOBJ lpObj, LPOBJ lpVictim);
void OnPlayerDie(LPOBJ lpObj, LPOBJ lpKiller);
void OnPlayerRegen(LPOBJ lpObj);
private:
void SetState_CLOSE();
void RunState_CLOSE();
void SetState_OPEN();
void RunState_OPEN();
void SetState_READY();
void RunState_READY();
void SetState_PLAYING();
void RunState_PLAYING();
void SetState_END();
void RunState_END();
void SetState_OCCUPIED();
void RunState_OCCUPIED();
void SendZoneSafetyInfo(int aIndex,bool bDoBlock, GENS_TYPE _gType);
void SendZoneSafetyInfo(GENS_TYPE SendGroup,bool bDoBlock, GENS_TYPE _gType);
void User_Reset();
BOOL User_Add(LPOBJ lpObj);
void SetNPCStatue();
void RemoveNPCStatue();
void MonsterNormalSet();
void MonsterNormalRemove();
void UserSetEnd();
void RemoveAllPlayer();
void SendTeam(GENS_TYPE _gensType,void * _p,int _iSize);
void GCStartSend(BYTE _bStart);
void GCSTimerSend(WORD wTimeLeft);
void RewardItemWinner(LPOBJ lpMonster,int aIndexKiller);
BOOL IsFoundHPPotion( LPOBJ lpObj );
void GCPlayerRegenTimer(LPOBJ lpObj);
void calcEndResultTable();
static bool sortMember(SortList const & lhs,SortList const & rhs);
void sendHideResultTable(int aIndex);
void CheckUnblockStatue();
private:
DDayState m_State;
int m_StateTickSec;
int m_TimeNoticeCheck;
int m_TimeNoticeCheck2;
GENS_TYPE m_eGensWiner;
int m_Time_Open;
int m_Time_Wait;
int m_Time_Playing;
int m_Time_Ending;
int m_Time_Occupied;
CTimeEvent m_TimeEvent;
CTargetTime m_TimeOpen;
CRITICAL_SECTION m_ProtectUser;
USER_INFO m_pGensAIndex[DDAY_USERPERGENS_MAX];
int m_GensACount;
USER_INFO m_pGensBIndex[DDAY_USERPERGENS_MAX];
int m_GensBCount;
DDayBlockArea m_BlockArea[2];
int m_Mon_TeamAPos;
int m_Mon_TeamBPos;
int m_Mon_Normal[DDAY_MONNORMAL_MAX];
int m_Mon_NormalCount;
int m_Mon_TeamAIndex;
int m_Mon_TeamBIndex;
int m_Mon_NormalIndex[DDAY_MONNORMAL_MAX];
int m_Mon_NormalIndexCount;
BOOL m_EventEnable;
int m_EventStatueUnBlockPoint;
int m_EventStatueUnBlockTimeSec;
int m_GensAPoint;
int m_GensBPoint;
BOOL m_IsUnblockStatueTeamA;
BOOL m_IsUnblockStatueTeamB;
};
extern DDayEvent g_DDayEvent;
#endif