Bazaar developer reference

CvCityStrategyAI::UpdateBestYields()

Defined in
CvCityStrategyAI.cpp, line 1589
Class
CvCityStrategyAI
Hook name
CivHooks::CvCityStrategyAI_UpdateBestYields

Hooks

static bool BeforeCvCityStrategyAI_UpdateBestYields(CvCityStrategyAI* self);static void AfterCvCityStrategyAI_UpdateBestYields(CvCityStrategyAI* self);static void ReplaceCvCityStrategyAI_UpdateBestYields(void (*original)(CvCityStrategyAI*), CvCityStrategyAI* self);CivRegisterBefore<CivHooks::CvCityStrategyAI_UpdateBestYields>(host, &BeforeCvCityStrategyAI_UpdateBestYields);CivRegisterAfter<CivHooks::CvCityStrategyAI_UpdateBestYields>(host, &AfterCvCityStrategyAI_UpdateBestYields);CivRegisterReplace<CivHooks::CvCityStrategyAI_UpdateBestYields>(host, &ReplaceCvCityStrategyAI_UpdateBestYields);

Code

1589void CvCityStrategyAI::UpdateBestYields()1590{1591	m_eFocusYield = (YieldTypes)NO_YIELD;15921593	ResetBestYields();15941595#if defined(MOD_GLOBAL_CITY_WORKING)1596	int iPopulationToEvaluate = min(m_pCity->getPopulation() + 2, m_pCity->GetNumWorkablePlots());1597#else1598	int iPopulationToEvaluate = min(m_pCity->getPopulation() + 2, NUM_CITY_PLOTS);1599#endif1600	CvPlot* pPlot = NULL;1601	uint uiPlotsEvaluated = 0;16021603	struct ReverseSort1604	{1605		bool operator()(unsigned char ucA, unsigned char ucB)1606		{1607			return ucA > ucB;1608		}1609	};16101611#if defined(MOD_GLOBAL_CITY_WORKING)1612	for(int iPlotLoop = 0; iPlotLoop < m_pCity->GetNumWorkablePlots(); iPlotLoop++)1613#else1614	for(int iPlotLoop = 0; iPlotLoop < NUM_CITY_PLOTS; iPlotLoop++)1615#endif1616	{1617		// we want to evaluate the city plot1618		//if (iPlotLoop == CITY_HOME_PLOT)1619		//{1620		//	continue;1621		//}16221623		pPlot = m_pCity->GetCityCitizens()->GetCityPlotFromIndex(iPlotLoop);1624		if(!pPlot)1625		{1626			continue;1627		}16281629		CvCity* pWorkingCity = pPlot->getWorkingCity();1630		if(!pWorkingCity || pWorkingCity->GetID() != m_pCity->GetID())1631		{1632			continue;1633		}16341635		for(int iYield = 0; iYield < NUM_YIELD_TYPES; iYield++)1636		{1637			YieldTypes eYield = (YieldTypes)iYield;1638			int iYieldAmount = pPlot->getYield(eYield);16391640			m_acBestYields[iYield][uiPlotsEvaluated] = iYieldAmount;1641		}1642		uiPlotsEvaluated++;1643	}16441645	for(int iYield = 0; iYield < NUM_YIELD_TYPES; iYield++)1646	{1647		std::stable_sort(m_acBestYields[iYield], m_acBestYields[iYield] + uiPlotsEvaluated, ReverseSort());1648	}16491650	int iSlotsToEvaluate = MIN((int)uiPlotsEvaluated, iPopulationToEvaluate);1651	CvAssertMsg(iSlotsToEvaluate > 0, "iSlotsToEvaluate is zero, trying to div by 0");1652	if(iSlotsToEvaluate <= 0)1653	{1654		return;1655	}16561657	for(int iYield = 0; iYield < NUM_YIELD_TYPES; iYield++)1658	{1659		int iYieldSum = 0;1660		for(int iSlot = 0; iSlot < iSlotsToEvaluate; iSlot++)1661		{1662			iYieldSum += (m_acBestYields[iYield][iSlot] * 100);1663		}16641665		// add in additional food from the city plot and the city buildings that provide food1666		if(iYield == YIELD_FOOD)1667		{1668			int iCityYieldSum = 0;1669			iCityYieldSum = m_pCity->plot()->getYield(YIELD_FOOD);1670			CvYieldInfo* pYield = GC.getYieldInfo(YIELD_FOOD);1671			if(pYield)1672			{1673				iCityYieldSum -= pYield->getMinCity();1674			}16751676			CvCityBuildings* pCityBuildings = m_pCity->GetCityBuildings();1677			BuildingTypes eBuilding;1678			for(int iI = 0; iI < GC.getNumBuildingInfos(); iI++)1679			{1680				eBuilding = (BuildingTypes) iI;1681				CvBuildingEntry* pkBuildingInfo = GC.getBuildingInfo(eBuilding);1682				if(pkBuildingInfo)1683				{1684					if(pCityBuildings->GetNumBuilding(eBuilding) > 0)1685					{1686#if defined(MOD_BUGFIX_MINOR)1687						iCityYieldSum += pkBuildingInfo->GetYieldChange(iYield) * pCityBuildings->GetNumBuilding(eBuilding);1688#else1689						iCityYieldSum += pkBuildingInfo->GetYieldChange(iYield);1690#endif1691					}1692				}1693			}16941695			iYieldSum += iCityYieldSum * 100;1696		}16971698		m_asBestYieldAverageTimes100[iYield] = iYieldSum / iSlotsToEvaluate;16991700		CvAssertMsg(m_asBestYieldAverageTimes100[iYield] < 750, "Crazy high yield");1701	}17021703	CitySpecializationTypes eSpecialization = m_pCity->GetCityStrategyAI()->GetSpecialization();1704	if(eSpecialization == NO_CITY_SPECIALIZATION)1705	{1706		if(m_pCity->GetPlayer()->isHuman())1707		{1708			// find a specialization type according to the citizen focus type1709			CityAIFocusTypes eCityAIFocusTypes = m_pCity->GetCityCitizens()->GetFocusType();17101711			CvString strLookup;1712			switch(eCityAIFocusTypes)1713			{1714			case CITY_AI_FOCUS_TYPE_FOOD:1715				strLookup = "CITYSPECIALIZATION_SETTLER_PUMP";1716				break;1717			case CITY_AI_FOCUS_TYPE_GOLD:1718				strLookup = "CITYSPECIALIZATION_COMMERCE";1719				break;1720			}17211722			if(!strLookup.IsEmpty())1723			{1724				std::vector<CvCitySpecializationXMLEntry*> aCitySpecializations = GC.getCitySpecializationInfo();1725				for(uint ui = 0; ui < aCitySpecializations.size(); ui++)1726				{1727					CvCitySpecializationXMLEntry* pEntry = aCitySpecializations[ui];1728					if(pEntry->GetType() == strLookup)1729					{1730						eSpecialization = (CitySpecializationTypes)ui;1731						break;1732					}1733				}1734			}1735		}17361737		// if the human did not have a city ai specialization1738		if(eSpecialization == NO_CITY_SPECIALIZATION)1739		{1740			std::vector<CvCitySpecializationXMLEntry*> m_aCitySpecializations;1741			m_aCitySpecializations = GC.getCitySpecializationInfo();1742			for(uint ui = 0; ui < m_aCitySpecializations.size(); ui++)1743			{1744				if(m_aCitySpecializations[ui]->IsDefault())1745				{1746					eSpecialization = (CitySpecializationTypes)ui;1747					break;1748				}1749			}1750		}1751	}17521753	CvCitySpecializationXMLEntry* pEntry = NULL;1754	if(eSpecialization != NO_CITY_SPECIALIZATION)1755	{1756		pEntry = GC.getCitySpecializationInfo(eSpecialization);1757	}17581759	if(!pEntry)1760	{1761		return;1762	}17631764	for(int iYield = 0; iYield < NUM_YIELD_TYPES; iYield++)1765	{1766		m_asYieldDeltaTimes100[iYield] = m_asBestYieldAverageTimes100[iYield] - pEntry->GetYieldTargetTimes100((YieldTypes)iYield);1767	}17681769	m_eFocusYield = pEntry->GetYieldType();1770}

Calls

Called by