Bazaar developer reference

CvUnitCombat::GenerateRangedCombatInfo(CvCity &, CvUnit *, CvPlot &, CvCombatInfo *)

Defined in
CvUnitCombat.cpp, line 786
Class
CvUnitCombat
Hook name
CivHooks::CvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo

Hooks

static bool BeforeCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo(CvCity& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void AfterCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo(CvCity& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void ReplaceCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo(void (*original)(CvCity&, CvUnit*, CvPlot&, CvCombatInfo*), CvCity& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);CivRegisterBefore<CivHooks::CvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo>(host, &BeforeCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo);CivRegisterAfter<CivHooks::CvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo>(host, &AfterCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo);CivRegisterReplace<CivHooks::CvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo>(host, &ReplaceCvUnitCombat_GenerateRangedCombatInfo_with_CvCity_CvUnit_CvPlot_CvCombatInfo);

Code

786void CvUnitCombat::GenerateRangedCombatInfo(CvCity& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo)787{788	BATTLE_STARTED(BATTLE_TYPE_RANGED, plot);789	pkCombatInfo->setCity(BATTLE_UNIT_ATTACKER, &kAttacker);790	pkCombatInfo->setUnit(BATTLE_UNIT_DEFENDER, pkDefender);791	pkCombatInfo->setPlot(&plot);792793	//////////////////////////////////////////////////////////////////////794795	bool bBarbarian = false;796	int iDamage = 0;797	int iTotalDamage = 0;798	PlayerTypes eDefenderOwner = NO_PLAYER;799	if(!plot.isCity())800	{801		CvAssert(pkDefender != NULL);802803		eDefenderOwner = pkDefender->getOwner();804805		if(pkDefender->isBarbarian())806			bBarbarian = true;807808		//CvAssert(pkDefender->IsCanDefend());809810		iDamage = kAttacker.rangeCombatDamage(pkDefender);811812#if defined(MOD_UNITS_MAX_HP)813		if(iDamage + pkDefender->getDamage() > pkDefender->GetMaxHitPoints())814		{815			iDamage = pkDefender->GetMaxHitPoints() - pkDefender->getDamage();816		}817#else818		if(iDamage + pkDefender->getDamage() > GC.getMAX_HIT_POINTS())819		{820			iDamage = GC.getMAX_HIT_POINTS() - pkDefender->getDamage();821		}822#endif823824		iTotalDamage = std::max(pkDefender->getDamage(), pkDefender->getDamage() + iDamage);825	}826	else827	{828		FAssertMsg(false, "City vs. City not supported.");	// Don't even think about it Jon....829	}830831	//////////////////////////////////////////////////////////////////////832833	pkCombatInfo->setFinalDamage(BATTLE_UNIT_ATTACKER, 0);				// Total damage to the unit834	pkCombatInfo->setDamageInflicted(BATTLE_UNIT_ATTACKER, iDamage);		// Damage inflicted this round835	pkCombatInfo->setFinalDamage(BATTLE_UNIT_DEFENDER, iTotalDamage);		// Total damage to the unit836	pkCombatInfo->setDamageInflicted(BATTLE_UNIT_DEFENDER, 0);			// Damage inflicted this round837838	// Fear Damage839	pkCombatInfo->setFearDamageInflicted(BATTLE_UNIT_ATTACKER, 0);840	// pkCombatInfo->setFearDamageInflicted( BATTLE_UNIT_DEFENDER, 0 );841842	pkCombatInfo->setExperience(BATTLE_UNIT_ATTACKER, 0);843	pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_ATTACKER, 0);844	pkCombatInfo->setInBorders(BATTLE_UNIT_ATTACKER, plot.getOwner() == eDefenderOwner);845#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)846	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, !kAttacker.isBarbarian()); // Kind of irrelevant, as cities don't get XP!847#else848	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, !kAttacker.isBarbarian());849#endif850851	int iExperience = /*2*/ GC.getEXPERIENCE_DEFENDING_UNIT_RANGED();852	pkCombatInfo->setExperience(BATTLE_UNIT_DEFENDER, iExperience);853	pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_DEFENDER, MAX_INT);854	pkCombatInfo->setInBorders(BATTLE_UNIT_DEFENDER, plot.getOwner() == kAttacker.getOwner());855#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)856	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, pkDefender->isGGFromBarbarians() || !bBarbarian && !kAttacker.isBarbarian());857#else858	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, !bBarbarian && !kAttacker.isBarbarian());859#endif860861	pkCombatInfo->setAttackIsRanged(true);862	// Defender doesn't retaliate.  We'll keep this separate from the ranged attack flag in case something changes to allow863	// some units to retaliate on a ranged attack (Archer vs. Archers maybe?)864	pkCombatInfo->setDefenderRetaliates(false);865866	GC.GetEngineUserInterface()->setDirty(UnitInfo_DIRTY_BIT, true);867}

Calls

Called by