Racks can now be marked for decommission from the DC view. The rack leaves production immediately (freeing slot and power), enters the pipeline as a timed decommission order, and is removed when complete. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -51,6 +51,7 @@ interface Actions {
|
||||
setTrainingAllocation: (ratio: number) => void;
|
||||
buildDataCenter: (name: string, location: LocationId, tier: DCTier) => void;
|
||||
orderRack: (dataCenterId: string, skuId: RackSkuId) => void;
|
||||
decommissionRack: (dataCenterId: string, rackId: string) => void;
|
||||
upgradeDataCenter: (dataCenterId: string, upgrade: 'cooling' | 'redundancy') => void;
|
||||
startTraining: (job: Omit<TrainingJob, 'progressTicks'>) => void;
|
||||
deployModel: (modelId: string) => void;
|
||||
@@ -196,10 +197,9 @@ export const useGameStore = create<Store>()(
|
||||
if (!dc || dc.status !== 'operational') return s;
|
||||
|
||||
const tierConfig = DC_TIER_CONFIGS[dc.tier];
|
||||
const pipelineForDc = s.infrastructure.rackPipeline.filter(o => o.dataCenterId === dataCenterId).length;
|
||||
const actualUsedSlots = dc.racks.length + pipelineForDc;
|
||||
const pipelinePowerForDc = s.infrastructure.rackPipeline
|
||||
.filter(o => o.dataCenterId === dataCenterId)
|
||||
const activePipeline = s.infrastructure.rackPipeline.filter(o => o.dataCenterId === dataCenterId && o.stage !== 'decommission');
|
||||
const actualUsedSlots = dc.racks.length + activePipeline.length;
|
||||
const pipelinePowerForDc = activePipeline
|
||||
.reduce((sum, o) => sum + RACK_SKU_CONFIGS[o.skuId].powerDrawKW, 0);
|
||||
const actualUsedPower = dc.racks.reduce((sum, r) => sum + RACK_SKU_CONFIGS[r.skuId].powerDrawKW, 0) + pipelinePowerForDc;
|
||||
if (actualUsedSlots >= tierConfig.rackSlots) return s;
|
||||
@@ -225,6 +225,39 @@ export const useGameStore = create<Store>()(
|
||||
};
|
||||
}),
|
||||
|
||||
decommissionRack: (dataCenterId, rackId) => set((s) => {
|
||||
const dc = s.infrastructure.dataCenters.find(d => d.id === dataCenterId);
|
||||
if (!dc || dc.status !== 'operational') return s;
|
||||
|
||||
const rack = dc.racks.find(r => r.id === rackId);
|
||||
if (!rack) return s;
|
||||
|
||||
const sku = RACK_SKU_CONFIGS[rack.skuId];
|
||||
const dataCenters = s.infrastructure.dataCenters.map(d => {
|
||||
if (d.id !== dataCenterId) return d;
|
||||
return { ...d, racks: d.racks.filter(r => r.id !== rackId) };
|
||||
});
|
||||
|
||||
const order = {
|
||||
id: rackId,
|
||||
skuId: rack.skuId,
|
||||
dataCenterId,
|
||||
stage: 'decommission' as const,
|
||||
stageProgress: 0,
|
||||
stageTotal: sku.pipelineTimeTicks.installation,
|
||||
totalCost: 0,
|
||||
repairCount: 0,
|
||||
};
|
||||
|
||||
return {
|
||||
infrastructure: {
|
||||
...s.infrastructure,
|
||||
dataCenters,
|
||||
rackPipeline: [...s.infrastructure.rackPipeline, order],
|
||||
},
|
||||
};
|
||||
}),
|
||||
|
||||
upgradeDataCenter: (dataCenterId, upgrade) => set((s) => {
|
||||
const dc = s.infrastructure.dataCenters.find(d => d.id === dataCenterId);
|
||||
if (!dc || dc.status !== 'operational') return s;
|
||||
|
||||
Reference in New Issue
Block a user