//结束游戏 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; }