Hooks
static bool BeforeCvUnitCombat_ResolveNuclearCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID);static void AfterCvUnitCombat_ResolveNuclearCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID);static void ReplaceCvUnitCombat_ResolveNuclearCombat(void (*original)(const CvCombatInfo&, uint), const CvCombatInfo& kCombatInfo, uint uiParentEventID);CivRegisterBefore<CivHooks::CvUnitCombat_ResolveNuclearCombat>(host, &BeforeCvUnitCombat_ResolveNuclearCombat);CivRegisterAfter<CivHooks::CvUnitCombat_ResolveNuclearCombat>(host, &AfterCvUnitCombat_ResolveNuclearCombat);CivRegisterReplace<CivHooks::CvUnitCombat_ResolveNuclearCombat>(host, &ReplaceCvUnitCombat_ResolveNuclearCombat);
Code
2726// Function: ResolveNuclearCombat2727// Resolve combat from a nuclear attack.2728void CvUnitCombat::ResolveNuclearCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID)2729{2730 UNREFERENCED_PARAMETER(uiParentEventID);27312732 CvUnit* pkAttacker = kCombatInfo.getUnit(BATTLE_UNIT_ATTACKER);2733 CvAssert_Debug(pkAttacker);27342735 CvPlot* pkTargetPlot = kCombatInfo.getPlot();2736 CvAssert_Debug(pkTargetPlot);27372738 CvString strBuffer;27392740 GC.getGame().changeNukesExploded(1);27412742 if(pkAttacker)2743 {2744 // Make sure we are disconnected from any unit transporting the attacker (i.e. its a missile)2745 pkAttacker->setTransportUnit(NULL);27462747 if(pkTargetPlot)2748 {2749 if(ApplyNuclearExplosionDamage(kCombatInfo.getDamageMembers(), kCombatInfo.getDamageMemberCount(), pkAttacker, pkTargetPlot, kCombatInfo.getAttackNuclearLevel() - 1) > 0)2750 {2751#if !defined(NO_ACHIEVEMENTS)2752 if(pkAttacker->getOwner() == GC.getGame().getActivePlayer())2753 {2754 // Must damage someone to get the achievement.2755 gDLL->UnlockAchievement(ACHIEVEMENT_DROP_NUKE);27562757 if(GC.getGame().getGameTurnYear() == 2012)2758 {2759 CvPlayerAI& kPlayer = GET_PLAYER(GC.getGame().getActivePlayer());2760 if(strncmp(kPlayer.getCivilizationTypeKey(), "CIVILIZATION_MAYA", 32) == 0)2761 {2762 gDLL->UnlockAchievement(ACHIEVEMENT_XP1_36);2763 }27642765 }27662767 }2768#endif27692770#if defined(MOD_EVENTS_NUCLEAR_DETONATION)2771 // While we should really send the NuclearDetonation event here, we don't still have all the info at this point2772 // so we send it while calculating the combat info, just after we declare war (if appropriate) from firing one2773#endif2774 }2775 }27762777 // Suicide Unit (currently all nuclear attackers are)2778 if(pkAttacker->isSuicide())2779 {2780 pkAttacker->setCombatUnit(NULL); // Must clear this if doing a delayed kill, should this be part of the kill method?2781 pkAttacker->setAttackPlot(NULL, false);2782 pkAttacker->kill(true);2783 }2784 else2785 {2786 CvAssertMsg(pkAttacker->isSuicide(), "A nuke unit that is not a one time use?");27872788 // Clean up some stuff2789 pkAttacker->setCombatUnit(NULL);2790 pkAttacker->ClearMissionQueue(GetPostCombatDelay());2791 pkAttacker->SetAutomateType(NO_AUTOMATE); // kick unit out of automation27922793 // Spend a move for this attack2794 pkAttacker->changeMoves(-GC.getMOVE_DENOMINATOR());27952796 // Can't move or attack again2797 if(!pkAttacker->canMoveAfterAttacking())2798 {2799 pkAttacker->finishMoves();2800 }2801 }28022803 // Report that combat is over in case we want to queue another attack2804 GET_PLAYER(pkAttacker->getOwner()).GetTacticalAI()->CombatResolved(pkAttacker, true);2805 }2806 2807 BATTLE_FINISHED();2808}