#pragma once //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // #ifndef __SSQ_MSG_HDR__ #define __SSQ_MSG_HDR__ // // Àüü ¸Þ½ÃÁöÀÇ ±æÀ̰¡ ´ã°ÜÁø´Ù. (variable stream) struct WAR_MSG_HDR { typedef ulong MSG_SIZE_T; // expanded by _NA001605_EP2_CHANGE_SKILL_BROADCASTER_ MSG_SIZE_T size; }; // // - °¢ ¸Þ½ÃÁöÀÇ Å¸ÀÔµéÀÌ ±âÀçµÈ´Ù. // - 1Byte, ÇÏÁö¸¸ raw streamÀÎ WAR_TAG_VÀÇ À̰ÍÀ» Á÷Á¢ »ç¿ëÇÏ´Â °æ¿ì´Â ¾ø¾î¾ß ÇÑ´Ù. // (ÀÌ°Í common routine¿¡¼­ÀÇ offset¿¬»ê ÆíÀǼºÀÌ ¸ñÀûÀÌ´Ù.) // ¸ðµç ¸Þ½ÃÁöµéÀº ½ÇÁúÀûÀ¸·Î WAR_TAG1_À» »ó¼ÓÇØ¼­ ±¸ÇöµÇ°Ô µÇ¾î ÀÖ´Ù. // <¸ñÀû> // - Server/Client °¢°¢ pointer¿¬»êÀ» ¼öÇàÇϸ鼭 ¹ö±×¸¦ À¯¹ßÇÒ ¼ö ÀÖ´Ù. // ÇϳªÀÇ ·ÎÁ÷À¸·Î serializing input/outputÀÌ °¡´ÉÇØÁöµµ·Ï ÇÏ´Â °ÍÀÌ ¸ñÇ¥´Ù. typedef struct WAR_TAG_V { BYTE _TAG; } *WAR_TAG_P; #endif const WORD MAX_WAR_MSG_SEQUENCIAL_STREAM_SIZE = 8000; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // #define WAR_MSG_DECL( protocol ) \ struct MSGSUB_##protocol : WAR_TAG1_< protocol, MSGSUB_##protocol > //¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ // // case SSQ_PROTOCOL_TRAP_EARTHQUAKE_EXECUTE: // { // RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_TRAP_EARTHQUAKE_INDICATION ); // // enable keyword 'rMsg' // rMsg.Count ~~ #define RECV_PATTERNCODE_FOR_WAR( subprotocol ) \ const MSGSUB_##subprotocol& rMsg = static_cast(*pIt); \ size = rMsg.GetSize() //================================================================================================== // #pragma pack(push, 1) //-------------------------------------------------------------------------------------------------- // template struct WAR_TAG1_ : public WAR_TAG_V { static const uint8_t value = _PROTOCOL; typedef _MSGTYPE msg_type; typedef WAR_TAG1_ this_type; // À̰ÍÀº ±âº» ¿¬»êÀÚ... ÇØ´ç ŸÀÔÀ» »ó¼ÓÇÑ º°µµÀÇ Å¸ÀÔÀº °¡º¯ ±æÀ̸¦ °¡Áø´Ù¸é // GetSize¸¦ º°µµ·Î ±¸ÇöÇØ¾ß ÇÑ´Ù. ±×¿ÜÀÇ °íÁ¤ÇüÀº À̰ÍÀ¸·Î ¸ðµÎ ÇØ°áµÉ °ÍÀÌ´Ù. // default, can overriding uint16_t GetSize() const { return static_cast(sizeof(*static_cast(this))); } bool SerializeTo(WAR_MSG_HDR* const IN header) const { uint16_t size = static_cast(this)->GetSize(); WAR_MSG_HDR::MSG_SIZE_T offset = size + header->size; if (MAX_WAR_MSG_SEQUENCIAL_STREAM_SIZE < offset) { return false; } msg_type* const dest = reinterpret_cast(\ reinterpret_cast(header + 1) + header->size); *dest = *static_cast(this); // dest->_TAG = msg_type::value; header->size = offset; return true; } }; #pragma pack(pop)