Bazaar developer reference

CvUnit::GetGenericMaxStrengthModifier(const CvUnit *, const CvPlot *, bool) const

Defined in
CvUnit.cpp, line 12152
Class
CvUnit
Hook name
CivHooks::CvUnit_GetGenericMaxStrengthModifier

Hooks

static bool BeforeCvUnit_GetGenericMaxStrengthModifier(const CvUnit* self, const CvUnit* pOtherUnit, const CvPlot* pBattlePlot, bool bIgnoreUnitAdjacency, int& result);static void AfterCvUnit_GetGenericMaxStrengthModifier(const CvUnit* self, const CvUnit* pOtherUnit, const CvPlot* pBattlePlot, bool bIgnoreUnitAdjacency, int& result);static int ReplaceCvUnit_GetGenericMaxStrengthModifier(int (*original)(const CvUnit*, const CvUnit*, const CvPlot*, bool), const CvUnit* self, const CvUnit* pOtherUnit, const CvPlot* pBattlePlot, bool bIgnoreUnitAdjacency);CivRegisterBefore<CivHooks::CvUnit_GetGenericMaxStrengthModifier>(host, &BeforeCvUnit_GetGenericMaxStrengthModifier);CivRegisterAfter<CivHooks::CvUnit_GetGenericMaxStrengthModifier>(host, &AfterCvUnit_GetGenericMaxStrengthModifier);CivRegisterReplace<CivHooks::CvUnit_GetGenericMaxStrengthModifier>(host, &ReplaceCvUnit_GetGenericMaxStrengthModifier);

Code

12151/// What are the generic strength modifiers for this Unit?12152int CvUnit::GetGenericMaxStrengthModifier(const CvUnit* pOtherUnit, const CvPlot* pBattlePlot, bool bIgnoreUnitAdjacency) const12153{12154	VALIDATE_OBJECT1215512156	int iModifier = 0;12157	int iTempModifier;1215812159	// Generic combat bonus12160	iTempModifier = getExtraCombatPercent();12161	iModifier += iTempModifier;1216212163	CvPlayerAI& kPlayer = GET_PLAYER(getOwner());12164	CvGameReligions* pReligions = GC.getGame().GetGameReligions();12165	ReligionTypes eFoundedReligion = pReligions->GetFounderBenefitsReligion(kPlayer.GetID());1216612167	// If the empire is unhappy, then Units get a combat penalty12168#if defined(MOD_GLOBAL_CS_RAZE_RARELY)12169	if((!kPlayer.isMinorCiv() && kPlayer.IsEmpireUnhappy()) || (kPlayer.isMinorCiv() && kPlayer.IsEmpireVeryUnhappy()))12170#else12171	if(kPlayer.IsEmpireUnhappy())12172#endif12173	{12174		iModifier += GetUnhappinessCombatPenalty();12175	}1217612177	// Over our strategic resource limit?12178	iTempModifier = GetStrategicResourceCombatPenalty();12179	if(iTempModifier != 0)12180		iModifier += iTempModifier;1218112182	// Great General nearby12183#if defined(MOD_PROMOTIONS_AURA_CHANGE)12184	int iAuraEffectChange = 0;12185	if(IsNearGreatGeneral(iAuraEffectChange) && !IsIgnoreGreatGeneralBenefit())12186#else12187	if(IsNearGreatGeneral() && !IsIgnoreGreatGeneralBenefit())12188#endif12189	{12190		iModifier += kPlayer.GetGreatGeneralCombatBonus();12191		iModifier += kPlayer.GetPlayerTraits()->GetGreatGeneralExtraBonus();12192#if defined(MOD_PROMOTIONS_AURA_CHANGE)12193		iModifier += iAuraEffectChange;12194#endif1219512196		if(IsStackedGreatGeneral())12197		{12198			iModifier += GetGreatGeneralCombatModifier();12199		}12200	}1220112202	// Reverse Great General nearby12203	int iReverseGGModifier = GetReverseGreatGeneralModifier();12204	if(iReverseGGModifier != 0)12205	{12206		iModifier += iReverseGGModifier;12207	}1220812209	// Improvement with combat bonus (from trait) nearby12210	int iNearbyImprovementModifier = GetNearbyImprovementModifier();12211	if(iNearbyImprovementModifier != 0)12212	{12213		iModifier += iNearbyImprovementModifier;12214	}1221512216	// Adjacent Friendly military Unit?12217	if(IsFriendlyUnitAdjacent(/*bCombatUnit*/ true))12218		iModifier += GetAdjacentModifier();1221912220	// Our empire fights well in Golden Ages?12221	if(kPlayer.isGoldenAge())12222		iModifier += kPlayer.GetPlayerTraits()->GetGoldenAgeCombatModifier();1222312224	////////////////////////12225	// KNOWN BATTLE PLOT12226	////////////////////////1222712228	if(pBattlePlot != NULL)12229	{12230		// Bonuses for fighting in one's lands12231		if(pBattlePlot->IsFriendlyTerritory(getOwner()))12232		{12233			iTempModifier = getFriendlyLandsModifier();12234			iModifier += iTempModifier;1223512236			// Founder Belief bonus12237			CvCity* pPlotCity = pBattlePlot->getWorkingCity();12238			if(pPlotCity)12239			{12240				ReligionTypes eReligion = pPlotCity->GetCityReligions()->GetReligiousMajority();12241				if(eReligion != NO_RELIGION && eReligion == eFoundedReligion)12242				{12243					const CvReligion* pCityReligion = pReligions->GetReligion(eReligion, pPlotCity->getOwner());12244					if(pCityReligion)12245					{12246						iTempModifier = pCityReligion->m_Beliefs.GetCombatModifierFriendlyCities();12247						iModifier += iTempModifier;12248					}12249				}12250			}12251		}1225212253		// Bonuses outside one's lands12254		else12255		{12256			iTempModifier = getOutsideFriendlyLandsModifier();12257			iModifier += iTempModifier;1225812259			// Bonus against city states?12260			if(pBattlePlot->isCity() && GET_PLAYER(pBattlePlot->getOwner()).isMinorCiv())12261			{12262				iModifier += kPlayer.GetPlayerTraits()->GetCityStateCombatModifier();12263			}1226412265			// Founder Belief bonus (this must be a city controlled by an enemy)12266			CvCity* pPlotCity = pBattlePlot->getWorkingCity();12267			if(pPlotCity)12268			{12269				if(atWar(getTeam(), pPlotCity->getTeam()))12270				{12271					ReligionTypes eReligion = pPlotCity->GetCityReligions()->GetReligiousMajority();12272					if(eReligion != NO_RELIGION && eReligion == eFoundedReligion)12273					{12274						const CvReligion* pCityReligion = GC.getGame().GetGameReligions()->GetReligion(eReligion, pPlotCity->getOwner());12275						if(pCityReligion)12276						{12277							iTempModifier = pCityReligion->m_Beliefs.GetCombatModifierEnemyCities();12278							iModifier += iTempModifier;12279						}12280					}12281				}12282			}12283		}1228412285		// Capital Defense12286		iTempModifier = GetCapitalDefenseModifier();12287		if(iTempModifier > 0)12288		{12289			CvCity* pCapital = GET_PLAYER(getOwner()).getCapitalCity();12290			if(pCapital)12291			{12292				int iDistanceToCapital = plotDistance(pBattlePlot->getX(), pBattlePlot->getY(), pCapital->getX(), pCapital->getY());12293				iTempModifier += (iDistanceToCapital * GetCapitalDefenseFalloff());12294				if (iTempModifier > 0)12295				{12296					iModifier += iTempModifier;12297				}12298			}12299		}1230012301		// Trait (player level) bonus against higher tech units12302		iTempModifier = GET_PLAYER(getOwner()).GetPlayerTraits()->GetCombatBonusVsHigherTech();12303		if(iTempModifier > 0)12304		{12305			// Only applies defending friendly territory12306			if(pBattlePlot->getOwner() == getOwner())12307			{12308				// Check tech levels too12309				UnitTypes eMyUnitType = getUnitType();12310				if(pOtherUnit && pOtherUnit->IsHigherTechThan(eMyUnitType))12311				{12312					iModifier += iTempModifier;12313				}12314			}12315		}1231612317		// Trait (player level) bonus against larger civs12318		iTempModifier = GET_PLAYER(getOwner()).GetPlayerTraits()->GetCombatBonusVsLargerCiv();12319		if(iTempModifier > 0)12320		{12321			if(pOtherUnit && pOtherUnit->IsLargerCivThan(this))12322			{12323				iModifier += iTempModifier;12324			}12325		}12326	}1232712328	////////////////////////12329	// OTHER UNIT IS KNOWN12330	////////////////////////1233112332	if(pOtherUnit != NULL)12333	{12334		CvAssertMsg(pOtherUnit != this, "Compared combat strength against one's own pointer. This is weird and probably wrong.");1233512336		if(!bIgnoreUnitAdjacency)12337		{12338			// Flanking12339			int iNumAdjacentFriends = pOtherUnit->GetNumEnemyUnitsAdjacent(this);12340			if(iNumAdjacentFriends > 0)12341			{12342				iTempModifier = /*15*/ GC.getBONUS_PER_ADJACENT_FRIEND() * iNumAdjacentFriends;1234312344				int iFlankModifier = GetFlankAttackModifier();12345				if(iFlankModifier > 0)12346				{12347					iTempModifier = iTempModifier * (100 + iFlankModifier) / 100;12348				}1234912350				iModifier += iTempModifier;12351			}12352		}1235312354		// Generic Unit Class Modifier12355		iTempModifier = getUnitClassModifier(pOtherUnit->getUnitClassType());12356		iModifier += iTempModifier;1235712358		// Unit Combat type Modifier12359		if(pOtherUnit->getUnitCombatType() != NO_UNITCOMBAT)12360		{12361			iTempModifier = unitCombatModifier(pOtherUnit->getUnitCombatType());12362			iModifier += iTempModifier;12363		}1236412365		// Domain Modifier12366		iTempModifier = domainModifier(pOtherUnit->getDomainType());12367		iModifier += iTempModifier;1236812369		// Bonus against city states?12370		if(GET_PLAYER(pOtherUnit->getOwner()).isMinorCiv())12371		{12372			iModifier += kPlayer.GetPlayerTraits()->GetCityStateCombatModifier();12373		}1237412375		// OTHER UNIT is a Barbarian12376		if(pOtherUnit->isBarbarian())12377		{12378			// Generic Barb Combat Bonus12379			iTempModifier = kPlayer.GetBarbarianCombatBonus();12380			iModifier += iTempModifier;1238112382			CvHandicapInfo& thisGameHandicap = GC.getGame().getHandicapInfo();1238312384			// Human bonus12385			if(isHuman())12386			{12387				iTempModifier = thisGameHandicap.getBarbarianCombatModifier();12388				iModifier += iTempModifier;12389			}12390			// AI bonus12391			else12392			{12393				iTempModifier = thisGameHandicap.getAIBarbarianCombatModifier();12394				iModifier += iTempModifier;12395			}1239612397			if(GC.getGame().isOption(GAMEOPTION_RAGING_BARBARIANS))12398			{12399				iModifier += 25;12400			}12401		}12402	}1240312404	return iModifier;12405}

Calls

Called by