Bazaar developer reference

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

Defined in
CvUnitCombat.cpp, line 1371
Class
CvUnitCombat
Hook name
CivHooks::CvUnitCombat_GenerateAirCombatInfo

Hooks

static bool BeforeCvUnitCombat_GenerateAirCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void AfterCvUnitCombat_GenerateAirCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void ReplaceCvUnitCombat_GenerateAirCombatInfo(void (*original)(CvUnit&, CvUnit*, CvPlot&, CvCombatInfo*), CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);CivRegisterBefore<CivHooks::CvUnitCombat_GenerateAirCombatInfo>(host, &BeforeCvUnitCombat_GenerateAirCombatInfo);CivRegisterAfter<CivHooks::CvUnitCombat_GenerateAirCombatInfo>(host, &AfterCvUnitCombat_GenerateAirCombatInfo);CivRegisterReplace<CivHooks::CvUnitCombat_GenerateAirCombatInfo>(host, &ReplaceCvUnitCombat_GenerateAirCombatInfo);

Code

1371void CvUnitCombat::GenerateAirCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo)1372{1373	BATTLE_STARTED(BATTLE_TYPE_AIR, plot);1374	int iExperience = 0;13751376	pkCombatInfo->setUnit(BATTLE_UNIT_ATTACKER, &kAttacker);1377	pkCombatInfo->setUnit(BATTLE_UNIT_DEFENDER, pkDefender);1378	pkCombatInfo->setPlot(&plot);13791380	//////////////////////////////////////////////////////////////////////13811382	// Any interception to be done?1383	CvUnit* pInterceptor = kAttacker.GetBestInterceptor(plot, pkDefender);1384	int iInterceptionDamage = 0;13851386	if(pInterceptor != NULL && pInterceptor != pkDefender)1387	{1388		pkCombatInfo->setUnit(BATTLE_UNIT_INTERCEPTOR, pInterceptor);1389		// Does the attacker evade?1390		if(GC.getGame().getJonRandNum(100, "Evasion Rand") >= kAttacker.evasionProbability())1391		{1392			// Is the interception successful?1393			if(GC.getGame().getJonRandNum(100, "Intercept Rand (Air)") < pInterceptor->currInterceptionProbability())1394			{1395				iInterceptionDamage = pInterceptor->GetInterceptionDamage(&kAttacker);1396			}1397		}1398		pkCombatInfo->setDamageInflicted(BATTLE_UNIT_INTERCEPTOR, iInterceptionDamage);		// Damage inflicted this round1399	}14001401	//////////////////////////////////////////////////////////////////////14021403	bool bBarbarian = false;1404	int iMaxXP = 0;14051406	int iAttackerDamageInflicted;1407	int iDefenderDamageInflicted;14081409	int iAttackerTotalDamageInflicted;1410	int iDefenderTotalDamageInflicted;14111412	PlayerTypes eDefenderOwner;14131414	// Target is a Unit1415	if(!plot.isCity())1416	{1417		CvAssert(pkDefender != NULL);1418		if(!pkDefender)1419			return;14201421		eDefenderOwner = pkDefender->getOwner();14221423		iExperience = /*4*/ GC.getEXPERIENCE_ATTACKING_UNIT_AIR();1424		if(pkDefender->isBarbarian())1425			bBarbarian = true;1426		iMaxXP = pkDefender->maxXPValue();14271428		// Calculate attacker damage1429		iAttackerDamageInflicted = kAttacker.GetAirCombatDamage(pkDefender, /*pCity*/ NULL, /*bIncludeRand*/ true, iInterceptionDamage);14301431#if defined(MOD_UNITS_MAX_HP)1432		if(iAttackerDamageInflicted + pkDefender->getDamage() > pkDefender->GetMaxHitPoints())1433		{1434			iAttackerDamageInflicted = pkDefender->GetMaxHitPoints() - pkDefender->getDamage();1435		}1436#else1437		if(iAttackerDamageInflicted + pkDefender->getDamage() > GC.getMAX_HIT_POINTS())1438		{1439			iAttackerDamageInflicted = GC.getMAX_HIT_POINTS() - pkDefender->getDamage();1440		}1441#endif14421443		iAttackerTotalDamageInflicted = std::max(pkDefender->getDamage(), pkDefender->getDamage() + iAttackerDamageInflicted);14441445		// Calculate defense damage1446		iDefenderDamageInflicted = pkDefender->GetAirStrikeDefenseDamage(&kAttacker);14471448#if defined(MOD_UNITS_MAX_HP)1449		if(iDefenderDamageInflicted + kAttacker.getDamage() > kAttacker.GetMaxHitPoints())1450		{1451			iDefenderDamageInflicted = kAttacker.GetMaxHitPoints() - kAttacker.getDamage();1452		}1453#else1454		if(iDefenderDamageInflicted + kAttacker.getDamage() > GC.getMAX_HIT_POINTS())1455		{1456			iDefenderDamageInflicted = GC.getMAX_HIT_POINTS() - kAttacker.getDamage();1457		}1458#endif14591460		iDefenderTotalDamageInflicted = std::max(kAttacker.getDamage(), kAttacker.getDamage() + (iDefenderDamageInflicted + iInterceptionDamage));1461	}1462	// Target is a City1463	else1464	{1465		CvCity* pCity = plot.getPlotCity();1466		CvAssert(pCity != NULL);1467		if(!pCity) return;1468		BATTLE_JOINED(pCity, BATTLE_UNIT_DEFENDER, true);1469		1470		CUSTOMLOG("Bombing %s by %s", pCity->getName().GetCString(), kAttacker.getName().GetCString());1471		if(pInterceptor != NULL && pInterceptor != pkDefender) {1472			CUSTOMLOG("  intercption being done by %s for %i damage", pInterceptor->getName().GetCString(), iInterceptionDamage);1473		}14741475		eDefenderOwner = plot.getOwner();14761477		/*		iDefenderStrength = pCity->getStrengthValue() / 2;1478		iOldDamage = pCity->getDamage();*/14791480		iExperience = /*4*/ GC.getEXPERIENCE_ATTACKING_CITY_AIR();1481		if(pCity->isBarbarian())1482			bBarbarian = true;1483		iMaxXP = 1000;14841485		iAttackerDamageInflicted = kAttacker.GetAirCombatDamage(/*pUnit*/ NULL, pCity, /*bIncludeRand*/ true, iInterceptionDamage);14861487		// Cities can't be knocked to less than 1 HP1488		if(iAttackerDamageInflicted + pCity->getDamage() >= pCity->GetMaxHitPoints())1489		{1490			iAttackerDamageInflicted = pCity->GetMaxHitPoints() - pCity->getDamage() - 1;1491		}14921493		iAttackerTotalDamageInflicted = std::max(pCity->getDamage(), pCity->getDamage() + iAttackerDamageInflicted);14941495		// Calculate defense damage1496		iDefenderDamageInflicted = pCity->GetAirStrikeDefenseDamage(&kAttacker);14971498		if(iDefenderDamageInflicted + kAttacker.getDamage() > pCity->GetMaxHitPoints())1499		{1500#if defined(MOD_BUGFIX_MINOR)1501			// Surely!!!1502			iDefenderDamageInflicted = pCity->GetMaxHitPoints() - kAttacker.getDamage();1503#else1504			iDefenderDamageInflicted = GC.getMAX_HIT_POINTS() - kAttacker.getDamage();1505#endif1506		}15071508		iDefenderTotalDamageInflicted = std::max(kAttacker.getDamage(), kAttacker.getDamage() + (iDefenderDamageInflicted + iInterceptionDamage));15091510#if !defined(NO_ACHIEVEMENTS)1511		//Achievement for Washington1512		CvUnitEntry* pkUnitInfo = GC.getUnitInfo(kAttacker.getUnitType());1513		if(pkUnitInfo)1514		{1515			if(kAttacker.isHuman() && !GC.getGame().isGameMultiPlayer() && _stricmp(pkUnitInfo->GetType(), "UNIT_AMERICAN_B17") == 0)1516			{1517				gDLL->UnlockAchievement(ACHIEVEMENT_SPECIAL_B17);1518			}1519		}1520#endif1521	}1522	//////////////////////////////////////////////////////////////////////15231524	pkCombatInfo->setFinalDamage(BATTLE_UNIT_ATTACKER, iDefenderTotalDamageInflicted);				// Total damage to the unit1525	pkCombatInfo->setDamageInflicted(BATTLE_UNIT_ATTACKER, iAttackerDamageInflicted);		// Damage inflicted this round1526	pkCombatInfo->setFinalDamage(BATTLE_UNIT_DEFENDER, iAttackerTotalDamageInflicted);		// Total damage to the unit1527	pkCombatInfo->setDamageInflicted(BATTLE_UNIT_DEFENDER, iDefenderDamageInflicted);			// Damage inflicted this round15281529	// Fear Damage1530	pkCombatInfo->setFearDamageInflicted(BATTLE_UNIT_ATTACKER, 0);1531	// pkCombatInfo->setFearDamageInflicted( BATTLE_UNIT_DEFENDER, 0 );15321533	pkCombatInfo->setExperience(BATTLE_UNIT_ATTACKER, iExperience);1534	pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_ATTACKER, iMaxXP);1535	pkCombatInfo->setInBorders(BATTLE_UNIT_ATTACKER, plot.getOwner() == eDefenderOwner);1536#if defined(MOD_BUGFIX_BARB_GP_XP)1537	bool bGeneralsXP = !kAttacker.isBarbarian();1538	if (MOD_BUGFIX_BARB_GP_XP) {1539		if (!plot.isCity()) {1540			bGeneralsXP = !pkDefender->isBarbarian();1541		} else {1542			bGeneralsXP = !plot.getPlotCity()->isBarbarian();1543		}1544	}1545#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)1546	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, kAttacker.isGGFromBarbarians() || bGeneralsXP);1547#else1548	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, bGeneralsXP);1549#endif1550#else1551#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)1552	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, kAttacker.isGGFromBarbarians() || !kAttacker.isBarbarian());1553#else1554	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, !kAttacker.isBarbarian());1555#endif1556#endif15571558	iExperience = /*2*/ GC.getEXPERIENCE_DEFENDING_UNIT_AIR();1559	pkCombatInfo->setExperience(BATTLE_UNIT_DEFENDER, iExperience);1560	pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_DEFENDER, MAX_INT);1561	pkCombatInfo->setInBorders(BATTLE_UNIT_DEFENDER, plot.getOwner() == kAttacker.getOwner());1562#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)1563	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, (!plot.isCity() && pkDefender->isGGFromBarbarians()) || !bBarbarian);1564#else1565	pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, !bBarbarian);1566#endif15671568	if (iInterceptionDamage > 0)1569	{1570		iExperience = /*2*/ GC.getEXPERIENCE_DEFENDING_AIR_SWEEP_GROUND();1571		pkCombatInfo->setExperience( BATTLE_UNIT_INTERCEPTOR, iExperience );1572		pkCombatInfo->setMaxExperienceAllowed( BATTLE_UNIT_INTERCEPTOR, MAX_INT );1573		pkCombatInfo->setInBorders( BATTLE_UNIT_INTERCEPTOR, plot.getOwner() == kAttacker.getOwner() );1574#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)1575		pkCombatInfo->setUpdateGlobal( BATTLE_UNIT_INTERCEPTOR, pInterceptor->isGGFromBarbarians() || !bBarbarian );1576#else1577		pkCombatInfo->setUpdateGlobal( BATTLE_UNIT_INTERCEPTOR, !bBarbarian );1578#endif1579	}15801581	pkCombatInfo->setAttackIsBombingMission(true);1582	pkCombatInfo->setDefenderRetaliates(true);15831584	GC.GetEngineUserInterface()->setDirty(UnitInfo_DIRTY_BIT, true);1585}

Calls

Called by