Ich habe nach "scrap" gesucht, aber nichts gefunden. Die Suche nach "disband" hat aber etwas in "CvPlayerAI::AI_doTurnUnitsPost()" hervorgebracht.
Ich glaube, es ist dieser Code. Bevor ich daran etwas mache, möchte ich aber versuchen, es zu verstehen.
Code:
void CvPlayerAI::AI_doTurnUnitsPost()
{
PROFILE_FUNC();
CvUnit* pLoopUnit;
CvPlot* pUnitPlot;
bool bValid;
int iPass;
int iLoop;
if (!isHuman() || isOption(PLAYEROPTION_AUTO_PROMOTION))
{
for(pLoopUnit = firstUnit(&iLoop); pLoopUnit != NULL; pLoopUnit = nextUnit(&iLoop))
{
pLoopUnit->AI_promote();
}
}
if (isHuman())
{
return;
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 02/24/10 jdog5000 */
/* */
/* Gold AI */
/************************************************************************************************/
bool bAnyWar = (GET_TEAM(getTeam()).getAnyWarPlanCount(true) > 0);
int iStartingGold = getGold();
int iTargetGold = AI_goldTarget();
int iUpgradeBudget = (AI_goldToUpgradeAllUnits() / (bAnyWar ? 1 : 2));
iUpgradeBudget = std::min(iUpgradeBudget, iStartingGold - ((iTargetGold > iUpgradeBudget) ? (iTargetGold - iUpgradeBudget) : iStartingGold/2));
if( AI_isFinancialTrouble() )
{
iUpgradeBudget /= 3;
}
// Always willing to upgrade 1 unit if we have the money
iUpgradeBudget = std::max(iUpgradeBudget,1);
bool bUnderBudget = true;
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
CvPlot* pLastUpgradePlot = NULL;
for (iPass = 0; iPass < 4; iPass++)
{
for(pLoopUnit = firstUnit(&iLoop); pLoopUnit != NULL; pLoopUnit = nextUnit(&iLoop))
{
bool bNoDisband = false;
bValid = false;
switch (iPass)
{
case 0:
// BBAI note: Effectively only for galleys, triremes, and ironclads ... unit types which are limited in
// what terrain they can operate in
if (AI_unitImpassableCount(pLoopUnit->getUnitType()) > 0)
{
bValid = true;
}
break;
case 1:
pUnitPlot = pLoopUnit->plot();
if (pUnitPlot->isCity())
{
if (pUnitPlot->getBestDefender(getID()) == pLoopUnit)
{
bNoDisband = true;
bValid = true;
pLastUpgradePlot = pUnitPlot;
}
// try to upgrade units which are in danger... but don't get obsessed
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 08/20/09 jdog5000 */
/* */
/* Unit AI, Efficiency */
/************************************************************************************************/
//if (!bValid && (pLastUpgradePlot != pUnitPlot) && ((AI_getPlotDanger(pUnitPlot, 1, false)) > 0))
if (!bValid && (pLastUpgradePlot != pUnitPlot) && ((AI_getAnyPlotDanger(pUnitPlot, 1, false))))
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
{
bNoDisband = true;
bValid = true;
pLastUpgradePlot = pUnitPlot;
}
}
break;
case 2:
/********************************************************************************/
/* BETTER_BTS_AI_MOD 9/15/08 jdog5000 */
/* */
/* Gold AI */
/********************************************************************************/
/* original BTS code
if (pLoopUnit->cargoSpace() > 0)
{
bValid = true;
}
*/
bUnderBudget = (iStartingGold - getGold()) < iUpgradeBudget;
// Only normal transports
if ( (pLoopUnit->cargoSpace() > 0) && (pLoopUnit->specialCargo() == NO_SPECIALUNIT) )
{
bValid = (bAnyWar || bUnderBudget);
}
// Also upgrade escort ships
if ( pLoopUnit->AI_getUnitAIType() == UNITAI_ESCORT_SEA )
{
bValid = (bAnyWar || bUnderBudget);
}
/********************************************************************************/
/* BETTER_BTS_AI_MOD END */
/********************************************************************************/
break;
case 3:
/********************************************************************************/
/* BETTER_BTS_AI_MOD 9/15/08 jdog5000 */
/* */
/* Gold AI */
/********************************************************************************/
/* original BTS code
bValid = true;
*/
bUnderBudget = (iStartingGold - getGold()) < iUpgradeBudget;
bValid = (bAnyWar || bUnderBudget);
/********************************************************************************/
/* BETTER_BTS_AI_MOD END */
/********************************************************************************/
break;
default:
FAssert(false);
break;
}
if (bValid)
{
bool bKilled = false;
if (!bNoDisband)
{
if (pLoopUnit->canFight())
{
int iExp = pLoopUnit->getExperience();
CvCity* pPlotCity = pLoopUnit->plot()->getPlotCity();
if (pPlotCity != NULL && pPlotCity->getOwnerINLINE() == getID())
{
int iCityExp = 0;
iCityExp += pPlotCity->getFreeExperience();
iCityExp += pPlotCity->getDomainFreeExperience(pLoopUnit->getDomainType());
iCityExp += pPlotCity->getUnitCombatFreeExperience(pLoopUnit->getUnitCombatType());
if (iCityExp > 0)
{
if ((iExp == 0) || (iExp < (iCityExp + 1) / 2))
{
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 08/20/09 jdog5000 */
/* */
/* Unit AI, Efficiency */
/************************************************************************************************/
if ((pLoopUnit->getDomainType() != DOMAIN_LAND) || pLoopUnit->plot()->plotCount(PUF_isMilitaryHappiness, -1, -1, getID()) > 1)
{
//if ((calculateUnitCost() > 0) && (AI_getPlotDanger( pLoopUnit->plot(), 2, false) == 0))
if ((calculateUnitCost() > 0) && (AI_getAnyPlotDanger( pLoopUnit->plot(), 2, false)))
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
{
pLoopUnit->kill(false);
bKilled = true;
pLastUpgradePlot = NULL;
}
}
}
}
}
}
}
if (!bKilled)
{
pLoopUnit->AI_upgrade(); // CAN DELETE UNIT!!!
}
Mir erscheint besonders der grüne Teil fraglich. Wenn ich das richtig interpretiere, heißt das: "Für den Fall dass calculateUnitsCosts >0 ist UND der Plot in Gefahr ist, löse überflüssige/veraltete Einheiten auf, die du nicht upgraden kannst". Wenn ich das richtig sehe, werde also überflüssige Einheiten NUR dann aufgelöst, wenn man sie eigentlich besser als letzte Reserve behalten sollte - und nicht an Stellen, wo der Plot nicht in Gefahr ist und man sie gefahrlos auflösen könnte. Ich habe jetzt an keiner Stelle gesehen, dass die Einheiten nur aufgelöst werden, wenn man in financialTrouble ist, sondern schon dann, wenn man "underBudget" ist.
Ich wäre aber auch sonst davon ausgegangen, dass Einheiten aufgelöst werden sollen, die überflüssig und nicht upgradebar sind, wenn ein Plot NICHT in Gefahr ist. Ich als Spieler würde eher irgendwelche Schrotteinheiten im Hinterland auflösen, um Geld zu sparen. Das verstehe ich hier nicht.