//游戏消息处理 bool __cdecl CTableFrameSink::OnGameMessage(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem) { switch (wSubCmdID) { case SUB_C_ADD_GOLD: //用户加注 { //效验数据 tagServerUserData * pUserData=pIServerUserItem->GetUserData(); if (pUserData->cbUserStatus!=US_PLAY) return true; if (m_cbPlayStatus[pUserData->wChairID]==FALSE) return true; //消息处理 CMD_C_AddGold * pAddGold=(CMD_C_AddGold *)pDataBuffer; OnUserAddGold(pUserData->wChairID,pAddGold->lGold,false); return true; } case SUB_C_GIVE_UP: //用户放弃 { //效验数据 tagServerUserData * pUserData=pIServerUserItem->GetUserData(); if (pUserData->cbUserStatus!=US_PLAY) return true; if (m_cbPlayStatus[pUserData->wChairID]==FALSE) return true; //消息处理 OnUserGiveUp(pUserData->wChairID); return true; } } return false; }
//游戏消息处理 bool __cdecl CTableFrameSink::OnGameMessage(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem) { switch(wSubCmdID) { case SUB_C_GIVE_UP: //用户放弃 { //用户效验 tagServerUserData * pUserData=pIServerUserItem->GetUserData(); if (pUserData->cbUserStatus!=US_PLAY) return true; //状态判断 ASSERT(m_cbPlayStatus[pUserData->wChairID]==TRUE); if (m_cbPlayStatus[pUserData->wChairID]==FALSE) return false; //消息处理 return OnUserGiveUp(pUserData->wChairID); } case SUB_C_ADD_SCORE: //用户加注 { //效验数据 ASSERT(wDataSize==sizeof(CMD_C_AddScore)); if (wDataSize!=sizeof(CMD_C_AddScore)) return false; //变量定义 CMD_C_AddScore * pAddScore=(CMD_C_AddScore *)pDataBuffer; //用户效验 tagServerUserData * pUserData=pIServerUserItem->GetUserData(); if (pUserData->cbUserStatus!=US_PLAY) return true; //状态判断 ASSERT(m_cbPlayStatus[pUserData->wChairID]==TRUE); if (m_cbPlayStatus[pUserData->wChairID]==FALSE) return false; //消息处理 return OnUserAddScore(pUserData->wChairID,pAddScore->lScore,false); } case SUB_C_OPEN_CARD: //用户坐下 { //用户效验 tagServerUserData * pUserData=pIServerUserItem->GetUserData(); //状态判断 //ASSERT(m_cbPlayStatus[pUserData->wChairID]!=TRUE); //if (m_cbPlayStatus[pUserData->wChairID]!=FALSE) return false; //发送数据 CMD_S_OpenCard OpenCard; OpenCard.wWinUser = pUserData->wChairID; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OPEN_CARD,&OpenCard,sizeof(OpenCard)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OPEN_CARD,&OpenCard,sizeof(OpenCard)); return true; } } return false; }
//游戏结束 bool __cdecl CTableFrameSink::OnEventGameEnd(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason) { switch (cbReason) { case GER_DISMISS: //游戏解散 { //效验参数 ASSERT(pIServerUserItem!=NULL); ASSERT(wChairID<m_wPlayerCount); //构造数据 CMD_S_GameEnd GameEnd; memset(&GameEnd,0,sizeof(GameEnd)); //发送信息 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); m_pITableFrame->KillGameTimer(IDI_GAME_END); //结束游戏 m_pITableFrame->ConcludeGame(); return true; } case GER_NORMAL: //常规结束 case GER_NO_PLAYER: //没有玩家 { //定义变量 CMD_S_GameEnd GameEnd; ZeroMemory(&GameEnd,sizeof(GameEnd)); //统计信息 WORD wWinerUser=EstimateWinner(0,4); ASSERT( wWinerUser != INVALID_CHAIR ); LONG lMaxWinScore = m_lUserScore[wWinerUser]; for (WORD i=0;i<m_wPlayerCount;i++) { //底牌信息 if ((cbReason==GER_NO_PLAYER)||(m_cbPlayStatus[i]==FALSE)) GameEnd.bUserCard[i]=0; else GameEnd.bUserCard[i]=m_cbHandCardData[i][0]; //积分信息 if (i!=wWinerUser) { LONG lScore = __min(__min(m_lTableGold[i*2]+m_lTableGold[i*2+1],m_lUserScore[i]),lMaxWinScore); GameEnd.lGameGold[i] = -lScore; GameEnd.lGameGold[wWinerUser] += lScore; } } for( WORD i = 0; i < GAME_PLAYER; i++ ) { LONG lRevenue=0; enScoreKind ScoreKind; //胜利类型 ScoreKind=(GameEnd.lGameGold[i]>0L)?enScoreKind_Win:enScoreKind_Lost; //计算税收 if (m_pGameServiceOption->wServerType==GAME_GENRE_GOLD) { //扣税变量 WORD cbRevenue=m_pGameServiceOption->wRevenue; if (GameEnd.lGameGold[i]>=100L) { //计算税收 lRevenue=(LONG)((LONGLONG)GameEnd.lGameGold[i]*cbRevenue/1000L); //成绩变量 GameEnd.lTax+=lRevenue; GameEnd.lGameGold[i]=GameEnd.lGameGold[i]-lRevenue; } } //写入积分 if (m_cbPlayStatus[i]==TRUE) { m_pITableFrame->WriteUserScore(i,GameEnd.lGameGold[i],lRevenue,ScoreKind); } } //发送信息 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); m_pITableFrame->KillGameTimer(IDI_GAME_END); //结束游戏 m_pITableFrame->ConcludeGame(); return true; } case GER_USER_LEFT: //用户强退 { //效验参数 ASSERT(pIServerUserItem!=NULL); ASSERT(wChairID<m_wPlayerCount); //强退处理 OnUserGiveUp(wChairID); return true; } } return false; }
//游戏结束 bool __cdecl CTableFrameSink::OnEventGameEnd(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason) { switch (cbReason) { case GER_NORMAL: //常规结束 case GER_NO_PLAYER: //没有玩家 { //定义变量 CMD_S_GameEnd GameEnd; memset(&GameEnd,0,sizeof(GameEnd)); CopyMemory(GameEnd.bPlayStatus,m_bPlayStatus,sizeof(m_bPlayStatus)); GameEnd.fMaxGold=m_fMaxGold; GameEnd.fTurnBasicGold=m_fTurnBasicGold; GameEnd.fBasicGold=m_pGameServiceOption->dwCellScore; CopyMemory(GameEnd.fTableGold,m_fTableGold,sizeof(m_fTableGold)); //设置下注 if (m_bSendCardCount<=2) { GameEnd.fTurnMaxGold=m_fMaxGold/4L; if(GameEnd.fTurnMaxGold <= m_pGameServiceOption->dwCellScore) { GameEnd.fTurnMaxGold = m_pGameServiceOption->dwCellScore; } } else if (m_bSendCardCount==3) GameEnd.fTurnMaxGold=m_fMaxGold/2L; else GameEnd.fTurnMaxGold=m_fMaxGold; //设置扑克 for (WORD i=0;i<m_wPlayerCount;i++) { GameEnd.bTableCardCount[i]=m_bTableCardCount[i]; GameEnd.bTableCardArray[i][0]=m_bTableCardArray[i][0]; if(m_bTableCardCount[i] >= 1) { CopyMemory(&GameEnd.bTableCardArray[i][1],&m_bTableCardArray[i][1],(m_bTableCardCount[i]-1)*sizeof(BYTE)); } } //计算总注 DOUBLE fAlfGold=0L; for (WORD i=0;i<CountArray(m_fTableGold);i++) fAlfGold+=m_fTableGold[i]; //统计信息 WORD wWinerUser=DeduceWiner(0,4); for (WORD i=0;i<m_wPlayerCount;i++) { //底牌信息 if ((cbReason==GER_NO_PLAYER)||(m_bPlayStatus[i]==FALSE)) GameEnd.bUserCard[i]=0; else GameEnd.bUserCard[i]=m_bTableCardArray[i][0]; //信用额度信息 if (i==wWinerUser) { GameEnd.fGameGold[i]=fAlfGold-m_fTableGold[i*2]-m_fTableGold[i*2+1]; } else GameEnd.fGameGold[i]=-m_fTableGold[i*2]-m_fTableGold[i*2+1]; } //修改用户额度 for (WORD i=0;i<m_wPlayerCount;i++) { if (m_bPlayStatus[i]==TRUE) { GameEnd.fGameGold[i]=GameEnd.fGameGold[i]; } else { GameEnd.fGameGold[i]=-m_fTableGold[i*2]-m_fTableGold[i*2+1]; } } GameEnd.bSendCardCount = m_bSendCardCount; GameEnd.wWinerUser = wWinerUser; if(m_CalculateSink.InitCalculateContext(&GameEnd)) { m_pITableFrame->WriteGameEnd(GER_NORMAL,(BYTE*)&GameEnd, sizeof(GameEnd), m_CalculateSink.GetCalculateContext(),&m_CalculateSink); //发送信息 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); //结束游戏 m_pITableFrame->ConcludeGame(); return true; } else { //删除定时器 /*if (m_bTimeStation!=255) { KillTimer(m_bTimeStation); m_bTimeStation=255; }*/ GT_ASSERT(FALSE); //结束游戏 m_pITableFrame->ConcludeGame(); return false; } } case GER_USER_LEFT: //用户强退 { //效验参数 GT_ASSERT(pIServerUserItem!=NULL); GT_ASSERT(wChairID<m_wPlayerCount); //强退处理 OnUserGiveUp(wChairID); return true; } } return false; }
//游戏消息处理 bool __cdecl CTableFrameSink::OnGameMessage(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem) { switch( wSubCmdID ) { case SUB_C_TOUCH_MJ: break; case SUB_C_OUT_MJ: { //变量定义 BYTE *pOutMj = ( BYTE* )pDataBuffer; //用户效验 tagServerUserData *pUserData = pIServerUserItem->GetUserData(); if( pUserData->cbUserStatus != US_PLAY ) { return true; } //消息处理 return OnUserOutMj( pUserData->wChairID, pOutMj ); } case SUB_C_GANG_MJ: //杠操作 { //用户效验 tagServerUserData *pUserData= pIServerUserItem->GetUserData(); if( pUserData->cbUserStatus!= US_PLAY) { return true; } //消息处理 return OnUserGang( pUserData->wChairID, pDataBuffer ); } case SUB_C_SELECT_GANG: { //用户效验 tagServerUserData *pUserData= pIServerUserItem->GetUserData(); if( pUserData->cbUserStatus!= US_PLAY ) { return true; } //消息处理 return OnUserGangSelect( pUserData->wChairID, pDataBuffer); } case SUB_C_PENG_MJ: //碰操作 { //用户效验 tagServerUserData *pUserData = pIServerUserItem->GetUserData(); if( pUserData->cbUserStatus != US_PLAY ) { MessageBox( 0, "UN_US_PLAY", 0, 0 ); return true; } //消息处理 return OnUserPeng(pUserData->wChairID, pDataBuffer); } case SUB_C_CHI_MJ: //吃操作 { //用户效验 tagServerUserData *pUserData = pIServerUserItem->GetUserData(); if( pUserData->cbUserStatus!= US_PLAY ) { MessageBox( 0, "UN_US_PLAY", 0, 0 ); return true; } //消息处理 return OnUserChi(pUserData->wChairID, pDataBuffer); } case SUB_C_HU_MJ: { //用户效验 tagServerUserData *pUserData=pIServerUserItem->GetUserData(); { if( pUserData->cbUserStatus != US_PLAY ) { MessageBox( 0, "UN_US_PLAY", 0, 0 ); return true; } } //消息处理 return OnUserHu(pUserData->wChairID, pDataBuffer); } case SUB_C_GIVEUP: //放弃 { //用户效验 tagServerUserData *pUserData = pIServerUserItem->GetUserData(); if( pUserData->cbUserStatus != US_PLAY ) { return true; } return OnUserGiveUp( pUserData->wChairID, pDataBuffer); } } return true; }
//游戏结束 bool __cdecl CTableFrameSink::OnEventGameEnd(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason) { switch (cbReason) { case GER_NORMAL: //常规结束 { //定义变量 CMD_S_GameEnd GameEnd; ZeroMemory(&GameEnd,sizeof(GameEnd)); GameEnd.cbTotalEnd = 1; //扑克数据 BYTE cbEndCardData[GAME_PLAYER][MAX_CENTERCOUNT]; ZeroMemory(cbEndCardData,sizeof(cbEndCardData)); try{ //获取扑克 for (WORD i=0;i<m_wPlayerCount;i++) { //用户过滤 if (m_cbPlayStatus[i]==FALSE) continue; //最大牌型 BYTE cbEndCardKind = m_GameLogic.FiveFromSeven(m_cbHandCardData[i],MAX_COUNT,m_cbCenterCardData,MAX_CENTERCOUNT,cbEndCardData[i],MAX_CENTERCOUNT); ASSERT(cbEndCardKind!=FALSE); CopyMemory(GameEnd.cbLastCenterCardData[i],cbEndCardData[i],sizeof(BYTE)*CountArray(cbEndCardData)); } }catch(...) { TraceMessage("用户过滤v最大牌型"); ASSERT(FALSE); } //总下注备份 LONG lTotalScore[GAME_PLAYER]; ZeroMemory(lTotalScore,sizeof(lTotalScore)); CopyMemory(lTotalScore,m_lTotalScore,sizeof(m_lTotalScore)); //胜利列表 UserWinList WinnerList[GAME_PLAYER]; ZeroMemory(WinnerList,sizeof(WinnerList)); //临时数据 BYTE bTempData[GAME_PLAYER][MAX_CENTERCOUNT]; CopyMemory(bTempData,cbEndCardData,GAME_PLAYER*MAX_CENTERCOUNT); WORD wWinCount=0; try{ //用户得分顺序 for (WORD i=0;i<m_wPlayerCount;i++) { //查找最大用户 if(!m_GameLogic.SelectMaxUser(bTempData,WinnerList[i],lTotalScore)) { wWinCount=i; break; } //删除胜利数据 for (WORD j=0;j<WinnerList[i].bSameCount;j++) { WORD wRemoveId=WinnerList[i].wWinerList[j]; ASSERT(bTempData[wRemoveId][0]!=0); ZeroMemory(bTempData[wRemoveId],sizeof(BYTE)*MAX_CENTERCOUNT); } } }catch(...) { TraceMessage("用户得分顺序"); ASSERT(FALSE); } //强退用户 for (WORD i=0;i<m_wPlayerCount;i++) { if(m_cbPlayStatus[i]==FALSE && lTotalScore[i]>0l) { WinnerList[wWinCount].wWinerList[WinnerList[wWinCount].bSameCount++] = i; } } //得分变量 LONG lUserScore[GAME_PLAYER]; ZeroMemory(lUserScore,sizeof(lUserScore)); //CopyMemory(lTotalScore,m_lTotalScore,sizeof(m_lTotalScore)); try { //得分情况 for (int i=0;i<m_wPlayerCount-1;i++) { //胜利人数 int iWinCount = (int)WinnerList[i].bSameCount; if(0 == iWinCount)break; //胜利用户得分情况 for(int j=0;j<iWinCount;j++) { if(0 == lTotalScore[WinnerList[i].wWinerList[j]])continue; if(j>0 && lTotalScore[WinnerList[i].wWinerList[j]] - lTotalScore[WinnerList[i].wWinerList[j-1]] == 0)continue; //失败用户失分情况 for(int k=i+1;k<m_wPlayerCount;k++) { //失败人数 if(0 == WinnerList[k].bSameCount)break; for(int l=0;l<WinnerList[k].bSameCount;l++) { //用户已赔空 if(0 == lTotalScore[WinnerList[k].wWinerList[l]])continue; WORD wLostId=WinnerList[k].wWinerList[l]; WORD wWinId=WinnerList[i].wWinerList[j]; LONG lMinScore = 0; //上家得分数目 LONG lLastScore = ((j>0)?lTotalScore[WinnerList[i].wWinerList[j-1]]:0); if(j>0)ASSERT(lLastScore>0L); lMinScore = min(lTotalScore[wWinId]-lLastScore,lTotalScore[wLostId]); for(int m=j;m<iWinCount;m++) { //得分数目 lUserScore[WinnerList[i].wWinerList[m]]+=lMinScore/(iWinCount-j); } //赔偿数目 lUserScore[wLostId]-=lMinScore; lTotalScore[wLostId]-=lMinScore; } } } } }catch(...) { TraceMessage("得分数目/赔偿数目"); ASSERT(FALSE); } //扣税变量 WORD wRevenue=m_pGameServiceOption->wRevenue; //统计用户分数(税收) for(WORD i=0;i<m_wPlayerCount;i++) { GameEnd.lGameScore[i]=lUserScore[i]; ASSERT(lUserScore[i]+m_lTotalScore[i]>=0L); if(GameEnd.lGameScore[i]>0L) { GameEnd.lGameTax[i]=GameEnd.lGameScore[i]*wRevenue/100L; GameEnd.lGameScore[i]-=GameEnd.lGameTax[i]; } } ////统计用户分数 //for(WORD i=0;i<m_wPlayerCount;i++) //{ // GameEnd.lGameScore[i]=lUserScore[i]; // GameEnd.lGameScore[i]-=GameEnd.lGameTax[i]; //} CopyMemory(GameEnd.cbCardData,m_cbHandCardData,sizeof(m_cbHandCardData)); //发送信息 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); //积分变量 for (WORD i=0;i<GAME_PLAYER;i++) { if (m_cbPlayStatus[i]==TRUE) { enScoreKind nScoreKind; if(GameEnd.lGameScore[i]==0L)nScoreKind=enScoreKind_Draw; else nScoreKind=(GameEnd.lGameScore[i]>0L)?enScoreKind_Win:enScoreKind_Lost; //写入积分 m_pITableFrame->WriteUserScore(i,GameEnd.lGameScore[i],GameEnd.lGameTax[i],nScoreKind); } } //结束游戏 m_pITableFrame->ConcludeGame(); return true; } case GER_NO_PLAYER: //没有玩家 { //定义变量 CMD_S_GameEnd GameEnd; ZeroMemory(&GameEnd,sizeof(GameEnd)); GameEnd.cbTotalEnd = 0; //效验结果 WORD wUserCount=0; for (WORD i=0;i<GAME_PLAYER;i++) { if(m_cbPlayStatus[i]!=FALSE)wUserCount++; } if(wUserCount!=1) { ASSERT(FALSE); TraceMessage("没有玩家//效验结果出错"); } //统计分数 LONG lScore = 0,lRevenue = 0; enScoreKind nScoreKind ; WORD wWinner = INVALID_CHAIR; for (WORD i = 0;i<GAME_PLAYER;i++) { if(m_cbPlayStatus[i]==FALSE) { if(m_lTotalScore[i] > 0L)GameEnd.lGameScore[i]-=m_lTotalScore[i]; continue; } wWinner = i; ////处理税收 //for (WORD t=0;t<m_wPlayerCount;t++) //{ // //赢家不用收税 // if(wWinner==t)continue; // if(m_lTotalScore[t]>0L) // { // GameEnd.lGameScore[t]=-m_lTotalScore[t]; // m_lTotalScore[t]-=m_bUserTax[t]; // GameEnd.lGameTax[t] = m_bUserTax[t]; // } //} //总下注数目 LONG lAllScore = 0L; for (WORD j = 0;j<GAME_PLAYER;j++) { if(wWinner==j)continue; lAllScore += m_lTotalScore[j]; } ASSERT(lAllScore>=0); GameEnd.lGameScore[i] = lAllScore; //统计税收 if(GameEnd.lGameScore[i]>0L) { //扣税变量 WORD wRevenue=m_pGameServiceOption->wRevenue; GameEnd.lGameTax[i]=GameEnd.lGameScore[i]*wRevenue/100L; GameEnd.lGameScore[i]-=GameEnd.lGameTax[i]; } //构造扑克 CopyMemory(GameEnd.cbCardData,m_cbHandCardData,sizeof(m_cbHandCardData)); lScore=GameEnd.lGameScore[i]; lRevenue= GameEnd.lGameTax[i]; nScoreKind=(GameEnd.lGameScore[i]>0L)?enScoreKind_Win:enScoreKind_Lost; } //发送消息 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); //写入积分 if(wWinner<GAME_PLAYER) { m_pITableFrame->WriteUserScore(wWinner,lScore,lRevenue,nScoreKind); } else TraceMessage("//写入积分ffff"); //结束游戏 m_pITableFrame->ConcludeGame(); return true; } case GER_USER_LEFT: { //效验参数 ASSERT(pIServerUserItem!=NULL); ASSERT(wChairID<m_wPlayerCount); //强退处理 OnUserGiveUp(wChairID); return true; } } return false; }