TechTypes getDiscoveryTech(UnitTypes eUnit, PlayerTypes ePlayer) { TechTypes eBestTech = NO_TECH; CvPlayerAI& kPlayer = GET_PLAYER(ePlayer); CvUnitEntry* pkUnitInfo = GC.getUnitInfo(eUnit); if(pkUnitInfo) { int iBestValue = 0; for(int iI = 0; iI < GC.getNumTechInfos(); iI++) { const TechTypes eTech = static_cast<TechTypes>(iI); CvTechEntry* pkTechInfo = GC.getTechInfo(eTech); if(pkTechInfo) { if(kPlayer.GetPlayerTechs()->CanResearch(eTech)) { int iValue = 0; for(int iJ = 0; iJ < GC.getNumFlavorTypes(); iJ++) { iValue += (pkTechInfo->GetFlavorValue(iJ) * pkUnitInfo->GetFlavorValue(iJ)); } if(iValue > iBestValue) { iBestValue = iValue; eBestTech = eTech; } } } } } return eBestTech; }
AdvisorTypes CvAdvisorRecommender::FindUnassignedAdvisorForBuildable (PlayerTypes /*ePlayer*/, CvCityBuildable& buildable) { int aiAdvisorValues[NUM_ADVISOR_TYPES]; for (uint ui = 0; ui < NUM_ADVISOR_TYPES; ui++) { aiAdvisorValues[ui] = 0; } CvBuildingEntry* pBuilding = NULL; CvUnitEntry* pUnit = NULL; CvProjectEntry* pProject = NULL; switch (buildable.m_eBuildableType) { case CITY_BUILDABLE_UNIT: pUnit = GC.getUnitInfo((UnitTypes)buildable.m_iIndex); break; case CITY_BUILDABLE_BUILDING: pBuilding = GC.getBuildingInfo((BuildingTypes)buildable.m_iIndex); break; case CITY_BUILDABLE_PROJECT: pProject = GC.getProjectInfo((ProjectTypes)buildable.m_iIndex); break; } for (int i = 0; i < GC.getNumFlavorTypes(); i++) { FlavorTypes eFlavor = (FlavorTypes)i; int iFlavorValue = 0; if (pBuilding) { iFlavorValue = pBuilding->GetFlavorValue(eFlavor); } else if (pUnit) { iFlavorValue = pUnit->GetFlavorValue(eFlavor); } else if (pProject) { iFlavorValue = pProject->GetFlavorValue(eFlavor); } if (iFlavorValue <= 0) { continue; } for (uint uiAdvisor = 0; uiAdvisor < NUM_ADVISOR_TYPES; uiAdvisor++) { AdvisorTypes eAdvisor = (AdvisorTypes)uiAdvisor; aiAdvisorValues[uiAdvisor] += iFlavorValue * AdvisorInterestInFlavor(eAdvisor, eFlavor); } } AdvisorTypes eWinningAdvisor = NO_ADVISOR_TYPE; int iHighestValue = 0; for (uint ui = 0; ui < NUM_ADVISOR_TYPES; ui++) { // skip this advisor if already assigned if (m_aRecommendedBuilds[ui].m_eBuildableType != NOT_A_CITY_BUILDABLE) { continue; } if (aiAdvisorValues[ui] > iHighestValue) { eWinningAdvisor = (AdvisorTypes)ui; iHighestValue = aiAdvisorValues[ui]; } } return eWinningAdvisor; }