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
- CvGlobals::getCOMBAT_DAMAGE()
- CvUnit::canCoexistWithEnemyUnit(TeamTypes) const
- CvUnit::chanceFirstStrikes() const
- CvUnit::currInterceptionProbability() const
- CvUnit::firstStrikes() const
- CvUnit::getCargo() const
- CvUnit::GetCombatLimit() const
- CvUnit::getDamage() const
- CvUnit::getLeaderUnitType() const
- CvUnit::GetMaxDefenseStrength(const CvPlot *, const CvUnit *, bool) const
- CvUnit::getTeam() const
- CvUnit::getUnitClassType() const
- CvUnit::immuneToFirstStrikes() const
- CvUnit::IsCanDefend(const CvPlot *) const
- CvUnit::isEmbarked() const
- CvUnit::plot() const
- isBeforeUnitCycle(const CvUnit *, const CvUnit *)
- isWorldUnitClass(UnitClassTypes)