Hooks
static bool BeforeCvUnitCombat_GenerateRangedCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void AfterCvUnitCombat_GenerateRangedCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void ReplaceCvUnitCombat_GenerateRangedCombatInfo(void (*original)(CvUnit&, CvUnit*, CvPlot&, CvCombatInfo*), CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);CivRegisterBefore<CivHooks::CvUnitCombat_GenerateRangedCombatInfo>(host, &BeforeCvUnitCombat_GenerateRangedCombatInfo);CivRegisterAfter<CivHooks::CvUnitCombat_GenerateRangedCombatInfo>(host, &AfterCvUnitCombat_GenerateRangedCombatInfo);CivRegisterReplace<CivHooks::CvUnitCombat_GenerateRangedCombatInfo>(host, &ReplaceCvUnitCombat_GenerateRangedCombatInfo);
Code
649void CvUnitCombat::GenerateRangedCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo)650{651 BATTLE_STARTED(BATTLE_TYPE_RANGED, plot);652 pkCombatInfo->setUnit(BATTLE_UNIT_ATTACKER, &kAttacker);653 pkCombatInfo->setUnit(BATTLE_UNIT_DEFENDER, pkDefender);654 pkCombatInfo->setPlot(&plot);655656 //////////////////////////////////////////////////////////////////////657658 bool bBarbarian = false;659 int iExperience = 0;660 int iMaxXP = 0;661 int iDamage = 0;662 int iTotalDamage = 0;663 PlayerTypes eDefenderOwner;664 if(!plot.isCity())665 {666 CvAssert(pkDefender != NULL);667668 eDefenderOwner = pkDefender->getOwner();669670 iExperience = /*2*/ GC.getEXPERIENCE_ATTACKING_UNIT_RANGED();671 if(pkDefender->isBarbarian())672 bBarbarian = true;673 iMaxXP = pkDefender->maxXPValue();674675 //CvAssert(pkDefender->IsCanDefend());676677 iDamage = kAttacker.GetRangeCombatDamage(pkDefender, /*pCity*/ NULL, /*bIncludeRand*/ true);678679#if defined(MOD_UNITS_MAX_HP)680 if(iDamage + pkDefender->getDamage() > kAttacker.GetMaxHitPoints())681 {682 iDamage = kAttacker.GetMaxHitPoints() - pkDefender->getDamage();683 }684#else685 if(iDamage + pkDefender->getDamage() > GC.getMAX_HIT_POINTS())686 {687 iDamage = GC.getMAX_HIT_POINTS() - pkDefender->getDamage();688 }689#endif690691 iTotalDamage = std::max(pkDefender->getDamage(), pkDefender->getDamage() + iDamage);692 }693 else694 {695 if (kAttacker.isRangedSupportFire()) return; // can't attack cities with this696697 CvCity* pCity = plot.getPlotCity();698 CvAssert(pCity != NULL);699 if(!pCity) return;700 BATTLE_JOINED(pCity, BATTLE_UNIT_DEFENDER, true);701702 eDefenderOwner = plot.getOwner();703 /* iDefenderStrength = pCity->getStrengthValue() / 2;704 iOldDamage = pCity->getDamage();*/705706 iExperience = /*3*/ GC.getEXPERIENCE_ATTACKING_CITY_RANGED();707 if(pCity->isBarbarian())708 bBarbarian = true;709 iMaxXP = 1000;710711 iDamage = kAttacker.GetRangeCombatDamage(/*pDefender*/ NULL, pCity, /*bIncludeRand*/ true);712713 // Cities can't be knocked to less than 1 HP714 if(iDamage + pCity->getDamage() >= pCity->GetMaxHitPoints())715 {716 iDamage = pCity->GetMaxHitPoints() - pCity->getDamage() - 1;717 }718719 iTotalDamage = std::max(pCity->getDamage(), pCity->getDamage() + iDamage);720 }721 //////////////////////////////////////////////////////////////////////722723 pkCombatInfo->setFinalDamage(BATTLE_UNIT_ATTACKER, 0); // Total damage to the unit724 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_ATTACKER, iDamage); // Damage inflicted this round725 pkCombatInfo->setFinalDamage(BATTLE_UNIT_DEFENDER, iTotalDamage); // Total damage to the unit726 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_DEFENDER, 0); // Damage inflicted this round727728 // Fear Damage729 pkCombatInfo->setFearDamageInflicted(BATTLE_UNIT_ATTACKER, 0);730 // pkCombatInfo->setFearDamageInflicted( BATTLE_UNIT_DEFENDER, 0 );731732 pkCombatInfo->setExperience(BATTLE_UNIT_ATTACKER, iExperience);733 pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_ATTACKER, iMaxXP);734 pkCombatInfo->setInBorders(BATTLE_UNIT_ATTACKER, plot.getOwner() == eDefenderOwner);735#if defined(MOD_BUGFIX_BARB_GP_XP)736 bool bGeneralsXP = !kAttacker.isBarbarian();737 if (MOD_BUGFIX_BARB_GP_XP) {738 if (!plot.isCity()) {739 bGeneralsXP = !pkDefender->isBarbarian();740 } else {741 bGeneralsXP = !plot.getPlotCity()->isBarbarian();742 }743 }744#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)745 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, kAttacker.isGGFromBarbarians() || bGeneralsXP);746#else747 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, bGeneralsXP);748#endif749#else750#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)751 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, kAttacker.isGGFromBarbarians() || !kAttacker.isBarbarian());752#else753 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, !kAttacker.isBarbarian());754#endif755#endif756757 iExperience = /*2*/ GC.getEXPERIENCE_DEFENDING_UNIT_RANGED();758 pkCombatInfo->setExperience(BATTLE_UNIT_DEFENDER, iExperience);759 pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_DEFENDER, kAttacker.maxXPValue());760 pkCombatInfo->setInBorders(BATTLE_UNIT_DEFENDER, plot.getOwner() == kAttacker.getOwner());761#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)762 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, (!plot.isCity() && pkDefender->isGGFromBarbarians()) || (!bBarbarian && !kAttacker.isBarbarian()));763#else764 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, !bBarbarian && !kAttacker.isBarbarian());765#endif766767 pkCombatInfo->setAttackIsRanged(true);768 // Defender doesn't retaliate. We'll keep this separate from the ranged attack flag in case something changes to allow769 // some units to retaliate on a ranged attack (Archer vs. Archers maybe?)770 pkCombatInfo->setDefenderRetaliates(false);771772 GC.GetEngineUserInterface()->setDirty(UnitInfo_DIRTY_BIT, true);773}