#pragma once #include #include //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // // namespace nsSSQ { #define SSQ_MSG_DECL( protocol ) \ struct MSGSUB_##protocol : WAR_TAG1_< protocol, MSGSUB_##protocol > // Ŭ¶óÆÀÀÇ Ç×ÀÇ·Î À̰ÍÀº »ç¿ëÀ» Áö¾çÇϱâ·Î ÇÑ´Ù. ÇϳªÀÇ ¸Þ¼Òµå¿¡¼­ SWITCH¹®À¸·Î ±¸ºÐÇÏ°í ·çÇÎÇϱâ·Î ÇÑ´Ù. // #define SSQ_MSG_HANDLER_IMPL( protocol ) \ // BOOL On##protocol( const MSGSUB_##protocol& rMsg ) // // case SSQ_PROTOCOL_TRAP_EARTHQUAKE_EXECUTE: // { // RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_TRAP_EARTHQUAKE_INDICATION ); // // enable keyword 'rMsg' // rMsg.Count ~~ #define RECV_PATTERNCODE_FOR_SSQ( subprotocol ) \ const MSGSUB_##subprotocol& rMsg = static_cast(*pIt); \ size = rMsg.GetSize() //¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ // enum eTIME_SECT { TS_WAITING_TIME , TS_QUEST_PLAY_TIME , }; enum eSSQ_CTRL_TAG { SCT_HDR = 0, SSQ_PROTOCOL_CTRL_TAG_TAIL = 254, // End Of Variable Stream (specialization) SCT_S2S = 200, // Server<->Server Control Tag }; enum eG2C_NOTICE_MODE { SSQ_PROTOCOL_NOTICE_ENABLE_ENTER_COUNTDOWN = 10, // ÀÔÀå °¡´É XºÐ Àü °øÁö SSQ_PROTOCOL_NOTICE_ENABLE_ENTER , // ÀÔÀå °¡´É °øÁö SSQ_PROTOCOL_NOTICE_CLOSE_ENTER_COUNTDOWN , // ÀÔÀå Á¾·á XºÐ Àü °øÁö SSQ_PROTOCOL_NOTICE_CLOSE_PORTAL , // ÀÔÀå Æ÷Å» »ý¼º Á¾·á °øÁö SSQ_PROTOCOL_NOTICE_CLOSE_ENTER , // ÀÔÀå Á¾·á °øÁö SSQ_PROTOCOL_NOTICE_BATTLE_CANCLED , // ÀüÅõ ½ÃÀÛ Á¶°Ç ºÎÇÕµÇÁö ¸øÇØ ÀüÅõ Ãë¼Ò SSQ_PROTOCOL_NOTICE_GAMBLE_START , // °·ºí ½ÃÀÛ (Âü°¡ÀÚ ´ë»ó) SSQ_PROTOCOL_NOTICE_GAMBLE_RESULT , // °·ºí Á¾·á ¹× °á°ú °øÁö (Âü°¡ÀÚ ´ë»ó) SSQ_PROTOCOL_NOTICE_BATTLE_COUNTDOWN , // ÀüÅõ ½ÃÀÛ 5ÃÊ Àü (Âü°¡ÀÚ ´ë»ó) SSQ_PROTOCOL_NOTICE_BATTLE_START , // ÀüÅõ ½ÃÀÛ (Âü°¡ÀÚ ´ë»ó) SSQ_PROTOCOL_NOTICE_BATTLE_END , // ÀüÅõ Á¾·á (Äù½ºÆ® ¼º°ø ¹× ½ÇÆÐ °ü·Ã Á¤º¸ Æ÷ÇÔ) SSQ_PROTOCOL_NOTICE_1TO1_PORTAL_CLOSED , // [°³ÀÎ ´ë»ó] ½Ã°£ Á¦ÇÑ¿¡ °É·Á »ý¼ºµÈ Æ÷Å» Ãë¼Ò SSQ_PROTOCOL_NOTICE_UPPERBOUND // ÀÌ ÀÌÈÄ·Î Ãß°¡µÇ¼­´Â ¾ÈµÈ´Ù. }; enum eG2C_TRAP_MODE { SSQ_PROTOCOL_TRAP_EARTHQUAKE_INDICATION = SSQ_PROTOCOL_NOTICE_UPPERBOUND, // ÁöÁø ¹ß»ý ¡Á¶ ¿¹°í SSQ_PROTOCOL_TRAP_EARTHQUAKE_EXECUTE , // ÇØ´ç À§Ä¡ ÁöÁø ¹ß»ý ¹× ±× °á°ú SSQ_PROTOCOL_TRAP_THUNDERBOLT_EXECUTE , // ¹ø°³ ¹ß»ý ¹× ±× °á°ú SSQ_PROTOCOL_TRAP_CLOSEDSPACE_EXECUTE , // °á°è µ¿ÀÛ ¹× ±× °á°ú SSQ_PROTOCOL_TRAP_CLOSEDSPACE_DISABLED , // °á°è µ¿ÀÛ Á¤Áö ¹× ÀÌÆåÆ® Á¦°Å SSQ_PROTOCOL_TRAP_SELF_DESTRUCTION , // ¸ó½ºÅÍ ÀÚÆø SSQ_PROTOCOL_TRAP_UPPERBOUND // ÀÌ ÀÌÈÄ·Î Ãß°¡µÇ¼­´Â ¾ÈµÈ´Ù. }; enum eG2C_CONTROL_MODE { SSQ_PROTOCOL_CONTROL_FORCED_POSITION_CORRECTION = SSQ_PROTOCOL_TRAP_UPPERBOUND, // ÁöÁøµîÀÇ »óȲÀ¸·Î C/S°£ À§Ä¡ ºÒÀÏÄ¡ ¹®Á¦ ÇØ°á ¸ñÀû SSQ_PROTOCOL_CONTROL_DAMAGE_PROCESS , // ij¸¯ÅÍ µ¥¹ÌÁö ó¸® //GCM_ENTER_CHARACTER_INFO = GTM_UPPERBOUND, // ÀÔÀåÇÑ Ä³¸¯ÅÍ Á¤º¸ //GCM_LEAVE_CHARACTER_INFO , // Å»ÅðÇÑ Ä³¸¯ÅÍ Á¤º¸ //GCM_DEAD_CHARACTER_INFO , // ƯÁ¤ ij¸¯ÅÍ Àú¼¼»ó SSQ_PROTOCOL_CONTROL_UPPERBOUND , }; enum eG2C_INFORMATION_MODE { SSQ_PROTOCOL_INFORMATION_COUNT_OF_PLAYERS = SSQ_PROTOCOL_CONTROL_UPPERBOUND, // ³²Àº Àοø (Âü°¡ÀÚ ´ë»ó) SSQ_PROTOCOL_INFORMATION_REMAINED_TIME , // ³²Àº ½Ã°£(ºÐ) (Âü°¡ÀÚ ´ë»ó) SSQ_PROTOCOL_INFORMATION_REWARD_ON_PLAYING , // ¹®ÀÇÇÊ¿ä - ÀüÅõÁß °æÇ° ´ç÷ (Âü°¡ÀÚ ´ë»ó) SSQ_PROTOCOL_INFORMATION_AMOUNT_DEDUCTED , // ÀÔÀå·á Â÷°¨ SSQ_PROTOCOL_INFORMATION_QUEST_FAIL_RESULT , // Äù½ºÆ® Á¾·á½Ã '½ÇÆÐ'¿ë ¸Þ½ÃÁö ó¸® SSQ_PROTOCOL_INFORMATION_QUEST_SUCCESS_RESULT , // Äù½ºÆ® Á¾·á½Ã '¼º°ø'¿ë ¸Þ½ÃÁö ó¸® SSQ_PROTOCOL_INFORMATION_UPPERBOUND // ÀÌ ÀÌÈÄ·Î Ãß°¡µÇ¼­´Â ¾ÈµÈ´Ù. }; enum eC2G_REQUEST_MODE { SSQ_PROTOCOL_REQUEST_OBSERVER_CTRL_RESULT = SSQ_PROTOCOL_INFORMATION_UPPERBOUND, // °üÀü¸ðµå ¿äû SSQ_PROTOCOL_REQUEST_OBSERVER_CTRL_G2C_SELECT , // G->C ij¸¯ÅÍ Á×Àº ÀÌÈÄ '°üÀü¸ðµå' ¼±Åà ¸Þ½ÃÁö ¶ç¿ì±â SSQ_PROTOCOL_REQUEST_UPPERBOUND // ÀÌ ÀÌÈÄ·Î Ãß°¡µÇ¼­´Â ¾ÈµÈ´Ù. }; BOOST_STATIC_ASSERT( SSQ_PROTOCOL_REQUEST_UPPERBOUND < SCT_S2S ); #pragma pack(push, 1) //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // // //¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ // // struct SSQ_MSG_CTRL_TAG_TAIL : WAR_TAG1_< SSQ_PROTOCOL_CTRL_TAG_TAIL, SSQ_MSG_CTRL_TAG_TAIL > { }; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // // - °¢ ¸Þ½ÃÁö ±¸Á¶´Â ¿©±â¿¡ Á¤ÀÇÇÑ´Ù. // SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_ENABLE_ENTER_COUNTDOWN ) { // to All Players SSQInfo::SSQCODE CodeOfSSQ; SSQInfo::MINUTE_T Countdown; }; SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_ENABLE_ENTER ) { // to All Players SSQInfo::SSQCODE CodeOfSSQ; }; SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_CLOSE_ENTER_COUNTDOWN ) { // to All Players SSQInfo::SSQCODE CodeOfSSQ; SSQInfo::MINUTE_T Countdown; }; SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_CLOSE_PORTAL ) { // to All Players SSQInfo::SSQCODE CodeOfSSQ; }; SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_CLOSE_ENTER ) { // to All Players SSQInfo::SSQCODE CodeOfSSQ; }; SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_1TO1_PORTAL_CLOSED ) { // to 1 Player }; SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_BATTLE_CANCLED ) { // to SSQ Players }; SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_GAMBLE_START ) { // to SSQ Players }; SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_GAMBLE_RESULT ) { // to SSQ Players sSTRING_BUFFER_CHAR_NAME CharName; // ij¸¯ÅÍ À̸§ Àü¼Û DWORD RewardHeim; // °·ºí·Î ȹµæÇÑ ÇÏÀÓ¾× }; SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_BATTLE_COUNTDOWN ) { // to SSQ Players }; SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_BATTLE_START ) { // to SSQ Players }; SSQ_MSG_DECL( SSQ_PROTOCOL_NOTICE_BATTLE_END ) { // to SSQ Players }; SSQ_MSG_DECL( SSQ_PROTOCOL_TRAP_EARTHQUAKE_INDICATION ) { // to SSQ Players SSQPattern::INDEX_T PatternIndex; // ÆÐÅÏ ¹øÈ£ BYTE StepArrayIndex; // ÇØ´ç ÆÐÅÏÀÇ ¹è¿­ À妽º }; SSQ_MSG_DECL( SSQ_PROTOCOL_TRAP_EARTHQUAKE_EXECUTE ) { // to SSQ Players }; SSQ_MSG_DECL( SSQ_PROTOCOL_TRAP_THUNDERBOLT_EXECUTE ) { // to SSQ Players static const DWORD MAX_SIZE = 8; SSQInfo::COUNT_T Count; WzVector Position[MAX_SIZE]; inline WORD GetSize() const { return (WORD)( sizeof(*this) - sizeof(WzVector)*(MAX_SIZE-Count) ); } }; SSQ_MSG_DECL( SSQ_PROTOCOL_TRAP_CLOSEDSPACE_EXECUTE ) { // to SSQ Players static const DWORD MAX_SIZE = SSQ_MAX_CHARACTERS; SSQInfo::COUNT_T Count; DAMAGE_INFO Damages[MAX_SIZE]; inline WORD GetSize() const { return (WORD)( sizeof(*this) - sizeof(DAMAGE_INFO)*(MAX_SIZE-Count) ); } }; SSQ_MSG_DECL( SSQ_PROTOCOL_TRAP_CLOSEDSPACE_DISABLED ) { }; SSQ_MSG_DECL( SSQ_PROTOCOL_TRAP_SELF_DESTRUCTION ) { // to SSQ Players }; SSQ_MSG_DECL( SSQ_PROTOCOL_CONTROL_FORCED_POSITION_CORRECTION ) { static const DWORD MAX_SIZE = 200; SSQInfo::COUNT_T Count; struct NODE { DWORD ObjectKey; WzVector Position; } PositionInfo[MAX_SIZE]; inline WORD GetSize() const { return (WORD)( sizeof(*this) - sizeof(NODE)*(MAX_SIZE-Count) ); } }; SSQ_MSG_DECL( SSQ_PROTOCOL_CONTROL_DAMAGE_PROCESS ) { static const DWORD MAX_SIZE = SSQ_MAX_CHARACTERS; SSQInfo::COUNT_T Count; DAMAGE_INFO Damages[MAX_SIZE]; inline WORD GetSize() const { return (WORD)( sizeof(*this) - sizeof(DAMAGE_INFO)*(MAX_SIZE-Count) ); } }; SSQ_MSG_DECL( SSQ_PROTOCOL_INFORMATION_COUNT_OF_PLAYERS ) { // to SSQ Players SSQInfo::COUNT_T Remains; // }; SSQ_MSG_DECL( SSQ_PROTOCOL_INFORMATION_REMAINED_TIME ) { // to SSQ Players SSQInfo::MINUTE_T Minute; // remained minute SSQInfo::SECOND_T Second; }; SSQ_MSG_DECL( SSQ_PROTOCOL_INFORMATION_REWARD_ON_PLAYING ) { // to SSQ Players sSTRING_BUFFER_CHAR_NAME CharName; // ij¸¯ÅÍ À̸§ Àü¼Û }; SSQ_MSG_DECL( SSQ_PROTOCOL_INFORMATION_AMOUNT_DEDUCTED ) { // to 1 target Player DWORD ObjectKey; // ÀÔÀå·á Â÷°¨ ´ë»ó DWORD Cost; // Â÷°¨¾× (current_money = total_money - Cost) }; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // C->G SSQ_MSG_DECL( SSQ_PROTOCOL_INFORMATION_QUEST_FAIL_RESULT ) // Äù½ºÆ® Á¾·á½Ã '½ÇÆÐ'¿ë ¸Þ½ÃÁö ó¸® { BOOLEAN bIsNotStarted; // ÀüÅõ ½ÃÀÛÀü Ãë¼ÒµÈ °æ¿ìÀÎÁö? }; SSQ_MSG_DECL( SSQ_PROTOCOL_INFORMATION_QUEST_SUCCESS_RESULT ) // Äù½ºÆ® Á¾·á½Ã '¼º°ø'¿ë ¸Þ½ÃÁö ó¸® { sSTRING_BUFFER_CHAR_NAME WinnerName; // ÃÖÁ¾ ½ÂÀÚ À̸§ #ifdef _NA_002950_20110627_SSQ_NOTICE typedef util::cSTRING_BUFFER GuildNameBuffer; GuildNameBuffer guild_name; // ½ÂÀÚ°¡ ¼ÓÇÑ ±æµå À̸§, ¹«¼Ò¼ÓÀÌ¸é ºó¹®ÀÚ¿­ #endif }; //SSQ_MSG_DECL( SSQ_PROTOCOL_REQUEST_OBSERVER_CTRL ) //{ // typedef nsSSQ::Observer::Info Info; // Info::eRequest Cmd; // union { // struct { // Info::eKeyCmd PressedKey; // } ObserverCmd; // }; // inline VOID Init() // { // Cmd = Info::eRequest_None; // ObserverCmd.PressedKey = Info::eKeyCmd_Max; // } //}; SSQ_MSG_DECL( SSQ_PROTOCOL_REQUEST_OBSERVER_CTRL_RESULT ) { typedef nsSSQ::Observer::Info Info; enum eNtfCmd { eNtfCmd_None , eNtfCmd_ResultByRequest_Fail , eNtfCmd_ResultByRequest_Success , }; BYTE Result; BYTE Coordinates; //Info::eCoordinates inline VOID Init() { Result = eNtfCmd_None; Coordinates = Info::eCoord_Slots; } }; SSQ_MSG_DECL( SSQ_PROTOCOL_REQUEST_OBSERVER_CTRL_G2C_SELECT ) // G->C ij¸¯ÅÍ Á×Àº ÀÌÈÄ '°üÀü¸ðµå' ¼±Åà ¸Þ½ÃÁö ¶ç¿ì±â { }; //// Client Packet Serializer //struct WarPacketAssembler //{ // static WORD msg_size; // static BYTE msg_stream[4096]; // template< typename _MSG, typename _MSGSUB > // static VOID MakePacket( const _MSGSUB& rMsg ) // { // typedef _MSG message; // typedef _MSGSUB sub_message; // message* const pMsgRoot = new (msg_stream) message; // pMsgRoot->m_Header.size = 0; // rMsg.SerializeTo( &pMsgRoot->m_Header ); // msg_size = pMsgRoot->GetSize(); // } //}; #pragma pack(pop) }; // end namespace nsSSQ