Hooks
static bool BeforeCvUnitCombat_GenerateAirSweepCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void AfterCvUnitCombat_GenerateAirSweepCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void ReplaceCvUnitCombat_GenerateAirSweepCombatInfo(void (*original)(CvUnit&, CvUnit*, CvPlot&, CvCombatInfo*), CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);CivRegisterBefore<CivHooks::CvUnitCombat_GenerateAirSweepCombatInfo>(host, &BeforeCvUnitCombat_GenerateAirSweepCombatInfo);CivRegisterAfter<CivHooks::CvUnitCombat_GenerateAirSweepCombatInfo>(host, &AfterCvUnitCombat_GenerateAirSweepCombatInfo);CivRegisterReplace<CivHooks::CvUnitCombat_GenerateAirSweepCombatInfo>(host, &ReplaceCvUnitCombat_GenerateAirSweepCombatInfo);
Code
1885void CvUnitCombat::GenerateAirSweepCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo)1886{1887 BATTLE_STARTED(BATTLE_TYPE_SWEEP, plot);1888#if defined(MOD_UNITS_MAX_HP)1889 int iAttackerMaxHP = kAttacker.GetMaxHitPoints();1890#else1891 int iMaxHP = GC.getMAX_HIT_POINTS();1892#endif18931894 pkCombatInfo->setUnit(BATTLE_UNIT_ATTACKER, &kAttacker);1895 pkCombatInfo->setUnit(BATTLE_UNIT_DEFENDER, pkDefender);1896 pkCombatInfo->setPlot(&plot);18971898 // Unit vs. Unit1899 CvAssert(pkDefender != NULL);19001901 int iAttackerStrength = kAttacker.GetMaxRangedCombatStrength(pkDefender, /*pCity*/ NULL, true, false);19021903 // Mod to air sweep strength1904 iAttackerStrength *= (100 + kAttacker.GetAirSweepCombatModifier());1905 iAttackerStrength /= 100;19061907 int iDefenderStrength = 0;19081909 int iDefenderExperience = 0;19101911 // Ground AA interceptor1912 if(pkDefender->getDomainType() != DOMAIN_AIR)1913 {1914 int iInterceptionDamage = pkDefender->GetInterceptionDamage(&kAttacker);19151916 // Reduce damage for performing a sweep1917 iInterceptionDamage *= /*75*/ GC.getAIR_SWEEP_INTERCEPTION_DAMAGE_MOD();1918 iInterceptionDamage /= 100;19191920 iDefenderExperience = /*2*/ GC.getEXPERIENCE_DEFENDING_AIR_SWEEP_GROUND();19211922 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_DEFENDER, iInterceptionDamage); // Damage inflicted this round1923 }1924 // Air interceptor1925 else1926 {1927 iDefenderStrength = pkDefender->GetMaxRangedCombatStrength(&kAttacker, /*pCity*/ NULL, false, false);1928#if defined(MOD_UNITS_MAX_HP)1929 int iDefenderMaxHP = pkDefender->GetMaxHitPoints();1930#endif19311932 int iAttackerDamageInflicted = kAttacker.getCombatDamage(iAttackerStrength, iDefenderStrength, kAttacker.getDamage(), /*bIncludeRand*/ true, /*bAttackerIsCity*/ false, /*bDefenderIsCity*/ false);1933 int iDefenderDamageInflicted = pkDefender->getCombatDamage(iDefenderStrength, iAttackerStrength, pkDefender->getDamage(), /*bIncludeRand*/ true, /*bAttackerIsCity*/ false, /*bDefenderIsCity*/ false);19341935 int iAttackerTotalDamageInflicted = iAttackerDamageInflicted + pkDefender->getDamage();1936 int iDefenderTotalDamageInflicted = iDefenderDamageInflicted + kAttacker.getDamage();19371938 // Will both units be killed by this? :o If so, take drastic corrective measures1939#if defined(MOD_UNITS_MAX_HP)1940 if (iAttackerTotalDamageInflicted >= iDefenderMaxHP && iDefenderTotalDamageInflicted >= iAttackerMaxHP)1941#else1942 if (iAttackerTotalDamageInflicted >= iMaxHP && iDefenderTotalDamageInflicted >= iMaxHP)1943#endif1944 {1945 // He who hath the least amount of damage survives with 1 HP left1946 if(iAttackerTotalDamageInflicted > iDefenderTotalDamageInflicted)1947 {1948#if defined(MOD_UNITS_MAX_HP)1949 iDefenderDamageInflicted = iAttackerMaxHP - kAttacker.getDamage() - 1;1950 iDefenderTotalDamageInflicted = iAttackerMaxHP - 1;1951 iAttackerTotalDamageInflicted = iDefenderMaxHP;1952#else1953 iDefenderDamageInflicted = iMaxHP - kAttacker.getDamage() - 1;1954 iDefenderTotalDamageInflicted = iMaxHP - 1;1955 iAttackerTotalDamageInflicted = iMaxHP;1956#endif1957 }1958 else1959 {1960#if defined(MOD_UNITS_MAX_HP)1961 iAttackerDamageInflicted = iDefenderMaxHP - pkDefender->getDamage() - 1;1962 iAttackerTotalDamageInflicted = iDefenderMaxHP - 1;1963 iDefenderTotalDamageInflicted = iAttackerMaxHP;1964#else1965 iAttackerDamageInflicted = iMaxHP - pkDefender->getDamage() - 1;1966 iAttackerTotalDamageInflicted = iMaxHP - 1;1967 iDefenderTotalDamageInflicted = iMaxHP;1968#endif1969 }1970 }19711972 iDefenderExperience = /*6*/ GC.getEXPERIENCE_DEFENDING_AIR_SWEEP_AIR();19731974 pkCombatInfo->setFinalDamage(BATTLE_UNIT_ATTACKER, iDefenderTotalDamageInflicted);1975 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_ATTACKER, iAttackerDamageInflicted);1976 pkCombatInfo->setFinalDamage(BATTLE_UNIT_DEFENDER, iAttackerTotalDamageInflicted);1977 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_DEFENDER, iDefenderDamageInflicted);19781979 // Fear Damage1980 //pkCombatInfo->setFearDamageInflicted( BATTLE_UNIT_ATTACKER, kAttacker.getCombatDamage(iAttackerStrength, iDefenderStrength, kAttacker.getDamage(), true, false, true) );1981 // pkCombatInfo->setFearDamageInflicted( BATTLE_UNIT_DEFENDER, getCombatDamage(iDefenderStrength, iAttackerStrength, pDefender->getDamage(), true, false, true) );19821983#if defined(MOD_UNITS_MAX_HP)1984 int iAttackerEffectiveStrength = iAttackerStrength * (iAttackerMaxHP - range(kAttacker.getDamage(), 0, iAttackerMaxHP - 1)) / iAttackerMaxHP;1985#else1986 int iAttackerEffectiveStrength = iAttackerStrength * (iMaxHP - range(kAttacker.getDamage(), 0, iMaxHP - 1)) / iMaxHP;1987#endif1988 iAttackerEffectiveStrength = iAttackerEffectiveStrength > 0 ? iAttackerEffectiveStrength : 1;1989#if defined(MOD_UNITS_MAX_HP)1990 int iDefenderEffectiveStrength = iDefenderStrength * (iDefenderMaxHP - range(pkDefender->getDamage(), 0, iDefenderMaxHP - 1)) / iDefenderMaxHP;1991#else1992 int iDefenderEffectiveStrength = iDefenderStrength * (iMaxHP - range(pkDefender->getDamage(), 0, iMaxHP - 1)) / iMaxHP;1993#endif1994 iDefenderEffectiveStrength = iDefenderEffectiveStrength > 0 ? iDefenderEffectiveStrength : 1;19951996 //int iExperience = kAttacker.defenseXPValue();1997 //iExperience = ((iExperience * iAttackerEffectiveStrength) / iDefenderEffectiveStrength); // is this right? looks like more for less [Jon: Yes, it's XP for the defender]1998 //iExperience = range(iExperience, GC.getMIN_EXPERIENCE_PER_COMBAT(), GC.getMAX_EXPERIENCE_PER_COMBAT());1999 pkCombatInfo->setExperience(BATTLE_UNIT_DEFENDER, iDefenderExperience);2000 pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_ATTACKER, pkDefender->maxXPValue());2001 pkCombatInfo->setInBorders(BATTLE_UNIT_ATTACKER, plot.getOwner() == pkDefender->getOwner());2002#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)2003 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, kAttacker.isGGFromBarbarians() || !kAttacker.isBarbarian());2004#else2005 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, !kAttacker.isBarbarian());2006#endif20072008 //iExperience = ((iExperience * iDefenderEffectiveStrength) / iAttackerEffectiveStrength);2009 //iExperience = range(iExperience, GC.getMIN_EXPERIENCE_PER_COMBAT(), GC.getMAX_EXPERIENCE_PER_COMBAT());2010 int iExperience = /*6*/ GC.getEXPERIENCE_ATTACKING_AIR_SWEEP();2011 pkCombatInfo->setExperience(BATTLE_UNIT_ATTACKER, iExperience);2012 pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_DEFENDER, kAttacker.maxXPValue());2013 pkCombatInfo->setInBorders(BATTLE_UNIT_DEFENDER, plot.getOwner() == kAttacker.getOwner());2014#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)2015 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, pkDefender->isGGFromBarbarians() || !pkDefender->isBarbarian());2016#else2017 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, !pkDefender->isBarbarian());2018#endif2019 }20202021 pkCombatInfo->setAttackIsRanged(false);2022 pkCombatInfo->setAttackIsAirSweep(true);2023 pkCombatInfo->setAttackerAdvances(false);2024 pkCombatInfo->setDefenderRetaliates(true);20252026 GC.GetEngineUserInterface()->setDirty(UnitInfo_DIRTY_BIT, true);2027}