CvUnit::GetMaxAttackStrength(const CvPlot *, const CvPlot *, const CvUnit *) const
- Defined in
- CvUnit.cpp, line 12409
- Class
- CvUnit
- Hook name
CivHooks::CvUnit_GetMaxAttackStrength
Hooks
static bool BeforeCvUnit_GetMaxAttackStrength(const CvUnit* self, const CvPlot* pFromPlot, const CvPlot* pToPlot, const CvUnit* pDefender, int& result);static void AfterCvUnit_GetMaxAttackStrength(const CvUnit* self, const CvPlot* pFromPlot, const CvPlot* pToPlot, const CvUnit* pDefender, int& result);static int ReplaceCvUnit_GetMaxAttackStrength(int (*original)(const CvUnit*, const CvPlot*, const CvPlot*, const CvUnit*), const CvUnit* self, const CvPlot* pFromPlot, const CvPlot* pToPlot, const CvUnit* pDefender);CivRegisterBefore<CivHooks::CvUnit_GetMaxAttackStrength>(host, &BeforeCvUnit_GetMaxAttackStrength);CivRegisterAfter<CivHooks::CvUnit_GetMaxAttackStrength>(host, &AfterCvUnit_GetMaxAttackStrength);CivRegisterReplace<CivHooks::CvUnit_GetMaxAttackStrength>(host, &ReplaceCvUnit_GetMaxAttackStrength);
Code
12408/// What is the max strength of this Unit when attacking?12409int CvUnit::GetMaxAttackStrength(const CvPlot* pFromPlot, const CvPlot* pToPlot, const CvUnit* pDefender) const12410{12411 VALIDATE_OBJECT1241212413 bool bIsEmbarkedAttackingLand = isEmbarked() && (pToPlot && !pToPlot->isWater());1241412415 if(isEmbarked() && !bIsEmbarkedAttackingLand)12416 return GetEmbarkedUnitDefense();1241712418 if(GetBaseCombatStrength(bIsEmbarkedAttackingLand) == 0)12419 return 0;1242012421 int iCombat;1242212423 int iTempModifier;12424 int iModifier = GetGenericMaxStrengthModifier(pDefender, pToPlot, /*bIgnoreFlanking*/ false);1242512426 // Generic Attack bonus12427 iTempModifier = getAttackModifier();12428 iModifier += iTempModifier;1242912430 // Kamikaze attack12431 if(getKamikazePercent() != 0)12432 {12433 iTempModifier = getKamikazePercent();12434 iModifier += iTempModifier;12435 }1243612437 // Temporary attack bonus (Policies, etc.)12438 if(GET_PLAYER(getOwner()).GetAttackBonusTurns() > 0)12439 {12440 iTempModifier = /*20*/ GC.getPOLICY_ATTACK_BONUS_MOD();12441 iModifier += iTempModifier;12442 }1244312444 ////////////////////////12445 // KNOWN DESTINATION PLOT12446 ////////////////////////1244712448 if(pToPlot != NULL)12449 {12450 // Attacking a City12451 if(pToPlot->isCity())12452 {12453 iTempModifier = cityAttackModifier();12454 iModifier += iTempModifier;1245512456 // Nearby unit sapping this city12457 if(IsNearSapper(pToPlot->getPlotCity()))12458 {12459 iTempModifier = GC.getSAPPED_CITY_ATTACK_MODIFIER();12460 iModifier += iTempModifier;12461 }1246212463 // City Defending against a Barbarian12464 if(isBarbarian())12465 {12466 iTempModifier = GC.getBARBARIAN_CITY_ATTACK_MODIFIER();12467 iModifier += iTempModifier;12468 }12469 }12470 // Some bonuses only apply when NOT attacking a city12471 else12472 {12473 // Attacking into Hills12474 if(pToPlot->isHills())12475 {12476 iTempModifier = hillsAttackModifier();12477 iModifier += iTempModifier;12478 }1247912480 // Attacking into Open Ground12481 if(pToPlot->isOpenGround())12482 {12483 iTempModifier = openAttackModifier();12484 iModifier += iTempModifier;12485 }1248612487 // Attacking into Rough Ground12488 if(pToPlot->isRoughGround())12489 {12490 iTempModifier = roughAttackModifier();12491 iModifier += iTempModifier;12492 }1249312494 // Attacking into a Feature12495 if(pToPlot->getFeatureType() != NO_FEATURE)12496 {12497 iTempModifier = featureAttackModifier(pToPlot->getFeatureType());12498 iModifier += iTempModifier;12499 }12500 // No Feature - Use Terrain Attack Mod12501 else12502 {12503 iTempModifier = terrainAttackModifier(pToPlot->getTerrainType());12504 iModifier += iTempModifier;1250512506 // Tack on Hills Attack Mod12507 if(pToPlot->isHills())12508 {12509 iTempModifier = terrainAttackModifier(TERRAIN_HILL);12510 iModifier += iTempModifier;12511 }12512 }12513 }1251412515 // Bonus for attacking in one's lands12516 if(pToPlot->IsFriendlyTerritory(getOwner()))12517 {12518 iTempModifier = getFriendlyLandsAttackModifier();12519 iModifier += iTempModifier;12520 }1252112522 ////////////////////////12523 // KNOWN ORIGIN PLOT12524 ////////////////////////1252512526 if(pFromPlot != NULL)12527 {12528 // Attacking across a river12529 if(!isRiverCrossingNoPenalty())12530 {12531 if(pFromPlot->isRiverCrossing(directionXY(pFromPlot, pToPlot)))12532 {12533 iTempModifier = GC.getRIVER_ATTACK_MODIFIER();12534 iModifier += iTempModifier;12535 }12536 }1253712538 // Amphibious attack12539 if(!isAmphib())12540 {12541 if(!(pToPlot->isWater()) && pFromPlot->isWater() && getDomainType() == DOMAIN_LAND)12542 {12543 iTempModifier = GC.getAMPHIB_ATTACK_MODIFIER();12544 iModifier += iTempModifier;12545 }12546 }12547 }12548 }1254912550 ////////////////////////12551 // KNOWN DEFENDER12552 ////////////////////////1255312554 if(pDefender != NULL)12555 {12556 CvAssertMsg(pDefender != this, "Compared attack strength against one's own pointer. This is weird and probably wrong.");1255712558 // Unit Class Attack Modifier12559 iTempModifier = unitClassAttackModifier(pDefender->getUnitClassType());12560 iModifier += iTempModifier;1256112562 // Bonus VS fortified12563 if(pDefender->getFortifyTurns() > 0)12564 iModifier += attackFortifiedModifier();1256512566 // Bonus VS wounded12567 if(pDefender->getDamage() > 0)12568 iModifier += attackWoundedModifier();12569 }1257012571 // Unit can't drop below 10% strength12572 if(iModifier < -90)12573 iModifier = -90;1257412575 iCombat = GetBaseCombatStrength(bIsEmbarkedAttackingLand) * (iModifier + 100);1257612577 return std::max(1, iCombat);12578}
Calls
- CvGlobals::getAMPHIB_ATTACK_MODIFIER()
- CvGlobals::getBARBARIAN_CITY_ATTACK_MODIFIER()
- CvGlobals::getPOLICY_ATTACK_BONUS_MOD()
- CvGlobals::getRIVER_ATTACK_MODIFIER()
- CvGlobals::getSAPPED_CITY_ATTACK_MODIFIER()
- CvPlayer::GetAttackBonusTurns() const
- CvPlayerAI::getPlayer(PlayerTypes)
- CvPlot::getFeatureType() const
- CvPlot::getPlotCity() const
- CvPlot::getTerrainType() const
- CvPlot::isCity() const
- CvPlot::IsFriendlyTerritory(PlayerTypes) const
- CvPlot::isHills() const
- CvPlot::isOpenGround() const
- CvPlot::isRiverCrossing(DirectionTypes) const
- CvPlot::isRoughGround() const
- CvPlot::isWater() const
- CvUnit::attackFortifiedModifier() const
- CvUnit::attackWoundedModifier() const
- CvUnit::cityAttackModifier() const
- CvUnit::featureAttackModifier(FeatureTypes) const
- CvUnit::getAttackModifier() const
- CvUnit::GetBaseCombatStrength(bool) const
- CvUnit::getDamage() const
- CvUnit::getDomainType() const
- CvUnit::GetEmbarkedUnitDefense() const
- CvUnit::getFortifyTurns() const
- CvUnit::getFriendlyLandsAttackModifier() const
- CvUnit::GetGenericMaxStrengthModifier(const CvUnit *, const CvPlot *, bool) const
- CvUnit::getKamikazePercent() const
- CvUnit::getOwner() const
- CvUnit::getUnitClassType() const
- CvUnit::hillsAttackModifier() const
- CvUnit::isAmphib() const
- CvUnit::isBarbarian() const
- CvUnit::isEmbarked() const
- CvUnit::IsNearSapper(const CvCity *) const
- CvUnit::isRiverCrossingNoPenalty() const
- CvUnit::openAttackModifier() const
- CvUnit::roughAttackModifier() const
- CvUnit::terrainAttackModifier(TerrainTypes) const
- CvUnit::unitClassAttackModifier(UnitClassTypes) const
- directionXY(const CvPlot *, const CvPlot *)
std::max
Called by
- CvGame::GetCombatPrediction(const CvUnit *, const CvUnit *)
- CvTacticalAI::ComputeTotalExpectedDamage(CvTacticalTarget *, CvPlot *)
- CvTacticalAI::FindAirUnitsToAirSweep(CvPlot *)
- CvTacticalAI::FindParatroopersWithinStrikingDistance(CvPlot *)
- CvTacticalAI::FindUnitsWithinStrikingDistance(CvPlot *, int, int, bool, bool, bool, bool, bool, bool)
- CvTacticalAI::IdentifyPriorityBarbarianTargets()
- CvTacticalAI::IdentifyPriorityTargets()
- CvUnit::GetBaseCombatStrengthConsideringDamage() const
- CvUnit::GetInterceptionDamage(const CvUnit *, bool) const
- CvUnit::GetParadropInterceptionDamage(const CvUnit *, bool) const
- CvUnitCombat::GenerateMeleeCombatInfo(CvUnit &, CvUnit *, CvPlot &, CvCombatInfo *)
- CvLuaUnit::lGetMaxAttackStrength(lua_State *)