Bazaar developer reference

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

Called by