🚀 Accelerate (default): every profit reinvests — fastest path to 3× L7. Best for people who want the endgame and don't need cash along the way. 💰 Pocket along the way: they keep 25/50/75% of each cycle's profit as spending money and bank the rest. The climb honestly slows down — the timeline and tables update to show it — but they see real money the whole way. Best for people who need proof it pays before they trust the climb.
+ ⚡ Front-load: pocket 50% of each cycle until L6, then tighten to 25% for the expensive late jumps. Because early upgrades are funded by the payout roll anyway, this arrives at 3× L7 on nearly the same date as flat 25% while paying roughly double during the early grind — usually the best effort-to-reward line for someone actively working the clicks. The share link remembers this choice too. 🏝 Park & collect: stop at a level on purpose and pocket the whole profit every cycle (e.g. L4+L3 ≈ $213/mo). Best for tight budgets who may never fund an L7 — and you still earn your 10% on every one of their cycles, forever.
The share link remembers the strategy, so the plan they open is the plan you chose for them.
@@ -1608,9 +1610,16 @@ const PHASE_SLOTS = {
'L5+L4': [5, 4], 'L6': [6], 'L7': [7], '3xL7': [7, 7, 7],
};
+// pocketPct: number (flat) or the string 'frontload' = 50% below L6, 25%
+// from L6 up (Marty 2026-07-31: take the money early when thresholds are
+// cheap, tighten for the expensive late jumps — same arrival as flat 25%).
+function pocketPctFor(pocketPct, phaseKey) {
+ if (pocketPct !== 'frontload') return pocketPct;
+ return Math.max(...PHASE_SLOTS[phaseKey]) >= 6 ? 25 : 50;
+}
+
function computePlan(phases, pocketPct = 0) {
const plan = {};
- const keepFrac = 1 - pocketPct / 100;
let bal = 0;
const activated = new Set();
for (let lv = 1; lv <= Math.max(...PHASE_SLOTS[phases[0]]); lv++) activated.add(lv);
@@ -1640,7 +1649,7 @@ function computePlan(phases, pocketPct = 0) {
while (cycles < 500) {
cycles++;
if (bal + p.payout - carriedCamp >= cost) { bal += p.payout - carriedCamp - cost; break; }
- bal += p.profit * keepFrac;
+ bal += p.profit * (1 - pocketPctFor(pocketPct, k) / 100);
}
plan[k] = { cycles, months: Math.round(cycles * p.daysPer / 30.4 * 10) / 10 };
}
@@ -1679,7 +1688,6 @@ function laneStats(lanes) {
// Simulate from an arbitrary lane set + starting reserve to 3×L7.
// Mirrors computePlan's rules exactly; capped for safety.
function boostSim(startLanes, bal0, pocketPct = 0) {
- const keepFrac = 1 - pocketPct / 100;
let lanes = [...startLanes].sort((a, b) => b - a);
let bal = bal0;
let cycles = 0;
@@ -1709,7 +1717,7 @@ function boostSim(startLanes, bal0, pocketPct = 0) {
while (spin++ < 500) {
cycles++;
if (bal + s.payout - carriedCamp >= cost) { bal += s.payout - carriedCamp - cost; break; }
- bal += s.profit * keepFrac;
+ bal += s.profit * (1 - (pocketPct === 'frontload' ? (Math.max(...lanes) >= 6 ? 25 : 50) : pocketPct) / 100);
}
lanes = targetSlots.sort((a, b) => b - a);
path.push(targetKey);
@@ -1792,6 +1800,7 @@ function renderBoost(phaseKey, mode, pocketPct) {
'Activation is charged once per level; unspent cash goes into reserves either way. ' +
(mode === 'park' ? 'Shown on the climb-to-endgame basis; if you park, the best combo is simply the highest profit/cycle you can afford.' :
mode === 'pocket' ? `Simulated with your ${pocketPct}% pocket setting.` :
+ mode === 'frontload' ? 'Simulated with the front-load setting: pocket 50% until L6, then 25%.' :
'Simulated in Accelerate mode, same reserve math as the rest of the calculator.');
}
@@ -1901,7 +1910,8 @@ function updateAll() {
const selfLevel = parseInt(document.getElementById('selfFundLevel').value);
const showRef = document.getElementById('showReferral').checked;
const mode = document.getElementById('strategyMode').value;
- const pocketPct = mode === 'pocket' ? (parseInt(document.getElementById('pocketPct').value) || 50) : 0;
+ const pocketPct = mode === 'pocket' ? (parseInt(document.getElementById('pocketPct').value) || 50)
+ : mode === 'frontload' ? 'frontload' : 0;
document.getElementById('pocketPctGroup').style.display = mode === 'pocket' ? '' : 'none';
document.getElementById('parkPhaseGroup').style.display = mode === 'park' ? '' : 'none';
@@ -1935,7 +1945,7 @@ function updateAll() {
const endCutPerCycle = PI[endKey].parked ? PI[endKey].payout * (commPct / 100) : THREE_L7_YOUR_CUT * mult;
const monthlyPassive = Math.round(endCutPerCycle * 30.4 / 19 * numPeople);
const pocketedTotal = Math.round(phases.filter(k => k !== '3xL7' && !PI[k].parked)
- .reduce((s, k) => s + PI[k].profit * (pocketPct / 100) * PI[k].cycles, 0));
+ .reduce((s, k) => s + PI[k].profit * (pocketPctFor(pocketPct, k) / 100) * PI[k].cycles, 0));
let totalToEGPerPerson = 0;
for (const k of phases) {
@@ -1980,11 +1990,11 @@ function updateAll() {
${mode === 'park' ? 'Time to Park Level' : 'Time to 3× L7'}