Bazaar developer reference

CvAdvisorRecommender::UpdateCityRecommendations(CvCity *)

Defined in
CvAdvisorRecommender.cpp, line 53
Class
CvAdvisorRecommender
Hook name
CivHooks::CvAdvisorRecommender_UpdateCityRecommendations

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}

Calls

Called by