void User::HandleClientInfoGameMessage (yap::IPacket& packet) { yap::String senderName = packet.ReadString (); yap::String content = packet.ReadString (); yap::GameMessage gameMessage; gameMessage.SetSenderName (senderName); gameMessage.SetContent (content); SendGameMessage (gameMessage); }
//发送场景 bool __cdecl CTableFrame::SendGameScene(IServerUserItem * pIServerUserItem, void * pData, WORD wDataSize) { //系统消息 TCHAR szMessage[256]=TEXT(""); //比赛房间 if (m_pGameServiceOption->wServerType&GAME_GENRE_MATCH) { _snprintf(szMessage,sizeof(szMessage),TEXT("亲爱的用户,欢迎您来到“%s”比赛游戏房间,祝比赛选手赛出水平,取得好的成绩!"),m_pGameServiceAttrib->szKindName); SendGameMessage(pIServerUserItem,szMessage,SMT_INFO); } else { _snprintf(szMessage,sizeof(szMessage),TEXT("亲爱的用户,欢迎您来到“%s”,欢迎你多提宝贵建议!"),m_pGameServiceAttrib->szKindName); SendGameMessage(pIServerUserItem,szMessage,SMT_INFO); } //发送场景 m_pIGameServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_SCENE,pData,wDataSize); return true; }
//发送场景 bool __cdecl CTableFrame::SendGameScene(IServerUserItem * pIServerUserItem, void * pData, WORD wDataSize) { //系统消息 TCHAR szMessage[256]=TEXT(""); _snprintf(szMessage,sizeof(szMessage),TEXT("亲爱的用户,欢迎您来到“%s”,欢迎你多提宝贵建议!"),m_pGameServiceAttrib->szKindName); SendGameMessage(pIServerUserItem,szMessage,SMT_INFO); //发送场景 m_pIGameServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_SCENE,pData,wDataSize); return true; }
/** * Called if you have initiated a window animation with * TWindow::StartWindowAnimation. * * @return True to continue animating. False to stop. */ bool TGameWindow::OnTaskAnimate() { // And don't forget to update the screen TWindowManager::GetInstance()->InvalidateScreen(); mOffset += 0.01F ; if (TGameState::GetInstance()->QueryJumpToMenu()) { SendGameMessage("quit"); } if (TGameState::GetInstance()->QueryRestartMode()) { // Restart our game mode! } // Keep animating return true; }
//定时器事件 bool __cdecl CTableFrameSink::OnTimerMessage(WORD wTimerID, WPARAM wBindParam) { switch (wTimerID) { case IDI_FREE: //空闲时间结束 { //开始游戏 m_pITableFrameControl->StartGame(); //启动下注计时器 m_pITableFrame->SetGameTimer(IDI_PLACE_JETTON,TIME_PLACE_JETTON*1000,1,0L); //设置游状态为下注阶段 m_pITableFrame->SetGameStatus(GS_PLACE_JETTON); return true; } case IDI_PLACE_JETTON: //下注时间结束 { //状态判断(防止强退重复设置) if (m_pITableFrame->GetGameStatus()!=GS_GAME_END) { //设置状态 m_pITableFrame->SetGameStatus(GS_GAME_END); //结束游戏 OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL); //设置时间 m_pITableFrame->SetGameTimer(IDI_GAME_END,TIME_GAME_END*1000,1,0L); } return true; } case IDI_GAME_END: //结束游戏 { //写入积分 for ( WORD wUserChairID = 0; wUserChairID < GAME_PLAYER; ++wUserChairID ) { IServerUserItem *pIServerUserItem = m_pITableFrame->GetServerUserItem(wUserChairID); if ( pIServerUserItem == NULL ) continue; //胜利类型 enScoreKind ScoreKind=(m_iUserWinScore[wUserChairID]>0L)?enScoreKind_Win:enScoreKind_Lost; //写入积分 if (m_iUserWinScore[wUserChairID]!=0L) m_pITableFrame->WriteUserScore(wUserChairID,m_iUserWinScore[wUserChairID], m_iUserRevenue[wUserChairID], ScoreKind); //坐庄条件判断。一轮游戏结束,玩家有输有赢。所以需要在申请上庄队列里把输了钱不在满足做庄的玩家清除掉 __int64 iUserScore=pIServerUserItem->GetUserScore()->lScore; if (wUserChairID!=m_wCurrentBanker && iUserScore<m_iApplyBankerCondition) { for (WORD i=0; i<m_ApplyUserArray.GetCount(); ++i) { if (wUserChairID!=m_ApplyUserArray[i]) continue; //从庄家队列删除不符合上庄的玩家 m_ApplyUserArray.RemoveAt(i); //发送消息 CMD_S_CancelBanker CancelBanker; ZeroMemory(&CancelBanker,sizeof(CancelBanker)); //设置变量 lstrcpyn(CancelBanker.szCancelUser,pIServerUserItem->GetAccounts(),CountArray(CancelBanker.szCancelUser)); //发送消息 m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_CANCEL_BANKER, &CancelBanker, sizeof(CancelBanker)); m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_CANCEL_BANKER, &CancelBanker, sizeof(CancelBanker)); //提示消息 TCHAR szTipMsg[128]; _sntprintf(szTipMsg,CountArray(szTipMsg),TEXT("由于你的金币数少于坐庄必须金币数(%I64d),你自动下庄!"),m_iApplyBankerCondition); SendGameMessage(wUserChairID,szTipMsg); break; } } } //结束游戏 m_pITableFrame->ConcludeGame(); //切换庄家 ChangeBanker(false); //设置时间 m_dwJettonTime=(DWORD)time(NULL); m_pITableFrame->SetGameTimer(IDI_FREE,TIME_FREE*1000,1,0L); //发送消息 CMD_S_GameFree GameFree; ZeroMemory(&GameFree,sizeof(GameFree)); GameFree.cbTimeLeave=TIME_FREE; GameFree.cbGameRecord = m_iGoalAnimal; GameFree.iGameTimes = m_iGameTimes; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_FREE,&GameFree,sizeof(GameFree)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_FREE,&GameFree,sizeof(GameFree)); return true; } } return false; }
//游戏结束 bool __cdecl CTableFrameSink::OnEventGameEnd(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason) { switch (cbReason) { case GER_NORMAL: //常规结束 { //派发扑克 DispatchTableCard(); //计算分数 __int64 iBankerWinScore=CalculateScore(); //递增次数 m_wBankerTime++; //结束消息 CMD_S_GameEnd GameEnd; ZeroMemory(&GameEnd,sizeof(GameEnd)); //庄家信息 GameEnd.nBankerTime = m_wBankerTime; GameEnd.iBankerTotallScore=m_iBankerWinScore; GameEnd.iBankerScore=iBankerWinScore; GameEnd.cbGoalAnimal = m_iGoalAnimal; //发送积分 GameEnd.cbTimeLeave=TIME_GAME_END; for ( WORD wUserIndex = 0; wUserIndex < GAME_PLAYER; ++wUserIndex ) { IServerUserItem *pIServerUserItem = m_pITableFrame->GetServerUserItem(wUserIndex); if ( pIServerUserItem == NULL ) continue; //设置成绩 GameEnd.iUserScore=m_iUserWinScore[wUserIndex]; //返还积分 GameEnd.iUserReturnScore=m_iUserReturnScore[wUserIndex]; //设置税收 if (m_iUserRevenue[wUserIndex]>0) GameEnd.iRevenue=m_iUserRevenue[wUserIndex]; else if (m_wCurrentBanker!=INVALID_CHAIR) GameEnd.iRevenue=m_iUserRevenue[m_wCurrentBanker]; else GameEnd.iRevenue=0; //发送消息 m_pITableFrame->SendTableData(wUserIndex,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); m_pITableFrame->SendLookonData(wUserIndex,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); } return true; } case GER_USER_LEFT: //用户离开 { //闲家离开,即刻结算 if (m_wCurrentBanker!=wChairID) { //变量定义 __int64 iScore=0; __int64 iRevenue=0; enScoreKind ScoreKind=enScoreKind_Flee; //统计成绩 for( int i=0; i<JETTON_AREA_COUNT; i++) iScore += m_iUserAreaScore[wChairID][i]; iScore = -iScore; //写入积分 if (iScore!=0L) m_pITableFrame->WriteUserScore(pIServerUserItem, iScore,iRevenue, ScoreKind); return true; } //庄家离开,状态判断 if (m_pITableFrame->GetGameStatus()!=GS_GAME_END) { //提示消息 TCHAR szTipMsg[128]; _sntprintf(szTipMsg,CountArray(szTipMsg),TEXT("由于庄家[ %s ]强退,游戏提前结束!"),pIServerUserItem->GetAccounts()); //发送消息 SendGameMessage(INVALID_CHAIR,szTipMsg); //设置状态 m_pITableFrame->SetGameStatus(GS_GAME_END); //设置时间 m_pITableFrame->KillGameTimer(IDI_PLACE_JETTON); m_pITableFrame->SetGameTimer(IDI_GAME_END,TIME_GAME_END*1000,1,0L); //派发扑克 DispatchTableCard(); //计算分数 CalculateScore(); //结束消息 CMD_S_GameEnd GameEnd; ZeroMemory(&GameEnd,sizeof(GameEnd)); //庄家信息 GameEnd.nBankerTime = m_wBankerTime; GameEnd.iBankerTotallScore=m_iBankerWinScore; if (m_iBankerWinScore>0) GameEnd.iBankerScore=0; //发送积分 GameEnd.cbTimeLeave=TIME_GAME_END; for ( WORD wUserIndex = 0; wUserIndex < GAME_PLAYER; ++wUserIndex ) { IServerUserItem *pIServerUserItem = m_pITableFrame->GetServerUserItem(wUserIndex); if ( pIServerUserItem == NULL ) continue; //设置成绩 GameEnd.iUserScore=m_iUserWinScore[wUserIndex]; //返还积分 GameEnd.iUserReturnScore=m_iUserReturnScore[wUserIndex]; //设置税收 if (m_iUserRevenue[wUserIndex]>0) GameEnd.iRevenue=m_iUserRevenue[wUserIndex]; else if (m_wCurrentBanker!=INVALID_CHAIR) GameEnd.iRevenue=m_iUserRevenue[m_wCurrentBanker]; else GameEnd.iRevenue=0; //发送消息 m_pITableFrame->SendTableData(wUserIndex,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); m_pITableFrame->SendLookonData(wUserIndex,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); } } //扣除分数 if (m_iUserWinScore[m_wCurrentBanker]<0) { m_pITableFrame->WriteUserScore(m_wCurrentBanker,m_iUserWinScore[m_wCurrentBanker], m_iUserRevenue[m_wCurrentBanker], enScoreKind_Flee); } //切换庄家 ChangeBanker(true); return true; } } return false; }
//更换庄家 bool CTableFrameSink::ChangeBanker(bool bCancelCurrentBanker) { //切换标识 bool bChangeBanker=false; //取消当前庄家做庄资格 if (bCancelCurrentBanker) { for (WORD i=0; i<m_ApplyUserArray.GetCount(); ++i) { //获取玩家 WORD wChairID=m_ApplyUserArray[i]; //条件过滤 if (wChairID!=m_wCurrentBanker) continue; //删除玩家 m_ApplyUserArray.RemoveAt(i); break; } //设置庄家 m_wCurrentBanker=INVALID_CHAIR; //轮换判断 if (m_pITableFrame->GetGameStatus()==GS_FREE && m_ApplyUserArray.GetCount()!=0) { m_wCurrentBanker=m_ApplyUserArray[0]; } //设置变量 bChangeBanker=true; } //轮庄判断。当前庄家暂时还有机会做庄 else if (m_wCurrentBanker!=INVALID_CHAIR) { //获取庄家 IServerUserItem *pIServerUserItem=m_pITableFrame->GetServerUserItem(m_wCurrentBanker); if( pIServerUserItem == NULL ) return FALSE; __int64 iBankerScore=pIServerUserItem->GetUserScore()->lScore; //次数判断。如果超过了做庄的次数或者所剩积分不再满足做庄条件,则强制替换掉 if (m_nMaxBankerTimes<=m_wBankerTime || iBankerScore<m_iApplyBankerCondition) { //撤销玩家 for (WORD i=0; i<m_ApplyUserArray.GetCount(); ++i) { //获取玩家 WORD wChairID=m_ApplyUserArray[i]; //条件过滤 if (wChairID!=m_wCurrentBanker) continue; //删除玩家 m_ApplyUserArray.RemoveAt(i); break; } //设置庄家 m_wCurrentBanker=INVALID_CHAIR; //轮换判断 if (m_ApplyUserArray.GetCount()!=0) { m_wCurrentBanker=m_ApplyUserArray[0]; } bChangeBanker=true; //提示消息 TCHAR szTipMsg[128]; if (iBankerScore<m_iApplyBankerCondition) _sntprintf(szTipMsg,CountArray(szTipMsg),TEXT("[ %s ]分数少于(%I64d),强行换庄!"),pIServerUserItem->GetAccounts(),m_iApplyBankerCondition); else _sntprintf(szTipMsg,CountArray(szTipMsg),TEXT("[ %s ]做庄次数达到(%d),强行换庄!"),pIServerUserItem->GetAccounts(),m_nMaxBankerTimes); //发送消息 SendGameMessage(INVALID_CHAIR,szTipMsg); } } //如果当前是系统做庄,则可以换一个真人玩家来做庄 else if (m_wCurrentBanker==INVALID_CHAIR && m_ApplyUserArray.GetCount()!=0) { m_wCurrentBanker=m_ApplyUserArray[0]; bChangeBanker=true; } //切换判断 if (bChangeBanker) { //设置变量 m_wBankerTime = 0; m_iBankerWinScore=0; //发送消息 CMD_S_ChangeBanker ChangeBanker; ZeroMemory(&ChangeBanker,sizeof(ChangeBanker)); ChangeBanker.wBankerUser=m_wCurrentBanker; if (m_wCurrentBanker!=INVALID_CHAIR) { IServerUserItem *pIServerUserItem=m_pITableFrame->GetServerUserItem(m_wCurrentBanker); if( pIServerUserItem == NULL ) return FALSE; ChangeBanker.iBankerScore=pIServerUserItem->GetUserScore()->lScore; } else { //如果if的条件不满足,应该如何处理? } m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_CHANGE_BANKER,&ChangeBanker,sizeof(ChangeBanker)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_CHANGE_BANKER,&ChangeBanker,sizeof(ChangeBanker)); if (m_wCurrentBanker!=INVALID_CHAIR) { //读取消息 LONG lMessageCount=GetPrivateProfileInt(TEXT("Message"),TEXT("MessageCount"),0,m_szConfigFileName); if (lMessageCount!=0) { //读取配置 LONG lIndex=rand()%lMessageCount; TCHAR szKeyName[32],szMessage1[256],szMessage2[256]; _sntprintf(szKeyName,CountArray(szKeyName),TEXT("Item%ld"),lIndex); GetPrivateProfileString(TEXT("Message"),szKeyName,TEXT("恭喜[ %s ]上庄"),szMessage1,CountArray(szMessage1),m_szConfigFileName); //获取玩家 IServerUserItem *pIServerUserItem=m_pITableFrame->GetServerUserItem(m_wCurrentBanker); //发送消息 _sntprintf(szMessage2,CountArray(szMessage2),szMessage1,pIServerUserItem->GetAccounts()); SendGameMessage(INVALID_CHAIR,szMessage2); } } } return bChangeBanker; }
//框架事件处理 bool __cdecl CTableFrame::OnEventSocketFrame(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem) { CString strFile,strTemp; CTime tmCur = CTime::GetCurrentTime(); CString strTime = tmCur.Format("%m%d"); strFile.Format("log\\%s游戏服务.log",strTime); strTemp.Format("into OnEventSocketFrame"); WriteLog(strFile, strTemp); //效验参数 ASSERT(pIServerUserItem!=NULL); ASSERT(m_pITableFrameSink!=NULL); //消息处理 bool bSuccess=m_pITableFrameSink->OnFrameMessage(wSubCmdID,pDataBuffer,wDataSize,pIServerUserItem); if (bSuccess==false) { switch (wSubCmdID) { case SUB_GF_INFO: //游戏信息 { //效验参数 ASSERT(wDataSize==sizeof(CMD_GF_Info)); if (wDataSize<sizeof(CMD_GF_Info)) return false; //变量定义 CMD_GF_Info * pInfo=(CMD_GF_Info *)pDataBuffer; tagServerUserData * pUserData=pIServerUserItem->GetUserData(); bool bLookonUser=(pUserData->cbUserStatus==US_LOOKON); //效验状态 ASSERT(pUserData->wChairID<m_wChairCount); if (pUserData->wChairID>=m_wChairCount) return false; //设置变量 if (bLookonUser==false) m_bAllowLookon[pUserData->wChairID]=pInfo->bAllowLookon?true:false; //发送配置 CMD_GF_Option Option; Option.bGameStatus=m_bGameStatus; Option.bAllowLookon=m_bAllowLookon[pUserData->wChairID]?TRUE:FALSE; m_pIGameServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_OPTION,&Option,sizeof(Option)); //发送场景 bool bSendSecret=((bLookonUser==false)||(m_bAllowLookon[pUserData->wChairID]==true)); return m_pITableFrameSink->SendGameScene(pUserData->wChairID,pIServerUserItem,m_bGameStatus,bSendSecret); } case SUB_GF_USER_READY: //用户同意 { //变量定义 tagServerUserData * pUserData=pIServerUserItem->GetUserData(); bool bLookonUser=(pUserData->cbUserStatus==US_LOOKON); //状态效验 ASSERT(bLookonUser==false); ASSERT(m_pIUserItem[pUserData->wChairID]==pIServerUserItem); if (bLookonUser==true) return false; if (pUserData->cbUserStatus>=US_PLAY) return true; //同意处理 if (m_pITableFrameEvent!=NULL) m_pITableFrameEvent->OnEventUserReqReady(pUserData->wChairID,m_pIUserItem[pUserData->wChairID]); //事件处理 if ((m_pITableFrameEvent!=NULL)&&(m_pITableFrameEvent->OnEventUserReqReady( pUserData->wChairID,pIServerUserItem)==false)) return true; //设置变量 pUserData->cbUserStatus=US_READY; //同意处理 if (m_pITableFrameEvent!=NULL) m_pITableFrameEvent->OnEventUserReady(pUserData->wChairID,m_pIUserItem[pUserData->wChairID]); //变量定义 bool bMatchServer=((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)!=0); bool bControlStart=((bMatchServer==true)&&m_pGameServiceOption->cbControlStart==TRUE); strTemp.Format("into GAME_GENRE_MATCH"); WriteLog(strFile, strTemp); //开始判断 if ((bControlStart==false)&&(StartVerdict()==true)) { StartGame(); return true; }//End if //发送状态 m_pIGameServiceFrame->SendUserStatus(pIServerUserItem); return true; } case SUB_GF_USER_CHAT: //用户聊天 { //效验参数 CMD_GF_UserChat * pUserChat=(CMD_GF_UserChat *)pDataBuffer; ASSERT(wDataSize>=(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage))); ASSERT(wDataSize==(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage)+pUserChat->wChatLength)); if (wDataSize<(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage))) return false; if (wDataSize!=(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage)+pUserChat->wChatLength)) return false; //变量定义 bool bMatchServer=((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)!=0); bool bControlStart=((bMatchServer==true)&&m_pGameServiceOption->cbControlStart==TRUE); strTemp.Format("into GAME_GENRE_MATCH 2"); WriteLog(strFile, strTemp); //命令过虑 const tagServerUserData * pUserData=pIServerUserItem->GetUserData(); //防作弊房间 // if ( m_pIGameServiceFrame->IsFZBRoom() || m_pGameServiceOption->cbFZB ) if ( CanNoChat(m_pGameServiceOption->cbFZB ) ) { LPCTSTR pszMessage=TEXT("抱歉,本游戏房间为防作弊房间不允许发送聊天信息!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; }//End if if (pUserData->dwMasterRight!=0L) { //比赛开始 if ((bMatchServer==true)&&(bControlStart=true)&&(lstrcmp(pUserChat->szChatMessage,TEXT("/:StartGame"))==0)) { if (StartVerdict()==true) StartGame(); return true; } //游戏解散 if (lstrcmp(pUserChat->szChatMessage,TEXT("/:DismissGame"))==0) { DismissGame(); return true; } }//End if //比赛旁观 if (pUserData->dwMasterRight==0L) { if ((bMatchServer==true)&&(pIServerUserItem->GetUserStatus()==US_LOOKON)) { LPCTSTR pszMessage=TEXT("为了不影响比赛选手比赛,旁观的用户禁止发言!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; } } //权限判断 if (CUserRight::CanGameChat(pIServerUserItem->GetUserData()->dwUserRight)==false) { LPCTSTR pszMessage=TEXT("你暂时没有发送房间消息的权限,只能与管理员私聊!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; } //状态查询 if ((pUserData->dwMasterRight==0L)&&(m_pIGameServiceFrame->IsAllowGameChat()==false)) { LPCTSTR pszMessage=TEXT("抱歉,本游戏房间不允许发送聊天信息!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; } //游戏玩家 for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) m_pIGameServiceFrame->SendData(m_pIUserItem[i],MDM_GF_FRAME,SUB_GF_USER_CHAT,pUserChat,wDataSize); } //旁观玩家 for (INT_PTR i=0;i<m_LookonUserItemPtr.GetCount();i++) { m_pIGameServiceFrame->SendData(m_LookonUserItemPtr[i],MDM_GF_FRAME,SUB_GF_USER_CHAT,pUserChat,wDataSize); } return true; } } } return bSuccess; }
//结束游戏 bool __cdecl CTableFrame::ConcludeGame() { CString strFile,strTemp; CTime tmCur = CTime::GetCurrentTime(); CString strTime = tmCur.Format("%m%d"); strFile.Format("log\\%s游戏服务.log",strTime); strTemp.Format("into ConcludeGame"); WriteLog(strFile, strTemp); //设置变量 m_bStarted=false; m_dwTimeStart=0L; m_lGameTaxScore=0L; m_bWriteScore=false; m_bGameStatus=GS_FREE; memset(m_ScoreInfo,0,sizeof(m_ScoreInfo)); memset(m_dwPlayerID,0,sizeof(m_dwPlayerID)); memset(m_wOffLineCount,0,sizeof(m_wOffLineCount)); //重置桌子 m_pITableFrameSink->RepositTableFrameSink(); //设置用户 tagServerUserData * pUserData=NULL; for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) { pUserData=m_pIUserItem[i]->GetUserData(); if (pUserData->cbUserStatus!=US_OFFLINE) pUserData->cbUserStatus=US_SIT; } } //断线处理 for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) { //获取用户 IServerUserItem * pIServerUserItem=m_pIUserItem[i]; if (pIServerUserItem->GetUserStatus()!=US_OFFLINE) continue; //删除定时器 WORD wTimerID=IDI_OFFLINE+i; m_pIGameServiceFrame->KillTableTimer(m_wTableID,wTimerID); //用户离开 PerformStandUpAction(pIServerUserItem); //清理用户资料 m_pIGameServiceFrame->DeleteUserItem(pIServerUserItem); } } //赛局判断 if ((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)&& (m_pGameServiceOption->cbLimitDraw==TRUE)&&(m_pGameServiceOption->lMatchDraw>0)) { strTemp.Format("into GAME_GENRE_MATCH 3"); WriteLog(strFile, strTemp); for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) { //获取用户 IServerUserItem * pIServerUserItem=m_pIUserItem[i]; tagServerUserData * pUserData=pIServerUserItem->GetUserData(); //比赛判断 LONG lPlayCount=pUserData->UserScoreInfo.lWinCount+pUserData->UserScoreInfo.lLostCount+pUserData->UserScoreInfo.lDrawCount; if (lPlayCount>=m_pGameServiceOption->lMatchDraw) { TCHAR szDescribe[256]=TEXT(""); lstrcpyn(szDescribe,TEXT("恭喜你,你的比赛局数已经完成了,不需要再继续比赛,请耐心等待赛果公布! "),CountArray(szDescribe)); SendGameMessage(pIServerUserItem,szDescribe,SMT_EJECT|SMT_INFO|SMT_CLOSE_GAME); PerformStandUpAction(pIServerUserItem); }//End if }//End if }//End for }//End if //检测积分 LONG lHighScore=m_pGameServiceOption->lHighScore; LONG lLessScore=m_pGameServiceOption->lLessScore; if ((lLessScore!=0L)||(lHighScore!=0)) { for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) { //获取用户 IServerUserItem * pIServerUserItem=m_pIUserItem[i]; tagServerUserData * pUserData=pIServerUserItem->GetUserData(); //判断积分 if ((lLessScore!=0L)&&(pUserData->UserScoreInfo.lScore<lLessScore)) { TCHAR szDescribe[256]=TEXT(""); _snprintf(szDescribe,sizeof(szDescribe),TEXT("你的游戏积分少于 %ld,不能继续游戏!"),lLessScore); SendGameMessage(pIServerUserItem,szDescribe,SMT_EJECT|SMT_INFO|SMT_CLOSE_GAME); PerformStandUpAction(pIServerUserItem); } if ((lHighScore!=0L)&&(pUserData->UserScoreInfo.lScore>lHighScore)) { TCHAR szDescribe[256]=TEXT(""); _snprintf(szDescribe,sizeof(szDescribe),TEXT("你的游戏积分高于 %ld,不能继续游戏!"),lHighScore); SendGameMessage(pIServerUserItem,szDescribe,SMT_EJECT|SMT_INFO|SMT_CLOSE_GAME); PerformStandUpAction(pIServerUserItem); } } } } //关闭判断 if ((m_pIGameServiceFrame->IsAllowEnterGame()==false)||(m_pIGameServiceFrame->IsShallClose()==true)) { for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) { //获取用户 IServerUserItem * pIServerUserItem=m_pIUserItem[i]; tagServerUserData * pUserData=pIServerUserItem->GetUserData(); //用户判断 if (pUserData->dwMasterRight==0L) { //用户起立 LPCTSTR pszMessage=TEXT("请注意,游戏房间即将关闭或者不允许玩家进入,请你离开游戏桌子!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO|SMT_CLOSE_GAME); PerformStandUpAction(pIServerUserItem); continue; } } } } //发送状态 m_pIGameServiceFrame->SendTableStatus(m_wTableID); return true; }
//结束游戏 bool __cdecl CTableFrame::ConcludeGame() { //设置变量 m_bStarted=false; m_dwTimeStart=0L; m_lGameTaxScore=0L; m_bWriteScore=false; m_bGameStatus=GS_FREE; memset(m_ScoreInfo,0,sizeof(m_ScoreInfo)); memset(m_dwPlayerID,0,sizeof(m_dwPlayerID)); memset(m_wOffLineCount,0,sizeof(m_wOffLineCount)); //重置桌子 m_pITableFrameSink->RepositTableFrameSink(); //设置用户 tagServerUserData * pUserData=NULL; for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) { pUserData=m_pIUserItem[i]->GetUserData(); if (pUserData->cbUserStatus!=US_OFFLINE) pUserData->cbUserStatus=US_SIT; } } //断线处理 for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) { //获取用户 IServerUserItem * pIServerUserItem=m_pIUserItem[i]; if (pIServerUserItem->GetUserStatus()!=US_OFFLINE) continue; //删除定时器 WORD wTimerID=IDI_OFFLINE+i; m_pIGameServiceFrame->KillTableTimer(m_wTableID,wTimerID); //用户离开 PerformStandUpAction(pIServerUserItem); //清理用户资料 m_pIGameServiceFrame->DeleteUserItem(pIServerUserItem); } } //检测积分 LONG lHighScore=m_pGameServiceOption->lHighScore; LONG lLessScore=m_pGameServiceOption->lLessScore; if ((lLessScore!=0L)||(lHighScore!=0)) { for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) { //获取用户 IServerUserItem * pIServerUserItem=m_pIUserItem[i]; tagServerUserData * pUserData=pIServerUserItem->GetUserData(); //判断积分 if ((lLessScore!=0L)&&(pUserData->UserScoreInfo.lScore<lLessScore)) { TCHAR szDescribe[256]=TEXT(""); _snprintf(szDescribe,sizeof(szDescribe),TEXT("你的游戏积分少于 %ld,不能继续游戏!"),lLessScore); SendGameMessage(pIServerUserItem,szDescribe,SMT_EJECT|SMT_INFO|SMT_CLOSE_GAME); PerformStandUpAction(pIServerUserItem); } if ((lHighScore!=0L)&&(pUserData->UserScoreInfo.lScore<lHighScore)) { TCHAR szDescribe[256]=TEXT(""); _snprintf(szDescribe,sizeof(szDescribe),TEXT("你的游戏积分高于 %ld,不能继续游戏!"),lHighScore); SendGameMessage(pIServerUserItem,szDescribe,SMT_EJECT|SMT_INFO|SMT_CLOSE_GAME); PerformStandUpAction(pIServerUserItem); } } } } //关闭判断 if ((m_pIGameServiceFrame->IsAllowEnterGame()==false)||(m_pIGameServiceFrame->IsShallClose()==true)) { for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) { //获取用户 IServerUserItem * pIServerUserItem=m_pIUserItem[i]; tagServerUserData * pUserData=pIServerUserItem->GetUserData(); //用户判断 if (pUserData->dwMasterRight==0L) { //用户起立 LPCTSTR pszMessage=TEXT("请注意,游戏房间即将关闭或者不允许玩家进入,请你离开游戏桌子!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO|SMT_CLOSE_GAME); PerformStandUpAction(pIServerUserItem); continue; } } } } //发送状态 m_pIGameServiceFrame->SendTableStatus(m_wTableID); return true; }
//框架事件处理 bool __cdecl CTableFrame::OnEventSocketFrame(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem) { //效验参数 ASSERT(pIServerUserItem!=NULL); ASSERT(m_pITableFrameSink!=NULL); //消息处理 bool bSuccess=m_pITableFrameSink->OnFrameMessage(wSubCmdID,pDataBuffer,wDataSize,pIServerUserItem); if (bSuccess==false) { switch (wSubCmdID) { case SUB_GF_INFO: //游戏信息 { //效验参数 ASSERT(wDataSize==sizeof(CMD_GF_Info)); if (wDataSize<sizeof(CMD_GF_Info)) return false; //变量定义 CMD_GF_Info * pInfo=(CMD_GF_Info *)pDataBuffer; tagServerUserData * pUserData=pIServerUserItem->GetUserData(); bool bLookonUser=(pUserData->cbUserStatus==US_LOOKON); //效验状态 ASSERT(pUserData->wChairID<m_wChairCount); if (pUserData->wChairID>=m_wChairCount) return false; //设置变量 if (bLookonUser==false) m_bAllowLookon[pUserData->wChairID]=pInfo->bAllowLookon?true:false; //发送配置 CMD_GF_Option Option; Option.bGameStatus=m_bGameStatus; Option.bAllowLookon=m_bAllowLookon[pUserData->wChairID]?TRUE:FALSE; m_pIGameServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_OPTION,&Option,sizeof(Option)); //发送场景 bool bSendSecret=((bLookonUser==false)||(m_bAllowLookon[pUserData->wChairID]==true)); return m_pITableFrameSink->SendGameScene(pUserData->wChairID,pIServerUserItem,m_bGameStatus,bSendSecret); } case SUB_GF_USER_READY: //用户同意 { //变量定义 tagServerUserData * pUserData=pIServerUserItem->GetUserData(); bool bLookonUser=(pUserData->cbUserStatus==US_LOOKON); //状态效验 ASSERT(bLookonUser==false); ASSERT(m_pIUserItem[pUserData->wChairID]==pIServerUserItem); if (bLookonUser==true) return false; if (pUserData->cbUserStatus>=US_PLAY) return true; //同意处理 if (m_pITableFrameEvent!=NULL) m_pITableFrameEvent->OnEventUserReqReady(pUserData->wChairID,m_pIUserItem[pUserData->wChairID]); //事件处理 if ((m_pITableFrameEvent!=NULL)&&(m_pITableFrameEvent->OnEventUserReqReady( pUserData->wChairID,pIServerUserItem)==false)) return true; //设置变量 pUserData->cbUserStatus=US_READY; //同意处理 if (m_pITableFrameEvent!=NULL) m_pITableFrameEvent->OnEventUserReady(pUserData->wChairID,m_pIUserItem[pUserData->wChairID]); //发送状态 m_pIGameServiceFrame->SendUserStatus(pIServerUserItem); return true; } case SUB_GF_USER_CHAT: //用户聊天 { //效验参数 CMD_GF_UserChat * pUserChat=(CMD_GF_UserChat *)pDataBuffer; ASSERT(wDataSize>=(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage))); ASSERT(wDataSize==(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage)+pUserChat->wChatLength)); if (wDataSize<(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage))) return false; if (wDataSize!=(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage)+pUserChat->wChatLength)) return false; //命令过虑 const tagServerUserData * pUserData=pIServerUserItem->GetUserData(); if (pUserData->dwMasterRight!=0L) { //游戏解散 if (lstrcmp(pUserChat->szChatMessage,TEXT("/:DismissGame"))==0) { DismissGame(); return true; } } //权限判断 if (CUserRight::CanGameChat(pIServerUserItem->GetUserData()->dwUserRight)==false) { LPCTSTR pszMessage=TEXT("你暂时没有发送房间消息的权限,只能与管理员私聊!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; } //状态查询 if ((pUserData->dwMasterRight==0L)&&(m_pIGameServiceFrame->IsAllowGameChat()==false)) { LPCTSTR pszMessage=TEXT("抱歉,本游戏房间不允许发送聊天信息!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; } //游戏玩家 for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) m_pIGameServiceFrame->SendData(m_pIUserItem[i],MDM_GF_FRAME,SUB_GF_USER_CHAT,pUserChat,wDataSize); } //旁观玩家 for (INT_PTR i=0;i<m_LookonUserItemPtr.GetCount();i++) { m_pIGameServiceFrame->SendData(m_LookonUserItemPtr[i],MDM_GF_FRAME,SUB_GF_USER_CHAT,pUserChat,wDataSize); } return true; } } } return bSuccess; }