Add game-simulation package with multi-run balance testing, fix stalled-pipeline trap
Adds a full simulation harness (game-simulation package) with greedy/random strategies, 36-metric diagnostics, multi-run orchestration via child processes, and a statistical interpreter. Includes 2.3x engine performance optimizations (research bonus caching, per-DC dirty tracking, reduced allocations in tick pipeline, single-pass loops). Fixes a critical balance bug where training pipelines stalled on insufficient VRAM would permanently block training slots — the engine never re-checked stalled pipelines, and the greedy strategy didn't pre-check VRAM requirements. This caused 20-25% of seeds to get stuck in Scale-up era. All three fixes (engine un-stalling, strategy VRAM pre-check, stalled pipeline cancellation) bring pass rate from 75% to 100% across 20 random seeds. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -21,7 +21,16 @@ export interface ResearchBonuses {
|
||||
autoScalingBonus: number;
|
||||
}
|
||||
|
||||
const techTreeById = new Map(TECH_TREE.map(n => [n.id, n]));
|
||||
|
||||
let _cachedBonuses: ResearchBonuses | null = null;
|
||||
let _cachedResearchCount = -1;
|
||||
|
||||
export function getResearchBonuses(completedResearch: string[]): ResearchBonuses {
|
||||
if (_cachedBonuses && completedResearch.length === _cachedResearchCount) {
|
||||
return _cachedBonuses;
|
||||
}
|
||||
|
||||
const bonuses: ResearchBonuses = {
|
||||
energyCostReduction: 0,
|
||||
pipelineSpeedBonus: 0,
|
||||
@@ -42,7 +51,7 @@ export function getResearchBonuses(completedResearch: string[]): ResearchBonuses
|
||||
};
|
||||
|
||||
for (const id of completedResearch) {
|
||||
const node = TECH_TREE.find(n => n.id === id);
|
||||
const node = techTreeById.get(id);
|
||||
if (!node) continue;
|
||||
|
||||
for (const effect of node.effects) {
|
||||
@@ -79,5 +88,12 @@ export function getResearchBonuses(completedResearch: string[]): ResearchBonuses
|
||||
}
|
||||
}
|
||||
|
||||
_cachedBonuses = bonuses;
|
||||
_cachedResearchCount = completedResearch.length;
|
||||
return bonuses;
|
||||
}
|
||||
|
||||
export function resetResearchBonusCache(): void {
|
||||
_cachedBonuses = null;
|
||||
_cachedResearchCount = -1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user