/** * 游戏结束 * @param bDeskStation 玩家ID * @param bCloseFlag 结束类型 */ bool CServerGameDesk::GameFinish(BYTE bDeskStation, BYTE bCloseFlag) { KillTimer(TIME_USER_OUT_CARD) ; //得到最小数的金币 long m_dwMaxPoint=0; bool bSetMaxMoney=false; /*for (BYTE i=0;i<m_bMaxPeople;i++) { if (m_pUserInfo[i]!=NULL) { if (bSetMaxMoney==false) { bSetMaxMoney=true; m_dwMaxPoint=(long int)m_pUserInfo[i]->m_UserData.dwPoint-1; } else m_dwMaxPoint=__min(m_dwMaxPoint,(long int)m_pUserInfo[i]->m_UserData.dwPoint-1); } } if(m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME && m_dwMaxPoint<0) { TRACE("出现错误,四国军棋金币或比赛游戏中,玩家的金币数为负数."); return false; }*/ //编写代码 switch (bCloseFlag) { case GF_PREEND: //提前结束 case GF_NORMAL: //游戏正常结束 { int iBasePoint=m_pDataManage->m_InitData.uBasePoint;//倍数 //计算得分 //游戏结束 GameEndStruct GameEnd; ::memset(&GameEnd,0,sizeof(GameEnd)); m_Logic.CountFen(GameEnd.iTurePoint); if (GF_PREEND == bCloseFlag)//提前结束 { GameEnd.iTurePoint[bDeskStation] = GameEnd.iTurePoint[(bDeskStation+2)%4] = -2;//提出提前结束的一方 GameEnd.iTurePoint[(bDeskStation+1)%4] = GameEnd.iTurePoint[(bDeskStation+3)%4] = 2;//另一方 } //设置基本分begin m_pDataManage->m_InitData.uBasePoint = 1; int base=-1; int temp; for(int i=1;i<m_bMaxPeople;i++) { if (m_pUserInfo[i]==NULL) continue; temp=m_Logic.GetBaseFen(m_pUserInfo[i]->m_UserData.dwPoint); if(base>temp||-1==base) base=temp; } for(int i=0; i<m_bMaxPeople; i++) { if(NULL == m_pUserInfo[i]) { GameEnd.iTurePoint[i] = 0; continue; } GameEnd.iTurePoint[i]*=base; } //设置基本分end //设置数据 m_bGameStation=GS_WAIT_ARGEE; for (int i=0;i<m_bMaxPeople;i++) { if (m_pUserInfo[i]!=NULL) m_pUserInfo[i]->m_UserData.bUserState=USER_SITTING; } /*if (m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME) { GameEnd.iTurePoint[0]*=iBasePoint; GameEnd.iTurePoint[1]*=iBasePoint; GameEnd.iTurePoint[2]*=iBasePoint; GameEnd.iTurePoint[3]*=iBasePoint; for (BYTE i=0;i<m_bMaxPeople;i++) { if(GameEnd.iTurePoint[i]>0) GameEnd.iTurePoint[i]=__min(m_dwMaxPoint,GameEnd.iTurePoint[i]); if(GameEnd.iTurePoint[i]<0) GameEnd.iTurePoint[i]=__max(-m_dwMaxPoint,GameEnd.iTurePoint[i]); if (GameEnd.iTurePoint[i]>=100) { if(m_pDataManage->m_InitData.uComType!=SUP_MATCH_GAME) GameEnd.iTurePoint[i]=GameEnd.iTurePoint[i]*49L/50L; } } }*/ //写入数据库 /* bool temp_cut[PLAY_COUNT]; memset(temp_cut,0,sizeof(temp_cut)); ChangeUserPoint(GameEnd.iTurePoint, temp_cut); __super::RecoderGameInfo(GameEnd.iChangeMoney);*/ //写入数据库 bool temp_cut[4]; memset(temp_cut,0,sizeof(temp_cut)); ChangeUserPoint(GameEnd.iTurePoint, temp_cut); __super::RecoderGameInfo(GameEnd.iChangeMoney); GameEnd.iDoublePointEffect = GetDoublePointEffect();//20081125 bool bNotCostPoint = (m_pDataManage->m_InitData.dwRoomRule & GRR_NOT_COST_POINT) > 0; /// 金币场不扣积分 add by wys 2010-11-1 if (true == bNotCostPoint) { memset(GameEnd.iTurePoint,0,sizeof(GameEnd.iTurePoint)); } //发送数据 for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0); SendWatchData(m_bMaxPeople,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0); ReSetGameState(bCloseFlag); __super::GameFinish(bDeskStation,GF_SALE); return true; } case GF_SALE: //游戏安全结束 case GFF_FORCE_FINISH: //用户断线离开 { int iBasePoint=m_pDataManage->m_InitData.uBasePoint;//倍数 //计算得分 // int iTurePoint=GetUpGrade(m_iGamePoint,m_iPlayCardCount); //设置数据 m_bGameStation=GS_WAIT_ARGEE; for (int i=0;i<m_bMaxPeople;i++) { if (m_pUserInfo[i]!=NULL) m_pUserInfo[i]->m_UserData.bUserState=USER_SITTING; } GameCutStruct CutEnd; CutEnd.bDeskStation=bDeskStation; if(bCloseFlag==GF_SALE) { CutEnd.iTurePoint[bDeskStation]=0; CutEnd.iTurePoint[(bDeskStation+1)%4]=0; CutEnd.iTurePoint[(bDeskStation+2)%4]=0; CutEnd.iTurePoint[(bDeskStation+3)%4]=0; } else { //设置分数 CutEnd.iTurePoint[bDeskStation]=0-m_pDataManage->m_InitData.uRunPublish;; CutEnd.iTurePoint[(bDeskStation+1)%4]=0; CutEnd.iTurePoint[(bDeskStation+2)%4]=0; CutEnd.iTurePoint[(bDeskStation+3)%4]=0; } //发送信息 if (bCloseFlag==GF_SALE) { for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_SALE_END,0); SendWatchData(m_bMaxPeople,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_SALE_END,0); } else { //计算金币类和比赛类的实得分 /*if (m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME) { CutEnd.iTurePoint[0]*=iBasePoint; CutEnd.iTurePoint[1]*=iBasePoint; CutEnd.iTurePoint[2]*=iBasePoint; CutEnd.iTurePoint[3]*=iBasePoint; for (BYTE i=0;i<m_bMaxPeople;i++) { if(CutEnd.iTurePoint[i]>0) CutEnd.iTurePoint[i]=__min(m_dwMaxPoint,CutEnd.iTurePoint[i]); if(CutEnd.iTurePoint[i]<0) CutEnd.iTurePoint[i]=__max(-m_dwMaxPoint,CutEnd.iTurePoint[i]); if (CutEnd.iTurePoint[i]>=100) { if(m_pDataManage->m_InitData.uComType!=SUP_MATCH_GAME) CutEnd.iTurePoint[i]=CutEnd.iTurePoint[i]*49L/50L; } } }*/ /* bool temp_cut[PLAY_COUNT]; memset(temp_cut,0,sizeof(temp_cut)); for (int i=0;i<PLAY_COUNT;i++) { temp_cut[i]=(bDeskStation==i && CutEnd.iTurePoint[i]<0); } ChangeUserPoint(CutEnd.iTurePoint, temp_cut); __super::RecoderGameInfo(CutEnd.iChangeMoney);*/ //写入数据库 bool temp_cut[4]; memset(temp_cut,0,sizeof(temp_cut)); for (int i=0;i<m_bMaxPeople;i++) { temp_cut[i]=(bDeskStation==i && CutEnd.iTurePoint[i]<0); } ChangeUserPoint(CutEnd.iTurePoint, temp_cut); __super::RecoderGameInfo(CutEnd.iChangeMoney); bool bNotCostPoint = (m_pDataManage->m_InitData.dwRoomRule & GRR_NOT_COST_POINT) > 0; /// 金币场不扣积分 add by wys 2010-11-1 if (true == bNotCostPoint) { memset(CutEnd.iTurePoint,0,sizeof(CutEnd.iTurePoint)); } for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_CUT_END,0); SendWatchData(m_bMaxPeople,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_CUT_END,0); } bCloseFlag=GFF_FORCE_FINISH; ReSetGameState(bCloseFlag); __super::GameFinish(bDeskStation,bCloseFlag); return true; } } //重置数据 ReSetGameState(bCloseFlag); __super::GameFinish(bDeskStation,bCloseFlag); return true; }
//------------------------------------------------------------------------------------ //游戏结束 bool CServerGameDesk::GameFinish(BYTE bDeskStation, BYTE bCloseFlag) { DebugPrintf("happy landowner GameFinish 结束玩家【%d】,结束类型【%d】",bDeskStation,bCloseFlag); KillAllTimer(); GameEndStruct s_gameend; switch (bCloseFlag) { case GF_NORMAL: //游戏正常结束 { CountResultScore(bDeskStation,&s_gameend,GF_NORMAL); //计算得分 m_bGameStation = GS_WAIT_ARGEE; break; } case GFF_FORCE_FINISH: //强制退出结束 { CountResultScore(bDeskStation,&s_gameend,GFF_FORCE_FINISH); //计算得分 m_bGameStation = GS_WAIT_ARGEE; //游戏状态 等待下一盘开始 bCloseFlag = GF_SALE; break; } case GF_SALE: //游戏安全结束 { m_bGameStation = GS_WAIT_ARGEE; break; } default:break; } memcpy(s_gameend.bIsPrepare,m_bIsPrepare,sizeof(s_gameend.bIsPrepare)); //发送数据 for (int i=0; i<PLAY_COUNT; ++i) { if(NULL == m_pUserInfo[i]) continue; SendGameData(i,&s_gameend,sizeof(GameEndStruct),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0); } SendWatchData(m_bMaxPeople,&s_gameend,sizeof(GameEndStruct),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0); ReSetGameState(bCloseFlag); //重置数据 __super::GameFinish(bDeskStation,bCloseFlag); for(int i = 0; i < PLAY_COUNT; ++i) { if(NULL == m_pUserInfo[i]) { m_bIsAuto[i] = false; } } return true; }