void IGameController::ResetGame() { // reset the game for(int i=0; i<MOD_NUM_WORLDS; i++) { GameServer()->m_World[i].m_ResetRequested = true; } SetGameState(IGS_GAME_RUNNING); m_GameStartTick = Server()->Tick(); m_SuddenDeath = 0; int MatchNum = (str_length(g_Config.m_SvMaprotation) && g_Config.m_SvMatchesPerMap) ? g_Config.m_SvMatchesPerMap : 0; if(MatchNum == 0) m_MatchCount = 0; bool GameInfoChanged = (m_GameInfo.m_MatchCurrent != m_MatchCount+1) || (m_GameInfo.m_MatchNum != MatchNum) || (m_GameInfo.m_ScoreLimit != g_Config.m_SvScorelimit) || (m_GameInfo.m_TimeLimit != g_Config.m_SvTimelimit); m_GameInfo.m_MatchCurrent = m_MatchCount+1; m_GameInfo.m_MatchNum = MatchNum; m_GameInfo.m_ScoreLimit = g_Config.m_SvScorelimit; m_GameInfo.m_TimeLimit = g_Config.m_SvTimelimit; if(GameInfoChanged) UpdateGameInfo(-1); // do team-balancing DoTeamBalance(); }
void IGameController::ResetGame() { // reset the game GameServer()->m_World.m_ResetRequested = true; SetGameState(IGS_GAME_RUNNING); m_GameStartTick = Server()->Tick(); m_SuddenDeath = 0; // do team-balancing DoTeamBalance(); }
void IGameController::Tick() { // handle game states if(m_GameState != IGS_GAME_RUNNING) { if(m_GameStateTimer > 0) --m_GameStateTimer; if(m_GameStateTimer == 0) { // timer fires switch(m_GameState) { case IGS_WARMUP_USER: // end warmup SetGameState(IGS_WARMUP_USER, 0); break; case IGS_START_COUNTDOWN: // unpause the game SetGameState(IGS_GAME_RUNNING); break; case IGS_GAME_PAUSED: // end pause SetGameState(IGS_GAME_PAUSED, 0); break; case IGS_END_ROUND: // check if the match is over otherwise start next round DoWincheckMatch(); if(m_GameState != IGS_END_MATCH) StartRound(); break; case IGS_END_MATCH: // start next match CycleMap(); StartMatch(); m_MatchCount++; break; case IGS_WARMUP_GAME: case IGS_GAME_RUNNING: // not effected break; } } else { // timer still running switch(m_GameState) { case IGS_WARMUP_USER: // check if player ready mode was disabled and it waits that all players are ready -> end warmup if(!g_Config.m_SvPlayerReadyMode && m_GameStateTimer == TIMER_INFINITE) SetGameState(IGS_WARMUP_USER, 0); break; case IGS_START_COUNTDOWN: case IGS_GAME_PAUSED: // freeze the game ++m_GameStartTick; break; case IGS_WARMUP_GAME: case IGS_GAME_RUNNING: case IGS_END_MATCH: case IGS_END_ROUND: // not effected break; } } } // do team-balancing (skip this in survival, done there when a round starts) if(IsTeamplay() && !(m_GameFlags&GAMEFLAG_SURVIVAL)) { switch(m_UnbalancedTick) { case TBALANCE_CHECK: CheckTeamBalance(); break; case TBALANCE_OK: break; default: if(Server()->Tick() > m_UnbalancedTick+g_Config.m_SvTeambalanceTime*Server()->TickSpeed()*60) DoTeamBalance(); } } // check for inactive players DoActivityCheck(); // win check if((m_GameState == IGS_GAME_RUNNING || m_GameState == IGS_GAME_PAUSED) && !GameServer()->m_World.m_ResetRequested) { if(m_GameFlags&GAMEFLAG_SURVIVAL) DoWincheckRound(); else DoWincheckMatch(); } }