Bazaar developer reference

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

Called by