CvCity::addProductionExperience(CvUnit *, bool)
- Defined in
- CvCity.cpp, line 4015
- Class
- CvCity
- Hook name
CivHooks::CvCity_addProductionExperience
Hooks
static bool BeforeCvCity_addProductionExperience(CvCity* self, CvUnit* pUnit, bool bConscript);static void AfterCvCity_addProductionExperience(CvCity* self, CvUnit* pUnit, bool bConscript);static void ReplaceCvCity_addProductionExperience(void (*original)(CvCity*, CvUnit*, bool), CvCity* self, CvUnit* pUnit, bool bConscript);CivRegisterBefore<CivHooks::CvCity_addProductionExperience>(host, &BeforeCvCity_addProductionExperience);CivRegisterAfter<CivHooks::CvCity_addProductionExperience>(host, &AfterCvCity_addProductionExperience);CivRegisterReplace<CivHooks::CvCity_addProductionExperience>(host, &ReplaceCvCity_addProductionExperience);
Code
4015void CvCity::addProductionExperience(CvUnit* pUnit, bool bConscript)4016{4017 VALIDATE_OBJECT40184019 if(pUnit->canAcquirePromotionAny())4020 {4021#if defined(MOD_UNITS_XP_TIMES_100)4022 pUnit->changeExperienceTimes100(getProductionExperience(pUnit->getUnitType()) * 100 / ((bConscript) ? 2 : 1));4023#else4024 pUnit->changeExperience(getProductionExperience(pUnit->getUnitType()) / ((bConscript) ? 2 : 1));4025#endif4026 4027#if !defined(NO_ACHIEVEMENTS)4028 // XP2 Achievement4029 if (getOwner() != NO_PLAYER)4030 {4031 CvPlayer& kOwner = GET_PLAYER(getOwner());4032 if (!GC.getGame().isGameMultiPlayer() && kOwner.isHuman() && kOwner.isLocalPlayer())4033 {4034 // This unit begins with a promotion from XP, and part of that XP came from filled Great Work slots4035#if defined(MOD_UNITS_XP_TIMES_100)4036 if ((pUnit->getExperienceTimes100() / 100) >= pUnit->experienceNeeded() && getDomainFreeExperienceFromGreatWorks((DomainTypes)pUnit->getUnitInfo().GetDomainType()) > 0)4037#else4038 if (pUnit->getExperience() >= pUnit->experienceNeeded() && getDomainFreeExperienceFromGreatWorks((DomainTypes)pUnit->getUnitInfo().GetDomainType()) > 0)4039#endif4040 {4041 // We have a Royal Library4042 BuildingTypes eRoyalLibrary = (BuildingTypes) GC.getInfoTypeForString("BUILDING_ROYAL_LIBRARY", true);4043 if (eRoyalLibrary != NO_BUILDING && GetCityBuildings()->GetNumBuilding(eRoyalLibrary) > 0)4044 {4045 gDLL->UnlockAchievement(ACHIEVEMENT_XP2_19);4046 }4047 }4048 }4049 }4050#endif4051 }40524053 for(int iI = 0; iI < GC.getNumPromotionInfos(); iI++)4054 {4055 const PromotionTypes ePromotion = static_cast<PromotionTypes>(iI);4056 CvPromotionEntry* pkPromotionInfo = GC.getPromotionInfo(ePromotion);4057 if(pkPromotionInfo)4058 {4059 if(isFreePromotion(ePromotion))4060 {4061 if((pUnit->getUnitCombatType() != NO_UNITCOMBAT) && pkPromotionInfo->GetUnitCombatClass(pUnit->getUnitCombatType()))4062 {4063 pUnit->setHasPromotion(ePromotion, true);4064 }4065 }4066 }4067 }40684069 pUnit->testPromotionReady();4070}
Calls
- CvCity::getProductionExperience(UnitTypes)
- CvCity::isFreePromotion(PromotionTypes) const
- CvGlobals::getNumPromotionInfos()
- CvGlobals::getPromotionInfo(PromotionTypes)
- CvPromotionEntry::GetUnitCombatClass(int) const
- CvUnit::canAcquirePromotionAny() const
- CvUnit::changeExperienceTimes100(int, int, bool, bool, bool)
- CvUnit::getUnitCombatType() const
- CvUnit::getUnitType() const
- CvUnit::setHasPromotion(PromotionTypes, bool)
- CvUnit::testPromotionReady()