Bazaar developer reference

CvUnitCombat::ApplyPostCombatTraitEffects(CvUnit *, CvUnit *)

Defined in
CvUnitCombat.cpp, line 3770
Class
CvUnitCombat
Hook name
CivHooks::CvUnitCombat_ApplyPostCombatTraitEffects

Hooks

static bool BeforeCvUnitCombat_ApplyPostCombatTraitEffects(CvUnit* pkWinner, CvUnit* pkLoser);static void AfterCvUnitCombat_ApplyPostCombatTraitEffects(CvUnit* pkWinner, CvUnit* pkLoser);static void ReplaceCvUnitCombat_ApplyPostCombatTraitEffects(void (*original)(CvUnit*, CvUnit*), CvUnit* pkWinner, CvUnit* pkLoser);CivRegisterBefore<CivHooks::CvUnitCombat_ApplyPostCombatTraitEffects>(host, &BeforeCvUnitCombat_ApplyPostCombatTraitEffects);CivRegisterAfter<CivHooks::CvUnitCombat_ApplyPostCombatTraitEffects>(host, &AfterCvUnitCombat_ApplyPostCombatTraitEffects);CivRegisterReplace<CivHooks::CvUnitCombat_ApplyPostCombatTraitEffects>(host, &ReplaceCvUnitCombat_ApplyPostCombatTraitEffects);

Code

3770void CvUnitCombat::ApplyPostCombatTraitEffects(CvUnit* pkWinner, CvUnit* pkLoser)3771{3772	int iExistingDelay = 0;37733774	// "Heal if defeat enemy" promotion; doesn't apply if defeat a barbarian3775	if(pkWinner->getHPHealedIfDefeatEnemy() > 0 && (pkLoser->getOwner() != BARBARIAN_PLAYER || !(pkWinner->IsHealIfDefeatExcludeBarbarians())))3776	{3777		if(pkWinner->getHPHealedIfDefeatEnemy() > pkWinner->getDamage())3778		{3779			pkWinner->changeDamage(-pkWinner->getDamage());3780		}3781		else3782		{3783			pkWinner->changeDamage(-pkWinner->getHPHealedIfDefeatEnemy());3784		}3785	}3786#if defined(MOD_BUGFIX_MINOR)3787	// If the modder wants the healing to be negative (ie additional damage), then let it be3788	else if(pkWinner->getHPHealedIfDefeatEnemy() < 0 && (pkLoser->getOwner() != BARBARIAN_PLAYER || !(pkWinner->IsHealIfDefeatExcludeBarbarians())))3789	{3790		if(pkWinner->getHPHealedIfDefeatEnemy() <= (pkWinner->getDamage() - pkWinner->GetMaxHitPoints()))3791		{3792			// The graphics engine expects the unit to be alive here, so do NOT inflict enough damage to kill it!3793			pkWinner->setDamage(pkWinner->GetMaxHitPoints()-1);3794		}3795		else3796		{3797			pkWinner->changeDamage(-pkWinner->getHPHealedIfDefeatEnemy());3798		}3799	}3800#endif38013802	CvPlayer& kPlayer = GET_PLAYER(pkWinner->getOwner());3803	if (pkWinner->GetGoldenAgeValueFromKills() > 0)3804	{3805#if defined(MOD_API_EXTENSIONS)3806		int iCombatStrength = max(pkLoser->GetBaseCombatStrength(), pkLoser->GetBaseRangedCombatStrength());3807#else3808		int iCombatStrength = max(pkLoser->getUnitInfo().GetCombat(), pkLoser->getUnitInfo().GetRangedCombat());3809#endif3810		if(iCombatStrength > 0)3811		{3812			int iValue = iCombatStrength * pkWinner->GetGoldenAgeValueFromKills() / 100;3813			kPlayer.ChangeGoldenAgeProgressMeter(iValue);38143815#if defined(MOD_API_UNIFIED_YIELDS_GOLDEN_AGE)3816			CvYieldInfo* pYieldInfo = GC.getYieldInfo(YIELD_GOLDEN_AGE_POINTS);3817			CvString yieldString;3818			yieldString.Format("%s+%%d[ENDCOLOR]%s", pYieldInfo->getColorString(), pYieldInfo->getIconString());3819#else3820			CvString yieldString = "[COLOR_WHITE]+%d[ENDCOLOR][ICON_GOLDEN_AGE]";3821#endif38223823			if(pkWinner->getOwner() == GC.getGame().getActivePlayer())3824			{3825				char text[256] = {0};3826#if !defined(SHOW_PLOT_POPUP)3827				float fDelay = GC.getPOST_COMBAT_TEXT_DELAY() * 1.5f;3828#endif3829				sprintf_s(text, yieldString, iValue);3830#if defined(SHOW_PLOT_POPUP)3831				SHOW_PLOT_POPUP(pkLoser->plot(), pkWinner->getOwner(), text, 0.0);3832#else3833				GC.GetEngineUserInterface()->AddPopupText(pkLoser->getX(), pkLoser->getY(), text, fDelay);3834#endif38353836				iExistingDelay++;3837			}3838		}3839	}38403841	// Earn bonuses for kills?3842#if defined(MOD_API_UNIFIED_YIELDS)3843	kPlayer.DoYieldsFromKill(pkWinner, pkLoser, pkLoser->getX(), pkLoser->getY(), iExistingDelay);3844#else3845	kPlayer.DoYieldsFromKill(pkWinner->getUnitType(), pkLoser->getUnitType(), pkLoser->getX(), pkLoser->getY(), pkLoser->isBarbarian(), iExistingDelay);3846#endif38473848#if !defined(NO_ACHIEVEMENTS)3849	//Achievements and Stats3850	if(pkWinner->isHuman() && !GC.getGame().isGameMultiPlayer())3851	{3852		CvString szUnitType;3853		CvUnitEntry* pkUnitInfo = GC.getUnitInfo(pkWinner->getUnitType());3854		if(pkUnitInfo)3855			szUnitType = pkUnitInfo->GetType();38563857		//Elizabeth Special Achievement3858		if((CvString)kPlayer.getLeaderTypeKey() == "LEADER_ELIZABETH" && pkLoser->getDomainType() == DOMAIN_SEA)3859		{3860			gDLL->IncrementSteamStatAndUnlock(ESTEAMSTAT_BRITISHNAVY, 357, ACHIEVEMENT_SPECIAL_ARMADA);3861		}3862		//Ramkang's Special Achievement3863		if(szUnitType == "UNIT_SIAMESE_WARELEPHANT")3864		{3865			//CvString szUnitTypeLoser = (CvString) GC.getUnitInfo(pkLoser->getUnitType())->GetType();3866		}38673868		//Oda's Special Achievement3869		if((CvString)kPlayer.getLeaderTypeKey() == "LEADER_ODA_NOBUNAGA" && (pkWinner->GetMaxHitPoints() - pkWinner->getDamage() == 1))3870		{3871			gDLL->UnlockAchievement(ACHIEVEMENT_SPECIAL_KAMIKAZE);3872		}3873		//Napoleon's Special Achievement3874		if(szUnitType == "UNIT_FRENCH_MUSKETEER")3875		{3876			if(pkLoser->GetNumSpecificEnemyUnitsAdjacent(pkLoser, pkWinner) >=3)3877			{3878				gDLL->UnlockAchievement(ACHIEVEMENT_SPECIAL_MUSKETEERS);3879			}3880		}38813882		//DLC_05 Sejong's Turtle Boat Achievement3883		if(szUnitType == "UNIT_KOREAN_TURTLE_SHIP")3884		{3885			CvString szLoserUnitType;3886			CvUnitEntry* pkLoserUnitInfo = GC.getUnitInfo(pkLoser->getUnitType());3887			if(pkLoserUnitInfo)3888			{3889				szLoserUnitType = pkLoserUnitInfo->GetType();3890			}3891			if(szLoserUnitType == "UNIT_IRONCLAD")3892			{3893				gDLL->UnlockAchievement(ACHIEVEMENT_SPECIAL_IRONCLAD_TURTLE);3894			}3895		}38963897		//DLC_05 Sejong's Hwacha Achievement3898		if(szUnitType == "UNIT_KOREAN_HWACHA")3899		{3900			gDLL->IncrementSteamStatAndUnlock(ESTEAMSTAT_HWACHAKILLS, 99, ACHIEVEMENT_SPECIAL_HWATCH_OUT);3901		}39023903	}3904#endif3905}

Calls

Called by