Bazaar developer reference

CvUnit::GetAirStrikeDefenseDamage(const CvUnit *, bool) const

Defined in
CvUnit.cpp, line 13328
Class
CvUnit
Hook name
CivHooks::CvUnit_GetAirStrikeDefenseDamage

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}

Calls

Called by