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}