[SIZE="3"]int iAttackerStrength = pAttacker->currCombatStr(NULL, NULL);
int iAttackerFirepower = pAttacker->currFirepower(NULL, NULL);
int iDefenderStrength = pDefender->currCombatStr(pPlot, pAttacker);
int iDefenderFirepower = pDefender->currFirepower(pPlot, pAttacker);
FAssert((iAttackerStrength + iDefenderStrength)*(iAttackerFirepower + iDefenderFirepower) > 0);
int iAttackerOdds = ((GC.getDefineINT("COMBAT_DIE_SIDES") * iAttackerStrength) / (iAttackerStrength + iDefenderStrength));
int iStrengthFactor = ((iAttackerFirepower + iDefenderFirepower + 1) / 2);
int iDamageToAttacker = std::max(1, ((GC.getDefineINT("COMBAT_DAMAGE") * (iDefenderFirepower + iStrengthFactor)) / (iAttackerFirepower + iStrengthFactor)));
int iDamageToDefender = std::max(1, ((GC.getDefineINT("COMBAT_DAMAGE") * (iAttackerFirepower + iStrengthFactor)) / (iDefenderFirepower + iStrengthFactor)));
int iExperience;
if (pAttacker->combatLimit() < 100)
{
iExperience = GC.getDefineINT("EXPERIENCE_FROM_WITHDRAWL");
}
else
{
iExperience = (pDefender->attackXPValue() * iDefenderStrength) / iAttackerStrength;
iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
}
int iNeededRoundsAttacker = (pDefender->currHitPoints() - 1 - pDefender->maxHitPoints() + pAttacker->combatLimit())/iDamageToDefender + 1;
int iNeededRoundsDefender = (pAttacker->currHitPoints() - 1)/iDamageToAttacker + 1;
szTempBuffer.Format(L"for %d XP -- " SETCOLR L"%d*%dHP" ENDCOLR L" / " SETCOLR L"%d*%dHP" ENDCOLR L" Odds: %.1f%%",
iExperience, TEXT_COLOR("COLOR_POSITIVE_TEXT"), iNeededRoundsAttacker, iDamageToDefender, TEXT_COLOR("COLOR_NEGATIVE_TEXT"), iNeededRoundsDefender, iDamageToAttacker, float(iAttackerOdds)/10.0f);
szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());[/SIZE]