Hooks
static bool BeforeCvUnit_GetAirStrikeDefenseDamage(const CvUnit* self, const CvUnit* pAttacker, bool bIncludeRand, int& result);static void AfterCvUnit_GetAirStrikeDefenseDamage(const CvUnit* self, const CvUnit* pAttacker, bool bIncludeRand, int& result);static int ReplaceCvUnit_GetAirStrikeDefenseDamage(int (*original)(const CvUnit*, const CvUnit*, bool), const CvUnit* self, const CvUnit* pAttacker, bool bIncludeRand);CivRegisterBefore<CivHooks::CvUnit_GetAirStrikeDefenseDamage>(host, &BeforeCvUnit_GetAirStrikeDefenseDamage);CivRegisterAfter<CivHooks::CvUnit_GetAirStrikeDefenseDamage>(host, &AfterCvUnit_GetAirStrikeDefenseDamage);CivRegisterReplace<CivHooks::CvUnit_GetAirStrikeDefenseDamage>(host, &ReplaceCvUnit_GetAirStrikeDefenseDamage);
Code
13328int CvUnit::GetAirStrikeDefenseDamage(const CvUnit* pAttacker, bool bIncludeRand) const13329{13330 int iAttackerStrength = pAttacker->GetMaxRangedCombatStrength(this, /*pCity*/ NULL, true, /*bForRangedAttack*/ false);13331 int iDefenderStrength = 0;1333213333 // Use Ranged combat value for defender, UNLESS it's a boat13334 if(GetMaxRangedCombatStrength(this, /*pCity*/ NULL, false, false) > 0 && !getDomainType() == DOMAIN_SEA)13335 iDefenderStrength = GetMaxRangedCombatStrength(pAttacker, /*pCity*/ NULL, false, false);13336 else13337 iDefenderStrength = GetMaxDefenseStrength(plot(), pAttacker);1333813339 if(iDefenderStrength == 0)13340 return 0;1334113342#if defined(MOD_UNITS_MAX_HP)13343 int iDefenderDamageRatio = GetMaxHitPoints() - getDamage();13344 int iDefenderDamage = /*200*/ GC.getAIR_STRIKE_SAME_STRENGTH_MIN_DEFENSE_DAMAGE() * iDefenderDamageRatio / GetMaxHitPoints();13345#else13346 int iDefenderDamageRatio = GC.getMAX_HIT_POINTS() - getDamage();13347 int iDefenderDamage = /*200*/ GC.getAIR_STRIKE_SAME_STRENGTH_MIN_DEFENSE_DAMAGE() * iDefenderDamageRatio / GC.getMAX_HIT_POINTS();13348#endif1334913350 int iDefenderRoll = 0;13351 if(bIncludeRand)13352 {13353 iDefenderRoll = /*200*/ GC.getGame().getJonRandNum(GC.getAIR_STRIKE_SAME_STRENGTH_POSSIBLE_EXTRA_DEFENSE_DAMAGE(), "Unit Air Strike Combat Damage");13354 iDefenderRoll *= iDefenderDamageRatio;13355#if defined(MOD_UNITS_MAX_HP)13356 iDefenderRoll /= GetMaxHitPoints();13357#else13358 iDefenderRoll /= GC.getMAX_HIT_POINTS();13359#endif13360 }13361 else13362 {13363 iDefenderRoll = /*200*/ GC.getAIR_STRIKE_SAME_STRENGTH_POSSIBLE_EXTRA_DEFENSE_DAMAGE();13364 iDefenderRoll -= 1; // Subtract 1 here, because this is the amount normally "lost" when doing a rand roll13365 iDefenderRoll *= iDefenderDamageRatio;13366#if defined(MOD_UNITS_MAX_HP)13367 iDefenderRoll /= GetMaxHitPoints();13368#else13369 iDefenderRoll /= GC.getMAX_HIT_POINTS();13370#endif13371 iDefenderRoll /= 2; // The divide by 2 is to provide the average damage13372 }13373 iDefenderDamage += iDefenderRoll;1337413375 double fStrengthRatio = (double(iDefenderStrength) / iAttackerStrength);1337613377 // In case our strength is less than the other guy's, we'll do things in reverse then make the ratio 1 over the result13378 if(iAttackerStrength > iDefenderStrength)13379 {13380 fStrengthRatio = (double(iAttackerStrength) / iDefenderStrength);13381 }1338213383 fStrengthRatio = (fStrengthRatio + 3) / 4;13384 fStrengthRatio = pow(fStrengthRatio, 4.0);13385 fStrengthRatio = (fStrengthRatio + 1) / 2;1338613387 if(iAttackerStrength > iDefenderStrength)13388 {13389 fStrengthRatio = 1 / fStrengthRatio;13390 }1339113392 iDefenderDamage = int(iDefenderDamage * fStrengthRatio);1339313394 // Bring it back out of hundreds13395 iDefenderDamage /= 100;1339613397 iDefenderDamage = max(1,iDefenderDamage);1339813399 return iDefenderDamage;13400}