Hooks
static bool BeforeCvUnitCombat_ResolveCombat(const CvCombatInfo& kInfo, uint uiParentEventID);static void AfterCvUnitCombat_ResolveCombat(const CvCombatInfo& kInfo, uint uiParentEventID);static void ReplaceCvUnitCombat_ResolveCombat(void (*original)(const CvCombatInfo&, uint), const CvCombatInfo& kInfo, uint uiParentEventID);CivRegisterBefore<CivHooks::CvUnitCombat_ResolveCombat>(host, &BeforeCvUnitCombat_ResolveCombat);CivRegisterAfter<CivHooks::CvUnitCombat_ResolveCombat>(host, &AfterCvUnitCombat_ResolveCombat);CivRegisterReplace<CivHooks::CvUnitCombat_ResolveCombat>(host, &ReplaceCvUnitCombat_ResolveCombat);
Code
2904void CvUnitCombat::ResolveCombat(const CvCombatInfo& kInfo, uint uiParentEventID /* = 0 */)2905{2906 PlayerTypes eAttackingPlayer = NO_PLAYER;2907 // Restore visibility2908 CvUnit* pAttacker = kInfo.getUnit(BATTLE_UNIT_ATTACKER);29092910 const TeamTypes eActiveTeam = GC.getGame().getActiveTeam();29112912 if(pAttacker)2913 {2914 eAttackingPlayer = pAttacker->getOwner();2915 auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(pAttacker));2916 gDLL->GameplayUnitVisibility(pDllUnit.get(), !pAttacker->isInvisible(eActiveTeam, false));2917 }29182919 CvUnit* pDefender = kInfo.getUnit(BATTLE_UNIT_DEFENDER);2920 if(pDefender)2921 {2922 auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(pDefender));2923 gDLL->GameplayUnitVisibility(pDllUnit.get(), !pDefender->isInvisible(eActiveTeam, false));2924 }29252926 CvUnit* pDefenderSupport = kInfo.getUnit(BATTLE_UNIT_INTERCEPTOR);2927 if(pDefenderSupport)2928 {2929 auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(pDefenderSupport));2930 gDLL->GameplayUnitVisibility(pDllUnit.get(), !pDefenderSupport->isInvisible(eActiveTeam, false));2931 }29322933 // Nuclear Mission2934 if(kInfo.getAttackIsNuclear())2935 {2936 ResolveNuclearCombat(kInfo, uiParentEventID);2937 }29382939 // Bombing Mission2940 else if(kInfo.getAttackIsBombingMission())2941 {2942 ResolveAirUnitVsCombat(kInfo, uiParentEventID);2943 }29442945 // Air Sweep Mission2946 else if(kInfo.getAttackIsAirSweep())2947 {2948 ResolveAirSweep(kInfo, uiParentEventID);2949 }29502951 // Ranged Attack2952 else if(kInfo.getAttackIsRanged())2953 {2954 if(kInfo.getUnit(BATTLE_UNIT_ATTACKER))2955 {2956 ResolveRangedUnitVsCombat(kInfo, uiParentEventID);2957 CvPlot *pPlot = kInfo.getPlot();2958 if (kInfo.getUnit(BATTLE_UNIT_ATTACKER) && kInfo.getUnit(BATTLE_UNIT_DEFENDER) && pPlot)2959 {2960 pPlot->AddArchaeologicalRecord(CvTypes::getARTIFACT_BATTLE_RANGED(), kInfo.getUnit(BATTLE_UNIT_ATTACKER)->getOwner(), kInfo.getUnit(BATTLE_UNIT_DEFENDER)->getOwner());2961 }2962 }2963 else2964 {2965 ResolveRangedCityVsUnitCombat(kInfo, uiParentEventID);2966 CvPlot *pPlot = kInfo.getPlot();2967 if (kInfo.getCity(BATTLE_UNIT_ATTACKER) && kInfo.getUnit(BATTLE_UNIT_DEFENDER) && pPlot)2968 {2969 pPlot->AddArchaeologicalRecord(CvTypes::getARTIFACT_BATTLE_RANGED(), kInfo.getCity(BATTLE_UNIT_ATTACKER)->getOwner(), kInfo.getUnit(BATTLE_UNIT_DEFENDER)->getOwner());2970 }2971 }2972 }29732974 // Melee Attack2975 else2976 {2977 if(kInfo.getCity(BATTLE_UNIT_DEFENDER))2978 {2979 ResolveCityMeleeCombat(kInfo, uiParentEventID);2980 }2981 else2982 {2983 ResolveMeleeCombat(kInfo, uiParentEventID);2984 CvPlot *pPlot = kInfo.getPlot();2985 if (kInfo.getUnit(BATTLE_UNIT_ATTACKER) && kInfo.getUnit(BATTLE_UNIT_DEFENDER) && pPlot)2986 {2987 pPlot->AddArchaeologicalRecord(CvTypes::getARTIFACT_BATTLE_MELEE(), kInfo.getUnit(BATTLE_UNIT_ATTACKER)->getOwner(), kInfo.getUnit(BATTLE_UNIT_DEFENDER)->getOwner());2988 }2989 }2990 }29912992 // Clear popup blocking after combat resolves2993 if(eAttackingPlayer == GC.getGame().getActivePlayer())2994 {2995 GC.GetEngineUserInterface()->SetDontShowPopups(false);2996 }2997}