Hooks
static bool BeforeCvGame_GetCombatPrediction(CvGame* self, const CvUnit* pAttackingUnit, const CvUnit* pDefendingUnit, CombatPredictionTypes& result);static void AfterCvGame_GetCombatPrediction(CvGame* self, const CvUnit* pAttackingUnit, const CvUnit* pDefendingUnit, CombatPredictionTypes& result);static CombatPredictionTypes ReplaceCvGame_GetCombatPrediction(CombatPredictionTypes (*original)(CvGame*, const CvUnit*, const CvUnit*), CvGame* self, const CvUnit* pAttackingUnit, const CvUnit* pDefendingUnit);CivRegisterBefore<CivHooks::CvGame_GetCombatPrediction>(host, &BeforeCvGame_GetCombatPrediction);CivRegisterAfter<CivHooks::CvGame_GetCombatPrediction>(host, &AfterCvGame_GetCombatPrediction);CivRegisterReplace<CivHooks::CvGame_GetCombatPrediction>(host, &ReplaceCvGame_GetCombatPrediction);
Code
11853CombatPredictionTypes CvGame::GetCombatPrediction(const CvUnit* pAttackingUnit, const CvUnit* pDefendingUnit)11854{11855 if(!pAttackingUnit || !pDefendingUnit)11856 {11857 return NO_COMBAT_PREDICTION;11858 }1185911860 CombatPredictionTypes ePrediction = NO_COMBAT_PREDICTION;1186111862 if(pAttackingUnit->isRanged())11863 {11864 return COMBAT_PREDICTION_RANGED;11865 }1186611867 CvPlot* pFromPlot = pAttackingUnit->plot();11868 CvPlot* pToPlot = pDefendingUnit->plot();1186911870 int iAttackingStrength = pAttackingUnit->GetMaxAttackStrength(pFromPlot, pToPlot, pDefendingUnit);11871 if(iAttackingStrength == 0)11872 {11873 return NO_COMBAT_PREDICTION;11874 }1187511876 int iDefenderStrength = pDefendingUnit->GetMaxDefenseStrength(pToPlot, pAttackingUnit, false);1187711878 //iMyDamageInflicted = pMyUnit:GetCombatDamage(iMyStrength, iTheirStrength, pMyUnit:GetDamage() + iTheirFireSupportCombatDamage, false, false, false);11879 int iAttackingDamageInflicted = pAttackingUnit->getCombatDamage(iAttackingStrength, iDefenderStrength, pAttackingUnit->getDamage(), false, false, false);11880 int iDefenderDamageInflicted = pDefendingUnit->getCombatDamage(iDefenderStrength, iAttackingStrength, pDefendingUnit->getDamage(), false, false, false);11881 //iTheirDamageInflicted = iTheirDamageInflicted + iTheirFireSupportCombatDamage;1188211883#if defined(MOD_UNITS_MAX_HP)11884 int iAttackerMaxHitPoints = pAttackingUnit->GetMaxHitPoints();11885 int iDefenderMaxHitPoints = pDefendingUnit->GetMaxHitPoints();1188611887 if (iAttackingDamageInflicted > iDefenderMaxHitPoints)11888 {11889 iAttackingDamageInflicted = iDefenderMaxHitPoints;11890 }11891 if (iDefenderDamageInflicted > iAttackerMaxHitPoints)11892 {11893 iDefenderDamageInflicted = iAttackerMaxHitPoints;11894 }1189511896 bool bAttackerDies = (pAttackingUnit->getDamage() + iDefenderDamageInflicted >= iAttackerMaxHitPoints);11897 bool bDefenderDies = (pDefendingUnit->getDamage() + iAttackingDamageInflicted >= iDefenderMaxHitPoints);11898#else11899 int iMaxUnitHitPoints = GC.getMAX_HIT_POINTS();11900 if (iAttackingDamageInflicted > iMaxUnitHitPoints)11901 {11902 iAttackingDamageInflicted = iMaxUnitHitPoints;11903 }11904 if (iDefenderDamageInflicted > iMaxUnitHitPoints)11905 {11906 iDefenderDamageInflicted = iMaxUnitHitPoints;11907 }1190811909 bool bAttackerDies = false;11910 bool bDefenderDies = false;1191111912 if (pAttackingUnit->getDamage() + iDefenderDamageInflicted >= iMaxUnitHitPoints)11913 {11914 bAttackerDies = true;11915 }1191611917 if (pDefendingUnit->getDamage() + iAttackingDamageInflicted >= iMaxUnitHitPoints)11918 {11919 bDefenderDies = true;11920 }11921#endif1192211923 if(bAttackerDies && bDefenderDies)11924 {11925 ePrediction = COMBAT_PREDICTION_STALEMATE;11926 }11927 else if(bAttackerDies)11928 {11929 ePrediction = COMBAT_PREDICTION_TOTAL_DEFEAT;11930 }11931 else if(bDefenderDies)11932 {11933 ePrediction = COMBAT_PREDICTION_TOTAL_VICTORY;11934 }11935 else if(iAttackingDamageInflicted - iDefenderDamageInflicted > 30)11936 {11937 ePrediction = COMBAT_PREDICTION_MAJOR_VICTORY;11938 }11939 else if(iAttackingDamageInflicted > iDefenderDamageInflicted)11940 {11941 ePrediction = COMBAT_PREDICTION_SMALL_VICTORY;11942 }11943 else if(iDefenderDamageInflicted - iAttackingDamageInflicted > 30)11944 {11945 ePrediction = COMBAT_PREDICTION_MAJOR_DEFEAT;11946 }11947 else if(iAttackingDamageInflicted < iDefenderDamageInflicted)11948 {11949 ePrediction = COMBAT_PREDICTION_SMALL_DEFEAT;11950 }11951 else11952 {11953 ePrediction = COMBAT_PREDICTION_STALEMATE;11954 }1195511956 return ePrediction;11957}