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
- CvBaseInfo::GetType() const
- CvBuildingEntry::GetYieldChange(int) const
- CvCity::GetCityBuildings() const
- CvCity::GetCityCitizens() const
- CvCity::GetCityStrategyAI() const
- CvCity::GetID() const
- CvCity::GetNumWorkablePlots(int) const
- CvCity::GetPlayer()
- CvCity::getPopulation(bool) const
- CvCity::plot() const
- CvCityBuildings::GetNumBuilding(BuildingTypes) const
- CvCityCitizens::GetCityPlotFromIndex(int) const
- CvCityCitizens::GetFocusType() const
- CvCitySpecializationXMLEntry::GetYieldTargetTimes100(YieldTypes) const
- CvCitySpecializationXMLEntry::GetYieldType() const
- CvCitySpecializationXMLEntry::IsDefault() const
- CvCityStrategyAI::GetSpecialization() const
- CvCityStrategyAI::ResetBestYields()
CvCityStrategyAI::ReverseSort::ReverseSort- CvGlobals::getBuildingInfo(BuildingTypes)
- CvGlobals::getCitySpecializationInfo()
- CvGlobals::getCitySpecializationInfo(CitySpecializationTypes)
- CvGlobals::getNumBuildingInfos()
- CvGlobals::getYieldInfo(YieldTypes)
- CvPlayer::isHuman() const
- CvPlot::getWorkingCity() const
- CvPlot::getYield(YieldTypes) const
CvString::CvStringCvString::IsEmptyCvString::operator=- CvYieldInfo::getMinCity() const
std::minstd::operator==std::stable_sortstd::vector::operator=std::vector::operator[]std::vector::sizestd::vector::vectorstd::vector::vector