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; }
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; }
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; }
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; }
// 换牌功能 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; }