diff --git a/apps/web/src/components/dev/EventTriggersTab.tsx b/apps/web/src/components/dev/EventTriggersTab.tsx index 60865f5..672b4e3 100644 --- a/apps/web/src/components/dev/EventTriggersTab.tsx +++ b/apps/web/src/components/dev/EventTriggersTab.tsx @@ -71,11 +71,15 @@ function resetRackFailures() { ...cluster, campuses: cluster.campuses.map((campus) => ({ ...campus, - dataCenters: campus.dataCenters.map((dc) => ({ - ...dc, - computeRacksOnline: dc.computeRacksOnline + dc.computeRacksFailed, - computeRacksFailed: 0, - })), + dataCenters: campus.dataCenters.map((dc) => { + const repairCount = dc.deploymentCohorts.filter(c => c.stage === 'repair').reduce((sum, c) => sum + c.count, 0); + return { + ...dc, + computeRacksOnline: dc.computeRacksOnline + repairCount, + computeRacksFailed: 0, + deploymentCohorts: dc.deploymentCohorts.filter(c => c.stage !== 'repair'), + }; + }), })), })); return { infrastructure: { ...s.infrastructure, clusters: newClusters } }; diff --git a/apps/web/src/pages/InfrastructurePage.tsx b/apps/web/src/pages/InfrastructurePage.tsx index 13b7d33..91c7655 100644 --- a/apps/web/src/pages/InfrastructurePage.tsx +++ b/apps/web/src/pages/InfrastructurePage.tsx @@ -113,7 +113,7 @@ function DeploymentProgressBar({ dc }: { dc: DataCenter }) { const tierConfig = DC_TIER_CONFIGS[dc.tier]; const maxCompute = maxComputeRacks(tierConfig.rackSlots); const pipelineRacks = dc.deploymentCohorts.filter(c => c.stage !== 'decommission').reduce((s, c) => s + c.count, 0); - const totalTarget = dc.computeRacksOnline + dc.computeRacksFailed + pipelineRacks; + const totalTarget = dc.computeRacksOnline + pipelineRacks; const pct = totalTarget > 0 ? (dc.computeRacksOnline / totalTarget) * 100 : 0; if (totalTarget === 0 && dc.status === 'operational') return null; @@ -642,8 +642,8 @@ function DataCenterDetailView({ clusterId, campusId, datacenterId }: { const tierConfig = DC_TIER_CONFIGS[dc.tier]; const maxCompute = maxComputeRacks(tierConfig.rackSlots); - const existingCompute = dc.computeRacksOnline + dc.computeRacksFailed - + dc.deploymentCohorts.filter(c => c.stage !== 'decommission').reduce((s, c) => s + c.count, 0); + const pipelineCount = dc.deploymentCohorts.filter(c => c.stage !== 'decommission').reduce((s, c) => s + c.count, 0); + const existingCompute = dc.computeRacksOnline + pipelineCount; const availableSlots = maxCompute - existingCompute; const sku = dc.rackSkuId ? RACK_SKU_CONFIGS[dc.rackSkuId] : null; const netSlots = networkSlotsRequired(existingCompute); @@ -814,7 +814,7 @@ function DataCenterDetailView({ clusterId, campusId, datacenterId }: { ) : ( <>

- Retrofit swaps all {dc.computeRacksOnline + dc.computeRacksFailed} {sku!.name} racks to a new SKU. + Retrofit swaps all {dc.computeRacksOnline + pipelineCount} {sku!.name} racks to a new SKU. The DC goes offline during retrofit.

@@ -906,7 +906,7 @@ function DataCenterDetailView({ clusterId, campusId, datacenterId }: { {confirmRetrofit && ( { retrofitDC(datacenterId, confirmRetrofit); setConfirmRetrofit(null); }} onCancel={() => setConfirmRetrofit(null)} diff --git a/apps/web/src/store/index.ts b/apps/web/src/store/index.ts index 4c5a1ed..9581825 100644 --- a/apps/web/src/store/index.ts +++ b/apps/web/src/store/index.ts @@ -377,8 +377,8 @@ export const useGameStore = create()( const tierConfig = DC_TIER_CONFIGS[dc.tier]; const maxCompute = maxComputeRacks(tierConfig.rackSlots); - const existingCompute = dc.computeRacksOnline + dc.computeRacksFailed - + dc.deploymentCohorts.filter(c => c.stage !== 'decommission').reduce((sum, c) => sum + c.count, 0); + const pipelineCount = dc.deploymentCohorts.filter(c => c.stage !== 'decommission').reduce((sum, c) => sum + c.count, 0); + const existingCompute = dc.computeRacksOnline + pipelineCount; const available = maxCompute - existingCompute; const actualQty = Math.min(quantity, available); if (actualQty <= 0) return s; @@ -424,14 +424,14 @@ export const useGameStore = create()( const dc = found.dc; const tierConfig = DC_TIER_CONFIGS[dc.tier]; const maxCompute = maxComputeRacks(tierConfig.rackSlots); - const existingCompute = dc.computeRacksOnline + dc.computeRacksFailed - + dc.deploymentCohorts.filter(c => c.stage !== 'decommission').reduce((sum, c) => sum + c.count, 0); + const pipelineCount = dc.deploymentCohorts.filter(c => c.stage !== 'decommission').reduce((sum, c) => sum + c.count, 0); + const existingCompute = dc.computeRacksOnline + pipelineCount; const available = maxCompute - existingCompute; if (available <= 0) return; const sku = RACK_SKU_CONFIGS[skuId]; const affordableQty = Math.floor(s.economy.money / sku.baseCost); - const powerLimit = Math.floor((tierConfig.powerBudgetKW - existingCompute * sku.powerDrawKW) / sku.powerDrawKW); + const powerLimit = Math.floor((tierConfig.powerBudgetKW - dc.computeRacksOnline * sku.powerDrawKW) / sku.powerDrawKW); const qty = Math.min(available, affordableQty, powerLimit); if (qty <= 0) return; @@ -498,7 +498,8 @@ export const useGameStore = create()( if (eraOrder.indexOf(s.meta.currentEra) < eraOrder.indexOf(sku.era)) return s; if (sku.requiredResearch && !s.research.completedResearch.includes(sku.requiredResearch)) return s; - const totalRacksToRetrofit = dc.computeRacksOnline + dc.computeRacksFailed; + const pipelineCount = dc.deploymentCohorts.filter(c => c.stage !== 'decommission').reduce((sum, c) => sum + c.count, 0); + const totalRacksToRetrofit = dc.computeRacksOnline + pipelineCount; if (totalRacksToRetrofit <= 0) return s; const oldSku = RACK_SKU_CONFIGS[dc.rackSkuId]; diff --git a/packages/game-engine/src/systems/infrastructureSystem.ts b/packages/game-engine/src/systems/infrastructureSystem.ts index c74740d..f554ce3 100644 --- a/packages/game-engine/src/systems/infrastructureSystem.ts +++ b/packages/game-engine/src/systems/infrastructureSystem.ts @@ -195,7 +195,6 @@ export function processInfrastructure(state: GameState): InfraTickResult { } let computeRacksOnline = dc.computeRacksOnline; - let computeRacksFailed = dc.computeRacksFailed; let dcRepairCosts = 0; // Process retrofit @@ -349,7 +348,6 @@ export function processInfrastructure(state: GameState): InfraTickResult { const prodFailures = binomialSample(computeRacksOnline, effectiveRate); if (prodFailures > 0) { computeRacksOnline -= prodFailures; - computeRacksFailed += prodFailures; const repairCost = sku.baseCost * sku.repairCostFraction * prodFailures; dcRepairCosts += repairCost; @@ -400,12 +398,15 @@ export function processInfrastructure(state: GameState): InfraTickResult { // Compute aggregates for this DC const location = LOCATION_CONFIGS[cluster.locationId]; const tierConfig = DC_TIER_CONFIGS[dc.tier]; - const totalRacksInDc = computeRacksOnline + computeRacksFailed; - const netSlots = networkSlotsRequired(computeRacksOnline); const pipelineRacks = updatedCohorts - .filter(c => c.stage !== 'decommission' && c.stage !== 'repair') + .filter(c => c.stage !== 'decommission') .reduce((sum, c) => sum + c.count, 0); - const usedSlots = totalRacksInDc + netSlots + pipelineRacks; + const computeRacksFailed = updatedCohorts + .filter(c => c.stage === 'repair') + .reduce((sum, c) => sum + c.count, 0); + const totalRacksInDc = computeRacksOnline + pipelineRacks; + const netSlots = networkSlotsRequired(computeRacksOnline + pipelineRacks); + const usedSlots = computeRacksOnline + pipelineRacks + netSlots; let usedPowerKW = 0; let dcFlops = 0;