Ich habe ein ganz ungünstiges Problem. In meiner Story wird mit dem Wechsel auf Zug 1060 plötzlich die Inflation negativ - aus 1536% im Zug 1059 wird zu Beginn meines Zugs -607%.
Das passiert verlässlich, ich habe diesen Rundenwechsel schon dreimal gespielt. Andere Dinge wie die Zufallsereignisse verhalten sich immer anders.
Das ist mir ziemlich unverständlich, da nach der Formel selbst im extremsten Fall die ausgegebene Inflationsrate 0 sein müsste:
Code:
int CvPlayer::calculateInflationRate() const
{
int iTurns = ((GC.getGameINLINE().getGameTurn() + GC.getGameINLINE().getElapsedGameTurns()) / 2);
if (GC.getGameINLINE().getMaxTurns() > 0)
{
iTurns = std::min(GC.getGameINLINE().getMaxTurns(), iTurns);
}
iTurns += GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getInflationOffset();
if (iTurns <= 0)
{
return 0;
}
int iInflationPerTurnTimes10000 = GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getInflationPercent();
iInflationPerTurnTimes10000 *= GC.getHandicapInfo(getHandicapType()).getInflationPercent();
iInflationPerTurnTimes10000 /= 100;
int iModifier = m_iInflationModifier;
if (!isHuman() && !isBarbarian())
{
int iAIModifier = GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).getAIInflationPercent();
//Kathy: EraModifier für mehr als 25 Eras
iAIModifier *= 100;
iAIModifier /= std::max(100, (( -GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).getAIPerEraModifier() * getCurrentEra()) + 100));
//Original Code
// iAIModifier *= std::max(0, ((GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).getAIPerEraModifier() * getCurrentEra()) + 100));
// iAIModifier /= 100;
iModifier += iAIModifier - 100;
}
iInflationPerTurnTimes10000 *= std::max(0, 100 + iModifier);
iInflationPerTurnTimes10000 /= 100;
// Keep up to second order terms in binomial series
int iRatePercent = (iTurns * iInflationPerTurnTimes10000) / 100;
iRatePercent += (iTurns * (iTurns - 1) * iInflationPerTurnTimes10000 * iInflationPerTurnTimes10000) / 2000000;
FAssert(iRatePercent >= 0);
return iRatePercent;
}
int CvPlayer::calculateInflatedCosts() const
{
int iCosts;
iCosts = calculatePreInflatedCosts();
iCosts *= std::max(0, (calculateInflationRate() + 100));
iCosts /= 100;
return iCosts;
}
Die Lila Stelle:
Wenn iModifier kleiner -100 wäre, würde iInflationPerTurnTimes10000 an dieser Stelle 0. Angesichts dieses Codes ist mir unverständlich, wie das Programm eine negative Inflation angeben kann. Kann mir das irgendjemand erklären? Selbst, wenn iTurn, iModifier und die anderen Variablen plötzlich negativ werden (und das kann eigentlich nur iModifier, der Rest wird ja aus den xml-Dateien ausgelesen oder ist, wie die Anzeige der vergangenen Runden, korrekt)
Immerhin werden, trotz negativer kalkulierter Inflationsrate, in der grünen Zeile die Kosten auf 0 gesetzt und ich bekomme nicht 507% meiner Kosten ausbezahlt. Trotzdem sind die Gesamteinahmen nun enorm hoch, nachdem ich davor am Existenzminimum herumgekrabbelt bin.