bool isTechRequiredForUnit(TechTypes eTech, UnitTypes eUnit) { CvUnitEntry* info = GC.getUnitInfo(eUnit); if(info == NULL) { return false; } if(info->GetPrereqAndTech() == eTech) { return true; } for(int iI = 0; iI < GC.getNUM_UNIT_AND_TECH_PREREQS(); iI++) { if(info->GetPrereqAndTechs(iI) == eTech) { return true; } } return false; }
// --------------------------------------------------------------------------- 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; }