#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 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(); ////////////////////////////////////////////////////////////////////////// // public: inline void SetWiseUser(WiseUser* pUser) { m_pUser = pUser; } inline GameZone* GetGameZone() { return m_pGameZone; } ////////////////////////////////////////////////////////////////////////// // 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; } ////////////////////////////////////////////////////////////////////////// // 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); ////////////////////////////////////////////////////////////////////////// // 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); ////////////////////////////////////////////////////////////////////////// // 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); ////////////////////////////////////////////////////////////////////////// // 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; };