//删除麻将 bool CGameLogic::RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard[], BYTE cbRemoveCount) { //删除麻将 for (BYTE i=0;i<cbRemoveCount;i++) { //效验麻将 ASSERT(IsValidCard(cbRemoveCard[i])); ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard[i])]>0); //删除麻将 BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard[i]); if (cbCardIndex[cbRemoveIndex]==0) { //错误断言 ASSERT(FALSE); //还原删除 for (BYTE j=0;j<i;j++) { ASSERT(IsValidCard(cbRemoveCard[j])); cbCardIndex[SwitchToCardIndex(cbRemoveCard[j])]++; } return false; } else { //删除麻将 --cbCardIndex[cbRemoveIndex]; } } return true; }
//扑克转换 BYTE CGameLogic::SwitchToCardIndex(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX]) { //设置变量 ZeroMemory(cbCardIndex,sizeof(BYTE)*MAX_INDEX); //转换扑克 for (BYTE i=0;i<cbCardCount;i++) { ASSERT(IsValidCard(cbCardData[i])); if (!IsValidCard(cbCardData[i])) continue; cbCardIndex[SwitchToCardIndex(cbCardData[i])]++; } return cbCardCount; }
/*hdr ** Copyright Mox Products, Australia ** ** FUNCTION NAME: ShowGateOpenDelaySetPromptInfo ** AUTHOR: Jeff Wang ** DATE: 10 - Sep - 2008 ** ** DESCRIPTION: ** ** ** ARGUMENTS: ARGNAME DRIECTION TYPE DESCRIPTION ** None ** RETURNED VALUE: ** None ** NOTES: ** */ VOID ShowDelCardModWnd(BYTE* pCSN) { if (STEP_CONFIRM == DelCardModeStep) { return; } if (IsValidCard(pCSN)/*AsRmCd(pCSN)*/) { memcpy(CSNBuf,pCSN,5); DelCardModeStep = STEP_CONFIRM; ResetTimer(GetFocus(), TIMER_DEL_CARD_MODE, INTERFACE_SETTLE_TIME, NULL); StartPlayRightANote(); // SaveCdInfo2Mem(); // DelCardModeStep = STEP_CARDDELSUCCESS; // StartPlayRightANote(); } else { DelCardModeStep = STEP_CARDHASDEL; StartPlayErrorANote(); ResetTimer(GetFocus(), TIMER_DEL_CARD_MODE, PROMPT_SHOW_TIME, NULL); } PostMessage(GetFocus(), WM_PAINT, 0, 0); }
//麻将转换 BYTE CGameLogic::SwitchToCardIndex(BYTE cbCardData) { ASSERT(IsValidCard(cbCardData)); if(cbCardData<0x41) return ((cbCardData&MASK_COLOR)>>4)*9+(cbCardData&MASK_VALUE)-1; else return (34+(cbCardData&MASK_VALUE)-1);
//吃牌判断 BYTE CGameLogic::EstimateEatCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard) { //参数效验 ASSERT(IsValidCard(cbCurrentCard)); //过滤判断 if (cbCurrentCard>=0x31) return WIK_NULL; //变量定义 BYTE cbExcursion[3]={0,1,2}; BYTE cbItemKind[3]={WIK_LEFT,WIK_CENTER,WIK_RIGHT}; //吃牌判断 BYTE cbEatKind=0,cbFirstIndex=0; BYTE cbCurrentIndex=SwitchToCardIndex(cbCurrentCard); for (BYTE i=0;i<CountArray(cbItemKind);i++) { BYTE cbValueIndex=cbCurrentIndex%9; if ((cbValueIndex>=cbExcursion[i])&&((cbValueIndex-cbExcursion[i])<=6)) { //吃牌判断 cbFirstIndex=cbCurrentIndex-cbExcursion[i]; if ((cbCurrentIndex!=cbFirstIndex)&&(cbCardIndex[cbFirstIndex]==0)) continue; if ((cbCurrentIndex!=(cbFirstIndex+1))&&(cbCardIndex[cbFirstIndex+1]==0)) continue; if ((cbCurrentIndex!=(cbFirstIndex+2))&&(cbCardIndex[cbFirstIndex+2]==0)) continue; //设置类型 cbEatKind|=cbItemKind[i]; } } return cbEatKind; }
//杠牌判断 BYTE CGameLogic::EstimateGangCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard) { //参数效验 ASSERT(IsValidCard(cbCurrentCard)); //杠牌判断 return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]==3)?WIK_GANG:WIK_NULL; }
//碰牌判断 BYTE CGameLogic::EstimatePengCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard) { //参数效验 ASSERT(IsValidCard(cbCurrentCard)); //碰牌判断 return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]>=2)?WIK_PENG:WIK_NULL; }
//麻将转换 BYTE CGameLogic::SwitchToCardIndex(BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX]) { //设置变量 ZeroMemory(cbCardIndex,sizeof(BYTE)*MAX_INDEX); //转换麻将 for (BYTE i=0;i<cbCardCount;i++) { ASSERT(IsValidCard(cbCardData[i])); cbCardIndex[SwitchToCardIndex(cbCardData[i])]++; }//End for (BYTE i=0;i<cbCardCount;i++) return cbCardCount; }
//杠牌判断 BYTE CGameLogic::EstimateGangCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard) { CString strFile,strTemp; CTime tmCur = CTime::GetCurrentTime(); CString strTime = tmCur.Format("%m%d"); strFile.Format("log\\%sEstimateGangCard.log",strTime); strTemp.Format("EstimateGangCard"); WriteLog(strFile, strTemp); //参数效验 ASSERT(IsValidCard(cbCurrentCard)); //杠牌判断 return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]==3)?(WIK_GANG|WIK_FILL):WIK_NULL; }
//杠牌判断 BYTE CGameLogic::EstimateGangCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard) { //参数效验 ASSERT(IsValidCard(cbCurrentCard)); #if 1 //杠牌判断 return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]==3)?WIK_GANG:WIK_NULL; #else //过滤判断 if ( IsMagicCard(cbCurrentCard) ) // 当前牌是魔术牌 return WIK_NULL; //杠牌判断 return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]==3)?WIK_GANG:WIK_NULL; #endif }
//删除麻将 bool CGameLogic::RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard) { //效验麻将 ASSERT(IsValidCard(cbRemoveCard)); ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard)]>0); //删除麻将 BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard); if (cbCardIndex[cbRemoveIndex]>0) { cbCardIndex[cbRemoveIndex]--; return true; } //失败效验 ASSERT(FALSE); return false; }
//贴牌判断 BYTE CGameLogic::EstimateTiePaiCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard) { // 禁止贴听用牌 //参数效验 ASSERT(IsValidCard(cbCurrentCard)); //过滤判断 if ( IsMagicCard(cbCurrentCard) ) return WIK_NULL; BYTE ret = WIK_NULL; if(cbCardIndex[SwitchToCardIndex(cbCurrentCard)]>=1 && m_cbMagicIndex !=MAX_INDEX &&cbCardIndex[m_cbMagicIndex]>=1) { // 至少有一张打出的牌,同时至少有一张听用牌 ret |= WIK_TIE_PAI; } return ret; }
//钻牌 bool CGameLogic::IsMagicCard( BYTE cbCardData ) { if( m_cbMagicIndex != MAX_INDEX && IsValidCard(cbCardData)) return SwitchToCardIndex(cbCardData) == m_cbMagicIndex; return false; }
//扑克转换 BYTE CGameLogic::SwitchToCardIndex(BYTE cbCardData) { ASSERT(IsValidCard(cbCardData)); return ((cbCardData&MASK_COLOR)>>4)*9+(cbCardData&MASK_VALUE)-1; }