Game balance audit: wire research effects, rework capability formula, fix dead systems
CI / build-and-push (push) Successful in 32s

- Create researchBonuses utility to aggregate tech tree effects into all game systems
  (infrastructure energy costs, compute efficiency, training speed, model capability, reputation)
- Rework model capability from sqrt(compute) to 4-pillar formula (params + compute + data + research)
- Make context window affect benchmarks and inference speed
- Add MoE tradeoffs: 1.5x VRAM, 0.8x training speed
- Enforce research point costs as a gate for unlocking research
- Add real consequences to data contamination events (reputation hit, legal costs)
- Scale talent costs from $0.03 to $5/tick per headcount
- Scale compliance costs 100x to be meaningful
- Rework competitor acquisition: cheaper but grants headcount, RP, and reputation
- Remove dead code: sfxVolume, autoSaveInterval, notificationsEnabled,
  FAST_FORWARD_BATCH_SIZE, CHINCHILLA_OPTIMAL_RATIO

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-25 09:36:31 -04:00
parent 8d650fefae
commit 00e790591e
14 changed files with 205 additions and 54 deletions
@@ -24,6 +24,7 @@ import {
estimateNetworkSlots,
} from '@ai-tycoon/shared';
import type { TickNotification } from '../tick';
import type { ResearchBonuses } from './researchBonuses';
export interface InfraTickResult {
infrastructure: InfrastructureState;
@@ -463,7 +464,7 @@ function computeInterconnectMultiplier(
// --- Main Infrastructure Tick ---
export function processInfrastructure(state: GameState): InfraTickResult {
export function processInfrastructure(state: GameState, researchBonuses?: ResearchBonuses): InfraTickResult {
const notifications: TickNotification[] = [];
let repairCosts = 0;
@@ -587,7 +588,9 @@ export function processInfrastructure(state: GameState): InfraTickResult {
continue;
}
const speed = stageSpeed(cohort.stage, engEff, opsEff);
const baseSpeed = stageSpeed(cohort.stage, engEff, opsEff);
const pipelineBonus = cohort.stage !== 'repair' ? (researchBonuses?.pipelineSpeedBonus ?? 0) : 0;
const speed = baseSpeed * (1 + pipelineBonus);
const newProgress = cohort.stageProgress + speed;
if (newProgress < cohort.stageTotal) {
@@ -728,8 +731,9 @@ export function processInfrastructure(state: GameState): InfraTickResult {
}
const pue = COOLING_TYPE_CONFIGS[dc.coolingType].pueMultiplier;
const energyReduction = researchBonuses?.energyCostReduction ?? 0;
const energyCostPerTick = (tierConfig.baseEnergyCostPerTick + usedPowerKW * BASE_ENERGY_COST_PER_FLOP)
* location.energyCostMultiplier * pue;
* location.energyCostMultiplier * pue * (1 - energyReduction);
const maintenanceCostPerTick = totalRacksInDc * BASE_MAINTENANCE_PER_RACK;
const currentUptime = totalRacksInDc > 0 ? effectiveComputeRacks / totalRacksInDc : 1;