Jaaa das ist nicht so einfach. Vorm Beispiel hier mal der code dazu.
Code:
iOverflow = getUnitProduction(eTrainUnit) - iProductionNeeded;
int iMaxOverflow = std::max(iProductionNeeded, getCurrentProductionDifference(false, false));
int iMaxOverflowForGold = std::max(iProductionNeeded, getProductionDifference(getProductionNeeded(), getProduction(), 0, isFoodProduction(), false));
iOverflow = std::min(iMaxOverflow, iOverflow);
if (iOverflow > 0)
{
changeOverflowProduction(iOverflow, getProductionModifier(eTrainUnit));
}
setUnitProduction(eTrainUnit, 0);
int iProductionGold = std::max(0, iOverflow - iMaxOverflowForGold) * GC.getDefineINT("MAXED_UNIT_GOLD_PERCENT") / 100;
Angenommen du hast 120
basis in einer Stadt und produzierst eine Inantrie (140
) von 0 an. In der Stadt steht eine Schmiede und Fabrik ( +50%
genereller Bonus) und Militärakademie und Heldenepos ( +150%
Militärbonus).
iOverflow = (120
+50%+150%) - 140
.
iOverflow = 360
- 140
.
iOverflow = 220
iMaxOverflow = max(140
, (120
+50%+150%))
iMaxOverflow = max(140
, 360
)
iMaxOverflow = 360
iOverflow = min(220
, 360
)
iOverflow = 220
iMaxOverflowForGold = max(140
, (120
+50%))
iMaxOverflowForGold = max(140
, 180
)
iMaxOverflowForGold = 180
iProductionGold = max(0, 220-180)
iProductionGold = 40
iRealOverflow = 220
-50%-150% = 73
Und das ganze nochmal in Bildern:
Ich überlasse es jetz mal der Kreativität der Leser was man damit schönes anstellen kann - der Schlüssel zum Reichtum gezieltes anproduzieren und extrem hohe Grundprodkution. Es ist jedoch wirtschaftlich recht harmlos, weil es erstmal eine so hohe Grundproduktion voraussetzt. Der Knackpunkt ist aber dass man das Gold bekommt obwohl der Überschuss in
voll angerechnet wird.
Lohnen tut sich das aber wohl kaum, vorallem da man so fies viel rechnen muss. Ich halte es deshalb balancetechnich für relativ unrelevent, deswegen rede ich auch offen drüber. Wenn das jemand als gefährlichen MP-Exploit einstuft können wir das gerne rauslöschen.
Und weils so schön ist. Eigentlich müsste der code wohl irgnedwie so aussehen:
Code:
iOverflow = getUnitProduction(eTrainUnit) - iProductionNeeded;
int iMaxOverflow = std::max(iProductionNeeded, getCurrentProductionDifference(false, false));
iOverflow = std::min(iMaxOverflow, iOverflow);
if (iOverflow > 0)
{
changeOverflowProduction(iOverflow, getProductionModifier(eTrainUnit));
}
setUnitProduction(eTrainUnit, 0);
int iProductionGold = std::max(0, iOverflow * (getBaseYieldRateModifier(0) / getBaseYieldRateModifier(getProductionModifier())) * GC.getDefineINT("MAXED_UNIT_GOLD_PERCENT") / 100;
Was genau die Entwickler da geraucht haben weden wir wohl nicht erfahren. Getestet auf korrektheit haben sie den Code jedenfalls nicht.