// --------------------------------------------------------------------------- UnitClassTypes CvGameQueries::GetLeastAdvancedUnitClassNobodyHas(bool bUseRandom /* = false */) { CvWeightedVector<int, SAFE_ESTIMATE_NUM_UNITS, true> UnitClassesVector; int iWeight; bool bValid; for (int i = 0; i < GC.getNumUnitClassInfos(); i++) { const UnitClassTypes eUnitClass = static_cast<UnitClassTypes>(i); CvUnitClassInfo* pkUnitClassInfo = GC.getUnitClassInfo(eUnitClass); if(pkUnitClassInfo) { const UnitTypes eDefaultUnit = (UnitTypes) pkUnitClassInfo->getDefaultUnitIndex(); // If the UnitClass doesn't have a Default Unit available to everyone, skip it if (eDefaultUnit == NO_UNIT) { continue; } CvUnitEntry* pkUnitInfo = GC.getUnitInfo(eDefaultUnit); if(pkUnitInfo == NULL) { continue; } // Only look at Land Units if (pkUnitInfo->GetDomainType() != DOMAIN_LAND) { continue; } // Only look at Military Units if (pkUnitInfo->GetCombat() <= 0) { continue; } const TechTypes ePrereqTech = (TechTypes) pkUnitInfo->GetPrereqAndTech(); // Unit has to require a Tech, otherwise it's too easy! if (ePrereqTech == NO_TECH) { continue; } CvTechEntry* pkTechInfo = GC.getTechInfo(ePrereqTech); if(pkTechInfo == NULL) { continue; } bValid = true; bool bAllPlayersHaveTech = true; for (int iMajorLoop = 0; iMajorLoop < MAX_MAJOR_CIVS; iMajorLoop++) { if (GET_PLAYER((PlayerTypes) iMajorLoop).isAlive()) { // If a player already has one of this Unit, throw it out - we want something more advanced if (GET_PLAYER((PlayerTypes) iMajorLoop).getUnitClassCount(eUnitClass) > 0) { bValid = false; break; } // Even if no one has this Unit lying around, if all players already have the Tech which unlocks it, throw it out - too easy if (bAllPlayersHaveTech && !GET_TEAM((TeamTypes) GET_PLAYER((PlayerTypes) iMajorLoop).getTeam()).GetTeamTechs()->HasTech(ePrereqTech)) { bAllPlayersHaveTech = false; } } } if (!bValid || bAllPlayersHaveTech) { continue; } iWeight = pkUnitInfo->GetPower(); // Add a Tech factor, since we want something in the near future, not too far off iWeight += (pkTechInfo->GetResearchCost() / 8); // Add a random bit so that the same Unit isn't ALWAYS picked if (bUseRandom) { iWeight += GC.getGame().getJonRandNum(iWeight / 10, "Minor Civ Quest: Gift Unit - Adding random weight to Unit Chosen"); } UnitClassesVector.push_back(i, iWeight); } } UnitClassesVector.SortItems(); //int iValue; bValid = true; for (int i = UnitClassesVector.size() - 1; i >= 0; i--) { const UnitClassTypes eUnitClass = (UnitClassTypes) UnitClassesVector.GetElement(i); // First Unit we find in this sorted Vector is our guy if (bValid) { return eUnitClass; } } return NO_UNITCLASS; }
/// Runs every turn to try and figure out what other known Players' Grand Strategies are void CvGrandStrategyAI::DoGuessOtherPlayersActiveGrandStrategy() { CvWeightedVector<int, 5, true> vGrandStrategyPriorities; FStaticVector< int, 5, true, c_eCiv5GameplayDLL > vGrandStrategyPrioritiesForLogging; GuessConfidenceTypes eGuessConfidence = NO_GUESS_CONFIDENCE_TYPE; int iGrandStrategiesLoop = 0; AIGrandStrategyTypes eGrandStrategy = NO_AIGRANDSTRATEGY; CvAIGrandStrategyXMLEntry* pGrandStrategy = 0; CvString strGrandStrategyName; CvTeam& pTeam = GET_TEAM(GetPlayer()->getTeam()); int iMajorLoop = 0; PlayerTypes eMajor = NO_PLAYER; int iPriority = 0; // Establish world Military strength average int iWorldMilitaryAverage = GC.getGame().GetWorldMilitaryStrengthAverage(GetPlayer()->GetID(), true, true); // Establish world culture and tourism averages int iNumPlayersAlive = 0; int iWorldCultureAverage = 0; int iWorldTourismAverage = 0; for(iMajorLoop = 0; iMajorLoop < MAX_MAJOR_CIVS; iMajorLoop++) { eMajor = (PlayerTypes) iMajorLoop; if(GET_PLAYER(eMajor).isAlive()) { iWorldCultureAverage += GET_PLAYER(eMajor).GetJONSCultureEverGenerated(); iWorldTourismAverage += GET_PLAYER(eMajor).GetCulture()->GetTourism(); iNumPlayersAlive++; } } iWorldCultureAverage /= iNumPlayersAlive; iWorldTourismAverage /= iNumPlayersAlive; // Establish world Tech progress average iNumPlayersAlive = 0; int iWorldNumTechsAverage = 0; TeamTypes eTeam; for(int iTeamLoop = 0; iTeamLoop < MAX_MAJOR_CIVS; iTeamLoop++) // Looping over all MAJOR teams { eTeam = (TeamTypes) iTeamLoop; if(GET_TEAM(eTeam).isAlive()) { iWorldNumTechsAverage += GET_TEAM(eTeam).GetTeamTechs()->GetNumTechsKnown(); iNumPlayersAlive++; } } iWorldNumTechsAverage /= iNumPlayersAlive; // Look at every Major we've met for(iMajorLoop = 0; iMajorLoop < MAX_MAJOR_CIVS; iMajorLoop++) { eMajor = (PlayerTypes) iMajorLoop; if(GET_PLAYER(eMajor).isAlive() && iMajorLoop != GetPlayer()->GetID()) { if(pTeam.isHasMet(GET_PLAYER(eMajor).getTeam())) { for(iGrandStrategiesLoop = 0; iGrandStrategiesLoop < GetAIGrandStrategies()->GetNumAIGrandStrategies(); iGrandStrategiesLoop++) { eGrandStrategy = (AIGrandStrategyTypes) iGrandStrategiesLoop; pGrandStrategy = GetAIGrandStrategies()->GetEntry(iGrandStrategiesLoop); strGrandStrategyName = (CvString) pGrandStrategy->GetType(); if(strGrandStrategyName == "AIGRANDSTRATEGY_CONQUEST") { iPriority = GetGuessOtherPlayerConquestPriority(eMajor, iWorldMilitaryAverage); } else if(strGrandStrategyName == "AIGRANDSTRATEGY_CULTURE") { iPriority = GetGuessOtherPlayerCulturePriority(eMajor, iWorldCultureAverage, iWorldTourismAverage); } else if(strGrandStrategyName == "AIGRANDSTRATEGY_UNITED_NATIONS") { iPriority = GetGuessOtherPlayerUnitedNationsPriority(eMajor); } else if(strGrandStrategyName == "AIGRANDSTRATEGY_SPACESHIP") { iPriority = GetGuessOtherPlayerSpaceshipPriority(eMajor, iWorldNumTechsAverage); } vGrandStrategyPriorities.push_back(iGrandStrategiesLoop, iPriority); vGrandStrategyPrioritiesForLogging.push_back(iPriority); } if(vGrandStrategyPriorities.size() > 0) { // Add "No Grand Strategy" in case we just don't have enough info to go on iPriority = /*40*/ GC.getAI_GRAND_STRATEGY_GUESS_NO_CLUE_WEIGHT(); vGrandStrategyPriorities.push_back(NO_AIGRANDSTRATEGY, iPriority); vGrandStrategyPrioritiesForLogging.push_back(iPriority); vGrandStrategyPriorities.SortItems(); eGrandStrategy = (AIGrandStrategyTypes) vGrandStrategyPriorities.GetElement(0); iPriority = vGrandStrategyPriorities.GetWeight(0); eGuessConfidence = NO_GUESS_CONFIDENCE_TYPE; // How confident are we in our Guess? if(eGrandStrategy != NO_AIGRANDSTRATEGY) { if(iPriority >= /*120*/ GC.getAI_GRAND_STRATEGY_GUESS_POSITIVE_THRESHOLD()) { eGuessConfidence = GUESS_CONFIDENCE_POSITIVE; } else if(iPriority >= /*70*/ GC.getAI_GRAND_STRATEGY_GUESS_LIKELY_THRESHOLD()) { eGuessConfidence = GUESS_CONFIDENCE_LIKELY; } else { eGuessConfidence = GUESS_CONFIDENCE_UNSURE; } } SetGuessOtherPlayerActiveGrandStrategy(eMajor, eGrandStrategy, eGuessConfidence); LogGuessOtherPlayerGrandStrategy(vGrandStrategyPrioritiesForLogging, eMajor); } vGrandStrategyPriorities.clear(); vGrandStrategyPrioritiesForLogging.clear(); } } } }