예제 #1
0
static void NoteMemoryRefs(void *block) {
	t_BlockInfo *p_blockinfo;
	byte *p_block = (byte *)block;

	ASSERT(NULL != p_block);
	p_blockinfo = GetBlockInfo(p_block);
	p_blockinfo->m_refered = true;
}
예제 #2
0
static size_t GetSizeOfBlock(byte *block) {
	t_BlockInfo *p_blockinfo;

	ASSERT(NULL != block);
	p_blockinfo = GetBlockInfo(block);
	ASSERT(p_blockinfo->m_begin == block);	
	return p_blockinfo->m_size;
}
예제 #3
0
static void UpdateBlockInfo(byte *old_block, byte *new_block, size_t new_size) {
	t_BlockInfo *p_blockinfo;

	ASSERT(NULL != old_block && NULL != new_block && 0 != new_size);
	p_blockinfo = GetBlockInfo(old_block);
	ASSERT(p_blockinfo->m_begin == old_block);
	p_blockinfo->m_begin = new_block;
	p_blockinfo->m_size = new_size;
}
예제 #4
0
static bool IsInBlockInfo(void *block, size_t size) {
	t_BlockInfo *p_blockinfo;
	byte *p_block = (byte *)block;
	byte *p_virtual_end;
	byte *p_actual_end;

	ASSERT(NULL != p_block && 0 != size);
	p_blockinfo = GetBlockInfo(p_block);
	p_virtual_end = BLOCK_END(p_block, size);
	p_actual_end = BLOCK_END(p_blockinfo->m_begin, p_blockinfo->m_size);
	if (p_virtual_end > p_actual_end)
		return false;
	else
		return true;
}
예제 #5
0
// 换牌功能
BOOL CSoMJFrameLogic::TransGMCmdSwap(int nChair, char* pStr)
{
    int i;
	char chStr[2], * pData1, *pData2;
    TILE  tile;

    // 获取需要交换的牌集
    pData1 = strtok(pStr, ",");

    // 获取需要改变的目标牌集
    pData2 = strtok(NULL, " ");

    if (pData1 == NULL || pData2 == NULL)
    {
        return FALSE;
    }

    if (strncmp("*", pData1, strlen("*")) == 0)
    {
        // * 号, 更换所有手牌
        int nDataLength = Mystrnlen(pData2, 128);
        //int nDataLength = strlen(pData2);

        CMJHand mjHand;
        mjHand.ReleaseAll();
        for (i = 0; i < nDataLength; i += 2)
        {
            chStr[0] = pData2[i];
            chStr[1] = pData2[i+1];

            // 将字符串转换成一张牌
            tile = TransChatToTile(chStr);

            if (tile > TILE_BEGIN)
            {
                mjHand.AddTile(tile);
            }
        }

        // 判断换的牌数据长度, 是否等于换牌玩家手牌长度
        if (mjHand.CurrentLength() == m_TilesHand[nChair].CurrentLength())
        {
            // 换牌
            m_TilesHand[nChair] = mjHand;

            // 强刷更新客户端牌数据
            UpdateHandTiles(nChair);

            // 判断当前是否为出牌玩家
            if (GetTurn() == nChair)
            {
                if (m_TilesHand[nChair].CurrentLength() % 3 == 2)
                {
                    // 检测换牌后, 是否可以拦牌
                    if (CheckBlock(nChair))
                    {
                        m_pStateEvent->SetMJState(MJ_STATE_BLOCK);

                        GetSoGameProcess()->SendGameDataToSeat((UINT)nChair, (char*)&GetBlockInfo(nChair), sizeof(TCMD_NOTIFY_BLOCK));
                    }
                }
            }

            return TRUE;
        }
    }
    else
    {
        // 更换手里已经有的牌
        int nDataLength1 = Mystrnlen(pData1, 128);
        int nDataLength2 = Mystrnlen(pData2, 128);

        // 判断要交换的牌长度是否相等
        if (nDataLength1 == nDataLength2)
        {
            CMJHand mjHand, tmpHand;
            mjHand.ReleaseAll();
            tmpHand.ReleaseAll();

            for (i = 0; i < nDataLength1; i += 2)
            {
                chStr[0] = pData1[i];
                chStr[1] = pData1[i+1];

                // 将字符串转换成一张牌
                tile = TransChatToTile(chStr);

                if (tile > TILE_BEGIN)
                {
                    mjHand.AddTile(tile);
                }
            }

            if (!m_TilesHand[nChair].IsSubSet(mjHand))
            {
                // 要换的牌数据, 在手牌中不存在
                return FALSE;
            }

            for (i = 0; i < nDataLength2; i += 2)
            {
                chStr[0] = pData2[i];
                chStr[1] = pData2[i+1];

                // 将字符串转换成一张牌
                tile = TransChatToTile(chStr);

                if (tile > TILE_BEGIN)
                {
                    tmpHand.AddTile(tile);
                }
            }

            if (mjHand.CurrentLength() == tmpHand.CurrentLength())
            {
                // 可以换牌
                m_TilesHand[nChair].DelTiles(mjHand);
                m_TilesHand[nChair].AddTiles(tmpHand);

                // 强刷更新客户端牌数据
                UpdateHandTiles(nChair);

                // 判断当前是否为出牌玩家
                if (GetTurn() == nChair)
                {
                    if (m_TilesHand[nChair].CurrentLength() % 3 == 2)
                    {
                        // 检测换牌后, 是否可以拦牌
                        if (CheckBlock(nChair))
                        {
                            m_pStateEvent->SetMJState(MJ_STATE_BLOCK);
                        }
                    }
                }

                return TRUE;
            }
        }
    }

    return FALSE;
}