Files
Sun1602/Tools/WiseClient/Information/Zone/ZoneControl.h
T
2022-10-26 12:25:11 +08:00

150 lines
4.5 KiB
C++

#pragma once
class WiseUser;
class GameZone;
//////////////////////////////////////////////////////////////////////////
//
struct sZONE_MOVINFO_ARG
{
eZONETYPE ZONETYPE_CUR;
FIELDCODE FIELDCODE_CUR;
eZONETYPE ZONETYPE_NEXT;
FIELDCODE FIELDCODE_NEXT;
eZONE_STATE ZONESTATE_CUR;
};
struct sMAP_POS_ARG
{
enum ePOS { X = 0, Y = 1, Z = 2, MAX = 3 };
DWORD SUBCMD;
DWORD ANGLE;
FLOAT XYZ_CUR[sMAP_POS_ARG::ePOS::MAX];
FLOAT XYZ_DEST[sMAP_POS_ARG::ePOS::MAX];
};
class sZONE_CTRL_INFO
{
public:
//#define DECL_CONST_MEMBER static const eFLAG
DECL_CONST_MEMBER MAX_SIZE = 31;
DECL_CONST_MEMBER BIT_TUTORIAL_PROCESS = 10;
//#undef DECL_SP_CONST_MEMBER
private: typedef util::BitSetOperation<MAX_SIZE> ZONE_LC_BITS;
public: inline void Clear() { m_Bits.ClearAll(); }
inline BOOL IsEnable(DWORD flag) { return m_Bits.IsSet(flag); }
inline void Enabled(DWORD flag) { m_Bits.Set(flag); }
inline void Disabled(DWORD flag) { m_Bits.UnSet(flag); }
private: ZONE_LC_BITS m_Bits;
};
//////////////////////////////////////////////////////////////////////////
//
class ZoneControl
{
public: ZoneControl();
~ZoneControl();
//////////////////////////////////////////////////////////////////////////
// <INTERFACEs>
public: inline void SetWiseUser(WiseUser* pUser) { m_pUser = pUser; }
inline GameZone* GetGameZone() { return m_pGameZone; }
//////////////////////////////////////////////////////////////////////////
// <INTERFACEs>
public:
enum eZONE_MOV_CMD
{
CMD_ZONE_ARG_CLEAR , // + 입력된 ARG 초기화
CMD_ZONE_GET_CUR_INFO , // 현재 상태 출력
CMD_ZONE_MOV_START , // 이동 시작, pARG, _CUR, _NEXT 정보 입력 요구됨
CMD_ZONE_MOV_END , // 이동 완료
CMD_ZONE_CLEAR , // 종료 관련, 내부 정보 초기화
CMD_ZONE_MAX ,
};
BOOL ZoneMoveCmd(eZONE_MOV_CMD IN zCMD, sZONE_MOVINFO_ARG* IN OUT pARG);
BOOL CanUseZoneMoveCmd() { return TRUE; } // 아직 구현 미정
enum eMAP_POS_CMD
{
CMD_POS_ARG_CLEAR , //
CMD_POS_GET_CUR_INFO , // 현재 위치 출력
CMD_POS_SET_CUR_INFO , // 주어진 인자값으로 위치 설정
CMD_POS_CALC_MOV_DIRECTION , // 방향키에 의한 이동시 계산 루틴
CMD_POS_CALC_MOV_TARGET , // 특정 영역 지정 이동시 계산 루틴
CMD_POS_CLEAR , // 종료 관련, 내부 정보 초기화
CMD_POS_MAX ,
};
BOOL MapPosCmd(eMAP_POS_CMD IN mCMD, sMAP_POS_ARG* IN OUT pARG);
inline BOOL& MapPosCmdBlockMode() { return m_bMapPosCmdBlock; }
inline sZONE_CTRL_INFO& ZONE_CTRL_INFO() { return m_ZONE_CTRL_INFO; }
//////////////////////////////////////////////////////////////////////////
// <eZONE_MOV_CMD::HANDLERs>
private: BOOL _CMD_ZONE_ARG_CLEAR(sZONE_MOVINFO_ARG* IN OUT pARG);
BOOL _CMD_ZONE_GET_CUR_INFO(sZONE_MOVINFO_ARG* OUT pARG);
// 1) _CMD_ZONE_GET_CUR_INFO
// 2) 이동할 위치 설정
// 3) _CMD_ZONE_MOV_START
BOOL _CMD_ZONE_MOV_START(sZONE_MOVINFO_ARG* IN pARG);
// ARG = NULL
BOOL _CMD_ZONE_MOV_END(sZONE_MOVINFO_ARG* IN pARG);
// ARG = NULL
BOOL _CMD_ZONE_CLEAR(sZONE_MOVINFO_ARG* pARG);
//////////////////////////////////////////////////////////////////////////
// <eZONE_MOV_CMD::HANDLERs>
private: BOOL _CMD_POS_ARG_CLEAR(sMAP_POS_ARG* IN OUT pARG);
BOOL _CMD_POS_GET_CUR_INFO(sMAP_POS_ARG* OUT pARG);
BOOL _CMD_POS_SET_CUR_INFO(sMAP_POS_ARG* IN pARG);
BOOL _CMD_POS_CALC_MOV_DIRECTION(sMAP_POS_ARG* IN pARG);
BOOL _CMD_POS_CALC_MOV_TARGET(sMAP_POS_ARG* IN pARG);
BOOL _CMD_POS_CLEAR(sMAP_POS_ARG* IN pARG);
//////////////////////////////////////////////////////////////////////////
// <eZONE_MOV_CMD>
private: inline BOOL _IsZoneTransaction()
{
BOOL bTrans = (BOOL)(ePRS_BEFORE_ENTER_ZONE&m_ZONE_MOV_INFO.ZONESTATE_CUR ? TRUE : FALSE);
return bTrans;
}
void _GetZoneStateByMoving(eZONE_STATE& rzsSTATE);
void _GetZoneStateByMoved(eZONE_STATE& rzsSTATE);
//////////////////////////////////////////////////////////////////////////
// <eMAP_POS_CMD>
private:
private:
private: //eZONE_POS m_eZONE_POS;
//eZONE_MOV_TRANS m_eZONE_MOV_TRANS;
typedef BOOL (ZoneControl::*fnZONE_HANDLER)(sZONE_MOVINFO_ARG* IN OUT pARG);
typedef BOOL (ZoneControl::*fnPOS_HANDLER)(sMAP_POS_ARG* IN OUT pARG);
WiseUser* m_pUser;
GameZone* m_pGameZone;
BOOL m_bMapPosCmdBlock;
sZONE_MOVINFO_ARG m_ZONE_MOV_INFO;
sMAP_POS_ARG m_MAP_POS_INFO;
fnZONE_HANDLER m_ZONE_HANDLERS[eZONE_MOV_CMD::CMD_ZONE_MAX];
fnPOS_HANDLER m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_MAX];
sZONE_CTRL_INFO m_ZONE_CTRL_INFO;
};