Bazaar developer reference

CvUnit::DoUpgradeTo(UnitTypes, bool)

Defined in
CvUnit.cpp, line 11239
Class
CvUnit
Hook name
CivHooks::CvUnit_DoUpgradeTo
Lua events
GameEvents.UnitUpgraded

Hooks

static bool BeforeCvUnit_DoUpgradeTo(CvUnit* self, UnitTypes eUnitType, bool bFree, CvUnit*& result);static void AfterCvUnit_DoUpgradeTo(CvUnit* self, UnitTypes eUnitType, bool bFree, CvUnit*& result);static CvUnit* ReplaceCvUnit_DoUpgradeTo(CvUnit* (*original)(CvUnit*, UnitTypes, bool), CvUnit* self, UnitTypes eUnitType, bool bFree);CivRegisterBefore<CivHooks::CvUnit_DoUpgradeTo>(host, &BeforeCvUnit_DoUpgradeTo);CivRegisterAfter<CivHooks::CvUnit_DoUpgradeTo>(host, &AfterCvUnit_DoUpgradeTo);CivRegisterReplace<CivHooks::CvUnit_DoUpgradeTo>(host, &ReplaceCvUnit_DoUpgradeTo);

Code

11239CvUnit* CvUnit::DoUpgradeTo(UnitTypes eUnitType, bool bFree)11240{11241#endif11242	// Gold Cost11243	int iUpgradeCost = upgradePrice(eUnitType);11244	CvPlayerAI& thisPlayer = GET_PLAYER(getOwner());11245#if defined(MOD_API_EXTENSIONS)11246	if (!bFree) {11247#endif11248	thisPlayer.GetTreasury()->LogExpenditure(getUnitInfo().GetText(), iUpgradeCost, 3);11249	thisPlayer.GetTreasury()->ChangeGold(-iUpgradeCost);11250#if defined(MOD_API_EXTENSIONS)11251	}11252#endif1125311254#if defined(MOD_API_EXTENSIONS)11255	if (!bFree) {11256#endif11257#if defined(MOD_GLOBAL_CS_UPGRADES)11258	if (MOD_GLOBAL_CS_UPGRADES) {11259		// Is this plot owned by an allied militaristic City State11260		const CvPlot* pPlot = plot();11261		if(pPlot->getOwner() != getOwner() && pPlot->getOwner() != NO_PLAYER) {11262			const CvPlayer& pPlotOwner = GET_PLAYER(pPlot->getOwner());11263			if (pPlotOwner.isMinorCiv()) {11264				CvMinorCivAI* kMinor = pPlotOwner.GetMinorCivAI();11265				if (kMinor->GetTrait() == MINOR_CIV_TRAIT_MILITARISTIC && kMinor->GetAlly() == getOwner()) {11266					// Push the spawn unit counter back as a penalty for upgrading one of our own units11267					int iNumTurns = /*-3*/ GC.getALLIES_EXTRA_TURNS_UNIT_SPAWN() * -1;1126811269					// Modify for Game Speed11270					iNumTurns *= GC.getGame().getGameSpeedInfo().getGreatPeoplePercent();11271					iNumTurns /= 100;1127211273					CUSTOMLOG("CS unit spawn penalty for upgrading one of our own units is %d turns", iNumTurns);11274					kMinor->ChangeUnitSpawnCounter(getOwner(), iNumTurns);11275				}11276			}11277		}11278	}11279#endif11280#if defined(MOD_API_EXTENSIONS)11281	}11282#endif1128311284	// Add newly upgraded Unit & kill the old one11285	CvUnit* pNewUnit = thisPlayer.initUnit(eUnitType, getX(), getY(), NO_UNITAI, NO_DIRECTION, false, false);1128611287	if(NULL != pNewUnit)11288	{11289		if(GC.getGame().getActivePlayer() == getOwner())11290		{11291			auto_ptr<ICvUnit1> pDllNewUnit = GC.WrapUnitPointer(pNewUnit);11292			DLLUI->selectUnit(pDllNewUnit.get(), true, false, false);11293		}1129411295#if defined(MOD_EVENTS_UNIT_UPGRADES)11296		// MUST call the event before convert() as that kills the old unit11297		if (MOD_EVENTS_UNIT_UPGRADES) {11298			GAMEEVENTINVOKE_HOOK(GAMEEVENT_UnitUpgraded, getOwner(), GetID(), pNewUnit->GetID(), false);11299		} else {11300#endif11301		ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();11302		if (pkScriptSystem) 11303		{11304			CvLuaArgsHandle args;11305			args->Push(((int)getOwner()));11306			args->Push(GetID());11307			args->Push(pNewUnit->GetID());11308			args->Push(false); // bGoodyHut1130911310			bool bResult;11311			LuaSupport::CallHook(pkScriptSystem, "UnitUpgraded", args.get(), bResult);11312		}11313#if defined(MOD_EVENTS_UNIT_UPGRADES)11314		}11315#endif11316		pNewUnit->convert(this, true);11317		pNewUnit->setupGraphical();11318		11319		// Can't move after upgrading11320#if defined(MOD_GLOBAL_MOVE_AFTER_UPGRADE)11321		if (MOD_GLOBAL_MOVE_AFTER_UPGRADE && pNewUnit->getUnitInfo().CanMoveAfterUpgrade()) {11322			pNewUnit->setSetUpForRangedAttack(isSetUpForRangedAttack());11323			pNewUnit->m_iAttacksMade = m_iAttacksMade;11324			pNewUnit->m_iMadeInterceptionCount = m_iMadeInterceptionCount;11325			pNewUnit->m_eActivityType = m_eActivityType;11326			if (IsFortifiedThisTurn()) {11327				pNewUnit->SetFortifiedThisTurn(true);11328			} else {11329				pNewUnit->setFortifyTurns(getFortifyTurns());11330			}11331		} else 11332#endif11333		pNewUnit->finishMoves();1133411335		kill(true);11336	}1133711338#if !defined(NO_ACHIEVEMENTS)11339	if(isHuman() && !GC.getGame().isGameMultiPlayer() && GET_PLAYER(GC.getGame().getActivePlayer()).isLocalPlayer())11340	{11341		gDLL->UnlockAchievement(ACHIEVEMENT_UNIT_UPGRADE);11342	}11343#endif1134411345	return pNewUnit;11346}

Calls

Called by