fix(game): charge a ship upgrade against production only once
TurnPlanetProductions started its production budget from PlanetProductionCapacity, which already subtracts the reserved upgrade cost, and then subtracted each applied upgrade's cost again in the apply loop — charging every applied upgrade twice. That both starved the planet's build/research budget and could skip upgrades that were in fact affordable. The budget now starts from the planet's full production potential and the apply loop deducts each upgrade once; PlanetProductionCapacity stays the report's net-of-upgrades "free L". Test: TestUpgradeDoesNotDoubleChargeProduction; the TestProduceShips MAT expectation is updated to the once-charged value. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -181,8 +181,13 @@ func (c *Cache) TurnPlanetProductions() {
|
||||
ri := c.RaceIndex(*p.Owner)
|
||||
r := &c.g.Race[ri]
|
||||
|
||||
// upgrade groups and return to in_orbit state
|
||||
productionAvailable := c.PlanetProductionCapacity(pn)
|
||||
// Upgrade groups (most expensive first) and return them to the
|
||||
// in-orbit state, paying for each upgrade once out of the planet's
|
||||
// full production potential; whatever remains feeds this turn's
|
||||
// production below. Starting from PlanetProductionCapacity here would
|
||||
// have charged every applied upgrade twice, since that helper already
|
||||
// nets out the reserved upgrade cost for the report.
|
||||
productionAvailable := p.ProductionCapacity()
|
||||
for sg := range c.shipGroupsInUpgrade(p.Number) {
|
||||
cost := c.upgradeCostNow(sg)
|
||||
if productionAvailable >= cost {
|
||||
|
||||
Reference in New Issue
Block a user