Bazaar developer reference

CvUnitCombat::ResolveAirUnitVsCombat(const CvCombatInfo &, uint)

Defined in
CvUnitCombat.cpp, line 1592
Class
CvUnitCombat
Hook name
CivHooks::CvUnitCombat_ResolveAirUnitVsCombat

Hooks

static bool BeforeCvUnitCombat_ResolveAirUnitVsCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID);static void AfterCvUnitCombat_ResolveAirUnitVsCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID);static void ReplaceCvUnitCombat_ResolveAirUnitVsCombat(void (*original)(const CvCombatInfo&, uint), const CvCombatInfo& kCombatInfo, uint uiParentEventID);CivRegisterBefore<CivHooks::CvUnitCombat_ResolveAirUnitVsCombat>(host, &BeforeCvUnitCombat_ResolveAirUnitVsCombat);CivRegisterAfter<CivHooks::CvUnitCombat_ResolveAirUnitVsCombat>(host, &AfterCvUnitCombat_ResolveAirUnitVsCombat);CivRegisterReplace<CivHooks::CvUnitCombat_ResolveAirUnitVsCombat>(host, &ReplaceCvUnitCombat_ResolveAirUnitVsCombat);

Code

1592void CvUnitCombat::ResolveAirUnitVsCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID)1593{1594	bool bTargetDied = false;1595	int iAttackerDamageInflicted = kCombatInfo.getDamageInflicted(BATTLE_UNIT_ATTACKER);1596	int iDefenderDamageInflicted = kCombatInfo.getDamageInflicted(BATTLE_UNIT_DEFENDER);15971598	CvUnit* pkAttacker = kCombatInfo.getUnit(BATTLE_UNIT_ATTACKER);15991600	// If there's no valid attacker, then get out of here1601	CvAssert_Debug(pkAttacker);16021603	// Interception?1604	int iInterceptionDamage = kCombatInfo.getDamageInflicted(BATTLE_UNIT_INTERCEPTOR);1605	if(iInterceptionDamage > 0)1606		iDefenderDamageInflicted += iInterceptionDamage;16071608	CvUnit* pInterceptor = kCombatInfo.getUnit(BATTLE_UNIT_INTERCEPTOR);1609	CvAssert_Debug(pInterceptor);1610	if(pInterceptor)1611	{1612		pInterceptor->setMadeInterception(true);1613		pInterceptor->setCombatUnit(NULL);1614#if defined(MOD_UNITS_XP_TIMES_100)1615		pInterceptor->changeExperienceTimes100(100 * 1616#else1617		pInterceptor->changeExperience(1618#endif1619			kCombatInfo.getExperience(BATTLE_UNIT_INTERCEPTOR),1620			kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_INTERCEPTOR),1621			true,1622			kCombatInfo.getInBorders(BATTLE_UNIT_INTERCEPTOR),1623			kCombatInfo.getUpdateGlobal(BATTLE_UNIT_INTERCEPTOR));1624	}16251626	CvPlot* pkTargetPlot = kCombatInfo.getPlot();1627	CvAssert_Debug(pkTargetPlot);16281629	ICvUserInterface2* pkDLLInterface = GC.GetEngineUserInterface();1630	int iActivePlayerID = GC.getGame().getActivePlayer();1631	CvString strBuffer;16321633	if(pkTargetPlot)1634	{1635		if(!pkTargetPlot->isCity())1636		{1637			// Target was a Unit1638			CvUnit* pkDefender = kCombatInfo.getUnit(BATTLE_UNIT_DEFENDER);1639			CvAssert_Debug(pkDefender != NULL);16401641			if(pkDefender)1642			{1643				if(pkAttacker)1644				{1645#if !defined(NO_ACHIEVEMENTS)1646					//One Hit1647#if defined(MOD_UNITS_MAX_HP)1648					if(pkDefender->GetCurrHitPoints() == pkDefender->GetMaxHitPoints() && pkAttacker->isHuman() && !GC.getGame().isGameMultiPlayer())1649#else1650					if(pkDefender->GetCurrHitPoints() == GC.getMAX_HIT_POINTS() && pkAttacker->isHuman() && !GC.getGame().isGameMultiPlayer())1651#endif1652					{1653						gDLL->UnlockAchievement(ACHIEVEMENT_ONEHITKILL);1654					}1655#endif16561657#if defined(MOD_API_UNIT_STATS)1658					pkAttacker->changeDamage(iDefenderDamageInflicted, pkDefender->getOwner(), pkDefender->GetID());1659					pkDefender->changeDamage(iAttackerDamageInflicted, pkAttacker->getOwner(), pkAttacker->GetID());1660#else1661					pkAttacker->changeDamage(iDefenderDamageInflicted, pkDefender->getOwner());1662					pkDefender->changeDamage(iAttackerDamageInflicted, pkAttacker->getOwner());1663#endif16641665					// Update experience1666#if defined(MOD_UNITS_XP_TIMES_100)1667					pkDefender->changeExperienceTimes100(100 * 1668#else1669					pkDefender->changeExperience(1670#endif1671					    kCombatInfo.getExperience(BATTLE_UNIT_DEFENDER),1672					    kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_DEFENDER),1673					    true,1674					    kCombatInfo.getInBorders(BATTLE_UNIT_DEFENDER),1675					    kCombatInfo.getUpdateGlobal(BATTLE_UNIT_DEFENDER));16761677					// Attacker died1678					if(pkAttacker->IsDead())1679					{1680						auto_ptr<ICvUnit1> pAttacker = GC.WrapUnitPointer(pkAttacker);1681						gDLL->GameplayUnitDestroyedInCombat(pAttacker.get());16821683#if !defined(NO_ACHIEVEMENTS)1684						CvPlayerAI& kDefenderOwner = GET_PLAYER(pkDefender->getOwner());1685						kDefenderOwner.GetPlayerAchievements().KilledUnitWithUnit(pkDefender, pkAttacker);1686#endif16871688						if(iActivePlayerID == pkAttacker->getOwner())1689						{1690							strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_DIED_ATTACKING", pkAttacker->getNameKey(), pkDefender->getNameKey(), iAttackerDamageInflicted);1691							pkDLLInterface->AddMessage(uiParentEventID, pkAttacker->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, GC.getEraInfo(GC.getGame().getCurrentEra())->getAudioUnitDefeatScript(), MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);1692							MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkAttacker->plot(), pkDefender->getOwner());1693						}1694						if(iActivePlayerID == pkDefender->getOwner())1695						{1696							if (iInterceptionDamage > 0 && pInterceptor)1697							{1698								strBuffer = GetLocalizedText("TXT_KEY_MISC_ENEMY_AIR_UNIT_DESTROYED", pInterceptor->getNameKey(), pkAttacker->getVisualCivAdjective(pkDefender->getTeam()), pkAttacker->getNameKey(), pkDefender->getNameKey());1699								pkDLLInterface->AddMessage(uiParentEventID, pkDefender->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, GC.getEraInfo(GC.getGame().getCurrentEra())->getAudioUnitVictoryScript(), MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);1700								MILITARYLOG(pkDefender->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkAttacker->getOwner());1701							}1702							else1703							{1704								strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_KILLED_ENEMY_UNIT", pkDefender->getNameKey(), iAttackerDamageInflicted, 0, pkAttacker->getNameKey(), pkAttacker->getVisualCivAdjective(pkDefender->getTeam()));1705								pkDLLInterface->AddMessage(uiParentEventID, pkDefender->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, GC.getEraInfo(GC.getGame().getCurrentEra())->getAudioUnitVictoryScript(), MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);1706								MILITARYLOG(pkDefender->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkAttacker->getOwner());1707							}1708						}17091710						ApplyPostCombatTraitEffects(pkDefender, pkAttacker);1711					}1712					// Defender died1713					else if(pkDefender->IsDead())1714					{1715#if !defined(NO_ACHIEVEMENTS)1716						CvPlayerAI& kAttackerOwner = GET_PLAYER(pkAttacker->getOwner());1717						kAttackerOwner.GetPlayerAchievements().KilledUnitWithUnit(pkAttacker, pkDefender);1718#endif17191720						if(iActivePlayerID == pkAttacker->getOwner())1721						{1722							strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ATTACK_BY_AIR_AND_DEATH", pkAttacker->getNameKey(), pkDefender->getNameKey());1723							pkDLLInterface->AddMessage(uiParentEventID, pkAttacker->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pkDefender->getUnitInfo().GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);1724							MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkDefender->getOwner());1725						}1726						if(iActivePlayerID == pkDefender->getOwner())1727						{1728							strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_AIR_AND_DEATH", pkDefender->getNameKey(), pkAttacker->getNameKey());1729							pkDLLInterface->AddMessage(uiParentEventID, pkDefender->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pkDefender->getUnitInfo().GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);1730							MILITARYLOG(pkDefender->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkAttacker->getOwner());1731						}17321733						CvNotifications* pNotifications = GET_PLAYER(pkDefender->getOwner()).GetNotifications();1734						if(pNotifications)1735						{1736							Localization::String strSummary = Localization::Lookup("TXT_KEY_UNIT_LOST");1737							pNotifications->Add(NOTIFICATION_UNIT_DIED, strBuffer, strSummary.toUTF8(), pkDefender->getX(), pkDefender->getY(), (int) pkDefender->getUnitType(), pkDefender->getOwner());1738						}17391740						bTargetDied = true;17411742						ApplyPostCombatTraitEffects(pkAttacker, pkDefender);17431744#if defined(MOD_BUGFIX_MINOR)1745						// Friendship from barb death via air-strike1746						if(pkDefender->isBarbarian())1747						{1748						 	pkDefender->DoTestBarbarianThreatToMinorsWithThisUnitsDeath(pkAttacker->getOwner());1749						}1750#endif1751					}1752					// Nobody died1753					else1754					{1755						if(iActivePlayerID == pkAttacker->getOwner())1756						{1757							strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ATTACK_BY_AIR", pkAttacker->getNameKey(), pkDefender->getNameKey(), iDefenderDamageInflicted);1758							pkDLLInterface->AddMessage(uiParentEventID, pkAttacker->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pkDefender->getUnitInfo().GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);1759							MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkDefender->getOwner());1760						}1761						if(iActivePlayerID == pkDefender->getOwner())1762						{1763							if (iInterceptionDamage > 0 && pInterceptor)1764							{1765								strBuffer = GetLocalizedText("TXT_KEY_MISC_ENEMY_AIR_UNIT_INTERCEPTED", pInterceptor->getNameKey(), pkAttacker->getVisualCivAdjective(pkDefender->getTeam()), pkAttacker->getNameKey(), iDefenderDamageInflicted, pkDefender->getNameKey());1766								pkDLLInterface->AddMessage(uiParentEventID, pkDefender->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, GC.getEraInfo(GC.getGame().getCurrentEra())->getAudioUnitVictoryScript(), MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);1767								MILITARYLOG(pkDefender->getOwner(), strBuffer.c_str(), pInterceptor->plot(), pkAttacker->getOwner());1768							}1769							else1770							{1771								strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_AIR", pkDefender->getNameKey(), pkAttacker->getNameKey(), iAttackerDamageInflicted);1772								pkDLLInterface->AddMessage(uiParentEventID, pkDefender->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pkDefender->getUnitInfo().GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);1773								MILITARYLOG(pkDefender->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkAttacker->getOwner());1774							}1775						}1776					}1777				}17781779				//set damage but don't update entity damage visibility1780				//pkDefender->changeDamage(iDamage, pkAttacker->getOwner());17811782				pkDefender->setCombatUnit(NULL);1783				if(!CvUnitMission::IsHeadMission(pkDefender, CvTypes::getMISSION_WAIT_FOR()))		// If the top mission was not a 'wait for', then clear it.1784					pkDefender->ClearMissionQueue();1785			}1786			else1787				bTargetDied = true;1788		}1789		else1790		{1791			// Target was a City1792			CvCity* pCity = pkTargetPlot->getPlotCity();1793			CvAssert_Debug(pCity != NULL);17941795			if(pCity)1796			{1797				pCity->clearCombat();1798				if(pkAttacker)1799				{1800					pCity->changeDamage(iAttackerDamageInflicted);1801#if defined(MOD_API_UNIT_STATS)1802					pkAttacker->changeDamage(iDefenderDamageInflicted, pCity->getOwner(), -1);1803#else1804					pkAttacker->changeDamage(iDefenderDamageInflicted, pCity->getOwner());1805#endif18061807					//		iUnitDamage = std::max(pCity->getDamage(), pCity->getDamage() + iDamage);18081809					if(pkAttacker->IsDead())1810					{1811						if(iActivePlayerID == pkAttacker->getOwner())1812						{1813							strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_DIED_ATTACKING_CITY", pkAttacker->getNameKey(), pCity->getNameKey(), iAttackerDamageInflicted);1814							pkDLLInterface->AddMessage(uiParentEventID, pkAttacker->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, GC.getEraInfo(GC.getGame().getCurrentEra())->getAudioUnitDefeatScript(), MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);1815							MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkAttacker->plot(), pCity->getOwner());1816						}1817					}18181819					if(pCity->getOwner() == iActivePlayerID)1820					{1821						strBuffer = GetLocalizedText("TXT_KEY_MISC_YOUR_CITY_ATTACKED_BY_AIR", pCity->getNameKey(), pkAttacker->getNameKey(), iDefenderDamageInflicted);1822						//red icon over attacking unit1823						pkDLLInterface->AddMessage(uiParentEventID, pCity->getOwner(), false, GC.getEVENT_MESSAGE_TIME(), strBuffer);1824						MILITARYLOG(pCity->getOwner(), strBuffer.c_str(), pCity->plot(), pkAttacker->getOwner());1825					}1826				}1827			}1828			else1829				bTargetDied = true;1830		}1831	}1832	else1833		bTargetDied = true;18341835	// Suicide Unit (e.g. Missiles)1836	if(pkAttacker)1837	{1838		if(pkAttacker->isSuicide())1839		{1840			pkAttacker->setCombatUnit(NULL);	// Must clear this if doing a delayed kill, should this be part of the kill method?1841			pkAttacker->kill(true);1842		}1843		else1844		{1845			// Experience1846			if(iAttackerDamageInflicted > 0)1847			{1848#if defined(MOD_UNITS_XP_TIMES_100)1849				pkAttacker->changeExperienceTimes100(100 * kCombatInfo.getExperience(BATTLE_UNIT_ATTACKER),1850#else1851				pkAttacker->changeExperience(kCombatInfo.getExperience(BATTLE_UNIT_ATTACKER),1852#endif1853				                             kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_ATTACKER),1854				                             true,1855				                             kCombatInfo.getInBorders(BATTLE_UNIT_ATTACKER),1856				                             kCombatInfo.getUpdateGlobal(BATTLE_UNIT_ATTACKER));18571858				// Promotion time?1859				pkAttacker->testPromotionReady();18601861			}18621863			// Clean up some stuff1864			pkAttacker->setCombatUnit(NULL);1865			pkAttacker->ClearMissionQueue(GetPostCombatDelay());18661867			// Spend a move for this attack1868			pkAttacker->changeMoves(-GC.getMOVE_DENOMINATOR());18691870			// Can't move or attack again1871			if(!pkAttacker->canMoveAfterAttacking())1872			{1873				pkAttacker->finishMoves();1874			}1875		}18761877		// Report that combat is over in case we want to queue another attack1878		GET_PLAYER(pkAttacker->getOwner()).GetTacticalAI()->CombatResolved(pkAttacker, bTargetDied);1879	}1880	1881	BATTLE_FINISHED();1882}

Calls

Called by