void CvUnit::resolveCombat(CvUnit* pDefender, CvPlot* pPlot, CvBattleDefinition& kBattle)
{
PROFILE_FUNC();
MEMORY_TRACK();
CombatDetails cdAttackerDetails;
CombatDetails cdDefenderDetails;
AI_setPredictedHitPoints(-1);
pDefender->AI_setPredictedHitPoints(-1);
int iAttackerStrength = currCombatStr(NULL, NULL, &cdAttackerDetails);
int iAttackerFirepower = currFirepower(NULL, NULL);
int iDefenderStrength;
int iAttackerDamage;
int iDefenderDamage;
[COLOR="Red"]int iDefenderOdds[/COLOR];
/************************************************************************************************/
/* Afforess Start 03/15/10 Coded By: KillMePlease */
/* */
/* Occasional Promotions */
/************************************************************************************************/
bool bAttackerWithdrawn = false;
bool bAttackerHasLostNoHP = true;
int iAttackerInitialDamage = getDamage();
int iDefenderInitialDamage = pDefender->getDamage();
int iInitialDefXP = pDefender->getExperience100();
int iInitialAttXP = getExperience100();
int iInitialAttGGXP = GET_PLAYER(getOwnerINLINE()).getCombatExperience();
int iInitialDefGGXP = GET_PLAYER(pDefender->getOwnerINLINE()).getCombatExperience();
bool bDynamicXP = GC.getGameINLINE().isModderGameOption(MODDERGAMEOPTION_IMPROVED_XP);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
getDefenderCombatValues(*pDefender, pPlot, iAttackerStrength, iAttackerFirepower, [COLOR="Red"]iDefenderOdds[/COLOR], iDefenderStrength, iAttackerDamage, iDefenderDamage, &cdDefenderDetails, pDefender);
int iAttackerKillOdds = iDefenderOdds * (100 - withdrawalProbability()) / 100;
if (isHuman() || pDefender->isHuman())
{
//Added ST
CyArgsList pyArgsCD;
pyArgsCD.add(gDLL->getPythonIFace()->makePythonObject(&cdAttackerDetails));
pyArgsCD.add(gDLL->getPythonIFace()->makePythonObject(&cdDefenderDetails));
pyArgsCD.add(getCombatOdds(this, pDefender));
CvEventReporter::getInstance().genericEvent("combatLogCalc", pyArgsCD.makeFunctionArgs());
}
collateralCombat(pPlot, pDefender);
/************************************************************************************************/
/* Afforess Start 02/22/10 Coded by: KillMePlease */
/* */
/* Defender Withdraw */
/************************************************************************************************/
int iCloseCombatRoundNum = -1;
bool bTryMobileWithdraw = false; //if unit will be trying to withdraw from a plot it occupies
if (pPlot->getNumDefenders(pDefender->getOwner()) == 1 && pDefender->baseMoves() > baseMoves()) //must be faster than attacker
{
bTryMobileWithdraw = true;
}
int iWinningOdds = getCombatOdds(this, pDefender);
bool bDefenderSkirmish = false; //iWinningOdds > 60;
m_combatResult.bDefenderWithdrawn = false;
m_combatResult.pPlot = NULL;
m_combatResult.iAttacksCount++;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
while (true)
{
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 02/21/10 jdog5000 */
/* */
/* Lead From Behind */
/************************************************************************************************/
// From Lead From Behind by UncutDragon
/* original code
if (GC.getGameINLINE().getSorenRandNum(GC.getDefineINT("COMBAT_DIE_SIDES"), "Combat") < iDefenderOdds)
*/ // modified
[B]if (GC.getGameINLINE().getSorenRandNum(GC.getCOMBAT_DIE_SIDES(), "Combat") < [COLOR="Red"]iDefenderOdds[/COLOR])[/B]