Hooks
static bool BeforeCvUnitCombat_ResolveRangedCityVsUnitCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID);static void AfterCvUnitCombat_ResolveRangedCityVsUnitCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID);static void ReplaceCvUnitCombat_ResolveRangedCityVsUnitCombat(void (*original)(const CvCombatInfo&, uint), const CvCombatInfo& kCombatInfo, uint uiParentEventID);CivRegisterBefore<CivHooks::CvUnitCombat_ResolveRangedCityVsUnitCombat>(host, &BeforeCvUnitCombat_ResolveRangedCityVsUnitCombat);CivRegisterAfter<CivHooks::CvUnitCombat_ResolveRangedCityVsUnitCombat>(host, &AfterCvUnitCombat_ResolveRangedCityVsUnitCombat);CivRegisterReplace<CivHooks::CvUnitCombat_ResolveRangedCityVsUnitCombat>(host, &ReplaceCvUnitCombat_ResolveRangedCityVsUnitCombat);
Code
1063void CvUnitCombat::ResolveRangedCityVsUnitCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID)1064{1065 bool bTargetDied = false;1066 int iDamage = kCombatInfo.getDamageInflicted(BATTLE_UNIT_ATTACKER);1067 bool bBarbarian = false;10681069 CvCity* pkAttacker = kCombatInfo.getCity(BATTLE_UNIT_ATTACKER);1070 CvAssert_Debug(pkAttacker);10711072 if(pkAttacker)1073 pkAttacker->clearCombat();10741075 CvPlot* pkTargetPlot = kCombatInfo.getPlot();1076 CvAssert_Debug(pkTargetPlot);10771078 ICvUserInterface2* pkDLLInterface = GC.GetEngineUserInterface();1079 int iActivePlayerID = GC.getGame().getActivePlayer();10801081 if(pkTargetPlot)1082 {1083 if(!pkTargetPlot->isCity())1084 {1085 CvUnit* pkDefender = kCombatInfo.getUnit(BATTLE_UNIT_DEFENDER);1086 CvAssert_Debug(pkDefender != NULL);1087 if(pkDefender)1088 {1089 bBarbarian = pkDefender->isBarbarian();10901091 if(pkAttacker)1092 {1093 // Info message for the attacking player1094 if(iActivePlayerID == pkAttacker->getOwner())1095 {1096 Localization::String localizedText = Localization::Lookup("TXT_KEY_MISC_YOUR_CITY_RANGE_ATTACK");1097 localizedText << pkAttacker->getNameKey() << pkDefender->getNameKey() << iDamage;1098 pkDLLInterface->AddMessage(uiParentEventID, pkAttacker->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), localizedText.toUTF8());//, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pDefender->getUnitInfo().GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX(), pPlot->getY());1099 MILITARYLOG(pkAttacker->getOwner(), localizedText.toUTF8(), pkAttacker->plot(), pkDefender->getOwner());1100 }11011102 // Red icon over defending unit1103 if(iActivePlayerID == pkDefender->getOwner())1104 {1105 Localization::String localizedText = Localization::Lookup("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_CITY");1106 localizedText << pkDefender->getNameKey() << pkAttacker->getNameKey() << iDamage;1107 pkDLLInterface->AddMessage(uiParentEventID, pkDefender->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), localizedText.toUTF8());//, "AS2D_COMBAT", MESSAGE_TYPE_COMBAT_MESSAGE, pDefender->getUnitInfo().GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pDefender->getX(), pDefender->getY(), true, true);1108 MILITARYLOG(pkDefender->getOwner(), localizedText.toUTF8(), pkDefender->plot(), pkAttacker->getOwner());1109 }11101111#if defined(MOD_UNITS_MAX_HP)1112 if(iDamage + pkDefender->getDamage() >= pkDefender->GetMaxHitPoints())1113#else1114 if(iDamage + pkDefender->getDamage() >= GC.getMAX_HIT_POINTS())1115#endif1116 {1117 CvNotifications* pNotifications = GET_PLAYER(pkDefender->getOwner()).GetNotifications();1118 if(pNotifications)1119 {1120 Localization::String localizedText = Localization::Lookup("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_CITY");1121 localizedText << pkDefender->getNameKey() << pkAttacker->getNameKey() << iDamage;1122 Localization::String strSummary = Localization::Lookup("TXT_KEY_UNIT_LOST");1123 pNotifications->Add(NOTIFICATION_UNIT_DIED, localizedText.toUTF8(), strSummary.toUTF8(), pkDefender->getX(), pkDefender->getY(), (int) pkDefender->getUnitType(), pkDefender->getOwner());1124 }1125 bTargetDied = true;11261127 // Earn bonuses for kills?1128 CvPlayer& kAttackingPlayer = GET_PLAYER(pkAttacker->getOwner());1129#if defined(MOD_API_UNIFIED_YIELDS)1130 kAttackingPlayer.DoYieldsFromKill(NULL, pkDefender, pkDefender->getX(), pkDefender->getY(), 0);1131#else1132 kAttackingPlayer.DoYieldsFromKill(NO_UNIT, pkDefender->getUnitType(), pkDefender->getX(), pkDefender->getY(), pkDefender->isBarbarian(), 0);1133#endif1134 }11351136 //set damage but don't update entity damage visibility1137#if defined(MOD_API_UNIT_STATS)1138 pkDefender->changeDamage(iDamage, pkAttacker->getOwner(), pkAttacker->GetID());1139#else1140 pkDefender->changeDamage(iDamage, pkAttacker->getOwner());1141#endif11421143 // Update experience1144#if defined(MOD_UNITS_XP_TIMES_100)1145 pkDefender->changeExperienceTimes100(100 * 1146#else1147 pkDefender->changeExperience(1148#endif1149 kCombatInfo.getExperience(BATTLE_UNIT_DEFENDER),1150 kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_DEFENDER),1151 true,1152 kCombatInfo.getInBorders(BATTLE_UNIT_DEFENDER),1153 kCombatInfo.getUpdateGlobal(BATTLE_UNIT_DEFENDER));1154 }11551156 pkDefender->setCombatUnit(NULL);1157 if(!CvUnitMission::IsHeadMission(pkDefender, CvTypes::getMISSION_WAIT_FOR())) // If the top mission was not a 'wait for', then clear it.1158 pkDefender->ClearMissionQueue();1159 }1160 else1161 bTargetDied = true;1162 }1163 else1164 {1165 CvAssert(false); // Left as an exercise for the reader1166 bTargetDied = true;1167 }1168 }11691170 // Report that combat is over in case we want to queue another attack1171 if(pkAttacker)1172 GET_PLAYER(pkAttacker->getOwner()).GetTacticalAI()->CombatResolved((void*)pkAttacker, bTargetDied, true);1173 1174 BATTLE_FINISHED();1175}