/** * 定时器消息 */ bool CServerGameDesk::OnTimer(UINT uTimerID) { if (uTimerID==TIME_GAME_FINISH) //结束定时器 { KillTimer(TIME_GAME_FINISH); if (m_bGameStation==GS_PLAY_GAME) GameFinish(0,GF_NORMAL); } else if(uTimerID == TIME_USER_OUT_CARD) { m_iTimerCount --; if(m_iTimerCount < 0 ) { KillTimer(TIME_USER_OUT_CARD) ; if(m_bGameStation == GS_PLAY_GAME) { H021_UserPass(m_Logic.m_iNowOutPeople ,NULL ,NULL ,0,0,false) ; } } return true ; } return __super::OnTimer(uTimerID); }
/** * 同意用户离开 * @param bDeskStation 玩家ID * @param pNetHead 参数基类 * @param pData 网络数据包 * @param uSize 数据包大小 * @param uSocketID 参数基类 * @param bWatchUser 是否旁观 */ bool CServerGameDesk::H048_ArgeeStopThing(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser) { if(bWatchUser) return false; StopResultStruct * pStop=(StopResultStruct *)pData; if(pStop->bArgee==1) { //同意 StopResultStruct stop; stop.bArgee=true; SendGameData((bDeskStation+2)%4,&stop,sizeof(stop),MDM_GM_GAME_NOTIFY,ASS_AGREE_STOP,0); MessageStruct Mess; memset(&Mess,0,sizeof(Mess)); lstrcpy(Mess.Message,"敌家经过商量,提前结束了本局!"); SendGameData((bDeskStation+1)%4,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0); SendGameData((bDeskStation+3)%4,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0); memset(&Mess,0,sizeof(Mess)); lstrcpy(Mess.Message,"拣分的双方经过商量,提前结束了本局!"); SendWatchData(m_bMaxPeople,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0); //结束游戏 if (m_bGameStation==GS_PLAY_GAME) GameFinish(bDeskStation, GF_PREEND);//提前结束 } else { StopResultStruct stop; stop.bArgee=false; SendGameData((bDeskStation+2)%4,&stop,sizeof(stop),MDM_GM_GAME_NOTIFY,ASS_AGREE_STOP,0); } return true; }
bool CServerGameDesk::UserNetCut(BYTE bDeskStation, CGameUserInfo *pLostUserInfo) { DebugPrintf("用户掉线 位置=【%d】",bDeskStation); __super:: UserNetCut(bDeskStation, pLostUserInfo); m_bIsCut[bDeskStation] = true; int iTempCount = 0; for(int i = 0;i < PLAY_COUNT; ++i) { if(m_bIsCut[i]) { iTempCount++; } } //所有人断线 结束游戏 if(iTempCount == CountPlayer()) { GameFinish(bDeskStation,GF_SALE); //安全结束游戏 } return true; }
/** * 用户离开游戏桌 */ BYTE CServerGameDesk::UserLeftDesk(BYTE bDeskStation, CGameUserInfo * pUserInfo) { if(m_bGameStation>GS_WAIT_ARGEE &&m_bGameStation<GS_WAIT_NEXT) GameFinish(bDeskStation,GF_SALE); if(GS_WAIT_ARGEE==m_bGameStation) {//清理布局 m_Logic.UserLeft(bDeskStation); } return __super::UserLeftDesk(bDeskStation,pUserInfo); }
//用户离开游戏桌 BYTE CServerGameDesk::UserLeftDesk(BYTE bDeskStation, CGameUserInfo * pUserInfo) { DebugPrintf("用户离开 位置=【%d】",bDeskStation); m_bIsAuto[bDeskStation] = false; m_bIsCut[bDeskStation] = false; if(IsPlayGame(bDeskStation)) { GameFinish(bDeskStation,GF_SALE); //安全结束游戏 } return __super::UserLeftDesk(bDeskStation,pUserInfo); }
/** * 用户请求离开 * @param bDeskStation 请求玩家ID * @param szMessage 请求消息内容 */ BOOL CServerGameDesk::H041_UserHaveThing(BYTE bDeskStation, char * szMessage) { if (m_bGameStation<GS_BUZHEN) return TRUE; m_bdesk=bDeskStation; m_iLeaveArgee|=1<<bDeskStation; if (m_iLeaveArgee!=15) { HaveThingStruct HaveThing; HaveThing.pos=bDeskStation; ::CopyMemory(HaveThing.szMessage,szMessage,60*sizeof(char)); for (int i=0;i<m_bMaxPeople;i++) if (i!=bDeskStation) SendGameData(i,&HaveThing,sizeof(HaveThing),MDM_GM_GAME_NOTIFY,ASS_HAVE_THING,0); } else GameFinish(bDeskStation,GF_SALE); return TRUE; }
/** * 同意用户离开 * @param bDeskStation 玩家ID * @param bArgee 是否同意 */ BOOL CServerGameDesk::H044_ArgeeUserLeft(BYTE bDeskStation, BOOL bArgee) { if (bArgee) m_iLeaveArgee|=1<<bDeskStation; else //m_iLeaveArgee&=~1<<bDeskStation; { m_iLeaveArgee = 0; } if (m_iLeaveArgee!=15) { m_bQueryQuit=true; LeaveResultStruct Leave; Leave.bDeskStation=bDeskStation; Leave.bArgeeLeave=bArgee; for (int i=0;i<m_bMaxPeople;i++) if (i!=bDeskStation) SendGameData(i,&Leave,sizeof(Leave),MDM_GM_GAME_NOTIFY,ASS_LEFT_RESULT,0); } else GameFinish(m_bdesk,GF_SALE); return TRUE; }
//-------------------------------------------------------------------------------- //处理玩家摊牌动作; void CServerGameDesk::HandTanPaiAction(BYTE byDStation,BYTE byDownCard[]) { //安全判断 if(!m_bIsInGame[byDStation] || NULL == byDownCard || m_bHaveBaiPai[byDStation] || m_bGameStation != GS_PLAY_GAME) { return; } ::CopyMemory(m_bBullCard[byDStation],byDownCard,sizeof(BYTE)*USER_HAND_CARD); //摆牌数据 m_byCardShape[byDStation] = m_Logic.GetShape(m_byUCard[byDStation],m_iUCCount[byDStation],byDownCard); TanPaiStruct tanpai; tanpai.byStaiton = byDStation; tanpai.byShape = m_byCardShape[byDStation]; if(m_bWatchOther[byDStation]) { ::CopyMemory(tanpai.byDownCard,m_bBullCard[byDStation],sizeof(m_bBullCard[byDStation])); } for (int i = 0; i < PLAY_COUNT; ++i) { if(m_pUserInfo[i]) { SendGameData(i,&tanpai,sizeof(tanpai),MDM_GM_GAME_NOTIFY,ASS_TAN_PAI,0); } } SendWatchData(m_bMaxPeople,&tanpai,sizeof(tanpai),MDM_GM_GAME_NOTIFY,ASS_TAN_PAI,0); m_bHaveBaiPai[byDStation] = true; //检测是否所有人都已摊牌 if(CheckTanPaiFinish()) { GameFinish(byDStation,GF_NORMAL); } }
//***************************************************************************** // 更新 //***************************************************************************** void CGame::Update(void) { m_pManager->GetCameraManager()->Update(); m_pFieldManager->Update(); m_pManager->GetLightManager()->Update(); m_pCrowdManager->Update(); // ディレクターの更新処理 よく考えたらこれはここだとダメな気がするけどまぁとりあえず m_pDirectorManager->Update(); // 現モードの初期化処理&前モードの終了処理 if (m_PrevMode != m_Mode) { // 前モードの終了処理 switch (m_PrevMode) { case GAME_INTRO: UninitGameIntro(); break; case GAME_BATTLE: UninitGameBattle(); break; case GAME_FINISH: UninitGameFinish(); break; } // 現モードの初期化処理 switch (m_Mode) { case GAME_INTRO: InitGameIntro(); break; case GAME_BATTLE: InitGameBattle(); break; case GAME_FINISH: InitGameFinish(); break; } } m_PrevMode = m_Mode; // 現モードの実行 switch (m_Mode) { case GAME_INTRO: GameIntro(); break; case GAME_BATTLE: GameBattle(); break; case GAME_FINISH: GameFinish(); break; } // 緊急用 if (CInputKeyboard::GetKeyboardTrigger(KEYBOARD_CODE_GO_TITLE)) { m_Mode = GAME_FINISH; } #ifdef _DEBUG // test if( CInputKeyboard::GetKeyboardTrigger( KEYBOARD_CODE_FORCE_BATTLE_MODE ) ) { m_pManager->GetPlayerManager()->SetPos( PLAYER_1, D3DXVECTOR3( -25.0f, 0.0f, 0.0f ) ); m_pManager->GetPlayerManager()->SetPos( PLAYER_2, D3DXVECTOR3( +25.0f, 0.0f, 0.0f ) ); m_pManager->GetJudgeManager()->SetBattleMode( BATTLE_FIGHT ); } if( CInputKeyboard::GetKeyboardTrigger( KEYBOARD_CODE_FORCE_MOVE_MODE ) ) { m_pManager->GetPlayerManager()->SetPos( PLAYER_1, D3DXVECTOR3( -50.0f, 0.0f, 0.0f ) ); m_pManager->GetPlayerManager()->SetPos( PLAYER_2, D3DXVECTOR3( +50.0f, 0.0f, 0.0f ) ); m_pManager->GetJudgeManager()->SetBattleMode( BATTLE_MOVE ); } if (CInputKeyboard::GetKeyboardTrigger(KEYBOARD_CODE_UI_START_TEST)) { m_pUiManager->StartAnimation(INTORO_ANIMATION_FRAME); } if (CInputKeyboard::GetKeyboardTrigger(KEYBOARD_CODE_DECIDE)) { // フェードアウト開始 m_pFade->Start( MODE_FADE_OUT, DEFFAULT_FADE_OUT_COLOR, DEFFAULT_FADE_TIME ); // タイトルヘ m_pManager->SetNextPhase( MODE_PHASE_TITLE ); } #endif #ifdef _DEBUG CDebugProc::PrintR( "[GAME]\n" ); CDebugProc::PrintR( "Timer:%d\n", (int)( m_BattleTimer / TARGET_FPS ) ); CDebugProc::PrintR( "GameMode:" ); switch( m_Mode ) { m_BattleTimer = DEFAULT_BATTLE_TIMER; case GAME_INTRO: CDebugProc::PrintR( "GAME_INTRO" ); break; case GAME_BATTLE: CDebugProc::PrintR( "GAME_BATTLE" ); break; case GAME_FINISH: CDebugProc::PrintR( "GAME_FINISH" ); break; } CDebugProc::PrintR( "\n" ); CDebugProc::PrintR( "BattleMode:" ); switch( m_pJudgeManager->GetBattleMode() ) { // 移動モード case BATTLE_MOVE: CDebugProc::PrintR( "BATTLE_MOVE" ); break; // 戦闘モード case BATTLE_FIGHT: CDebugProc::PrintR( "BATTLE_FIGHT" ); break; } CDebugProc::PrintR( "\n\n" ); #endif }
//游戏开始 bool CServerGameDesk::GameBegin(BYTE bBeginFlag) { if (__super::GameBegin(bBeginFlag)==false) { GameFinish(0,GF_SALE); return false; } m_bGameStation = GS_SEND_CARD; //游戏状态 //-ADD--BY---DWJ-20121203 //这里每盘根据房间ID读取下配置文件中的ReSetAIHaveWinMoney 参数 设定下机器人赢了多少钱; GetAIContrlSetFromIni(m_pDataManage->m_InitData.uRoomID); //牛牛玩家人数 m_byCowUserNum = 0; //是否牛牛玩家 memset(m_bIsCowUser, false, sizeof(m_bIsCowUser)); for (int i = 0; i < PLAY_COUNT; ++i) { if(m_pUserInfo[i]) { m_bIsInGame[i] = true; } } //分发扑克 m_Logic.RandCard(m_iTotalCard,m_iAllCardCount,m_bHaveKing); int temp = rand()%100; //洗到好牌 if (temp < m_iGoodCard) { for (int i=0; i<20; i++) { if (GetMaxCardShape(m_iTotalCard,m_iAllCardCount) > UG_BULL_SEVEN) { break; } m_Logic.RandCard(m_iTotalCard,m_iAllCardCount,m_bHaveKing); } } srand(GetTickCount()); m_bGameStation = GS_SEND_CARD; BeginUpgradeStruct begindata; ::CopyMemory(begindata.bIsInGame,m_bIsInGame,sizeof(m_bIsInGame)); for(int i = 0; i < PLAY_COUNT; ++i) { if(NULL == m_pUserInfo[i]) continue; SendGameData(i,&begindata,sizeof(BeginUpgradeStruct),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0); } SendWatchData(m_bMaxPeople,&begindata,sizeof(BeginUpgradeStruct),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0); SendCard(); DebugPrintf("游戏开始__ happy landowner gamebing end!"); return true; }