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
+21 -4
View File
@@ -42,7 +42,7 @@ import {
} from '@ai-tycoon/shared';
import {
emptyDCNetworkSummary, emptyCampusNetworkSummary, emptyClusterNetworkSummary,
BENCHMARKS,
BENCHMARKS, TECH_TREE,
} from '@ai-tycoon/game-engine';
import { INITIAL_RIVALS } from '@ai-tycoon/game-engine';
@@ -1117,8 +1117,15 @@ export const useGameStore = create<Store>()(
startResearch: (research) => set((s) => {
if (s.research.activeResearch) return s;
const node = TECH_TREE.find(n => n.id === research.researchId);
const rpCost = node?.cost.researchPoints ?? 0;
if (rpCost > s.research.researchPoints) return s;
return {
research: { ...s.research, activeResearch: research },
research: {
...s.research,
activeResearch: research,
researchPoints: s.research.researchPoints - rpCost,
},
};
}),
@@ -1202,8 +1209,9 @@ export const useGameStore = create<Store>()(
acquireCompetitor: (competitorId) => set((s) => {
const rival = s.competitors.rivals.find(r => r.id === competitorId);
if (!rival || rival.status === 'acquired') return s;
const cost = rival.estimatedRevenue * 500 + rival.estimatedCapability * 100_000;
const cost = rival.estimatedRevenue * 50 + rival.estimatedCapability * 20_000;
if (s.economy.money < cost) return s;
const rpGain = Math.floor(rival.estimatedCapability / 15);
return {
economy: { ...s.economy, money: s.economy.money - cost },
competitors: {
@@ -1217,9 +1225,18 @@ export const useGameStore = create<Store>()(
departments: {
...s.talent.departments,
research: { ...s.talent.departments.research, headcount: s.talent.departments.research.headcount + 5 },
engineering: { ...s.talent.departments.engineering, headcount: s.talent.departments.engineering.headcount + 3 },
engineering: { ...s.talent.departments.engineering, headcount: s.talent.departments.engineering.headcount + 5 },
sales: { ...s.talent.departments.sales, headcount: s.talent.departments.sales.headcount + 3 },
},
},
research: {
...s.research,
researchPoints: s.research.researchPoints + rpGain,
},
reputation: {
...s.reputation,
publicPerception: Math.min(100, s.reputation.publicPerception + 5),
},
};
}),