// Endless upgrades: once a family of upgrades is complete (its `requires` // milestone is owned), it continues forever as a repeatable line. Every level // multiplies the effect once more and costs exponentially more, up to // `maxLevel` levels, which nobody will ever reach. import { bulkCost, maxAffordable } from './formulas.js'; export const lineLevel = (state, id) => state.endless[id] ?? 0; export function lineAvailable(state, line) { return !line.requires || state.upgrades.includes(line.requires); } /** How many levels `amount` ("max" or a number) buys right now, and what they cost. */ export function endlessQuote(state, ctx, id, amount) { const line = ctx.endlessById.get(id); const level = lineLevel(state, id); const wanted = amount === 'max' ? maxAffordable(line.baseCost, line.costGrowth, level, state.funds) : amount; const count = Math.max(0, Math.min(wanted, line.maxLevel - level)); return { count, cost: bulkCost(line.baseCost, line.costGrowth, level, count) }; } export function buyEndless(state, ctx, id, amount = 1) { const line = ctx.endlessById.get(id); if (!line || !lineAvailable(state, line)) return false; const { count, cost } = endlessQuote(state, ctx, id, amount); if (count <= 0 || !(state.funds >= cost)) return false; // an infinite cost is never affordable state.funds -= cost; state.endless[id] = lineLevel(state, id) + count; return true; }