void CvUnit::resolveAirCombat(CvUnit* pInterceptor, CvPlot* pPlot, CvAirMissionDefinition& kBattle)
{
CvWString szBuffer;
int iTheirStrength = (DOMAIN_AIR == pInterceptor->getDomainType() ? pInterceptor->airCurrCombatStr(this) : pInterceptor->currCombatStr(NULL, NULL));
int iOurStrength = (DOMAIN_AIR == getDomainType() ? airCurrCombatStr(pInterceptor) : currCombatStr(NULL, NULL));
[B]// Dale - RtW: START
if (pInterceptor->getDomainType() == DOMAIN_AIR && pInterceptor->airCurrCombatStr(this) > 0)
{
iTheirStrength = pInterceptor->airCurrCombatStr(this);
}
// Dale - RtW: END[/B]
int iTotalStrength = iOurStrength + iTheirStrength;
if (0 == iTotalStrength)
{
FAssert(false);
return;
}
int iOurOdds = (100 * iOurStrength) / std::max(1, iTotalStrength);
int iOurRoundDamage = (pInterceptor->currInterceptionProbability() * GC.getDefineINT("MAX_INTERCEPTION_DAMAGE")) / 100;
int iTheirRoundDamage = (currInterceptionProbability() * GC.getDefineINT("MAX_INTERCEPTION_DAMAGE")) / 100;
if (getDomainType() == DOMAIN_AIR)
{
iTheirRoundDamage = std::max(GC.getDefineINT("MIN_INTERCEPTION_DAMAGE"), iTheirRoundDamage);
}
int iTheirDamage = 0;
int iOurDamage = 0;
for (int iRound = 0; iRound < GC.getDefineINT("INTERCEPTION_MAX_ROUNDS"); ++iRound)
{
if (GC.getGameINLINE().getSorenRandNum(100, "Air combat") < iOurOdds)
{
[B]// Dale - RtW: START
if (DOMAIN_AIR == pInterceptor->getDomainType() || (pInterceptor->getDomainType() == DOMAIN_LAND && pInterceptor->airCurrCombatStr(this) > 0))
// Dale - RtW: END[/B]
{
iTheirDamage += iTheirRoundDamage;
pInterceptor->changeDamage(iTheirRoundDamage, getOwnerINLINE());
if (pInterceptor->isDead())
{
break;
}
}
}
else
{
iOurDamage += iOurRoundDamage;
changeDamage(iOurRoundDamage, pInterceptor->getOwnerINLINE());
if (isDead())
{
break;
}
}
}
if (isDead())
{
if (iTheirRoundDamage > 0)
{
int iExperience = attackXPValue();
iExperience = (iExperience * iOurStrength) / std::max(1, iTheirStrength);
iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
pInterceptor->changeExperience(iExperience, maxXPValue(), true, pPlot->getOwnerINLINE() == pInterceptor->getOwnerINLINE(), !isBarbarian());
}
}
else if (pInterceptor->isDead())
{
int iExperience = pInterceptor->defenseXPValue();
iExperience = (iExperience * iTheirStrength) / std::max(1, iOurStrength);
iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
changeExperience(iExperience, pInterceptor->maxXPValue(), true, pPlot->getOwnerINLINE() == getOwnerINLINE(), !pInterceptor->isBarbarian());
}
else if (iOurDamage > 0)
{
if (iTheirRoundDamage > 0)
{
pInterceptor->changeExperience(GC.getDefineINT("EXPERIENCE_FROM_WITHDRAWL"), maxXPValue(), true, pPlot->getOwnerINLINE() == pInterceptor->getOwnerINLINE(), !isBarbarian());
}
}
else if (iTheirDamage > 0)
{
changeExperience(GC.getDefineINT("EXPERIENCE_FROM_WITHDRAWL"), pInterceptor->maxXPValue(), true, pPlot->getOwnerINLINE() == getOwnerINLINE(), !pInterceptor->isBarbarian());
}
kBattle.setDamage(BATTLE_UNIT_ATTACKER, iOurDamage);
kBattle.setDamage(BATTLE_UNIT_DEFENDER, iTheirDamage);
}