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}