Hooks
static bool BeforeCvUnitCombat_GenerateNuclearCombatInfo(CvUnit& kAttacker, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void AfterCvUnitCombat_GenerateNuclearCombatInfo(CvUnit& kAttacker, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void ReplaceCvUnitCombat_GenerateNuclearCombatInfo(void (*original)(CvUnit&, CvPlot&, CvCombatInfo*), CvUnit& kAttacker, CvPlot& plot, CvCombatInfo* pkCombatInfo);CivRegisterBefore<CivHooks::CvUnitCombat_GenerateNuclearCombatInfo>(host, &BeforeCvUnitCombat_GenerateNuclearCombatInfo);CivRegisterAfter<CivHooks::CvUnitCombat_GenerateNuclearCombatInfo>(host, &AfterCvUnitCombat_GenerateNuclearCombatInfo);CivRegisterReplace<CivHooks::CvUnitCombat_GenerateNuclearCombatInfo>(host, &ReplaceCvUnitCombat_GenerateNuclearCombatInfo);
Code
2269void CvUnitCombat::GenerateNuclearCombatInfo(CvUnit& kAttacker, CvPlot& plot, CvCombatInfo* pkCombatInfo)2270{2271 BATTLE_STARTED(BATTLE_TYPE_NUKE, plot);2272 pkCombatInfo->setUnit(BATTLE_UNIT_ATTACKER, &kAttacker);2273 pkCombatInfo->setUnit(BATTLE_UNIT_DEFENDER, NULL);2274 pkCombatInfo->setPlot(&plot);22752276#if defined(MOD_EVENTS_BATTLES)2277 if (plot.isCity())2278 {2279 BATTLE_JOINED(plot.getPlotCity(), BATTLE_UNIT_DEFENDER, true);2280 }2281 else2282 {2283 CvUnit* pBestDefender = plot.getBestDefender(NO_PLAYER, kAttacker.getOwner()).pointer();2284 BATTLE_JOINED(pBestDefender, BATTLE_UNIT_DEFENDER, false);2285 }2286#endif22872288 //////////////////////////////////////////////////////////////////////22892290 CvString strBuffer;2291 bool abTeamsAffected[MAX_TEAMS];2292 int iI;2293 for(iI = 0; iI < MAX_TEAMS; iI++)2294 {2295 abTeamsAffected[iI] = kAttacker.isNukeVictim(&plot, ((TeamTypes)iI));2296 }22972298 int iPlotTeam = plot.getTeam();2299 bool bWar = false;2300 bool bBystander = false;23012302 for(iI = 0; iI < MAX_TEAMS; iI++)2303 {2304 if(abTeamsAffected[iI])2305 {2306 if(!kAttacker.isEnemy((TeamTypes)iI))2307 {2308#if defined(MOD_EVENTS_WAR_AND_PEACE)2309 GET_TEAM(kAttacker.getTeam()).declareWar(((TeamTypes)iI), false, kAttacker.getOwner());2310#else2311 GET_TEAM(kAttacker.getTeam()).declareWar(((TeamTypes)iI));2312#endif23132314 if (iPlotTeam == iI) 2315 {2316 bWar = true;2317 } 2318 else 2319 {2320 bBystander = true;2321 }2322 }2323 }2324 }23252326#if defined(MOD_EVENTS_NUCLEAR_DETONATION)2327 if (MOD_EVENTS_NUCLEAR_DETONATION) {2328 GAMEEVENTINVOKE_HOOK(GAMEEVENT_NuclearDetonation, kAttacker.getOwner(), plot.getX(), plot.getY(), bWar, bBystander);2329 } else {2330#endif2331 ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();2332 if (pkScriptSystem) 2333 { 2334 CvLuaArgsHandle args;23352336 args->Push(kAttacker.getOwner());2337 args->Push(plot.getX());2338 args->Push(plot.getY());2339 args->Push(bWar);2340 args->Push(bBystander);23412342 bool bResult;2343 LuaSupport::CallHook(pkScriptSystem, "NuclearDetonation", args.get(), bResult);2344 }2345#if defined(MOD_EVENTS_NUCLEAR_DETONATION)2346 }2347#endif23482349 kAttacker.setReconPlot(&plot);23502351 //////////////////////////////////////////////////////////////////////23522353 pkCombatInfo->setFinalDamage(BATTLE_UNIT_ATTACKER, 0); // Total damage to the unit2354 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_ATTACKER, 0); // Damage inflicted this round2355 pkCombatInfo->setFinalDamage(BATTLE_UNIT_DEFENDER, 0); // Total damage to the unit2356 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_DEFENDER, 0); // Damage inflicted this round23572358 pkCombatInfo->setFearDamageInflicted(BATTLE_UNIT_ATTACKER, 0);23592360 pkCombatInfo->setExperience(BATTLE_UNIT_ATTACKER, 0);2361 pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_ATTACKER, 0);2362 pkCombatInfo->setInBorders(BATTLE_UNIT_ATTACKER, plot.getOwner() != kAttacker.getOwner()); // Not really correct2363#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)2364 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, kAttacker.isGGFromBarbarians() || !kAttacker.isBarbarian());2365#else2366 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, !kAttacker.isBarbarian());2367#endif23682369 pkCombatInfo->setExperience(BATTLE_UNIT_DEFENDER, 0);2370 pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_DEFENDER, 0);2371 pkCombatInfo->setInBorders(BATTLE_UNIT_DEFENDER, plot.getOwner() == kAttacker.getOwner());2372 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, false);23732374 pkCombatInfo->setAttackIsBombingMission(true);2375 pkCombatInfo->setDefenderRetaliates(false);2376 pkCombatInfo->setAttackNuclearLevel(kAttacker.GetNukeDamageLevel() + 1);23772378 // Set all of the units in the blast radius to defenders and calculate their damage2379 int iDamageMembers = 0;2380 GenerateNuclearExplosionDamage(&plot, kAttacker.GetNukeDamageLevel(), &kAttacker, pkCombatInfo->getDamageMembers(), &iDamageMembers, pkCombatInfo->getMaxDamageMemberCount());2381 pkCombatInfo->setDamageMemberCount(iDamageMembers);23822383 GC.GetEngineUserInterface()->setDirty(UnitInfo_DIRTY_BIT, true);2384}