View Full Version : Anti-Aircraft intercept logic in source code?


Ninja2
May 04, 2008, 05:40 AM
Hi Dale

Where might I find the AA intercept logic in the source code? I want to copy the ability of bombers to do the bombing run, despite being intercepted by the AA guns.

danrh
May 06, 2008, 04:14 PM
Similar question so I'll tack it on here. Wondering where one can find the opportunity fire option, and is it possible to have opfire without collateral damge for artillery?

Dale are there any particular tricks you employ for testing a scenario and determining balance? I know for myself at least its can take me a week to run through a scenario so multiple testings must be hugely time consuming.

Dan

Ninja2
May 10, 2008, 05:23 AM
I've been staring at the code int CvUnit.cpp for a while now... I think I've narrowed it down to this - the two bold sections are Dale's additions to the vanilla code, and it is also different from the code in DCM 1.5, where this feature was left out:

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));
// Dale - RtW: START
if (pInterceptor->getDomainType() == DOMAIN_AIR && pInterceptor->airCurrCombatStr(this) > 0)
{
iTheirStrength = pInterceptor->airCurrCombatStr(this);
}
// Dale - RtW: END
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)
{
// Dale - RtW: START
if (DOMAIN_AIR == pInterceptor->getDomainType() || (pInterceptor->getDomainType() == DOMAIN_LAND && pInterceptor->airCurrCombatStr(this) > 0))
// Dale - RtW: END
{
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);
}

I don't quite understand, however, what this code actually does - well, I can read that it's the aerial combat, but what do the bold sections mean... can anyone help clarify it for me?