Hooks
static bool BeforeCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo(CvCity& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void AfterCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo(CvCity& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void ReplaceCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo(void (*original)(CvCity&, CvUnit*, CvPlot&, CvCombatInfo*), CvCity& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);CivRegisterBefore<CivHooks::CvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo>(host, &BeforeCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo);CivRegisterAfter<CivHooks::CvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo>(host, &AfterCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo);CivRegisterReplace<CivHooks::CvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo>(host, &ReplaceCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo);
Code
786void CvUnitCombat::GenerateRangedCombatInfo(CvCity& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo)787{788 BATTLE_STARTED(BATTLE_TYPE_RANGED, plot);789 pkCombatInfo->setCity(BATTLE_UNIT_ATTACKER, &kAttacker);790 pkCombatInfo->setUnit(BATTLE_UNIT_DEFENDER, pkDefender);791 pkCombatInfo->setPlot(&plot);792793 //////////////////////////////////////////////////////////////////////794795 bool bBarbarian = false;796 int iDamage = 0;797 int iTotalDamage = 0;798 PlayerTypes eDefenderOwner = NO_PLAYER;799 if(!plot.isCity())800 {801 CvAssert(pkDefender != NULL);802803 eDefenderOwner = pkDefender->getOwner();804805 if(pkDefender->isBarbarian())806 bBarbarian = true;807808 //CvAssert(pkDefender->IsCanDefend());809810 iDamage = kAttacker.rangeCombatDamage(pkDefender);811812#if defined(MOD_UNITS_MAX_HP)813 if(iDamage + pkDefender->getDamage() > pkDefender->GetMaxHitPoints())814 {815 iDamage = pkDefender->GetMaxHitPoints() - pkDefender->getDamage();816 }817#else818 if(iDamage + pkDefender->getDamage() > GC.getMAX_HIT_POINTS())819 {820 iDamage = GC.getMAX_HIT_POINTS() - pkDefender->getDamage();821 }822#endif823824 iTotalDamage = std::max(pkDefender->getDamage(), pkDefender->getDamage() + iDamage);825 }826 else827 {828 FAssertMsg(false, "City vs. City not supported."); // Don't even think about it Jon....829 }830831 //////////////////////////////////////////////////////////////////////832833 pkCombatInfo->setFinalDamage(BATTLE_UNIT_ATTACKER, 0); // Total damage to the unit834 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_ATTACKER, iDamage); // Damage inflicted this round835 pkCombatInfo->setFinalDamage(BATTLE_UNIT_DEFENDER, iTotalDamage); // Total damage to the unit836 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_DEFENDER, 0); // Damage inflicted this round837838 // Fear Damage839 pkCombatInfo->setFearDamageInflicted(BATTLE_UNIT_ATTACKER, 0);840 // pkCombatInfo->setFearDamageInflicted( BATTLE_UNIT_DEFENDER, 0 );841842 pkCombatInfo->setExperience(BATTLE_UNIT_ATTACKER, 0);843 pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_ATTACKER, 0);844 pkCombatInfo->setInBorders(BATTLE_UNIT_ATTACKER, plot.getOwner() == eDefenderOwner);845#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)846 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, !kAttacker.isBarbarian()); // Kind of irrelevant, as cities don't get XP!847#else848 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, !kAttacker.isBarbarian());849#endif850851 int iExperience = /*2*/ GC.getEXPERIENCE_DEFENDING_UNIT_RANGED();852 pkCombatInfo->setExperience(BATTLE_UNIT_DEFENDER, iExperience);853 pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_DEFENDER, MAX_INT);854 pkCombatInfo->setInBorders(BATTLE_UNIT_DEFENDER, plot.getOwner() == kAttacker.getOwner());855#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)856 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, pkDefender->isGGFromBarbarians() || !bBarbarian && !kAttacker.isBarbarian());857#else858 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, !bBarbarian && !kAttacker.isBarbarian());859#endif860861 pkCombatInfo->setAttackIsRanged(true);862 // Defender doesn't retaliate. We'll keep this separate from the ranged attack flag in case something changes to allow863 // some units to retaliate on a ranged attack (Archer vs. Archers maybe?)864 pkCombatInfo->setDefenderRetaliates(false);865866 GC.GetEngineUserInterface()->setDirty(UnitInfo_DIRTY_BIT, true);867}