Code
874void CvUnitCombat::ResolveRangedUnitVsCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID)875{876 bool bTargetDied = false;877 int iDamage = kCombatInfo.getDamageInflicted(BATTLE_UNIT_ATTACKER);878// int iExperience = kCombatInfo.getExperience(BATTLE_UNIT_ATTACKER);879// int iMaxXP = kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_ATTACKER);880 bool bBarbarian = false;881882 CvUnit* pkAttacker = kCombatInfo.getUnit(BATTLE_UNIT_ATTACKER);883 CvAssert_Debug(pkAttacker);884885 CvPlot* pkTargetPlot = kCombatInfo.getPlot();886 CvAssert_Debug(pkTargetPlot);887888 ICvUserInterface2* pkDLLInterface = GC.GetEngineUserInterface();889 CvString strBuffer;890891 if(pkTargetPlot)892 {893 if(!pkTargetPlot->isCity())894 {895 // Unit896 CvUnit* pkDefender = kCombatInfo.getUnit(BATTLE_UNIT_DEFENDER);897 CvAssert_Debug(pkDefender != NULL);898 if(pkDefender)899 {900 bBarbarian = pkDefender->isBarbarian();901902 if(pkAttacker)903 {904 // Defender died905#if defined(MOD_UNITS_MAX_HP)906 if(iDamage + pkDefender->getDamage() >= pkDefender->GetMaxHitPoints())907#else908 if(iDamage + pkDefender->getDamage() >= GC.getMAX_HIT_POINTS())909#endif910 {911 if(pkAttacker->getOwner() == GC.getGame().getActivePlayer())912 {913 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ATTACK_BY_AIR_AND_DEATH", pkAttacker->getNameKey(), pkDefender->getNameKey());914 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()*/);915 MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkDefender->getOwner());916 }917918 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_AIR_AND_DEATH", pkDefender->getNameKey(), pkAttacker->getNameKey());919 CvNotifications* pNotifications = GET_PLAYER(pkDefender->getOwner()).GetNotifications();920 if(pNotifications)921 {922 Localization::String strSummary = Localization::Lookup("TXT_KEY_UNIT_LOST");923 pNotifications->Add(NOTIFICATION_UNIT_DIED, strBuffer, strSummary.toUTF8(), pkDefender->getX(), pkDefender->getY(), (int) pkDefender->getUnitType(), pkDefender->getOwner());924 }925926 bTargetDied = true;927928#if !defined(NO_ACHIEVEMENTS)929 CvPlayerAI& kAttackerOwner = GET_PLAYER(pkAttacker->getOwner());930 kAttackerOwner.GetPlayerAchievements().KilledUnitWithUnit(pkAttacker, pkDefender);931#endif932933 ApplyPostCombatTraitEffects(pkAttacker, pkDefender);934935 if(bBarbarian)936 {937 pkDefender->DoTestBarbarianThreatToMinorsWithThisUnitsDeath(pkAttacker->getOwner());938 }939940#if !defined(NO_ACHIEVEMENTS)941 //One Hit942#if defined(MOD_UNITS_MAX_HP)943 if(pkDefender->GetCurrHitPoints() == pkDefender->GetMaxHitPoints() && pkAttacker->isHuman() && !GC.getGame().isGameMultiPlayer())944#else945 if(pkDefender->GetCurrHitPoints() == GC.getMAX_HIT_POINTS() && pkAttacker->isHuman() && !GC.getGame().isGameMultiPlayer())946#endif947 {948 gDLL->UnlockAchievement(ACHIEVEMENT_ONEHITKILL);949 }950#endif951 }952 // Nobody died953 else954 {955 if(pkAttacker->getOwner() == GC.getGame().getActivePlayer())956 {957 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ATTACK_BY_AIR", pkAttacker->getNameKey(), pkDefender->getNameKey(), iDamage);958 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()*/);959 MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkDefender->getOwner());960 }961 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_AIR", pkDefender->getNameKey(), pkAttacker->getNameKey(), iDamage);962 }963964 //red icon over attacking unit965 if(pkDefender->getOwner() == GC.getGame().getActivePlayer())966 {967 pkDLLInterface->AddMessage(uiParentEventID, pkDefender->getOwner(), false, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pkAttacker->m_pUnitInfo->GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pkAttacker->getX(), pkAttacker->getY(), true, true*/);968 MILITARYLOG(pkDefender->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkAttacker->getOwner());969 }970 //white icon over defending unit971 //pkDLLInterface->AddMessage(uiParentEventID, pkDefender->getOwner(), false, 0, ""/*, "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, pkDefender->getUnitInfo().GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), pkDefender->getX(), pkDefender->getY(), true, true*/);972973 //set damage but don't update entity damage visibility974#if defined(MOD_API_UNIT_STATS)975 pkDefender->changeDamage(iDamage, pkAttacker->getOwner(), pkAttacker->GetID());976#else977 pkDefender->changeDamage(iDamage, pkAttacker->getOwner());978#endif979980 // Update experience981#if defined(MOD_UNITS_XP_TIMES_100)982 pkDefender->changeExperienceTimes100(100 * 983#else984 pkDefender->changeExperience(985#endif986 kCombatInfo.getExperience(BATTLE_UNIT_DEFENDER),987 kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_DEFENDER),988 true,989 kCombatInfo.getInBorders(BATTLE_UNIT_DEFENDER),990 kCombatInfo.getUpdateGlobal(BATTLE_UNIT_DEFENDER));991 }992993 pkDefender->setCombatUnit(NULL);994 if(!CvUnitMission::IsHeadMission(pkDefender, CvTypes::getMISSION_WAIT_FOR())) // If the top mission was not a 'wait for', then clear it.995 pkDefender->ClearMissionQueue();996 }997 else998 bTargetDied = true;999 }1000 else1001 {1002 // City1003 CvCity* pCity = pkTargetPlot->getPlotCity();1004 CvAssert_Debug(pCity != NULL);1005 if(pCity)1006 {1007 if(pkAttacker)1008 {1009 bBarbarian = pCity->isBarbarian();1010 pCity->changeDamage(iDamage);10111012 if(pCity->getOwner() == GC.getGame().getActivePlayer())1013 {1014 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOUR_CITY_ATTACKED_BY_AIR", pCity->getNameKey(), pkAttacker->getNameKey(), iDamage);1015 //red icon over attacking unit1016 pkDLLInterface->AddMessage(uiParentEventID, pCity->getOwner(), false, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pkAttacker->m_pUnitInfo->GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pkAttacker->getX(), pkAttacker->getY(), true, true*/);1017 MILITARYLOG(pCity->getOwner(), strBuffer.c_str(), pCity->plot(), pkAttacker->getOwner());1018 }1019 }10201021 pCity->clearCombat();1022 }1023 else1024 bTargetDied = true;1025 }1026 }1027 else1028 bTargetDied = true;10291030 if(pkAttacker)1031 {1032 // Unit gains XP for executing a Range Strike1033 if(iDamage > 0) // && iDefenderStrength > 0)1034 {1035#if defined(MOD_UNITS_XP_TIMES_100)1036 pkAttacker->changeExperienceTimes100(100 * 1037#else1038 pkAttacker->changeExperience(1039#endif1040 kCombatInfo.getExperience(BATTLE_UNIT_ATTACKER),1041 kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_ATTACKER),1042 true,1043 kCombatInfo.getInBorders(BATTLE_UNIT_ATTACKER),1044 kCombatInfo.getUpdateGlobal(BATTLE_UNIT_ATTACKER));1045 }10461047 pkAttacker->testPromotionReady();10481049 pkAttacker->setCombatUnit(NULL);1050 pkAttacker->ClearMissionQueue(GetPostCombatDelay());10511052 // Report that combat is over in case we want to queue another attack1053 GET_PLAYER(pkAttacker->getOwner()).GetTacticalAI()->CombatResolved(pkAttacker, bTargetDied);1054 }1055 1056 BATTLE_FINISHED();1057}