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}