Code
2030void CvUnitCombat::ResolveAirSweep(const CvCombatInfo& kCombatInfo, uint uiParentEventID)2031{2032 // After combat stuff2033 CvString strBuffer;2034 bool bAttackerDead = false;2035 bool bDefenderDead = false;20362037 CvUnit* pkAttacker = kCombatInfo.getUnit(BATTLE_UNIT_ATTACKER);2038 CvUnit* pkDefender = kCombatInfo.getUnit(BATTLE_UNIT_DEFENDER);2039 CvPlot* pkTargetPlot = kCombatInfo.getPlot();2040 if(!pkTargetPlot && pkDefender)2041 pkTargetPlot = pkDefender->plot();20422043 CvAssert_Debug(pkAttacker && pkDefender && pkTargetPlot);20442045 // Internal variables2046 int iAttackerDamageInflicted = kCombatInfo.getDamageInflicted(BATTLE_UNIT_ATTACKER);2047 int iDefenderDamageInflicted = kCombatInfo.getDamageInflicted(BATTLE_UNIT_DEFENDER);20482049 // Made interception!2050 if(pkDefender)2051 {2052 pkDefender->setMadeInterception(true);2053 if(pkAttacker && pkTargetPlot)2054 {2055#if !defined(NO_ACHIEVEMENTS)2056 //One Hit2057#if defined(MOD_UNITS_MAX_HP)2058 if(pkDefender->GetCurrHitPoints() == pkDefender->GetMaxHitPoints() && pkAttacker->isHuman() && !GC.getGame().isGameMultiPlayer())2059#else2060 if(pkDefender->GetCurrHitPoints() == GC.getMAX_HIT_POINTS() && pkAttacker->isHuman() && !GC.getGame().isGameMultiPlayer())2061#endif2062 {2063 gDLL->UnlockAchievement(ACHIEVEMENT_ONEHITKILL);2064 }2065#endif20662067#if defined(MOD_API_UNIT_STATS)2068 pkDefender->changeDamage(iAttackerDamageInflicted, pkAttacker->getOwner(), pkAttacker->GetID());2069 pkAttacker->changeDamage(iDefenderDamageInflicted, pkDefender->getOwner(), pkDefender->GetID());2070#else2071 pkDefender->changeDamage(iAttackerDamageInflicted, pkAttacker->getOwner());2072 pkAttacker->changeDamage(iDefenderDamageInflicted, pkDefender->getOwner());2073#endif20742075 // Update experience for both sides.2076#if defined(MOD_UNITS_XP_TIMES_100)2077 pkDefender->changeExperienceTimes100(100 *2078#else2079 pkDefender->changeExperience(2080#endif2081 kCombatInfo.getExperience(BATTLE_UNIT_DEFENDER),2082 kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_DEFENDER),2083 true,2084 kCombatInfo.getInBorders(BATTLE_UNIT_DEFENDER),2085 kCombatInfo.getUpdateGlobal(BATTLE_UNIT_DEFENDER));20862087#if defined(MOD_UNITS_XP_TIMES_100)2088 pkAttacker->changeExperienceTimes100(100 * 2089#else2090 pkAttacker->changeExperience(2091#endif2092 kCombatInfo.getExperience(BATTLE_UNIT_ATTACKER),2093 kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_ATTACKER),2094 true,2095 kCombatInfo.getInBorders(BATTLE_UNIT_ATTACKER),2096 kCombatInfo.getUpdateGlobal(BATTLE_UNIT_ATTACKER));20972098 // Anyone eat it?2099#if defined(MOD_UNITS_MAX_HP)2100 bAttackerDead = (pkAttacker->getDamage() >= pkAttacker->GetMaxHitPoints());2101 bDefenderDead = (pkDefender->getDamage() >= pkDefender->GetMaxHitPoints());2102#else2103 bAttackerDead = (pkAttacker->getDamage() >= GC.getMAX_HIT_POINTS());2104 bDefenderDead = (pkDefender->getDamage() >= GC.getMAX_HIT_POINTS());2105#endif21062107 int iActivePlayerID = GC.getGame().getActivePlayer();21082109 //////////////////////////////////////////////////////////////////////////21102111 // Ground AA interceptor2112 if(pkDefender->getDomainType() != DOMAIN_AIR)2113 {2114 // Attacker died2115 if(bAttackerDead)2116 {2117 auto_ptr<ICvUnit1> pAttacker = GC.WrapUnitPointer(pkAttacker);2118 gDLL->GameplayUnitDestroyedInCombat(pAttacker.get());21192120 if(iActivePlayerID == pkAttacker->getOwner())2121 {2122 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_DIED_ATTACKING", pkAttacker->getNameKey(), pkDefender->getNameKey(), iAttackerDamageInflicted, 0);2123 GC.GetEngineUserInterface()->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()*/);2124 MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkDefender->getOwner());2125 }2126 if(iActivePlayerID == pkDefender->getOwner())2127 {2128 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_KILLED_ENEMY_UNIT", pkDefender->getNameKey(), iAttackerDamageInflicted, 0, pkAttacker->getNameKey(), pkAttacker->getVisualCivAdjective(pkDefender->getTeam()));2129 GC.GetEngineUserInterface()->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()*/);2130 MILITARYLOG(pkDefender->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkAttacker->getOwner());2131 }2132 pkDefender->testPromotionReady();2133 }2134 }2135 // Air AA interceptor2136 else2137 {2138 // Attacker died2139 if(bAttackerDead)2140 {2141 auto_ptr<ICvUnit1> pAttacker = GC.WrapUnitPointer(pkAttacker);2142 gDLL->GameplayUnitDestroyedInCombat(pAttacker.get());21432144 if(iActivePlayerID == pkAttacker->getOwner())2145 {2146 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_DIED_ATTACKING", pkAttacker->getNameKey(), pkDefender->getNameKey(), iAttackerDamageInflicted, 0);2147 GC.GetEngineUserInterface()->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()*/);2148 MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkDefender->getOwner());2149 }2150 if(iActivePlayerID == pkDefender->getOwner())2151 {2152 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_KILLED_ENEMY_UNIT", pkDefender->getNameKey(), iAttackerDamageInflicted, 0, pkAttacker->getNameKey(), pkAttacker->getVisualCivAdjective(pkDefender->getTeam()));2153 GC.GetEngineUserInterface()->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()*/);2154 MILITARYLOG(pkDefender->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkAttacker->getOwner());2155 }21562157 pkDefender->testPromotionReady();21582159 ApplyPostCombatTraitEffects(pkDefender, pkAttacker);2160 }2161 // Defender died2162 else if(bDefenderDead)2163 {2164 auto_ptr<ICvUnit1> pDefender = GC.WrapUnitPointer(pkDefender);2165 gDLL->GameplayUnitDestroyedInCombat(pDefender.get());21662167 if(iActivePlayerID == pkAttacker->getOwner())2168 {2169 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_DESTROYED_ENEMY", pkAttacker->getNameKey(), iDefenderDamageInflicted, pkDefender->getNameKey());2170 GC.GetEngineUserInterface()->AddMessage(uiParentEventID, pkAttacker->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()*/);2171 MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkDefender->getOwner());2172 }2173 if(iActivePlayerID == pkDefender->getOwner())2174 {2175 if(pkAttacker->getVisualOwner(pkDefender->getTeam()) != pkAttacker->getOwner())2176 {2177 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WAS_DESTROYED_UNKNOWN", pkDefender->getNameKey(), pkAttacker->getNameKey(), iDefenderDamageInflicted);2178 }2179 else2180 {2181 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WAS_DESTROYED", pkDefender->getNameKey(), pkAttacker->getNameKey(), pkAttacker->getVisualCivAdjective(pkDefender->getTeam()), iDefenderDamageInflicted);2182 }2183 GC.GetEngineUserInterface()->AddMessage(uiParentEventID, pkDefender->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()*/);2184 MILITARYLOG(pkDefender->getOwner(), strBuffer.c_str(), pkDefender->plot(), ((pkAttacker->getVisualOwner(pkDefender->getTeam()) != pkAttacker->getOwner()) ? NO_PLAYER : pkAttacker->getOwner()));2185 }21862187 CvNotifications* pNotification = GET_PLAYER(pkDefender->getOwner()).GetNotifications();2188 if(pNotification)2189 {2190 if(pkAttacker->getVisualOwner(pkDefender->getTeam()) != pkAttacker->getOwner())2191 {2192 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WAS_DESTROYED_UNKNOWN", pkDefender->getNameKey(), pkAttacker->getNameKey(), iDefenderDamageInflicted);2193 }2194 else2195 {2196 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WAS_DESTROYED", pkDefender->getNameKey(), pkAttacker->getNameKey(), pkAttacker->getVisualCivAdjective(pkDefender->getTeam()), iDefenderDamageInflicted);2197 }2198 Localization::String strSummary = Localization::Lookup("TXT_KEY_UNIT_LOST");2199 pNotification->Add(NOTIFICATION_UNIT_DIED, strBuffer, strSummary.toUTF8(), pkDefender->getX(), pkDefender->getY(), (int) pkDefender->getUnitType(), pkDefender->getOwner());2200 }22012202 pkAttacker->testPromotionReady();22032204 ApplyPostCombatTraitEffects(pkAttacker, pkDefender);2205 }2206 // Nobody died2207 else2208 {2209 if(iActivePlayerID == pkAttacker->getOwner())2210 {2211 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WITHDRAW", pkAttacker->getNameKey(), iDefenderDamageInflicted, pkDefender->getNameKey(), iAttackerDamageInflicted);2212 GC.GetEngineUserInterface()->AddMessage(uiParentEventID, pkAttacker->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_OUR_WITHDRAWL", MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);2213 MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkAttacker->plot(), pkDefender->getOwner());2214 }2215 if(iActivePlayerID == pkDefender->getOwner())2216 {2217 strBuffer = GetLocalizedText("TXT_KEY_MISC_ENEMY_UNIT_WITHDRAW", pkAttacker->getNameKey(), iDefenderDamageInflicted, pkDefender->getNameKey(), iAttackerDamageInflicted);2218 GC.GetEngineUserInterface()->AddMessage(uiParentEventID, pkDefender->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_THEIR_WITHDRAWL", MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);2219 MILITARYLOG(pkDefender->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkAttacker->getOwner());2220 }22212222 pkDefender->testPromotionReady();2223 pkAttacker->testPromotionReady();2224 }2225 }2226 }2227 }2228 else2229 bDefenderDead = true;22302231 // Clean up some stuff2232 if(pkDefender)2233 {2234 pkDefender->setCombatUnit(NULL);2235 pkDefender->ClearMissionQueue();2236 }22372238 if(pkAttacker)2239 {2240 pkAttacker->setCombatUnit(NULL);2241 pkAttacker->ClearMissionQueue(GetPostCombatDelay());22422243 // Spend a move for this attack2244 pkAttacker->changeMoves(-GC.getMOVE_DENOMINATOR());22452246 // Can't move or attack again2247 if(!pkAttacker->canMoveAfterAttacking())2248 {2249 pkAttacker->finishMoves();2250 }22512252 // Report that combat is over in case we want to queue another attack2253 GET_PLAYER(pkAttacker->getOwner()).GetTacticalAI()->CombatResolved(pkAttacker, bDefenderDead);2254 }2255 2256 BATTLE_FINISHED();2257}