CvUnit::GetMaxRangedCombatStrength(const CvUnit *, const CvCity *, bool, bool) const
- Defined in
- CvUnit.cpp, line 12787
- Class
- CvUnit
- Hook name
CivHooks::CvUnit_GetMaxRangedCombatStrength
Hooks
static bool BeforeCvUnit_GetMaxRangedCombatStrength(const CvUnit* self, const CvUnit* pOtherUnit, const CvCity* pCity, bool bAttacking, bool bForRangedAttack, int& result);static void AfterCvUnit_GetMaxRangedCombatStrength(const CvUnit* self, const CvUnit* pOtherUnit, const CvCity* pCity, bool bAttacking, bool bForRangedAttack, int& result);static int ReplaceCvUnit_GetMaxRangedCombatStrength(int (*original)(const CvUnit*, const CvUnit*, const CvCity*, bool, bool), const CvUnit* self, const CvUnit* pOtherUnit, const CvCity* pCity, bool bAttacking, bool bForRangedAttack);CivRegisterBefore<CivHooks::CvUnit_GetMaxRangedCombatStrength>(host, &BeforeCvUnit_GetMaxRangedCombatStrength);CivRegisterAfter<CivHooks::CvUnit_GetMaxRangedCombatStrength>(host, &AfterCvUnit_GetMaxRangedCombatStrength);CivRegisterReplace<CivHooks::CvUnit_GetMaxRangedCombatStrength>(host, &ReplaceCvUnit_GetMaxRangedCombatStrength);
Code
12787int CvUnit::GetMaxRangedCombatStrength(const CvUnit* pOtherUnit, const CvCity* pCity, bool bAttacking, bool bForRangedAttack) const12788{12789 VALIDATE_OBJECT12790 int iModifier;12791 int iCombat;1279212793 int iTempModifier;1279412795 CvPlayerAI& kPlayer = GET_PLAYER(getOwner());12796 CvPlayerTraits* pTraits = kPlayer.GetPlayerTraits();12797 CvGameReligions* pReligions = GC.getGame().GetGameReligions();12798 ReligionTypes eFoundedReligion = pReligions->GetFounderBenefitsReligion(kPlayer.GetID());1279912800 int iStr = isRangedSupportFire() ? GetBaseCombatStrength() / 2 : GetBaseRangedCombatStrength();1280112802 if(iStr == 0)12803 {12804 return 0;12805 }1280612807 // Extra combat percent12808 iModifier = getExtraCombatPercent();1280912810 // Kamikaze attack12811 if(getKamikazePercent() != 0)12812 iModifier += getKamikazePercent();1281312814 // If the empire is unhappy, then Units get a combat penalty12815#if defined(MOD_GLOBAL_CS_RAZE_RARELY)12816 if((!kPlayer.isMinorCiv() && kPlayer.IsEmpireUnhappy()) || (kPlayer.isMinorCiv() && kPlayer.IsEmpireVeryUnhappy()))12817#else12818 if(kPlayer.IsEmpireUnhappy())12819#endif12820 {12821 iModifier += GetUnhappinessCombatPenalty();12822 }1282312824 // Over our strategic resource limit?12825 iTempModifier = GetStrategicResourceCombatPenalty();12826 if(iTempModifier != 0)12827 iModifier += iTempModifier;1282812829 // Great General nearby12830#if defined(MOD_PROMOTIONS_AURA_CHANGE)12831 int iAuraEffectChange = 0;12832 if(IsNearGreatGeneral(iAuraEffectChange) && !IsIgnoreGreatGeneralBenefit())12833#else12834 if(IsNearGreatGeneral() && !IsIgnoreGreatGeneralBenefit())12835#endif12836 {12837#if defined(MOD_BUGFIX_MINOR)12838 iModifier += kPlayer.GetGreatGeneralCombatBonus();12839#else12840 iModifier += /*25*/ GC.getGREAT_GENERAL_STRENGTH_MOD();12841#endif12842 iModifier += pTraits->GetGreatGeneralExtraBonus();12843#if defined(MOD_PROMOTIONS_AURA_CHANGE)12844 iModifier += iAuraEffectChange;12845#endif1284612847 if(IsStackedGreatGeneral())12848 {12849 iModifier += GetGreatGeneralCombatModifier();12850 }12851 }1285212853 // Reverse Great General nearby12854 int iReverseGGModifier = GetReverseGreatGeneralModifier();12855 if(iReverseGGModifier != 0)12856 {12857 iModifier += iReverseGGModifier;12858 }1285912860 // Improvement with combat bonus (from trait) nearby12861 int iNearbyImprovementModifier = GetNearbyImprovementModifier();12862 if(iNearbyImprovementModifier != 0)12863 {12864 iModifier += iNearbyImprovementModifier;12865 }1286612867 // Our empire fights well in Golden Ages?12868 if(kPlayer.isGoldenAge())12869 iModifier += pTraits->GetGoldenAgeCombatModifier();1287012871 ////////////////////////12872 // OTHER UNIT IS KNOWN12873 ////////////////////////1287412875 if(NULL != pOtherUnit)12876 {12877 // Unit Class Mod12878 iModifier += getUnitClassModifier(pOtherUnit->getUnitClassType());1287912880 // Unit combat modifier VS other unit12881 if(pOtherUnit->getUnitCombatType() != NO_UNITCOMBAT)12882 iModifier += unitCombatModifier(pOtherUnit->getUnitCombatType());1288312884 // Domain modifier VS other unit12885 iModifier += domainModifier(pOtherUnit->getDomainType());1288612887 // Bonus VS fortified12888 if(pOtherUnit->getFortifyTurns() > 0)12889 iModifier += attackFortifiedModifier();1289012891 // Bonus VS wounded12892 if(pOtherUnit->getDamage() > 0)12893 iModifier += attackWoundedModifier();1289412895 // Bonus against city states?12896 if(GET_PLAYER(pOtherUnit->getOwner()).isMinorCiv())12897 {12898 iModifier += pTraits->GetCityStateCombatModifier();12899 }1290012901 // OTHER UNIT is a Barbarian12902 if(pOtherUnit->isBarbarian())12903 {12904 // Generic Barb Combat Bonus12905 iTempModifier = kPlayer.GetBarbarianCombatBonus();12906 iModifier += iTempModifier;1290712908 CvHandicapInfo& thisGameHandicap = GC.getGame().getHandicapInfo();1290912910 // Human bonus12911 if(isHuman())12912 {12913 iTempModifier = thisGameHandicap.getBarbarianCombatModifier();12914 iModifier += iTempModifier;12915 }12916 // AI bonus12917 else12918 {12919 iTempModifier = thisGameHandicap.getAIBarbarianCombatModifier();12920 iModifier += iTempModifier;12921 }1292212923 if(GC.getGame().isOption(GAMEOPTION_RAGING_BARBARIANS))12924 {12925 iModifier += 25;12926 }12927 }1292812929 // ATTACKING12930 if(bForRangedAttack)12931 {12932 // Unit Class Attack Mod12933 iModifier += unitClassAttackModifier(pOtherUnit->getUnitClassType());1293412935 ////////////////////////12936 // KNOWN BATTLE PLOT12937 ////////////////////////1293812939 CvPlot* pTargetPlot = pOtherUnit->plot();1294012941 // Open Ground12942 if(pTargetPlot->isOpenGround())12943 iModifier += openRangedAttackModifier();1294412945 // Rough Ground12946 if(pTargetPlot->isRoughGround())12947 iModifier += roughRangedAttackModifier();1294812949 // Bonus for fighting in one's lands12950 if(pTargetPlot->IsFriendlyTerritory(getOwner()))12951 {12952 iTempModifier = getFriendlyLandsModifier();12953 iModifier += iTempModifier;1295412955 // Founder Belief bonus12956 CvCity* pPlotCity = pTargetPlot->getWorkingCity();12957 if(pPlotCity)12958 {12959 ReligionTypes eReligion = pPlotCity->GetCityReligions()->GetReligiousMajority();12960 if(eReligion != NO_RELIGION && eReligion == eFoundedReligion)12961 {12962 const CvReligion* pCityReligion = pReligions->GetReligion(eReligion, pPlotCity->getOwner());12963 if(pCityReligion)12964 {12965 iTempModifier = pCityReligion->m_Beliefs.GetCombatModifierFriendlyCities();12966 iModifier += iTempModifier;12967 }12968 }12969 }12970 }1297112972 // Bonus for fighting outside one's lands12973 else12974 {12975 iTempModifier = getOutsideFriendlyLandsModifier();12976 iModifier += iTempModifier;1297712978 // Founder Belief bonus (this must be a city controlled by an enemy)12979 CvCity* pPlotCity = pTargetPlot->getWorkingCity();12980 if(pPlotCity)12981 {12982 if(atWar(getTeam(), pPlotCity->getTeam()))12983 {12984 ReligionTypes eReligion = pPlotCity->GetCityReligions()->GetReligiousMajority();12985 if(eReligion != NO_RELIGION && eReligion == eFoundedReligion)12986 {12987 const CvReligion* pCityReligion = GC.getGame().GetGameReligions()->GetReligion(eReligion, pPlotCity->getOwner());12988 if(pCityReligion)12989 {12990 iTempModifier = pCityReligion->m_Beliefs.GetCombatModifierEnemyCities();12991 iModifier += iTempModifier;12992 }12993 }12994 }12995 }12996 }12997 }1299812999 // Ranged DEFENSE13000 else13001 {13002 // Ranged Defense Mod13003 iModifier += rangedDefenseModifier();1300413005 // Unit Class Defense Mod13006 iModifier += unitClassDefenseModifier(pOtherUnit->getUnitClassType());13007 }13008 }1300913010 ////////////////////////13011 // ATTACKING A CITY13012 ////////////////////////1301313014 if(pCity != NULL)13015 {13016 // Attacking a City13017 iTempModifier = cityAttackModifier();13018 iModifier += iTempModifier;1301913020 // Nearby unit sapping this city13021 if(IsNearSapper(pCity))13022 {13023 iTempModifier = GC.getSAPPED_CITY_ATTACK_MODIFIER();13024 iModifier += iTempModifier;13025 }1302613027 // Bonus against city states?13028 if(GET_PLAYER(pCity->getOwner()).isMinorCiv())13029 {13030 iModifier += pTraits->GetCityStateCombatModifier();13031 }13032 }1303313034 // Ranged attack mod13035 if(bForRangedAttack)13036 {13037 iModifier += GetRangedAttackModifier();13038 }1303913040 // This unit on offense13041 if(bAttacking)13042 {13043 iModifier += getAttackModifier();13044 }13045 // This Unit on defense13046 else13047 {13048 // No TERRAIN bonuses for this Unit?13049 iTempModifier = plot()->defenseModifier(getTeam(), false);1305013051 // If we receive normal defensive bonuses OR iTempModifier is actually a PENALTY, then add in the mod13052 if(!noDefensiveBonus() || iTempModifier < 0)13053 iModifier += iTempModifier;1305413055 iModifier += getDefenseModifier();13056 }1305713058 // Unit can't drop below 10% strength13059 if(iModifier < -90)13060 iModifier = -90;1306113062 iCombat = (iStr * (iModifier + 100));1306313064 return std::max(1, iCombat);13065}
Calls
- atWar(TeamTypes, TeamTypes)
- CvCity::GetCityReligions() const
- CvCity::getOwner() const
- CvCity::getTeam() const
- CvCityReligions::GetReligiousMajority()
- CvGame::GetGameReligions()
- CvGame::getHandicapInfo() const
- CvGame::isOption(GameOptionTypes) const
- CvGameReligions::GetFounderBenefitsReligion(PlayerTypes) const
- CvGameReligions::GetReligion(ReligionTypes, PlayerTypes) const
- CvGlobals::getGame()
- CvGlobals::getSAPPED_CITY_ATTACK_MODIFIER()
- CvHandicapInfo::getAIBarbarianCombatModifier() const
- CvHandicapInfo::getBarbarianCombatModifier() const
- CvPlayer::GetBarbarianCombatBonus() const
- CvPlayer::GetGreatGeneralCombatBonus() const
- CvPlayer::GetID() const
- CvPlayer::GetPlayerTraits() const
- CvPlayer::IsEmpireUnhappy() const
- CvPlayer::IsEmpireVeryUnhappy() const
- CvPlayer::isGoldenAge() const
- CvPlayer::isMinorCiv() const
- CvPlayerAI::getPlayer(PlayerTypes)
- CvPlayerTraits::GetCityStateCombatModifier() const
- CvPlayerTraits::GetGoldenAgeCombatModifier() const
- CvPlayerTraits::GetGreatGeneralExtraBonus() const
- CvPlot::defenseModifier(TeamTypes, bool, bool) const
- CvPlot::getWorkingCity() const
- CvPlot::IsFriendlyTerritory(PlayerTypes) const
- CvPlot::isOpenGround() const
- CvPlot::isRoughGround() const
- CvReligionBeliefs::GetCombatModifierEnemyCities() const
- CvReligionBeliefs::GetCombatModifierFriendlyCities() const
- CvUnit::attackFortifiedModifier() const
- CvUnit::attackWoundedModifier() const
- CvUnit::cityAttackModifier() const
- CvUnit::domainModifier(DomainTypes) const
- CvUnit::getAttackModifier() const
- CvUnit::GetBaseCombatStrength(bool) const
- CvUnit::GetBaseRangedCombatStrength() const
- CvUnit::getDamage() const
- CvUnit::getDefenseModifier() const
- CvUnit::getDomainType() const
- CvUnit::getExtraCombatPercent() const
- CvUnit::getFortifyTurns() const
- CvUnit::getFriendlyLandsModifier() const
- CvUnit::GetGreatGeneralCombatModifier() const
- CvUnit::getKamikazePercent() const
- CvUnit::GetNearbyImprovementModifier() const
- CvUnit::getOutsideFriendlyLandsModifier() const
- CvUnit::getOwner() const
- CvUnit::GetRangedAttackModifier() const
- CvUnit::GetReverseGreatGeneralModifier() const
- CvUnit::GetStrategicResourceCombatPenalty() const
- CvUnit::getTeam() const
- CvUnit::GetUnhappinessCombatPenalty() const
- CvUnit::getUnitClassModifier(UnitClassTypes) const
- CvUnit::getUnitClassType() const
- CvUnit::getUnitCombatType() const
- CvUnit::isBarbarian() const
- CvUnit::isHuman() const
- CvUnit::IsIgnoreGreatGeneralBenefit() const
- CvUnit::IsNearGreatGeneral(int &) const
- CvUnit::IsNearSapper(const CvCity *) const
- CvUnit::isRangedSupportFire() const
- CvUnit::IsStackedGreatGeneral() const
- CvUnit::noDefensiveBonus() const
- CvUnit::openRangedAttackModifier() const
- CvUnit::plot() const
- CvUnit::rangedDefenseModifier() const
- CvUnit::roughRangedAttackModifier() const
- CvUnit::unitClassAttackModifier(UnitClassTypes) const
- CvUnit::unitClassDefenseModifier(UnitClassTypes) const
- CvUnit::unitCombatModifier(UnitCombatTypes) const
std::max
Called by
- CvCity::GetAirStrikeDefenseDamage(const CvUnit *, bool) const
- CvCity::rangeCombatUnitDefense(const CvUnit *) const
- CvTacticalAI::ComputeTotalExpectedDamage(CvTacticalTarget *, CvPlot *)
- CvTacticalAI::FindUnitsWithinStrikingDistance(CvPlot *, int, int, bool, bool, bool, bool, bool, bool)
- CvTacticalAI::IdentifyPriorityBarbarianTargets()
- CvTacticalAI::IdentifyPriorityTargets()
- CvTacticalAnalysisMap::AddToDominanceZones(int, CvTacticalAnalysisCell *)
- CvTacticalAnalysisMap::CalculateMilitaryStrengths()
- CvUnit::GetAirCombatDamage(const CvUnit *, CvCity *, bool, int) const
- CvUnit::GetAirStrikeDefenseDamage(const CvUnit *, bool) const
- CvUnit::GetInterceptionDamage(const CvUnit *, bool) const
- CvUnit::GetParadropInterceptionDamage(const CvUnit *, bool) const
- CvUnit::GetRangeCombatDamage(const CvUnit *, CvCity *, bool, int) const
- CvUnitCombat::GenerateAirSweepCombatInfo(CvUnit &, CvUnit *, CvPlot &, CvCombatInfo *)
- CvUnitCombat::GenerateMeleeCombatInfo(CvUnit &, CvUnit *, CvPlot &, CvCombatInfo *)
- CvLuaUnit::lGetMaxRangedCombatStrength(lua_State *)