SDK & Python help badly needed for GG from Barbarians mod for BtS 3.17

draco963

Prince
Joined
Jan 26, 2007
Messages
451
Location
Earth
OK, so I've taken TheLopez's original Great Generals from Barbarians & Animals mod (found here) and tried to update it for BtS v3.17.

Although I think I did all the SDK porting properly, and the Python didn't seem to need to be modified, cause it was all new files that don't overwrite anything already extant, the mod most definately does not work. Not only do I not get GG points from Barbarians or Animals, I now get no GG points at all! :mad:

As SDK is waaay beyond my normal skillset, and Python is on the borders of incomprehensible to me, I am already at my wits end :wallbash: and desperately asking for help.

Below, you'll find a zip of the files I made using Lopez's originals as a template. Any help is greatly appreciated!!!

View attachment GGfB.rar

EDIT: Please remember, my "Changed DLL" files are my attempt to merge TheLopez's changes into BtS. Lopez's original SDK files, included in this rar for ease of comparison, are based on Warlords v2.0.8.0 files.
 
OK, some small progress in identifying where I need to work:

Lopez's changed CvUnit.cpp has two changes in it, both within the argument beneath void CvUnit::updateCombat(bool bQuick). The problem appears to be, that the portion of the argument that contains Lopez's changes has been removed in its entirety from the 3.17 version of the same file.

So, starting from the //Kill them! line in the file (used because both Warlords, Lopez, & BtS have it) the CvUnit file from the GG from Barbarians mod looks like this:

Spoiler :
// Kill them!
pDefender->setDamage(GC.getMAX_HIT_POINTS());
}
else
{
CvBattleDefinition kBattle;
kBattle.setUnit(BATTLE_UNIT_ATTACKER, this);
kBattle.setUnit(BATTLE_UNIT_DEFENDER, pDefender);
kBattle.setDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_BEGIN, getDamage());
kBattle.setDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_BEGIN, pDefender->getDamage());

//Added ST
CombatDetails cdAttackerDetails;
CombatDetails cdDefenderDetails;
iAttackerStrength = currCombatStr(NULL, NULL, &cdAttackerDetails);
iAttackerFirepower = currFirepower(NULL, NULL);
iDefenderStrength = pDefender->currCombatStr(pPlot, this, &cdDefenderDetails);
iDefenderFirepower = pDefender->currFirepower(pPlot, this);

FAssert((iAttackerStrength + iDefenderStrength) > 0);
FAssert((iAttackerFirepower + iDefenderFirepower) > 0);

iDefenderOdds = ((GC.getDefineINT("COMBAT_DIE_SIDES") * iDefenderStrength) / (iAttackerStrength + iDefenderStrength));

iStrengthFactor = ((iAttackerFirepower + iDefenderFirepower + 1) / 2);

bFirst = true;

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));
gDLL->getEventReporterIFace()->genericEvent("combatLogCalc", pyArgsCD.makeFunctionArgs());
}

if (pDefender->isBarbarian())
{
if (GET_PLAYER(getOwnerINLINE()).getWinsVsBarbs() < GC.getHandicapInfo(GET_PLAYER(getOwnerINLINE()).getHandicapType()).getFreeWinsVsBarbs())
{
iDefenderOdds = min(10, iDefenderOdds);
}
}
if (isBarbarian())
{
if (GET_PLAYER(pDefender->getOwnerINLINE()).getWinsVsBarbs() < GC.getHandicapInfo(GET_PLAYER(pDefender->getOwnerINLINE()).getHandicapType()).getFreeWinsVsBarbs())
{
iDefenderOdds = max(90, iDefenderOdds);
}
}

while (true)
{
if (bFirst)
{
collateralCombat(pPlot, pDefender);
}

if (GC.getGameINLINE().getSorenRandNum(GC.getDefineINT("COMBAT_DIE_SIDES"), "Combat") < iDefenderOdds)
{
if (getCombatFirstStrikes() == 0)
{
iDamage = max(1, ((GC.getDefineINT("COMBAT_DAMAGE") * (iDefenderFirepower + iStrengthFactor)) / (iAttackerFirepower + iStrengthFactor)));

if (((getDamage() + iDamage) >= maxHitPoints()) && (GC.getGameINLINE().getSorenRandNum(100, "Withdrawal") < withdrawalProbability()))
{
// < Great Generals From Barbarian Combat Start >

bool xpFromCombat = true;

if(pDefender->isBarbarian() && !GC.getGameINLINE().isGreatGeneralFromBarbarianCombat())
{
xpFromCombat = false;
}
if(pDefender->isAnimal() && !GC.getGameINLINE().isGreatGeneralFromAnimalCombat())
{
xpFromCombat = false;
}

changeExperience(GC.getDefineINT("EXPERIENCE_FROM_WITHDRAWL"), pDefender->maxXPValue(), xpFromCombat, pPlot->getOwnerINLINE() == getOwnerINLINE());
// < Great Generals From Barbarian Combat End >


break;
}

changeDamage(iDamage, pDefender->getOwnerINLINE());

if (pDefender->getCombatFirstStrikes() > 0)
{
kBattle.addFirstStrikes(BATTLE_UNIT_DEFENDER, 1);
kBattle.addDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_RANGED, iDamage);
}

//Added ST
cdAttackerDetails.iCurrHitPoints=currHitPoints();

if (isHuman() || pDefender->isHuman())
{
CyArgsList pyArgs;
pyArgs.add(gDLL->getPythonIFace()->makePythonObject(&cdAttackerDetails));
pyArgs.add(gDLL->getPythonIFace()->makePythonObject(&cdDefenderDetails));
pyArgs.add(1);
pyArgs.add(iDamage);
gDLL->getEventReporterIFace()->genericEvent("combatLogHit", pyArgs.makeFunctionArgs());
}
}
}
else
{
if (pDefender->getCombatFirstStrikes() == 0)
{
iDamage = max(1, ((GC.getDefineINT("COMBAT_DAMAGE") * (iAttackerFirepower + iStrengthFactor)) / (iDefenderFirepower + iStrengthFactor)));

pDefender->changeDamage(iDamage);

if (getCombatFirstStrikes() > 0)
{
kBattle.addFirstStrikes(BATTLE_UNIT_ATTACKER, 1);
kBattle.addDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_RANGED, iDamage);
}

//Added ST
cdDefenderDetails.iCurrHitPoints=pDefender->currHitPoints();

if (isHuman() || pDefender->isHuman())
{
CyArgsList pyArgs;
pyArgs.add(gDLL->getPythonIFace()->makePythonObject(&cdAttackerDetails));
pyArgs.add(gDLL->getPythonIFace()->makePythonObject(&cdDefenderDetails));
pyArgs.add(0);
pyArgs.add(iDamage);
gDLL->getEventReporterIFace()->genericEvent("combatLogHit", pyArgs.makeFunctionArgs());
}
}
}

if (getCombatFirstStrikes() > 0)
{
changeCombatFirstStrikes(-1);
}

if (pDefender->getCombatFirstStrikes() > 0)
{
pDefender->changeCombatFirstStrikes(-1);
}

bFirst = false;

if (isDead() || pDefender->isDead())
{
// < Great Generals From Barbarian Combat Start >
bool xpFromCombat = true;

if(pDefender->isBarbarian() && !GC.getGameINLINE().isGreatGeneralFromBarbarianCombat())
{
xpFromCombat = false;
}
if(pDefender->isAnimal() && !GC.getGameINLINE().isGreatGeneralFromAnimalCombat())
{
xpFromCombat = false;
}

if (isDead())
{
iExperience = defenseXPValue();
iExperience = ((iExperience * iAttackerStrength) / iDefenderStrength);
iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
pDefender->changeExperience(iExperience, maxXPValue(), xpFromCombat, pPlot->getOwnerINLINE() == pDefender->getOwnerINLINE());
}
else
{
iExperience = pDefender->attackXPValue();
iExperience = ((iExperience * iDefenderStrength) / iAttackerStrength);
iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
changeExperience(iExperience, pDefender->maxXPValue(), xpFromCombat, pPlot->getOwnerINLINE() == getOwnerINLINE());
}
// < Great Generals From Barbarian Combat End >


break;
}
}

if (bVisible)
{
kBattle.setDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_END, getDamage());
kBattle.setDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_END, pDefender->getDamage());
kBattle.setAdvanceSquare(canAdvance(pPlot, 1));

if (isRanged() && pDefender->isRanged())
{
kBattle.setDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_RANGED, kBattle.getDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_END));
kBattle.setDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_RANGED, kBattle.getDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_END));
}
else
{
kBattle.addDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_RANGED, kBattle.getDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_BEGIN));
kBattle.addDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_RANGED, kBattle.getDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_BEGIN));
}

int iTurns = planBattle( kBattle);
kBattle.setMissionTime(iTurns * gDLL->getSecsPerTurn());
setCombatTimer(iTurns);

GC.getGameINLINE().incrementTurnTimer(getCombatTimer());

if (pPlot->isActiveVisible(false))
{
ExecuteMove(0.0f);
gDLL->getEntityIFace()->AddMission(&kBattle);
}
}
else
{
bFinish = true;
}
}
}

if (bFinish)
{
if (bVisible)
{
if (isCombatFocus() && gDLL->getInterfaceIFace()->isCombatFocus())
{
if (getOwnerINLINE() == GC.getGameINLINE().getActivePlayer())
{
gDLL->getInterfaceIFace()->releaseLockedCamera();
}
}
}


Really long, I know. The last if (bFinish)/if (bVisible) argument also has a parallel in all three versions of CvUnit.

Here's what the exact same section of the v3.17 CvUnit file looks like:

Spoiler :
// Kill them!
pDefender->setDamage(GC.getMAX_HIT_POINTS());
}
else
{
CvBattleDefinition kBattle;
kBattle.setUnit(BATTLE_UNIT_ATTACKER, this);
kBattle.setUnit(BATTLE_UNIT_DEFENDER, pDefender);
kBattle.setDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_BEGIN, getDamage());
kBattle.setDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_BEGIN, pDefender->getDamage());

resolveCombat(pDefender, pPlot, kBattle);

if (!bVisible)
{
bFinish = true;
}
else
{
kBattle.setDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_END, getDamage());
kBattle.setDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_END, pDefender->getDamage());
kBattle.setAdvanceSquare(canAdvance(pPlot, 1));

if (isRanged() && pDefender->isRanged())
{
kBattle.setDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_RANGED, kBattle.getDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_END));
kBattle.setDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_RANGED, kBattle.getDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_END));
}
else
{
kBattle.addDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_RANGED, kBattle.getDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_BEGIN));
kBattle.addDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_RANGED, kBattle.getDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_BEGIN));
}

int iTurns = planBattle( kBattle);
kBattle.setMissionTime(iTurns * gDLL->getSecsPerTurn());
setCombatTimer(iTurns);

GC.getGameINLINE().incrementTurnTimer(getCombatTimer());

if (pPlot->isActiveVisible(false))
{
ExecuteMove(0.5f, true);
gDLL->getEntityIFace()->AddMission(&kBattle);
}
}
}
}

if (bFinish)
{
if (bVisible)
{
if (isCombatFocus() && gDLL->getInterfaceIFace()->isCombatFocus())
{
if (getOwnerINLINE() == GC.getGameINLINE().getActivePlayer())
{
gDLL->getInterfaceIFace()->releaseLockedCamera();
}
}
}


Significantly shorter, as you can see. So, although I have been able to identify where the changes are supposed to be inserted, I have no idea HOW to do so. :wallbash: (at this rate, I'll either break the wall or get a concussion).

I will be SO grateful for ANY help, please!!
 
Back
Top Bottom