Bazaar developer reference

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

Defined in
CvUnitCombat.cpp, line 649
Class
CvUnitCombat
Hook name
CivHooks::CvUnitCombat_GenerateRangedCombatInfo

Hooks

static bool BeforeCvUnitCombat_GenerateRangedCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void AfterCvUnitCombat_GenerateRangedCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void ReplaceCvUnitCombat_GenerateRangedCombatInfo(void (*original)(CvUnit&, CvUnit*, CvPlot&, CvCombatInfo*), CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);CivRegisterBefore<CivHooks::CvUnitCombat_GenerateRangedCombatInfo>(host, &BeforeCvUnitCombat_GenerateRangedCombatInfo);CivRegisterAfter<CivHooks::CvUnitCombat_GenerateRangedCombatInfo>(host, &AfterCvUnitCombat_GenerateRangedCombatInfo);CivRegisterReplace<CivHooks::CvUnitCombat_GenerateRangedCombatInfo>(host, &ReplaceCvUnitCombat_GenerateRangedCombatInfo);

Code

649void CvUnitCombat::GenerateRangedCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo)650{651	BATTLE_STARTED(BATTLE_TYPE_RANGED, plot);652	pkCombatInfo->setUnit(BATTLE_UNIT_ATTACKER, &kAttacker);653	pkCombatInfo->setUnit(BATTLE_UNIT_DEFENDER, pkDefender);654	pkCombatInfo->setPlot(&plot);655656	//////////////////////////////////////////////////////////////////////657658	bool bBarbarian = false;659	int iExperience = 0;660	int iMaxXP = 0;661	int iDamage = 0;662	int iTotalDamage = 0;663	PlayerTypes eDefenderOwner;664	if(!plot.isCity())665	{666		CvAssert(pkDefender != NULL);667668		eDefenderOwner = pkDefender->getOwner();669670		iExperience = /*2*/ GC.getEXPERIENCE_ATTACKING_UNIT_RANGED();671		if(pkDefender->isBarbarian())672			bBarbarian = true;673		iMaxXP = pkDefender->maxXPValue();674675		//CvAssert(pkDefender->IsCanDefend());676677		iDamage = kAttacker.GetRangeCombatDamage(pkDefender, /*pCity*/ NULL, /*bIncludeRand*/ true);678679#if defined(MOD_UNITS_MAX_HP)680		if(iDamage + pkDefender->getDamage() > kAttacker.GetMaxHitPoints())681		{682			iDamage = kAttacker.GetMaxHitPoints() - pkDefender->getDamage();683		}684#else685		if(iDamage + pkDefender->getDamage() > GC.getMAX_HIT_POINTS())686		{687			iDamage = GC.getMAX_HIT_POINTS() - pkDefender->getDamage();688		}689#endif690691		iTotalDamage = std::max(pkDefender->getDamage(), pkDefender->getDamage() + iDamage);692	}693	else694	{695		if (kAttacker.isRangedSupportFire()) return; // can't attack cities with this696697		CvCity* pCity = plot.getPlotCity();698		CvAssert(pCity != NULL);699		if(!pCity) return;700		BATTLE_JOINED(pCity, BATTLE_UNIT_DEFENDER, true);701702		eDefenderOwner = plot.getOwner();703		/*		iDefenderStrength = pCity->getStrengthValue() / 2;704		iOldDamage = pCity->getDamage();*/705706		iExperience = /*3*/ GC.getEXPERIENCE_ATTACKING_CITY_RANGED();707		if(pCity->isBarbarian())708			bBarbarian = true;709		iMaxXP = 1000;710711		iDamage = kAttacker.GetRangeCombatDamage(/*pDefender*/ NULL, pCity, /*bIncludeRand*/ true);712713		// Cities can't be knocked to less than 1 HP714		if(iDamage + pCity->getDamage() >= pCity->GetMaxHitPoints())715		{716			iDamage = pCity->GetMaxHitPoints() - pCity->getDamage() - 1;717		}718719		iTotalDamage = std::max(pCity->getDamage(), pCity->getDamage() + iDamage);720	}721	//////////////////////////////////////////////////////////////////////722723	pkCombatInfo->setFinalDamage(BATTLE_UNIT_ATTACKER, 0);				// Total damage to the unit724	pkCombatInfo->setDamageInflicted(BATTLE_UNIT_ATTACKER, iDamage);		// Damage inflicted this round725	pkCombatInfo->setFinalDamage(BATTLE_UNIT_DEFENDER, iTotalDamage);		// Total damage to the unit726	pkCombatInfo->setDamageInflicted(BATTLE_UNIT_DEFENDER, 0);			// Damage inflicted this round727728	// Fear Damage729	pkCombatInfo->setFearDamageInflicted(BATTLE_UNIT_ATTACKER, 0);730	// pkCombatInfo->setFearDamageInflicted( BATTLE_UNIT_DEFENDER, 0 );731732	pkCombatInfo->setExperience(BATTLE_UNIT_ATTACKER, iExperience);733	pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_ATTACKER, iMaxXP);734	pkCombatInfo->setInBorders(BATTLE_UNIT_ATTACKER, plot.getOwner() == eDefenderOwner);735#if defined(MOD_BUGFIX_BARB_GP_XP)736	bool bGeneralsXP = !kAttacker.isBarbarian();737	if (MOD_BUGFIX_BARB_GP_XP) {738		if (!plot.isCity()) {739			bGeneralsXP = !pkDefender->isBarbarian();740		} else {741			bGeneralsXP = !plot.getPlotCity()->isBarbarian();742		}743	}744#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)745	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, kAttacker.isGGFromBarbarians() || bGeneralsXP);746#else747	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, bGeneralsXP);748#endif749#else750#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)751	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, kAttacker.isGGFromBarbarians() || !kAttacker.isBarbarian());752#else753	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, !kAttacker.isBarbarian());754#endif755#endif756757	iExperience = /*2*/ GC.getEXPERIENCE_DEFENDING_UNIT_RANGED();758	pkCombatInfo->setExperience(BATTLE_UNIT_DEFENDER, iExperience);759	pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_DEFENDER, kAttacker.maxXPValue());760	pkCombatInfo->setInBorders(BATTLE_UNIT_DEFENDER, plot.getOwner() == kAttacker.getOwner());761#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)762	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, (!plot.isCity() && pkDefender->isGGFromBarbarians()) || (!bBarbarian && !kAttacker.isBarbarian()));763#else764	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, !bBarbarian && !kAttacker.isBarbarian());765#endif766767	pkCombatInfo->setAttackIsRanged(true);768	// Defender doesn't retaliate.  We'll keep this separate from the ranged attack flag in case something changes to allow769	// some units to retaliate on a ranged attack (Archer vs. Archers maybe?)770	pkCombatInfo->setDefenderRetaliates(false);771772	GC.GetEngineUserInterface()->setDirty(UnitInfo_DIRTY_BIT, true);773}

Calls

Called by