Hooks
static bool BeforeCvGame_init(CvGame* self, HandicapTypes eHandicap);static void AfterCvGame_init(CvGame* self, HandicapTypes eHandicap);static void ReplaceCvGame_init(void (*original)(CvGame*, HandicapTypes), CvGame* self, HandicapTypes eHandicap);CivRegisterBefore<CivHooks::CvGame_init>(host, &BeforeCvGame_init);CivRegisterAfter<CivHooks::CvGame_init>(host, &AfterCvGame_init);CivRegisterReplace<CivHooks::CvGame_init>(host, &ReplaceCvGame_init);
Code
170void CvGame::init(HandicapTypes eHandicap)171{172 bool bValid;173 int iStartTurn;174 int iEstimateEndTurn;175 int iI;176177 //--------------------------------178 // Init saved data179 reset(eHandicap);180181 //--------------------------------182 // Init containers183 m_voteSelections.Init();184 m_votesTriggered.Init();185186 if(!isGameMultiPlayer())187 {188 m_jonRand.setCallStackDebuggingEnabled(false);189 }190191 m_mapRand.init(CvPreGame::mapRandomSeed() % 73637381);192 m_jonRand.init(CvPreGame::syncRandomSeed() % 52319761);193194 //--------------------------------195 // Verify pregame data196197 //Validate game era. If we lack the era info for the current era, work backwards until we find a valid one.198 if(!GC.getEraInfo(getStartEra())){199 for(int eraIdx = ((int)CvPreGame::era())-1; eraIdx >= 0; --eraIdx){200 CvEraInfo* curEraInfo = GC.getEraInfo((EraTypes)eraIdx);201 if(curEraInfo){202 CvPreGame::setEra((EraTypes)eraIdx);203 break;204 }205 }206 }207208 //--------------------------------209 // Init non-saved data210211 //--------------------------------212 // Init other game data213214 // Turn off all MP options if it's a single player game215 GameTypes g = CvPreGame::gameType();216 if(g == GAME_SINGLE_PLAYER)217 {218 for(iI = 0; iI < NUM_MPOPTION_TYPES; ++iI)219 {220 setMPOption((MultiplayerOptionTypes)iI, false);221 }222223 setOption(GAMEOPTION_SIMULTANEOUS_TURNS, false);224 setOption(GAMEOPTION_DYNAMIC_TURNS, false);225 setOption(GAMEOPTION_PITBOSS, false);226 }227228 // If this is a hot seat game, simultaneous turns is always off229 if(isHotSeat() || isPbem())230 {231 setOption(GAMEOPTION_SIMULTANEOUS_TURNS, false);232 setOption(GAMEOPTION_DYNAMIC_TURNS, false);233 setOption(GAMEOPTION_PITBOSS, false);234 }235236 if(isMPOption(MPOPTION_SHUFFLE_TEAMS))237 {238 int aiTeams[MAX_CIV_PLAYERS];239240 int iNumPlayers = 0;241 for(int i = 0; i < MAX_CIV_PLAYERS; i++)242 {243 if(CvPreGame::slotStatus((PlayerTypes)i) == SS_TAKEN)244 {245 aiTeams[iNumPlayers] = CvPreGame::teamType((PlayerTypes)i);246 ++iNumPlayers;247 }248 }249250 for(int i = 0; i < iNumPlayers; i++)251 {252#if defined(MOD_BUGFIX_RANDOM)253 int j = (getJonRandNum(iNumPlayers - i, NULL) + i);254#else255 int j = (getJonRand().get(iNumPlayers - i, NULL) + i);256#endif257258 if(i != j)259 {260 int iTemp = aiTeams[i];261 aiTeams[i] = aiTeams[j];262 aiTeams[j] = iTemp;263 }264 }265266 iNumPlayers = 0;267 for(int i = 0; i < MAX_CIV_PLAYERS; i++)268 {269 if(CvPreGame::slotStatus((PlayerTypes)i) == SS_TAKEN)270 {271 CvPreGame::setTeamType((PlayerTypes)i, (TeamTypes)aiTeams[iNumPlayers]);272 ++iNumPlayers;273 }274 }275 }276277 if(isOption(GAMEOPTION_LOCK_MODS))278 {279 if(isGameMultiPlayer())280 {281 setOption(GAMEOPTION_LOCK_MODS, false);282 }283 else284 {285 static const int iPasswordSize = 8;286 char szRandomPassword[iPasswordSize];287 for(int i = 0; i < iPasswordSize-1; i++)288 {289 szRandomPassword[i] = getJonRandNum(128, "Random Keyword");290 }291 szRandomPassword[iPasswordSize-1] = 0;292293 CvString strRandomPassword = szRandomPassword;294 CvPreGame::setAdminPassword(strRandomPassword);295 }296 }297298 CvGameSpeedInfo& kGameSpeedInfo = getGameSpeedInfo();299 if(getGameTurn() == 0)300 {301 iStartTurn = 0;302303 for(iI = 0; iI < kGameSpeedInfo.getNumTurnIncrements(); iI++)304 {305 iStartTurn += kGameSpeedInfo.getGameTurnInfo(iI).iNumGameTurnsPerIncrement;306 }307308 CvEraInfo& kEraInfo = getStartEraInfo();309310 iStartTurn *= kEraInfo.getStartPercent();311 iStartTurn /= 100;312313 setGameTurn(iStartTurn);314315 if (kEraInfo.isNoReligion())316 {317 CvPreGame::SetGameOption(GAMEOPTION_NO_RELIGION, true);318 }319 }320321 setStartTurn(getGameTurn());322323 iEstimateEndTurn = 0;324325 for(iI = 0; iI < kGameSpeedInfo.getNumTurnIncrements(); iI++)326 {327 iEstimateEndTurn += kGameSpeedInfo.getGameTurnInfo(iI).iNumGameTurnsPerIncrement;328 }329330 setDefaultEstimateEndTurn(iEstimateEndTurn);331332 if(getMaxTurns() == 0)333 {334335 setEstimateEndTurn(iEstimateEndTurn);336337 if(getEstimateEndTurn() > getGameTurn())338 {339 bValid = false;340341 for(iI = 0; iI < GC.getNumVictoryInfos(); iI++)342 {343 VictoryTypes eVictory = static_cast<VictoryTypes>(iI);344 CvVictoryInfo* pkVictoryInfo = GC.getVictoryInfo(eVictory);345 if(pkVictoryInfo)346 {347 if(isVictoryValid(eVictory))348 {349 if(pkVictoryInfo->isEndScore())350 {351 bValid = true;352 break;353 }354 }355 }356357 }358359 if(bValid)360 {361 setMaxTurns(getEstimateEndTurn() - getGameTurn());362 }363 }364 }365 else366 {367 setEstimateEndTurn(getGameTurn() + getMaxTurns());368 }369370 setStartYear(GC.getSTART_YEAR());371372 for(iI = 0; iI < GC.getNumSpecialUnitInfos(); iI++)373 {374 SpecialUnitTypes eSpecialUnit = static_cast<SpecialUnitTypes>(iI);375 CvSpecialUnitInfo* pkSpecialUnitInfo = GC.getSpecialUnitInfo(eSpecialUnit);376 if(pkSpecialUnitInfo)377 {378 if(pkSpecialUnitInfo->isValid())379 {380 makeSpecialUnitValid(eSpecialUnit);381 }382 }383 }384385 if(isOption(GAMEOPTION_QUICK_COMBAT))386 {387 CvPreGame::setQuickCombat(true);388 }389390 m_bArchaeologyTriggered = false;391 CvGoodyHuts::Reset();392393 doUpdateCacheOnTurn();394#if defined(CIV_HOST_API)395 CivHostOnNewGame();396#endif397}