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; }
//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; }
CvPlot* CvPlayerAI::FindBestMusicianTargetPlot(CvUnit* pGreatMusician, bool bOnlySafePaths) { CvAssertMsg(pGreatMusician, "pGreatMusician is null"); if(!pGreatMusician) { return NULL; } int iBestTurnsToReach = MAX_INT; CvPlot* pBestTargetPlot = NULL; CvCity* pBestTargetCity = NULL; int iPathTurns; UnitHandle pMusician = UnitHandle(pGreatMusician); // Find target civ PlayerTypes eTargetPlayer = GetCulture()->GetCivLowestInfluence(true /*bCheckOpenBorders*/); if (eTargetPlayer == NO_PLAYER) { return NULL; } CvPlayer &kTargetPlayer = GET_PLAYER(eTargetPlayer); // Loop through each of that player's cities int iLoop; CvCity *pLoopCity; for(pLoopCity = kTargetPlayer.firstCity(&iLoop); pLoopCity != NULL; pLoopCity = kTargetPlayer.nextCity(&iLoop)) { // Search all the plots adjacent to this city for(int jJ = 0; jJ < NUM_DIRECTION_TYPES; jJ++) { CvPlot* pAdjacentPlot = plotDirection(pLoopCity->getX(), pLoopCity->getY(), ((DirectionTypes)jJ)); if(pAdjacentPlot != NULL) { // Make sure this is still owned by target and is revealed to us bool bRightOwner = (pAdjacentPlot->getOwner() == eTargetPlayer); bool bIsRevealed = pAdjacentPlot->isRevealed(getTeam()); if(bRightOwner && bIsRevealed) { iPathTurns = TurnsToReachTarget(pMusician, pAdjacentPlot, true /*bReusePaths*/, !bOnlySafePaths/*bIgnoreUnits*/); if(iPathTurns < iBestTurnsToReach) { iBestTurnsToReach = iPathTurns; pBestTargetCity = pLoopCity; } } } } } // Found a city now look at ALL the plots owned by that player near that city if (pBestTargetCity) { iBestTurnsToReach = MAX_INT; CvPlot *pLoopPlot; for(int iJ = 0; iJ < NUM_CITY_PLOTS; iJ++) { pLoopPlot = plotCity(pBestTargetCity->getX(), pBestTargetCity->getY(), iJ); if(pLoopPlot != NULL) { // Make sure this is still owned by target and is revealed to us bool bRightOwner = (pLoopPlot->getOwner() == eTargetPlayer); bool bIsRevealed = pLoopPlot->isRevealed(getTeam()); if(bRightOwner && bIsRevealed) { iPathTurns = TurnsToReachTarget(pMusician, pLoopPlot, true /*bReusePaths*/, !bOnlySafePaths/*bIgnoreUnits*/); if(iPathTurns < iBestTurnsToReach) { iBestTurnsToReach = iPathTurns; pBestTargetPlot = pLoopPlot; } } } } } return pBestTargetPlot; }
//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::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; }
void FInternationalization::GetCulturesWithAvailableLocalization(const TArray<FString>& InLocalizationPaths, TArray< FCultureRef >& OutAvailableCultures, const bool bIncludeDerivedCultures) { OutAvailableCultures.Reset(); TArray<FString> AllLocalizationFolders; IFileManager& FileManager = IFileManager::Get(); for(const auto& LocalizationPath : InLocalizationPaths) { /* Visitor class used to enumerate directories of culture */ class FCultureEnumeratorVistor : public IPlatformFile::FDirectoryVisitor { public: FCultureEnumeratorVistor( TArray<FString>& OutLocalizationFolders ) : LocalizationFolders(OutLocalizationFolders) { } virtual bool Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory) override { if(bIsDirectory) { // UE localization resource folders use "en-US" style while ICU uses "en_US" const FString LocalizationFolder = FPaths::GetCleanFilename(FilenameOrDirectory); const FString CanonicalName = FCulture::GetCanonicalName(LocalizationFolder); LocalizationFolders.AddUnique(CanonicalName); } return true; } /** Array to fill with the names of the UE localization folders available at the given path */ TArray<FString>& LocalizationFolders; }; FCultureEnumeratorVistor CultureEnumeratorVistor(AllLocalizationFolders); FileManager.IterateDirectory(*LocalizationPath, CultureEnumeratorVistor); } // Find any cultures that are a partial match for those we have translations for. if(bIncludeDerivedCultures) { TArray<FString> CultureNames; GetCultureNames(CultureNames); for(const FString& CultureName : CultureNames) { FCulturePtr Culture = GetCulture(CultureName); if (Culture.IsValid()) { TArray<FString> PrioritizedParentCultureNames = Culture->GetPrioritizedParentCultureNames(); for (const FString& PrioritizedParentCultureName : PrioritizedParentCultureNames) { if(AllLocalizationFolders.Contains(PrioritizedParentCultureName)) { OutAvailableCultures.AddUnique(Culture.ToSharedRef()); break; } } } } } // Find any cultures that are a complete match for those we have translations for. else { for(const FString& LocalizationFolder : AllLocalizationFolders) { FCulturePtr Culture = GetCulture(LocalizationFolder); if(Culture.IsValid()) { OutAvailableCultures.AddUnique(Culture.ToSharedRef()); } } } // Remove any cultures that were explicitly disabled OutAvailableCultures.RemoveAll([&](const FCultureRef& InCulture) -> bool { return Implementation->IsCultureDisabled(InCulture->GetName()); }); }