CvEconomicAI::DisbandExtraWorkers()
- Defined in
- CvEconomicAI.cpp, line 2297
- Class
- CvEconomicAI
- Hook name
CivHooks::CvEconomicAI_DisbandExtraWorkers
Hooks
static bool BeforeCvEconomicAI_DisbandExtraWorkers(CvEconomicAI* self);static void AfterCvEconomicAI_DisbandExtraWorkers(CvEconomicAI* self);static void ReplaceCvEconomicAI_DisbandExtraWorkers(void (*original)(CvEconomicAI*), CvEconomicAI* self);CivRegisterBefore<CivHooks::CvEconomicAI_DisbandExtraWorkers>(host, &BeforeCvEconomicAI_DisbandExtraWorkers);CivRegisterAfter<CivHooks::CvEconomicAI_DisbandExtraWorkers>(host, &AfterCvEconomicAI_DisbandExtraWorkers);CivRegisterReplace<CivHooks::CvEconomicAI_DisbandExtraWorkers>(host, &ReplaceCvEconomicAI_DisbandExtraWorkers);
Code
2297void CvEconomicAI::DisbandExtraWorkers()2298{2299 // Are we running at a deficit?2300 EconomicAIStrategyTypes eStrategyLosingMoney = (EconomicAIStrategyTypes) GC.getInfoTypeForString("ECONOMICAISTRATEGY_LOSING_MONEY");2301 bool bInDeficit = m_pPlayer->GetEconomicAI()->IsUsingStrategy(eStrategyLosingMoney);23022303 int iGoldSpentOnUnits = m_pPlayer->GetTreasury()->GetExpensePerTurnUnitMaintenance();2304 int iAverageGoldPerUnit = iGoldSpentOnUnits / (max(1,m_pPlayer->getNumUnits()));23052306#if defined(MOD_AI_SMART_V3)2307 // Disband more aggressively if at deficit.2308 int iDisbandLimit = MOD_AI_SMART_V3 ? 3 : 4;2309 if(!bInDeficit && iAverageGoldPerUnit <= iDisbandLimit) 2310#else2311 if(!bInDeficit && iAverageGoldPerUnit <= 4)2312#endif2313 {2314 return;2315 }23162317 //antonjs: consider: make calls to GetWorkersToCitiesRatio and GetImprovedToImprovablePlotsRatio instead, is the code similar enough?23182319 double fWorstCaseRatio = 0.25; // one worker for four cities2320 int iNumWorkers = m_pPlayer->GetNumUnitsWithUnitAI(UNITAI_WORKER, true, false);2321 int iNumCities = m_pPlayer->getNumCities();23222323 double fCurrentRatio = iNumWorkers / (double)iNumCities;2324 if(fCurrentRatio <= fWorstCaseRatio || iNumWorkers == 1)2325 {2326 return;2327 }23282329 const CvPlotsVector& aiPlots = m_pPlayer->GetPlots();2330 int iNumValidPlots = 0;2331 int iNumImprovedPlots = 0;2332 for(uint ui = 0; ui < aiPlots.size(); ui++)2333 {2334 if(aiPlots[ui] == -1)2335 {2336 continue;2337 }23382339 const CvPlot* pPlot = GC.getMap().plotByIndex(aiPlots[ui]);2340 if(!pPlot)2341 {2342 continue;2343 }23442345 if(pPlot->isWater() || pPlot->isImpassable() || pPlot->isMountain() || pPlot->isCity())2346 {2347 continue;2348 }23492350 iNumValidPlots++;23512352 if(pPlot->getImprovementType() != NO_IMPROVEMENT && !pPlot->IsImprovementPillaged())2353 {2354 iNumImprovedPlots++;2355 }2356 }23572358 // potential div by zero2359 if(iNumValidPlots <= 0)2360 {2361 return;2362 }23632364 int iNumUnimprovedPlots = iNumValidPlots - iNumImprovedPlots;23652366 // less than two thirds of the plots are improved, don't discard anybody2367 double fRatio = iNumImprovedPlots / (double)iNumValidPlots;2368 if(fRatio < 2/(double)3)2369 {2370 return;2371 }23722373 int iWorkersPerUnimprovedPlot = 5;2374 int iMinWorkers = iNumUnimprovedPlots / iWorkersPerUnimprovedPlot;2375 if((iNumUnimprovedPlots % iWorkersPerUnimprovedPlot) > 0)2376 {2377 iMinWorkers += 1;2378 }23792380 CvCity* pCapital = m_pPlayer->getCapitalCity();2381 if(!pCapital)2382 {2383 return;2384 }23852386 int iLoop;2387 CvCity* pCity;2388 for(pCity = m_pPlayer->firstCity(&iLoop); pCity != NULL; pCity = m_pPlayer->nextCity(&iLoop))2389 {2390 if(pCity == pCapital)2391 {2392 continue;2393 }23942395 if(pCapital->area() == pCity->area() && !pCity->IsRouteToCapitalConnected())2396 {2397 iMinWorkers += 1;2398 }2399 }240024012402 if(iNumWorkers <= iMinWorkers)2403 {2404 return;2405 }24062407 m_iLastTurnWorkerDisbanded = GC.getGame().getGameTurn();24082409 CvUnit* pUnit = FindWorkerToScrap();2410 if(!pUnit)2411 {2412 return;2413 }24142415 pUnit->scrap();2416 LogScrapUnit(pUnit, iNumWorkers, iNumCities, iNumImprovedPlots, iNumValidPlots);2417}
Calls
BaseVector::operator[]BaseVector::size- CustomMods::isAI_SMART_V3()
- CvCity::area() const
- CvCity::IsRouteToCapitalConnected() const
- CvEconomicAI::FindWorkerToScrap()
- CvEconomicAI::IsUsingStrategy(EconomicAIStrategyTypes)
- CvEconomicAI::LogScrapUnit(UnitHandle, int, int, int, int)
- CvGame::getGameTurn()
- CvGlobals::getGame()
- CvGlobals::getInfoTypeForString(const char *, bool) const
- CvGlobals::getMap()
- CvMap::plotByIndex(int) const
- CvPlayer::firstCity(int *, bool)
- CvPlayer::getCapitalCity()
- CvPlayer::GetEconomicAI() const
- CvPlayer::getNumCities() const
- CvPlayer::getNumUnits() const
- CvPlayer::GetNumUnitsWithUnitAI(UnitAITypes, bool, bool)
- CvPlayer::GetPlots()
- CvPlayer::GetTreasury() const
- CvPlayer::nextCity(int *, bool)
- CvPlot::getImprovementType() const
- CvPlot::isCity() const
- CvPlot::isImpassable() const
- CvPlot::IsImprovementPillaged() const
- CvPlot::isMountain() const
- CvPlot::isWater() const
- CvTreasury::GetExpensePerTurnUnitMaintenance()
- CvUnit::scrap()
FObjectHandle::FObjectHandlestd::max