⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 message.cpp

📁 分布式坦克游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    return m_MsgSizeArr[ADD_BONUS];
}

void            
CMessage::DecodeAddBonus (PBYTE pData)
{
    m_UnionData.BonusParam = *((BonusParamTag *)pData);
    ASSERT (BonusType(m_UnionData.BonusParam.Type) < NUM_BONUSES);
}


DWORD            
CMessage::EncodeAddTank (PBYTE pData) const
{
    ASSERT (m_UnionData.TankParam.ShieldLevel < 101);
    ASSERT (m_UnionData.TankParam.Direction < 24);

    *((TankParamTag*)pData) = m_UnionData.TankParam;
    return m_MsgSizeArr[ADD_TANK];
}

void            
CMessage::DecodeAddTank (PBYTE pData)
{
    m_UnionData.TankParam = *((TankParamTag*)pData);
    ASSERT (m_UnionData.TankParam.ShieldLevel < 101);
    ASSERT (m_UnionData.TankParam.Direction < 24);
}

DWORD            
CMessage::EncodeAddBoard (PBYTE pData) const
{
    ASSERT (m_UnionData.BoardParam.Seed < 0xFFFF);
    ASSERT (m_UnionData.BoardParam.Complexity < 0x001F);

    *((BoardParamTag *)pData) = m_UnionData.BoardParam;
    return m_MsgSizeArr[ADD_BOARD];
}

void            
CMessage::DecodeAddBoard (PBYTE pData)
{
    m_UnionData.BoardParam = *((BoardParamTag *)pData);
}

DWORD            
CMessage::EncodeRemoveTank (PBYTE pData) const
{
    *((TankRemoveParamTag *)pData) = m_UnionData.TankRemoveParam;
    return m_MsgSizeArr[REMOVE_TANK];
}

void            
CMessage::DecodeRemoveTank (PBYTE pData)
{
    m_UnionData.TankRemoveParam = *((TankRemoveParamTag *)pData);
}


DWORD           
CMessage::EncodeSetTankStatus (PBYTE pBuffer) const
{
    *(TankStatusParamTag*)pBuffer = m_UnionData.TankStatusParam;
    return m_MsgSizeArr[SET_TANK_STATUS];
}

void
CMessage::DecodeSetTankStatus (PBYTE pBuffer)
{
    m_UnionData.TankStatusParam = *((TankStatusParamTag *)pBuffer);
}

DWORD
CMessage::EncodeSetTankPos (PBYTE pBuffer) const
{
    *(TankPosParamTag*)pBuffer = m_UnionData.TankPosParam;
    return m_MsgSizeArr[SET_TANK_POS];
}

void
CMessage::DecodeSetTankPos (PBYTE pBuffer)
{
    m_UnionData.TankPosParam = *(TankPosParamTag*)pBuffer;
}

DWORD
CMessage::EncodeSetTankZombie (PBYTE pBuffer) const
{
    *(TankZombieParamTag*)pBuffer = m_UnionData.TankZombieParam;
    return m_MsgSizeArr[SET_TANK_ZOMBIE];
}

void
CMessage::DecodeSetTankZombie (PBYTE pBuffer)
{
    m_UnionData.TankZombieParam = *(TankZombieParamTag*)pBuffer;
}

DWORD            
CMessage::EncodeCheckSum (PBYTE pData) const
{
    ASSERT (m_UnionData.CheckSumParam.NumberOfTanks <= 4);
    ASSERT ((m_UnionData.CheckSumParam.ActiveBonusType >= BONUS_NONE) &&
            (m_UnionData.CheckSumParam.ActiveBonusType < NUM_BONUSES));

    PBYTE pb = pData;
    // First, do fixed part:
    FixedSizeChkSumType *p = (FixedSizeChkSumType *)pb;
    p->Header.NumberOfTanks     = m_UnionData.CheckSumParam.NumberOfTanks;
    p->Header.DeadHostReport    = BYTE(m_UnionData.CheckSumParam.DeadHostReport ? 1 : 0);
    p->Header.ActiveBonusType   = BYTE(m_UnionData.CheckSumParam.ActiveBonusType);
    p->Header.XPos              = m_UnionData.CheckSumParam.XPos;
    p->Header.YPos              = m_UnionData.CheckSumParam.YPos;
        // Encode sector mines checksums:
    int sect = 0;
    for (int i=0; i<8; i++)
    {
        p->MinesSectorsChkSum[i].LoNibble = BYTE((m_UnionData.CheckSumParam.MinesSectorsChkSum[sect++]) & 0x0F);
        p->MinesSectorsChkSum[i].HiNibble = BYTE((m_UnionData.CheckSumParam.MinesSectorsChkSum[sect++]) & 0x0F);
    }

    // Encode tanks - variable part:

    pb += sizeof (FixedSizeChkSumType);
    for (i=0; i<4; i++)
        if (m_UnionData.CheckSumParam.TanksChkSums[i].TankExists)
        {   // i'th tank exists
            // Tank's encoding includes tank's ID
            SingleTankChkSumType *p = (SingleTankChkSumType *)pb;

            p->TankID   = i;
            p->Zombie   = m_UnionData.CheckSumParam.TanksChkSums[i].Zombie;
            p->Shells   = m_UnionData.CheckSumParam.TanksChkSums[i].Shells;
            p->Bullets  = m_UnionData.CheckSumParam.TanksChkSums[i].Bullets;
            p->Mines    = m_UnionData.CheckSumParam.TanksChkSums[i].Mines;
            p->FastFire = m_UnionData.CheckSumParam.TanksChkSums[i].FastFire;
            pb += sizeof (SingleTankChkSumType);
        }

    // Return true (varaible) message size    
    DWORD dwMsgSize = sizeof (FixedSizeChkSumType) + 
                      m_UnionData.CheckSumParam.NumberOfTanks * sizeof (SingleTankChkSumType);
    ASSERT (pb == pData+dwMsgSize);
    return dwMsgSize + 5;   // Including message header
}

void            
CMessage::DecodeCheckSum (PBYTE pData)
{
    FixedSizeChkSumType *p = (FixedSizeChkSumType *)pData;
    m_UnionData.CheckSumParam.NumberOfTanks     = p->Header.NumberOfTanks;
    m_UnionData.CheckSumParam.DeadHostReport    = p->Header.DeadHostReport;
    m_UnionData.CheckSumParam.ActiveBonusType   = BonusType(p->Header.ActiveBonusType);
    m_UnionData.CheckSumParam.XPos = p->Header.XPos;
    m_UnionData.CheckSumParam.YPos = p->Header.YPos;
        // Decode sector mines checksums:
    int sect = 0;
    for (int i=0; i<8; i++)
    {
        m_UnionData.CheckSumParam.MinesSectorsChkSum[sect++] = p->MinesSectorsChkSum[i].LoNibble;
        m_UnionData.CheckSumParam.MinesSectorsChkSum[sect++] = p->MinesSectorsChkSum[i].HiNibble;
    }

    ASSERT (m_UnionData.CheckSumParam.NumberOfTanks <= 4);
    ASSERT ((m_UnionData.CheckSumParam.ActiveBonusType >= BONUS_NONE) &&
            (m_UnionData.CheckSumParam.ActiveBonusType < NUM_BONUSES));

    // Decode tanks - variable part:
    // Clear all tanks data
    memset (m_UnionData.CheckSumParam.TanksChkSums,
            0,
            sizeof (CheckSumParamTag::TankCheckSumParamTag) * MAX_TANKS);

    pData += sizeof (FixedSizeChkSumType);
    for (i=0; i<m_UnionData.CheckSumParam.NumberOfTanks; i++)
    {
        SingleTankChkSumType *p = (SingleTankChkSumType *)pData;
        BYTE bTankID = BYTE(p->TankID);  // Get tank ID
        ASSERT (bTankID < 4);
        m_UnionData.CheckSumParam.TanksChkSums[bTankID].TankExists  = TRUE;
        m_UnionData.CheckSumParam.TanksChkSums[bTankID].Zombie      = p->Zombie;
        m_UnionData.CheckSumParam.TanksChkSums[bTankID].Shells      = WORD(p->Shells);
        m_UnionData.CheckSumParam.TanksChkSums[bTankID].Bullets     = WORD(p->Bullets);
        m_UnionData.CheckSumParam.TanksChkSums[bTankID].Mines       = WORD(p->Mines);
        m_UnionData.CheckSumParam.TanksChkSums[bTankID].FastFire    = p->FastFire;
        pData += sizeof (SingleTankChkSumType);
    }
}

DWORD
CMessage::EncodeChat (PBYTE pData) const
{
    *pData++ = m_UnionData.ChatParam.TankID;
    PDWORD pdw = (PDWORD)pData;
    *pdw++ = m_UnionData.ChatParam.idFrom;
    pData = (PBYTE)pdw;
    strcpy ((char *)pData, m_UnionData.ChatParam.Msg);
    return DWORD(sizeof (m_UnionData.ChatParam) -           // Entire message
                 sizeof (m_UnionData.ChatParam.Msg) +       // Leave const size
                 strlen(m_UnionData.ChatParam.Msg) + 1 +    // Variable string 
                 MSG_HEADER_SIZE);                          // Msg header
}
 
void
CMessage::DecodeChat (PBYTE pData)
{
    m_UnionData.ChatParam.TankID = *pData++;
    m_UnionData.ChatParam.idFrom = *((PDWORD)(pData));
    pData+=sizeof(DWORD);

    // Assert msg length :
    int len = strlen ((char *)pData);

    ASSERT (len <= MAX_CHAT_MSG_LEN);
    if (len > MAX_CHAT_MSG_LEN) 
    {   // Chop string at last available char:
        pData[MAX_CHAT_MSG_LEN] = '\0';
        len = MAX_CHAT_MSG_LEN;
    }
    strcpy (m_UnionData.ChatParam.Msg, (char *)pData);
}

/* Special case - static mines per sector encoding / decoding functions : */

DWORD 
CMessage::EncodeSectorMines (PBYTE pData, int iSector, DWORD dwMinesFound, DWORD *pAllMinesInSector)
{
    pData[0] = BYTE(iSector);
    pData[1] = BYTE(dwMinesFound);
    DWORD dwDataSize = dwMinesFound * sizeof (DWORD);
    memcpy (&pData[2], pAllMinesInSector, dwDataSize);
    return dwDataSize + 2;
}

DWORD 
CMessage::DecodeSectorMines (PBYTE pData, DWORD dwBufferSize, int &iSector, DWORD *pAllMinesInSector)
{
    ASSERT (dwBufferSize >= 2);
    iSector = int(pData[0]);

    DWORD dwMinesFound = DWORD(pData[1]);
    DWORD dwDataSize = dwMinesFound * sizeof (DWORD);
    ASSERT (dwBufferSize == dwDataSize + 2);
    memcpy (pAllMinesInSector, &pData[2], dwDataSize);
    return dwMinesFound;

    UNREFERENCED_PARAMETER(dwBufferSize);
}

/* End of special case - static mines per sector encoding / decoding functions */


#ifdef NET_MON_GAME
char *
CMessage::GetName()
{   // Get message name
    return CMessage::GetName (BYTE(m_Type));
}
char *
CMessage::GetName(BYTE bID)
{   // Get message name (static)
    switch (bID)
    {
        case ADD_BONUS:
            return "ADD_BONUS";
        case ADD_TANK:
            return "ADD_TANK";
        case ADD_BOARD:
            return "ADD_BOARD";
        case ADD_BOMBER:
            return "ADD_BOMBER";
        case REMOVE_TANK:
            return "REMOVE_TANK";
        case MANOUVER_SET:
            return "MANOUVER_SET";
        case SET_TANK_STATUS:
            return "SET_TANK_STATUS";
        case SET_TANK_POS:
            return "SET_TANK_POS";
        case REQUEST_TANK:
            return "REQUEST_TANK";
        case CHECK_SUM:
            return "CHECK_SUM";
        case ADD_OBJECT:
            return "ADD_OBJECT";
        case ADD_SHELL:
            return "ADD_SHELL";
        case ADD_BULLET:
            return "ADD_BULLET";
        case ADD_GAME_OVER:
            return "ADD_GAME_OVER";
        case 0xff:
            return "PING";
        default:
            return "unknown";
    }
}

#endif  NET_MON_GAME



#pragma pack (pop)


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -