Hooks
static bool BeforeCvAdvisorRecommender_UpdateCityRecommendations(CvAdvisorRecommender* self, CvCity* pCity);static void AfterCvAdvisorRecommender_UpdateCityRecommendations(CvAdvisorRecommender* self, CvCity* pCity);static void ReplaceCvAdvisorRecommender_UpdateCityRecommendations(void (*original)(CvAdvisorRecommender*, CvCity*), CvAdvisorRecommender* self, CvCity* pCity);CivRegisterBefore<CivHooks::CvAdvisorRecommender_UpdateCityRecommendations>(host, &BeforeCvAdvisorRecommender_UpdateCityRecommendations);CivRegisterAfter<CivHooks::CvAdvisorRecommender_UpdateCityRecommendations>(host, &AfterCvAdvisorRecommender_UpdateCityRecommendations);CivRegisterReplace<CivHooks::CvAdvisorRecommender_UpdateCityRecommendations>(host, &ReplaceCvAdvisorRecommender_UpdateCityRecommendations);
Code
53void CvAdvisorRecommender::UpdateCityRecommendations(CvCity* pCity)54{55 ResetCity();5657 CvCityStrategyAI* pCityStrategy = pCity->GetCityStrategyAI();5859 RandomNumberDelegate fcn = MakeDelegate(&GC.getGame(), &CvGame::getAsyncRandNum);;6061 CvCityBuildable buildable;62 int iWeight;6364 // buildings65 for(int iBuildingLoop = 0; iBuildingLoop < GC.GetGameBuildings()->GetNumBuildings(); iBuildingLoop++)66 {67 BuildingTypes eBuilding = (BuildingTypes)iBuildingLoop;68 if(!pCity->canConstruct(eBuilding))69 {70 continue;71 }7273 buildable.m_eBuildableType = CITY_BUILDABLE_BUILDING;74 buildable.m_iIndex = iBuildingLoop;75 buildable.m_iTurnsToConstruct = pCity->getProductionTurnsLeft(eBuilding, 0);7677 iWeight = pCityStrategy->GetBuildingProductionAI()->GetWeight(eBuilding);78 m_aCityBuildables.push_back(buildable, iWeight);79 }8081 // units82 for(int iUnitLoop = 0; iUnitLoop < GC.GetGameUnits()->GetNumUnits(); iUnitLoop++)83 {84 UnitTypes eUnit = (UnitTypes)iUnitLoop;85 if(!pCity->canTrain(eUnit))86 {87 continue;88 }8990 buildable.m_eBuildableType = CITY_BUILDABLE_UNIT;91 buildable.m_iIndex = iUnitLoop;92 buildable.m_iTurnsToConstruct = pCity->getProductionTurnsLeft(eUnit, 0);93 iWeight = pCityStrategy->GetUnitProductionAI()->GetWeight(eUnit);94 m_aCityBuildables.push_back(buildable, iWeight);95 }9697 // projects98 for(int iProjectLoop = 0; iProjectLoop < GC.GetGameProjects()->GetNumProjects(); iProjectLoop++)99 {100 ProjectTypes eProject = (ProjectTypes)iProjectLoop;101 if(!pCity->canCreate(eProject))102 {103 continue;104 }105106 buildable.m_eBuildableType = CITY_BUILDABLE_PROJECT;107 buildable.m_iIndex = iProjectLoop;108 buildable.m_iTurnsToConstruct = pCity->getProductionTurnsLeft(eProject, 0);109 iWeight = pCityStrategy->GetProjectProductionAI()->GetWeight(eProject);110 m_aCityBuildables.push_back(buildable, iWeight);111 }112113 // reweigh by cost114 for(int iI = 0; iI < m_aCityBuildables.size(); iI++)115 {116 buildable = m_aCityBuildables.GetElement(iI);117118 // Compute the new weight and change it119 int iNewWeight = CityStrategyAIHelpers::ReweightByTurnsLeft(m_aCityBuildables.GetWeight(iI), buildable.m_iTurnsToConstruct);120 m_aCityBuildables.SetWeight(iI, iNewWeight);121 }122123 m_aCityBuildables.SortItems();124125 // move top buildables into final round!126 for(int i = 0; i < NUM_ADVISOR_TYPES; i++)127 {128 // if index is out of bounds129 if(i >= m_aCityBuildables.size())130 {131 break;132 }133134 m_aFinalRoundBuildables.push_back(m_aCityBuildables.GetElement(i), m_aCityBuildables.GetWeight(i));135 }136137 for(int i = 0; i < m_aFinalRoundBuildables.size(); i++)138 {139 m_aFinalRoundBuildables.SortItems();140141 buildable = m_aFinalRoundBuildables.GetElement(0);142 int iScore = m_aFinalRoundBuildables.GetWeight(0);143144 AdvisorTypes eAvailableAdvisor = FindUnassignedAdvisorForBuildable(pCity->getOwner(), buildable);145 if(eAvailableAdvisor != NO_ADVISOR_TYPE)146 {147 m_aRecommendedBuilds[eAvailableAdvisor] = buildable;148 }149150 m_aFinalRoundBuildables.SetWeight(0, iScore / 2);151 }152}