//AMS: Wait for some turns if no work slot is available. GreatPeopleDirectiveTypes CvPlayerAI::GetDirectiveWriter(CvUnit* pGreatWriter) { GreatPeopleDirectiveTypes eDirective = NO_GREAT_PEOPLE_DIRECTIVE_TYPE; // Defend against ideology pressure if not going for culture win if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && !GetDiplomacyAI()->IsGoingForCultureVictory() && GetCulture()->GetPublicOpinionUnhappiness() > 10) { eDirective = GREAT_PEOPLE_DIRECTIVE_CULTURE_BLAST; } // If not going for culture win and a Level 2 or 3 Tenet is available, try to snag it if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && !GetDiplomacyAI()->IsGoingForCultureVictory() && GetPlayerPolicies()->CanGetAdvancedTenet()) { eDirective = GREAT_PEOPLE_DIRECTIVE_CULTURE_BLAST; } // Create Great Work if there is a slot GreatWorkType eGreatWork = pGreatWriter->GetGreatWork(); if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GetEconomicAI()->GetBestGreatWorkCity(pGreatWriter->plot(), eGreatWork)) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } else if ((GC.getGame().getGameTurn() - pGreatWriter->getGameTurnCreated()) >= GC.getAI_HOMELAND_GREAT_PERSON_TURNS_TO_WAIT()) { eDirective = GREAT_PEOPLE_DIRECTIVE_CULTURE_BLAST; } //AMS: If still no directive, defaults at building great work. if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } return eDirective; }
GreatPeopleDirectiveTypes CvPlayerAI::GetDirectiveWriter(CvUnit* pGreatWriter) { GreatPeopleDirectiveTypes eDirective = NO_GREAT_PEOPLE_DIRECTIVE_TYPE; // Defend against ideology pressure if not going for culture win if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && !GetDiplomacyAI()->IsGoingForCultureVictory() && GetCulture()->GetPublicOpinionUnhappiness() > 10) { eDirective = GREAT_PEOPLE_DIRECTIVE_CULTURE_BLAST; } // If not going for culture win and a Level 2 or 3 Tenet is available, try to snag it if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && !GetDiplomacyAI()->IsGoingForCultureVictory() && GetPlayerPolicies()->CanGetAdvancedTenet()) { eDirective = GREAT_PEOPLE_DIRECTIVE_CULTURE_BLAST; } // Create Great Work if there is a slot GreatWorkType eGreatWork = pGreatWriter->GetGreatWork(); if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GetEconomicAI()->GetBestGreatWorkCity(pGreatWriter->plot(), eGreatWork)) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } else { eDirective = GREAT_PEOPLE_DIRECTIVE_CULTURE_BLAST; } return eDirective; }
CvPlot* CvPlayerAI::FindBestMerchantTargetPlot(CvUnit* pGreatMerchant, bool bOnlySafePaths) { CvAssertMsg(pGreatMerchant, "pGreatMerchant is null"); if(!pGreatMerchant) { return NULL; } int iBestTurnsToReach = MAX_INT; CvPlot* pBestTargetPlot = NULL; int iPathTurns; UnitHandle pMerchant = UnitHandle(pGreatMerchant); CvTeam& kTeam = GET_TEAM(getTeam()); // Loop through each city state for(int iI = 0; iI < MAX_PLAYERS; iI++) { CvPlayer& kPlayer = GET_PLAYER((PlayerTypes)iI); if(kPlayer.isMinorCiv()) { CvPlot* pCSPlot = kPlayer.getStartingPlot(); if(pCSPlot) { if(pCSPlot->isRevealed(getTeam())) { // Is this a minor we are friendly with? if(GetDiplomacyAI()->GetMinorCivApproach(kPlayer.GetID()) != MINOR_CIV_APPROACH_CONQUEST && !kTeam.isAtWar(kPlayer.getTeam()) && GetDiplomacyAI()->GetWarGoal(kPlayer.GetID()) == NO_WAR_GOAL_TYPE) { // Search all the plots adjacent to this city (since can't enter the minor city plot itself) for(int jJ = 0; jJ < NUM_DIRECTION_TYPES; jJ++) { CvPlot* pAdjacentPlot = plotDirection(pCSPlot->getX(), pCSPlot->getY(), ((DirectionTypes)jJ)); if(pAdjacentPlot != NULL) { // Make sure this is still owned by the city state and is revealed to us and isn't a water tile if(pAdjacentPlot->getOwner() == (PlayerTypes)iI && pAdjacentPlot->isRevealed(getTeam()) && !pAdjacentPlot->isWater()) { iPathTurns = TurnsToReachTarget(pMerchant, pAdjacentPlot, true /*bReusePaths*/, !bOnlySafePaths/*bIgnoreUnits*/); if(iPathTurns < iBestTurnsToReach) { iBestTurnsToReach = iPathTurns; pBestTargetPlot = pAdjacentPlot; } } } } } } } } } return pBestTargetPlot; }
GreatPeopleDirectiveTypes CvPlayerAI::GetDirectiveArtist(CvUnit* pGreatArtist) { GreatPeopleDirectiveTypes eDirective = NO_GREAT_PEOPLE_DIRECTIVE_TYPE; // Defend against ideology pressure if not going for culture win if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && !GetDiplomacyAI()->IsGoingForCultureVictory() && GetCulture()->GetPublicOpinionUnhappiness() > 10) { eDirective = GREAT_PEOPLE_DIRECTIVE_GOLDEN_AGE; } // If prepping for war, Golden Age will build units quickly if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && !GetDiplomacyAI()->IsGoingForCultureVictory() && PreparingForWar(this)) { eDirective = GREAT_PEOPLE_DIRECTIVE_GOLDEN_AGE; } // If finishing up spaceship parts, Golden Age will help build those quickly if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GetDiplomacyAI()->IsGoingForSpaceshipVictory() && EconomicAIHelpers::IsTestStrategy_GS_SpaceshipHomestretch(this)) { eDirective = GREAT_PEOPLE_DIRECTIVE_GOLDEN_AGE; } // If Persia and I'm at war, get a Golden Age going if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GetPlayerTraits()->GetGoldenAgeMoveChange() > 0 && GetMilitaryAI()->GetNumberCivsAtWarWith() > 1 && !isGoldenAge()) { eDirective = GREAT_PEOPLE_DIRECTIVE_GOLDEN_AGE; } // If Brazil and we're closing in on Culture Victory if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GetPlayerTraits()->GetGoldenAgeTourismModifier() > 0 && GetCulture()->GetNumCivsInfluentialOn() > (GC.getGame().GetGameCulture()->GetNumCivsInfluentialForWin() / 4)) { eDirective = GREAT_PEOPLE_DIRECTIVE_GOLDEN_AGE; } // Create Great Work if there is a slot GreatWorkType eGreatWork = pGreatArtist->GetGreatWork(); if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GetEconomicAI()->GetBestGreatWorkCity(pGreatArtist->plot(), eGreatWork)) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && !isGoldenAge() && ((GC.getGame().getGameTurn() - pGreatArtist->getGameTurnCreated()) >= GC.getAI_HOMELAND_GREAT_PERSON_TURNS_TO_WAIT())) { eDirective = GREAT_PEOPLE_DIRECTIVE_GOLDEN_AGE; } //AMS: If still no directive, defaults at building great work. if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } return eDirective; }
GreatPeopleDirectiveTypes CvPlayerAI::GetDirectiveScientist (CvUnit* pGreatScientist) { GreatPeopleDirectiveTypes eDirective = NO_GREAT_PEOPLE_DIRECTIVE_TYPE; if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && PreparingForWar(this) && !isGoldenAge()) { eDirective = GREAT_PEOPLE_DIRECTIVE_GOLDEN_AGE; } // If I'm in danger, use great person to get a tech if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && !IsSafe(this)) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GC.getGame().getGameTurn() <= ((GC.getGame().getEstimateEndTurn() * 1) / 4)) { if (GetDiplomacyAI()->IsGoingForSpaceshipVictory()) { eDirective = GREAT_PEOPLE_DIRECTIVE_CONSTRUCT_IMPROVEMENT; } } if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && (GC.getGame().getGameTurn() - pGreatScientist->getGameTurnCreated()) >= GC.getAI_HOMELAND_GREAT_PERSON_TURNS_TO_WAIT()) { // a free tech is not bad eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } return eDirective; }
GreatPeopleDirectiveTypes CvPlayerAI::GetDirectiveMerchant(CvUnit* pGreatMerchant) { GreatPeopleDirectiveTypes eDirective = NO_GREAT_PEOPLE_DIRECTIVE_TYPE; // if the merchant is in an army, he's already marching to a destination, so don't evaluate him if(pGreatMerchant->getArmyID() != FFreeList::INVALID_INDEX) { return NO_GREAT_PEOPLE_DIRECTIVE_TYPE; } if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GC.getGame().getGameTurn() <= ((GC.getGame().getEstimateEndTurn() * 2) / 4)) { if (GetDiplomacyAI()->IsGoingForDiploVictory()) { eDirective = GREAT_PEOPLE_DIRECTIVE_CONSTRUCT_IMPROVEMENT; } } // Attempt a run to a minor civ if(eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && IsSafe(this)) { CvPlot* pTarget = FindBestMerchantTargetPlot(pGreatMerchant, true); if(pTarget) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } } if(eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && (GC.getGame().getGameTurn() - pGreatMerchant->getGameTurnCreated()) >= GC.getAI_HOMELAND_GREAT_PERSON_TURNS_TO_WAIT()) { eDirective = GREAT_PEOPLE_DIRECTIVE_CONSTRUCT_IMPROVEMENT; } return eDirective; }
GreatPeopleDirectiveTypes CvPlayerAI::GetDirectiveEngineer(CvUnit* pGreatEngineer) { GreatPeopleDirectiveTypes eDirective = NO_GREAT_PEOPLE_DIRECTIVE_TYPE; // look for a wonder to rush if(eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE) { int iNextWonderWeight; BuildingTypes eNextWonderDesired = GetWonderProductionAI()->ChooseWonder(false /*bUseAsyncRandom*/, false /*bAdjustForOtherPlayers*/, iNextWonderWeight); if(eNextWonderDesired != NO_BUILDING) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } } if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GC.getGame().getGameTurn() <= ((GC.getGame().getEstimateEndTurn() * 3) / 4)) { if (GetDiplomacyAI()->IsGoingForWorldConquest()) { eDirective = GREAT_PEOPLE_DIRECTIVE_CONSTRUCT_IMPROVEMENT; } } if(eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && (GC.getGame().getGameTurn() - pGreatEngineer->getGameTurnCreated()) >= GC.getAI_HOMELAND_GREAT_PERSON_TURNS_TO_WAIT()) { eDirective = GREAT_PEOPLE_DIRECTIVE_CONSTRUCT_IMPROVEMENT; } return eDirective; }
void CvPlayerAI::AI_conquerCity(CvCity* pCity, PlayerTypes eOldOwner) { // Liberate a Minor's City? if (pCity->getOriginalOwner() != eOldOwner && pCity->getOriginalOwner() != GetID() && CanLiberatePlayer(eOldOwner)) { if (GET_PLAYER(pCity->getOriginalOwner()).isMinorCiv()) { if (GetDiplomacyAI()->DoPossibleMinorLiberation(pCity->getOriginalOwner(), pCity->GetID())) return; } } // Do we want to burn this city down? if (canRaze(pCity)) { // Burn the city if the empire is unhappy - keeping the city will only make things worse or if map hint dictates if (IsEmpireUnhappy() || (GC.getMap().GetAIMapHint() & 2)) { pCity->doTask(TASK_RAZE); return; } } // Puppet the city if (pCity->getOriginalOwner() != GetID()) { pCity->DoCreatePuppet(); } }
// AMS: AI will build academy more consistently. GreatPeopleDirectiveTypes CvPlayerAI::GetDirectiveScientist(CvUnit* /*pGreatScientist*/) { GreatPeopleDirectiveTypes eDirective = NO_GREAT_PEOPLE_DIRECTIVE_TYPE; // If I'm in danger, use great person to get a tech boost if(eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && !IsSafe(this)) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } if(eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GC.getGame().getGameTurn() <= ((GC.getGame().getEstimateEndTurn() * 1) / 3)) { if(GetDiplomacyAI()->IsGoingForSpaceshipVictory()) { eDirective = GREAT_PEOPLE_DIRECTIVE_CONSTRUCT_IMPROVEMENT; } else { //AMS: Even if not going spaceship right now, build academy 66% of times. if ((GC.getGame().getGameTurn()) % 3 != 0) { eDirective = GREAT_PEOPLE_DIRECTIVE_CONSTRUCT_IMPROVEMENT; } } } if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE) { // a tech boost is never bad eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } return eDirective; }
GreatPeopleDirectiveTypes CvPlayerAI::GetDirectiveArtist (CvUnit* pGreatArtist) { GreatPeopleDirectiveTypes eDirective = NO_GREAT_PEOPLE_DIRECTIVE_TYPE; if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && PreparingForWar(this) && !isGoldenAge()) { eDirective = GREAT_PEOPLE_DIRECTIVE_GOLDEN_AGE; } if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GC.getGame().getGameTurn() <= ((GC.getGame().getEstimateEndTurn() * 2) / 4)) { if (GetDiplomacyAI()->IsGoingForCultureVictory()) { eDirective = GREAT_PEOPLE_DIRECTIVE_CONSTRUCT_IMPROVEMENT; } } // gank territory from neighbor we don't like if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && IsSafe(this)) { int iScore = 0; CvPlot* pTargetPlot = FindBestArtistTargetPlot(pGreatArtist, iScore); if (pTargetPlot) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } } if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && (GC.getGame().getGameTurn() - pGreatArtist->getGameTurnCreated()) >= GC.getAI_HOMELAND_GREAT_PERSON_TURNS_TO_WAIT()) { eDirective = GetUnresolvedAction(this, pGreatArtist); } return eDirective; }
void CvPlayerAI::AI_chooseFreeGreatPerson() { while(GetNumFreeGreatPeople() > 0) { UnitTypes eDesiredGreatPerson = NO_UNIT; // Highly wonder competitive and still early in game? if(GetDiplomacyAI()->GetWonderCompetitiveness() >= 8 && GC.getGame().getGameTurn() <= (GC.getGame().getEstimateEndTurn() / 2)) { eDesiredGreatPerson = (UnitTypes)GC.getInfoTypeForString("UNIT_ENGINEER"); } else { // Pick the person based on our victory method AIGrandStrategyTypes eVictoryStrategy = GetGrandStrategyAI()->GetActiveGrandStrategy(); if(eVictoryStrategy == (AIGrandStrategyTypes) GC.getInfoTypeForString("AIGRANDSTRATEGY_CONQUEST")) { eDesiredGreatPerson = (UnitTypes)GC.getInfoTypeForString("UNIT_GREAT_GENERAL"); } else if(eVictoryStrategy == (AIGrandStrategyTypes) GC.getInfoTypeForString("AIGRANDSTRATEGY_CULTURE")) { eDesiredGreatPerson = (UnitTypes)GC.getInfoTypeForString("UNIT_ARTIST"); } else if(eVictoryStrategy == (AIGrandStrategyTypes) GC.getInfoTypeForString("AIGRANDSTRATEGY_UNITED_NATIONS")) { eDesiredGreatPerson = (UnitTypes)GC.getInfoTypeForString("UNIT_MERCHANT"); } else if(eVictoryStrategy == (AIGrandStrategyTypes) GC.getInfoTypeForString("AIGRANDSTRATEGY_SPACESHIP")) { eDesiredGreatPerson = (UnitTypes)GC.getInfoTypeForString("UNIT_SCIENTIST"); } } if(eDesiredGreatPerson != NO_UNIT) { CvCity* pCapital = getCapitalCity(); if(pCapital) { pCapital->GetCityCitizens()->DoSpawnGreatPerson(eDesiredGreatPerson, true, false); } ChangeNumFreeGreatPeople(-1); } else { break; } } }
//AMS: Instead of culture blast when created if no great work slot, we wait some turns until use... GreatPeopleDirectiveTypes CvPlayerAI::GetDirectiveMusician(CvUnit* pGreatMusician) { GreatPeopleDirectiveTypes eDirective = NO_GREAT_PEOPLE_DIRECTIVE_TYPE; // If headed on a concert tour, keep going if (pGreatMusician->getArmyID() != FFreeList::INVALID_INDEX) { eDirective = GREAT_PEOPLE_DIRECTIVE_TOURISM_BLAST; } // If closing in on a Culture win, go for the Concert Tour if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GetDiplomacyAI()->IsGoingForCultureVictory() && GetCulture()->GetNumCivsInfluentialOn() > (GC.getGame().GetGameCulture()->GetNumCivsInfluentialForWin() / 2)) { CvPlot* pTarget = FindBestMusicianTargetPlot(pGreatMusician, true); if(pTarget) { eDirective = GREAT_PEOPLE_DIRECTIVE_TOURISM_BLAST; } } // Create Great Work if there is a slot GreatWorkType eGreatWork = pGreatMusician->GetGreatWork(); if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GetEconomicAI()->GetBestGreatWorkCity(pGreatMusician->plot(), eGreatWork)) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } else if ((GC.getGame().getGameTurn() - pGreatMusician->getGameTurnCreated()) >= GC.getAI_HOMELAND_GREAT_PERSON_TURNS_TO_WAIT()) { CvPlot* pTarget = FindBestMusicianTargetPlot(pGreatMusician, true); if(pTarget) { eDirective = GREAT_PEOPLE_DIRECTIVE_TOURISM_BLAST; } } //AMS: If still no directive, defaults at building great work. if (eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE) { eDirective = GREAT_PEOPLE_DIRECTIVE_USE_POWER; } return eDirective; }
GreatPeopleDirectiveTypes CvPlayerAI::GetDirectiveArtist(CvUnit* /*pGreatArtist*/) { GreatPeopleDirectiveTypes eDirective = NO_GREAT_PEOPLE_DIRECTIVE_TYPE; if(eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && PreparingForWar(this) && !isGoldenAge()) { eDirective = GREAT_PEOPLE_DIRECTIVE_GOLDEN_AGE; } if(eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE && GC.getGame().getGameTurn() <= ((GC.getGame().getEstimateEndTurn() * 2) / 4)) { if(GetDiplomacyAI()->IsGoingForCultureVictory()) { eDirective = GREAT_PEOPLE_DIRECTIVE_CONSTRUCT_IMPROVEMENT; } } if(eDirective == NO_GREAT_PEOPLE_DIRECTIVE_TYPE) { eDirective = GREAT_PEOPLE_DIRECTIVE_GOLDEN_AGE; } return eDirective; }
void CvPlayerAI::AI_considerAnnex() { AI_PERF("AI-perf.csv", "AI_ considerAnnex"); // if the empire is unhappy, don't consider annexing if (IsEmpireUnhappy()) { return; } // if we're going for a culture victory, don't consider annexing if (GetDiplomacyAI()->IsGoingForCultureVictory()) { return; } // for Venice if (GetPlayerTraits()->IsNoAnnexing()) { return; } // if their capital city is puppeted, annex it CvCity* pCity = getCapitalCity(); if (pCity && pCity->IsPuppet()) { // we should only annex one city a turn, and sense this is one, we're done! pCity->DoAnnex(); return; } std::vector<CityAndProduction> aCityAndProductions; int iLoop = 0; pCity = NULL; // Find first coastal city in same area as settler for(pCity = firstCity(&iLoop); pCity != NULL; pCity = nextCity(&iLoop)) { CityAndProduction kEval; kEval.pCity = pCity; kEval.iProduction = pCity->getYieldRateTimes100(YIELD_PRODUCTION, false); aCityAndProductions.push_back(kEval); } std::stable_sort(aCityAndProductions.begin(), aCityAndProductions.end(), CityAndProductionEval()); CvCity* pTargetCity = NULL; float fCutoffValue = GC.getNORMAL_ANNEX(); BuildingClassTypes eCourthouseType = NO_BUILDINGCLASS; // find courthouse for(int eBuildingType = 0; eBuildingType < GC.getNumBuildingInfos(); eBuildingType++) { const BuildingTypes eBuilding = static_cast<BuildingTypes>(eBuildingType); CvBuildingEntry* buildingInfo = GC.getBuildingInfo(eBuilding); if(buildingInfo) { if (buildingInfo->IsNoOccupiedUnhappiness()) { eCourthouseType = (BuildingClassTypes)buildingInfo->GetBuildingClassType(); break; } } } bool bCourthouseImprovement = false; if (eCourthouseType != NO_BUILDINGCLASS) { if (GetPlayerPolicies()->GetBuildingClassProductionModifier(eCourthouseType) > 0) { bCourthouseImprovement = true; } } if (bCourthouseImprovement) { fCutoffValue = GC.getAGGRESIVE_ANNEX(); } uint uiCutOff = (uint)(aCityAndProductions.size() * fCutoffValue); for (uint ui = 0; ui < uiCutOff; ui++) { if (aCityAndProductions[ui].pCity->IsPuppet()) { pTargetCity = aCityAndProductions[ui].pCity; break; } } if (pTargetCity) { if (!pTargetCity->IsResistance()) { pTargetCity->DoAnnex(); } } }
void CvPlayerAI::AI_conquerCity(CvCity* pCity, PlayerTypes eOldOwner) { PlayerTypes eOriginalOwner = pCity->getOriginalOwner(); TeamTypes eOldOwnerTeam = GET_PLAYER(eOldOwner).getTeam(); // Liberate a city? if(eOriginalOwner != eOldOwner && eOriginalOwner != GetID() && CanLiberatePlayerCity(eOriginalOwner)) { // minor civ if(GET_PLAYER(eOriginalOwner).isMinorCiv()) { if(GetDiplomacyAI()->DoPossibleMinorLiberation(eOriginalOwner, pCity->GetID())) return; } else // major civ { bool bLiberate = false; if (GET_PLAYER(eOriginalOwner).isAlive()) { // If the original owner and this player have a defensive pact // and both the original owner and the player are at war with the old owner of this city // give the city back to the original owner TeamTypes eOriginalOwnerTeam = GET_PLAYER(eOriginalOwner).getTeam(); if (GET_TEAM(getTeam()).IsHasDefensivePact(eOriginalOwnerTeam) && GET_TEAM(getTeam()).isAtWar(eOldOwnerTeam) && GET_TEAM(eOriginalOwnerTeam).isAtWar(eOldOwnerTeam)) { bLiberate = true; } // if the player is a friend and we're going for diplo victory, then liberate to score some friend points else if (GetDiplomacyAI()->IsDoFAccepted(eOriginalOwner) && GetDiplomacyAI()->IsGoingForDiploVictory()) { bLiberate = true; } } // if the player isn't human and we're going for diplo victory, resurrect players to get super diplo bonuses else if (!GET_PLAYER(eOriginalOwner).isHuman() && GetDiplomacyAI()->IsGoingForDiploVictory()) { bLiberate = true; } if (bLiberate) { DoLiberatePlayer(eOriginalOwner, pCity->GetID()); return; } } } // Do we want to burn this city down? if(canRaze(pCity)) { // Burn the city if the empire is unhappy - keeping the city will only make things worse or if map hint dictates // Huns will burn down everything possible once they have a core of a few cities (was 3, but this put Attila out of the running long term as a conqueror) if (IsEmpireUnhappy() || (GC.getMap().GetAIMapHint() & 2) || (GetPlayerTraits()->GetRazeSpeedModifier() > 0 && getNumCities() >= 3 + (GC.getGame().getGameTurn() / 100)) ) { pCity->doTask(TASK_RAZE); return; } } // Puppet the city if(pCity->getOriginalOwner() != GetID() || GET_PLAYER(m_eID).GetPlayerTraits()->IsNoAnnexing()) { pCity->DoCreatePuppet(); } }
CvPlot* CvPlayerAI::FindBestArtistTargetPlot(CvUnit* pGreatArtist, int& iResultScore) { CvAssertMsg(pGreatArtist, "pGreatArtist is null"); if(!pGreatArtist) { return NULL; } iResultScore = 0; CvPlotsVector& m_aiPlots = GetPlots(); CvPlot* pBestPlot = NULL; int iBestScore = 0; // loop through plots and wipe out ones that are invalid const uint nPlots = m_aiPlots.size(); for(uint ui = 0; ui < nPlots; ui++) { if(m_aiPlots[ui] == -1) { continue; } CvPlot* pPlot = GC.getMap().plotByIndex(m_aiPlots[ui]); if(pPlot->isWater()) { continue; } if(!pPlot->IsAdjacentOwnedByOtherTeam(getTeam())) { continue; } // don't build over luxury resources ResourceTypes eResource = pPlot->getResourceType(); if(eResource != NO_RESOURCE) { CvResourceInfo* pkResource = GC.getResourceInfo(eResource); if(pkResource != NULL) { if (pkResource->getResourceUsage() == RESOURCEUSAGE_LUXURY) { continue; } } } // if no improvement can be built on this plot, then don't consider it FeatureTypes eFeature = pPlot->getFeatureType(); if (eFeature != NO_FEATURE && GC.getFeatureInfo(eFeature)->isNoImprovement()) { continue; } // Improvement already here? ImprovementTypes eImprovement = (ImprovementTypes)pPlot->getImprovementType(); if (eImprovement != NO_IMPROVEMENT) { CvImprovementEntry* pkImprovementInfo = GC.getImprovementInfo(eImprovement); if(pkImprovementInfo) { if (pkImprovementInfo->GetCultureBombRadius() > 0) { continue; } } } int iScore = 0; for(int iI = 0; iI < NUM_DIRECTION_TYPES; ++iI) { CvPlot* pAdjacentPlot = plotDirection(pPlot->getX(), pPlot->getY(), ((DirectionTypes)iI)); // if there's no plot, bail if(pAdjacentPlot == NULL) { continue; } // if the plot is ours or no one's, bail if(pAdjacentPlot->getTeam() == NO_TEAM || pAdjacentPlot->getTeam() == getTeam()) { continue; } // don't evaluate city plots since we don't get ownership of them with the bomb if(pAdjacentPlot->getPlotCity()) { continue; } const PlayerTypes eOtherPlayer = pAdjacentPlot->getOwner(); if(GET_PLAYER(eOtherPlayer).isMinorCiv()) { MinorCivApproachTypes eMinorApproach = GetDiplomacyAI()->GetMinorCivApproach(eOtherPlayer); // if we're friendly or protective, don't be a jerk. Bail out. if(eMinorApproach != MINOR_CIV_APPROACH_CONQUEST && eMinorApproach != MINOR_CIV_APPROACH_IGNORE) { iScore = 0; break; } } else { MajorCivApproachTypes eMajorApproach = GetDiplomacyAI()->GetMajorCivApproach(eOtherPlayer, true); DisputeLevelTypes eLandDisputeLevel = GetDiplomacyAI()->GetLandDisputeLevel(eOtherPlayer); bool bTicked = eMajorApproach == MAJOR_CIV_APPROACH_HOSTILE; bool bTickedAboutLand = eMajorApproach == MAJOR_CIV_APPROACH_NEUTRAL && (eLandDisputeLevel == DISPUTE_LEVEL_STRONG || eLandDisputeLevel == DISPUTE_LEVEL_FIERCE); // only bomb if we're hostile if(!bTicked && !bTickedAboutLand) { iScore = 0; break; } } eResource = pAdjacentPlot->getResourceType(); if(eResource != NO_RESOURCE) { iScore += GetBuilderTaskingAI()->GetResourceWeight(eResource, NO_IMPROVEMENT, pAdjacentPlot->getNumResource()) * 10; } else { for(int iYield = 0; iYield < NUM_YIELD_TYPES; iYield++) { iScore += pAdjacentPlot->getYield((YieldTypes)iYield); } } } if(iScore > iBestScore) { iBestScore = iScore; pBestPlot = pPlot; } } iResultScore = iBestScore; return pBestPlot; }
CvPlot* CvPlayerAI::FindBestMerchantTargetPlot(CvUnit* pGreatMerchant, bool bOnlySafePaths) { CvAssertMsg(pGreatMerchant, "pGreatMerchant is null"); if(!pGreatMerchant) { return NULL; } int iBestTurnsToReach = MAX_INT; CvPlot* pBestTargetPlot = NULL; int iPathTurns; UnitHandle pMerchant = UnitHandle(pGreatMerchant); CvTeam& kTeam = GET_TEAM(getTeam()); //bool bIsVenice = GetPlayerTraits()->IsNoAnnexing(); //bool bWantsCash = GreatMerchantWantsCash(); // Loop through each city state for(int iI = 0; iI < MAX_PLAYERS; iI++) { CvPlayer& kPlayer = GET_PLAYER((PlayerTypes)iI); if (!kPlayer.isMinorCiv()) { continue; } // if I'm Venice, I don't want to send a Merchant of Venice to a buy a city that I have trade routes // with because it's probably more valuable as a trade partner than as an owned entity //if (!bWantsCash) //{ // if (bIsVenice) // { // if (GetTrade()->IsConnectedToPlayer(kPlayer.GetID())) // { // continue; // } // } //} CvPlot* pCSPlot = kPlayer.getStartingPlot(); if (!pCSPlot) { continue; } if (!pCSPlot->isRevealed(getTeam())) { continue; } // Is this a minor we are friendly with? bool bMinorCivApproachIsCorrect = (GetDiplomacyAI()->GetMinorCivApproach(kPlayer.GetID()) != MINOR_CIV_APPROACH_CONQUEST); bool bNotAtWar = !kTeam.isAtWar(kPlayer.getTeam()); bool bNotPlanningAWar = GetDiplomacyAI()->GetWarGoal(kPlayer.GetID()) == NO_WAR_GOAL_TYPE; if(bMinorCivApproachIsCorrect && bNotAtWar && bNotPlanningAWar) { // Search all the plots adjacent to this city (since can't enter the minor city plot itself) for(int jJ = 0; jJ < NUM_DIRECTION_TYPES; jJ++) { CvPlot* pAdjacentPlot = plotDirection(pCSPlot->getX(), pCSPlot->getY(), ((DirectionTypes)jJ)); if(pAdjacentPlot != NULL) { // Make sure this is still owned by the city state and is revealed to us and isn't a water tile //if(pAdjacentPlot->getOwner() == (PlayerTypes)iI && pAdjacentPlot->isRevealed(getTeam()) && !pAdjacentPlot->isWater()) bool bRightOwner = (pAdjacentPlot->getOwner() == (PlayerTypes)iI); bool bIsRevealed = pAdjacentPlot->isRevealed(getTeam()); if(bRightOwner && bIsRevealed) { iPathTurns = TurnsToReachTarget(pMerchant, pAdjacentPlot, true /*bReusePaths*/, !bOnlySafePaths/*bIgnoreUnits*/); if(iPathTurns < iBestTurnsToReach) { iBestTurnsToReach = iPathTurns; pBestTargetPlot = pAdjacentPlot; } } } } } } return pBestTargetPlot; }