Polish Week 1: tooltips, save import, game balance tuning

Add reusable Tooltip component and rich tooltips on all TopBar KPIs
(cash breakdown, compute utilization, reputation context). Add save
import button to Settings page. Fix game balance: reduce GPU maintenance
100x, increase organic API demand 200x, accelerate subscription revenue
timescale, boost early subscriber seeding, use sqrt scaling for model
compute factor, simplify deploy to activate all product lines at once.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-24 17:17:58 -04:00
parent 9a48c188ad
commit d1d3eb4bf2
8 changed files with 156 additions and 35 deletions
@@ -38,8 +38,8 @@ export function processMarket(state: GameState, compute: ComputeState): MarketTi
const lostSubs = consumers.totalSubscribers * churnRate;
consumers.totalSubscribers = Math.max(0, consumers.totalSubscribers + newSubs - lostSubs);
if (consumers.totalSubscribers < 50 && modelQuality > 0.1) {
consumers.totalSubscribers += 2 + modelQuality * 5;
if (consumers.totalSubscribers < 100 && modelQuality > 0.1) {
consumers.totalSubscribers += 5 + modelQuality * 20;
}
const loadPenalty = compute.inferenceUtilization > 0.9
@@ -51,7 +51,7 @@ export function processMarket(state: GameState, compute: ComputeState): MarketTi
consumers.viralCoefficient = modelQuality > 0.5 ? 1 + (modelQuality - 0.5) * 2 : 0;
subscriptionRevenue = consumers.totalSubscribers * (chatProduct.pricing.subscriptionPrice / 2592000);
subscriptionRevenue = consumers.totalSubscribers * (chatProduct.pricing.subscriptionPrice / 86400);
}
// --- B2B API market (organic demand based on model quality + reputation) ---
@@ -65,7 +65,7 @@ export function processMarket(state: GameState, compute: ComputeState): MarketTi
const priceFactor = Math.max(0.1, 1 - (textApi.pricing.outputTokenPrice / 20));
organicApiTokens = Math.floor(
qualityFactor * reputationFactor * priceFactor * 50000 * (1 + state.meta.tickCount * 0.0001),
qualityFactor * reputationFactor * priceFactor * 10_000_000 * (1 + state.meta.tickCount * 0.0001),
);
let contractTokens = 0;
@@ -48,7 +48,7 @@ function createTrainedModel(
dataTokens: number,
state: GameState,
): TrainedModel {
const computeFactor = Math.log10(1 + compute) * 15;
const computeFactor = Math.sqrt(compute) * 5;
const dataFactor = Math.log10(1 + dataTokens / 1e8) * 10;
const researchBonus = state.research.completedResearch.length * 3;
const efficiencyBonus = state.research.completedResearch.filter(r => r.includes('efficiency')).length * 5;