Bazaar developer reference

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

Called by