Hooks
static bool BeforeCvUnit_CanUpgradeTo(const CvUnit* self, UnitTypes eUpgradeUnitType, bool bOnlyTestVisible, bool& result);static void AfterCvUnit_CanUpgradeTo(const CvUnit* self, UnitTypes eUpgradeUnitType, bool bOnlyTestVisible, bool& result);static bool ReplaceCvUnit_CanUpgradeTo(bool (*original)(const CvUnit*, UnitTypes, bool), const CvUnit* self, UnitTypes eUpgradeUnitType, bool bOnlyTestVisible);CivRegisterBefore<CivHooks::CvUnit_CanUpgradeTo>(host, &BeforeCvUnit_CanUpgradeTo);CivRegisterAfter<CivHooks::CvUnit_CanUpgradeTo>(host, &AfterCvUnit_CanUpgradeTo);CivRegisterReplace<CivHooks::CvUnit_CanUpgradeTo>(host, &ReplaceCvUnit_CanUpgradeTo);
Code
10948bool CvUnit::CanUpgradeTo(UnitTypes eUpgradeUnitType, bool bOnlyTestVisible) const10949{10950#endif10951 // Does the Unit actually upgrade into anything?10952 if(eUpgradeUnitType == NO_UNIT)10953 return false;1095410955 CvUnitEntry* pUpgradeUnitInfo = GC.getUnitInfo(eUpgradeUnitType);10956 if(pUpgradeUnitInfo == NULL)10957 return false;1095810959 // Tech requirement10960 TechTypes ePrereqTech = (TechTypes) pUpgradeUnitInfo->GetPrereqAndTech();1096110962 if(ePrereqTech != NO_TECH && !GET_TEAM(getTeam()).GetTeamTechs()->HasTech(ePrereqTech))10963 return false;1096410965#if defined(MOD_BUGFIX_UNIT_PREREQ_PROJECT)10966 // Project requirement10967 ProjectTypes ePrereqProject = (ProjectTypes) pUpgradeUnitInfo->GetProjectPrereq();10968 if (ePrereqProject != NO_PROJECT) {10969 CvProjectEntry* pkProjectInfo = GC.getProjectInfo(ePrereqProject);10970 if (pkProjectInfo && GET_TEAM(getTeam()).getProjectCount(ePrereqProject) == 0)10971 return false;10972 }10973#endif10974 10975 CvPlot* pPlot = plot();1097610977 // Show the upgrade, but don't actually allow it10978 if(!bOnlyTestVisible)10979 {10980#if defined(MOD_GLOBAL_STACKING_RULES)10981 if(pPlot->getNumFriendlyUnitsOfType(this) > pPlot->getUnitLimit())10982#else10983 if(pPlot->getNumFriendlyUnitsOfType(this) > GC.getPLOT_UNIT_LIMIT())10984#endif10985 {10986 return false;10987 }1098810989#if defined(MOD_GLOBAL_CS_UPGRADES)10990 if (!CanUpgradeInTerritory(bOnlyTestVisible))10991 return false;10992#else10993 // Must be in territory owned by the player10994 if(pPlot->getOwner() != getOwner())10995 return false;10996#endif1099710998 CvPlayerAI& kPlayer = GET_PLAYER(getOwner());1099911000 // Player must have enough Gold11001 if(kPlayer.GetTreasury()->GetGold() < upgradePrice(eUpgradeUnitType))11002 return false;1100311004 // Resource Requirements11005 int iNumOfThisResourceAvailable;11006 ResourceTypes eResource;11007 int iNumResourceNeeded;11008 for(int iResourceLoop = 0; iResourceLoop < GC.getNumResourceInfos(); iResourceLoop++)11009 {11010 eResource = (ResourceTypes) iResourceLoop;11011 iNumResourceNeeded = pUpgradeUnitInfo->GetResourceQuantityRequirement(eResource);1101211013 if(iNumResourceNeeded > 0)11014 {11015 // Amount we have lying around11016 iNumOfThisResourceAvailable = kPlayer.getNumResourceAvailable(eResource);11017 // Amount this old unit is using11018 iNumOfThisResourceAvailable += m_pUnitInfo->GetResourceQuantityRequirement(eResource);1101911020 if(iNumOfThisResourceAvailable <= 0 || iNumOfThisResourceAvailable < iNumResourceNeeded)11021 return false;11022 }11023 }1102411025 if(getDomainType() == DOMAIN_AIR)11026 {11027 if(!pPlot->isCity() || isCargo()) // Air units must be in a city, and no sneaky "I'm on a carrier in the city" either.11028 {11029 return false;11030 }11031 }11032 }1103311034#if defined(MOD_EVENTS_UNIT_UPGRADES)11035 if (MOD_EVENTS_UNIT_UPGRADES) {11036 if (GAMEEVENTINVOKE_TESTALL(GAMEEVENT_CanHaveAnyUpgrade, getOwner(), GetID()) == GAMEEVENTRETURN_FALSE) {11037 return false;11038 }1103911040 if (GAMEEVENTINVOKE_TESTALL(GAMEEVENT_UnitCanHaveAnyUpgrade, getOwner(), GetID()) == GAMEEVENTRETURN_FALSE) {11041 return false;11042 }11043 } else {11044#endif11045 ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();11046 if (pkScriptSystem)11047 {11048 CvLuaArgsHandle args;11049 args->Push(((int)getOwner()));11050 args->Push(GetID());1105111052 bool bResult = false;11053 if (LuaSupport::CallTestAll(pkScriptSystem, "CanHaveAnyUpgrade", args.get(), bResult)) {11054 if (bResult == false) {11055 return false;11056 }11057 }11058 }11059#if defined(MOD_EVENTS_UNIT_UPGRADES)11060 }11061#endif1106211063 return true;11064}