Bazaar developer reference

CvUnit::CanUpgradeTo(UnitTypes, bool) const

Defined in
CvUnit.cpp, line 10948
Class
CvUnit
Hook name
CivHooks::CvUnit_CanUpgradeTo
Lua events
GameEvents.CanHaveAnyUpgrade, GameEvents.UnitCanHaveAnyUpgrade

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}

Calls

Called by