CvCity::allUpgradesAvailable(UnitTypes, int) const
- Defined in
- CvCity.cpp, line 2495
- Class
- CvCity
- Hook name
CivHooks::CvCity_allUpgradesAvailable
Hooks
static bool BeforeCvCity_allUpgradesAvailable(const CvCity* self, UnitTypes eUnit, int iUpgradeCount, UnitTypes& result);static void AfterCvCity_allUpgradesAvailable(const CvCity* self, UnitTypes eUnit, int iUpgradeCount, UnitTypes& result);static UnitTypes ReplaceCvCity_allUpgradesAvailable(UnitTypes (*original)(const CvCity*, UnitTypes, int), const CvCity* self, UnitTypes eUnit, int iUpgradeCount);CivRegisterBefore<CivHooks::CvCity_allUpgradesAvailable>(host, &BeforeCvCity_allUpgradesAvailable);CivRegisterAfter<CivHooks::CvCity_allUpgradesAvailable>(host, &AfterCvCity_allUpgradesAvailable);CivRegisterReplace<CivHooks::CvCity_allUpgradesAvailable>(host, &ReplaceCvCity_allUpgradesAvailable);
Code
2494// Returns one of the upgrades...2495UnitTypes CvCity::allUpgradesAvailable(UnitTypes eUnit, int iUpgradeCount) const2496{2497 VALIDATE_OBJECT2498 UnitTypes eUpgradeUnit;2499 bool bUpgradeFound;2500 bool bUpgradeAvailable;2501 bool bUpgradeUnavailable;25022503 CvAssertMsg(eUnit != NO_UNIT, "eUnit is expected to be assigned (not NO_UNIT)");25042505 CvUnitEntry* pkUnitInfo = GC.getUnitInfo(eUnit);2506 if(pkUnitInfo == NULL)2507 return NO_UNIT;25082509 if(iUpgradeCount > GC.getNumUnitClassInfos())2510 {2511 return NO_UNIT;2512 }25132514 eUpgradeUnit = NO_UNIT;25152516 bUpgradeFound = false;2517 bUpgradeAvailable = false;2518 bUpgradeUnavailable = false;25192520 CvCivilizationInfo& thisCiv = getCivilizationInfo();25212522 for(int iI = 0; iI < GC.getNumUnitClassInfos(); iI++)2523 {2524 const UnitClassTypes eUnitClass = static_cast<UnitClassTypes>(iI);2525 CvUnitClassInfo* pkUnitClassInfo = GC.getUnitClassInfo(eUnitClass);2526 if(pkUnitClassInfo)2527 {2528 if(pkUnitInfo->GetUpgradeUnitClass(iI))2529 {2530 const UnitTypes eLoopUnit = (UnitTypes) thisCiv.getCivilizationUnits(iI);25312532 if(eLoopUnit != NO_UNIT)2533 {2534 bUpgradeFound = true;25352536 const UnitTypes eTempUnit = allUpgradesAvailable(eLoopUnit, (iUpgradeCount + 1));25372538 if(eTempUnit != NO_UNIT)2539 {2540 eUpgradeUnit = eTempUnit;2541 bUpgradeAvailable = true;2542 }2543 else2544 {2545 bUpgradeUnavailable = true;2546 }2547 }2548 }2549 }2550 }25512552 if(iUpgradeCount > 0)2553 {2554 if(bUpgradeFound && bUpgradeAvailable)2555 {2556 CvAssertMsg(eUpgradeUnit != NO_UNIT, "eUpgradeUnit is expected to be assigned (not NO_UNIT)");2557 return eUpgradeUnit;2558 }25592560 if(canTrain(eUnit, false, false, false, true))2561 {2562 return eUnit;2563 }2564 }2565 else2566 {2567 if(bUpgradeFound && !bUpgradeUnavailable)2568 {2569 return eUpgradeUnit;2570 }2571 }25722573 return NO_UNIT;2574}
Calls
- CvCity::canTrain(UnitTypes, bool, bool, bool, bool, CvString *) const
- CvCity::getCivilizationInfo() const
- CvCivilizationInfo::getCivilizationUnits(int) const
- CvGlobals::getNumUnitClassInfos()
- CvGlobals::getUnitClassInfo(UnitClassTypes)
- CvGlobals::getUnitInfo(UnitTypes)
- CvUnitEntry::GetUpgradeUnitClass(int) const