Bazaar developer reference

CvUnit::isBetterDefenderThan(const CvUnit *, const CvUnit *) const

Defined in
CvUnit.cpp, line 2245
Class
CvUnit
Hook name
CivHooks::CvUnit_isBetterDefenderThan

Hooks

static bool BeforeCvUnit_isBetterDefenderThan(const CvUnit* self, const CvUnit* pDefender, const CvUnit* pAttacker, bool& result);static void AfterCvUnit_isBetterDefenderThan(const CvUnit* self, const CvUnit* pDefender, const CvUnit* pAttacker, bool& result);static bool ReplaceCvUnit_isBetterDefenderThan(bool (*original)(const CvUnit*, const CvUnit*, const CvUnit*), const CvUnit* self, const CvUnit* pDefender, const CvUnit* pAttacker);CivRegisterBefore<CivHooks::CvUnit_isBetterDefenderThan>(host, &BeforeCvUnit_isBetterDefenderThan);CivRegisterAfter<CivHooks::CvUnit_isBetterDefenderThan>(host, &AfterCvUnit_isBetterDefenderThan);CivRegisterReplace<CivHooks::CvUnit_isBetterDefenderThan>(host, &ReplaceCvUnit_isBetterDefenderThan);

Code

2245bool CvUnit::isBetterDefenderThan(const CvUnit* pDefender, const CvUnit* pAttacker) const2246{2247	VALIDATE_OBJECT2248	int iOurDefense;2249	int iTheirDefense;22502251	if(pDefender == NULL)2252	{2253		return true;2254	}22552256	TeamTypes eAttackerTeam = NO_TEAM;2257	if(NULL != pAttacker)2258	{2259		eAttackerTeam = pAttacker->getTeam();2260	}22612262	if(canCoexistWithEnemyUnit(eAttackerTeam))2263	{2264		return false;2265	}22662267	if(!IsCanDefend())2268	{2269		return false;2270	}22712272	if(IsCanDefend() && !(pDefender->IsCanDefend()))2273	{2274		return true;2275	}22762277	// Don't let embarked units be best2278	if(isEmbarked() && !pDefender->isEmbarked())2279	{2280		return false;2281	}22822283	if(pAttacker)2284	{2285		if(getDamage() >= pAttacker->GetCombatLimit() && pDefender->getDamage() < pAttacker->GetCombatLimit())2286		{2287			return false;2288		}22892290		if(pDefender->getDamage() >= pAttacker->GetCombatLimit() && getDamage() < pAttacker->GetCombatLimit())2291		{2292			return true;2293		}2294	}22952296	iOurDefense = GetMaxDefenseStrength(plot(), pAttacker);2297	if(::isWorldUnitClass(getUnitClassType()))2298	{2299		iOurDefense /= 2;2300	}23012302	if(NULL == pAttacker)2303	{2304		if(pDefender->currInterceptionProbability() > 0)2305		{2306			iOurDefense *= (100 + pDefender->currInterceptionProbability());2307			iOurDefense /= 100;2308		}2309	}2310	else2311	{2312		if(!(pAttacker->immuneToFirstStrikes()))2313		{2314			iOurDefense *= ((((firstStrikes() * 2) + chanceFirstStrikes()) * ((GC.getCOMBAT_DAMAGE() * 2) / 5)) + 100);2315			iOurDefense /= 100;2316		}23172318		if(immuneToFirstStrikes())2319		{2320			iOurDefense *= ((((pAttacker->firstStrikes() * 2) + pAttacker->chanceFirstStrikes()) * ((GC.getCOMBAT_DAMAGE() * 2) / 5)) + 100);2321			iOurDefense /= 100;2322		}2323	}23242325	iOurDefense /= (getCargo() + 1);23262327	iTheirDefense = pDefender->GetMaxDefenseStrength(plot(), pAttacker);2328	if(::isWorldUnitClass(pDefender->getUnitClassType()))2329	{2330		iTheirDefense /= 2;2331	}23322333	if(NULL == pAttacker)2334	{2335		if(currInterceptionProbability() > 0)2336		{2337			iTheirDefense *= (100 + currInterceptionProbability());2338			iTheirDefense /= 100;2339		}2340	}2341	else2342	{2343		if(!(pAttacker->immuneToFirstStrikes()))2344		{2345			iTheirDefense *= ((((pDefender->firstStrikes() * 2) + pDefender->chanceFirstStrikes()) * ((GC.getCOMBAT_DAMAGE() * 2) / 5)) + 100);2346			iTheirDefense /= 100;2347		}23482349		if(pDefender->immuneToFirstStrikes())2350		{2351			iTheirDefense *= ((((pAttacker->firstStrikes() * 2) + pAttacker->chanceFirstStrikes()) * ((GC.getCOMBAT_DAMAGE() * 2) / 5)) + 100);2352			iTheirDefense /= 100;2353		}2354	}23552356	iTheirDefense /= (pDefender->getCargo() + 1);23572358	if(iOurDefense == iTheirDefense)2359	{2360		if(NO_UNIT == getLeaderUnitType() && NO_UNIT != pDefender->getLeaderUnitType())2361		{2362			++iOurDefense;2363		}2364		else if(NO_UNIT != getLeaderUnitType() && NO_UNIT == pDefender->getLeaderUnitType())2365		{2366			++iTheirDefense;2367		}2368		else if(isBeforeUnitCycle(this, pDefender))2369		{2370			++iOurDefense;2371		}2372	}23732374	return (iOurDefense > iTheirDefense);2375}

Calls

Called by