Earn rates today: daily 10 + weekly 50 → perfect week = 120, active ≈ 100, casual ≈ 40–60. One daily = one cheap item; one full week ≈ one premium item. Each game's launch set costs 🏆 200–400 total ≈ 2–4 weeks of active play per game — so "finish your favorite game's set" is quick, "chase 100%" scales with the catalogue (by design, per the bands decision).
Ladder timing at active pace (~100/wk lifetime): Peasant 100 ≈ 1 wk · Squire 250 ≈ 2–3 wk · Knight 500 ≈ 5 wk · Sorcerer 1 000 ≈ 2–3 mo · Archmage 2 000 ≈ 5 mo · Oracle 4 000 ≈ 10 mo · Ascendant 6 500 ≈ 16 mo · Emperor 10 000 ≈ 2 yrs. Since titles key off lifetime, shop spending doesn't slow the ladder — the two tracks are fully independent, which is exactly why the pacing still works. The early tiers land satisfyingly fast, the tail is a real long-game. Recommendation: leave thresholds; retune from GA4 once real completion data flows (the existing challenge_done events already measure earn rate).
+2 🏆 per good run, capped at 3/day (max +42/wk; realistically +20–30 for active players). Ties earning to actually playing — cheap to add since goodRuns are already tracked per day. It also raises the title pace slightly (lifetime grows faster); the thresholds review below already absorbs that. Parked streak bonuses could slot here later if more headroom is ever needed.
✨ Where the player sees the cap: (1) the end-of-run menu's existing "✓ Good run" line becomes the receipt — "✓ Good run · +2 🏆 (2/3 today)", and when maxed "✓ Good run · daily bonus maxed 3/3" — you learn the cap the moment it matters; (2) an always-on line in the challenges panel/drawer under the trophy pills — "⚡ Good-run bonus: 2/3 today · +2 🏆 each" — for planning "is one more run worth it?"; (3) one sentence in the FAQ's challenges entry. No new storage: the counter is min(goodRuns, 3) from the existing daily log.
Three archetypes, straight multiplication of today's earn rates (titles read lifetime, so spending on cosmetics never delays them):
| Player | Habit | Earn / week | Month 1 | Month 3 | Month 6 | Year 1 |
|---|---|---|---|---|---|---|
| 🔥 Devotee | every daily + every weekly | 🏆 120 | ≈ 520 | ≈ 1,560 | ≈ 3,120 | ≈ 6,240 |
| 🙂 Active | ~5 dailies + most weeklies | 🏆 100 | ≈ 430 | ≈ 1,300 | ≈ 2,600 | ≈ 5,200 |
| 🌙 Casual | 2–3 dailies, weekly sometimes | 🏆 45 | ≈ 195 | ≈ 585 | ≈ 1,170 | ≈ 2,340 |
| Milestone | 🔥 Devotee | 🙂 Active | 🌙 Casual |
|---|---|---|---|
| First cosmetic (🏆 10) | day 1 | day 1 | day 1–2 |
| A premium item (🏆 100) | ~1 week | ~1 week | ~2 weeks |
| Favorite game's full set (🏆 200–400) | 2–3 weeks | 2–4 weeks | 5–9 weeks |
| All 8 paid birds (🏆 1,160, incl. Phoenix 500) | ~10 weeks | ~12 weeks | ~6 months |
| 100% collection (launch set) | ~5 months | ~6 months | ~12 months |
| Title (lifetime 🏆) | 🔥 Devotee | 🙂 Active | 🌙 Casual |
|---|---|---|---|
| 🌾 Peasant (100) | week 1 | week 1 | week 2–3 |
| 🛡️ Squire (250) | week 2–3 | week 3 | week 6 |
| ⚔️ Knight (500) | week 4–5 | week 5 | ~3 months |
| 🔮 Sorcerer (1,000) | ~2 months | ~2.5 months | ~5 months |
| 🧙 Archmage (2,000) | ~4 months | ~5 months | ~10 months |
| 👁️ Oracle (4,000) | ~8 months | ~9 months | ~1.7 years |
| 🌟 Ascendant (6,500) | ~13 months | ~15 months | ~2.8 years |
| 👑 Emperor (10,000) | ~19 months | ~2 years | ~4+ years |
The challenges drawer's points row becomes a two-pill row + collection bar; the shop itself is a separate modal (like the titles ladder), opened from the gold pill — and the same modal is reachable from the profile's collection bar.
Kit-modal like the titles ladder. Header: balance + collection bar. Items grouped by game (game icon + per-game progress), each group a grid of kit shop cells — the exact primitive shipped for the Drydock: icon painter, price, owned/affordable/locked states, touch two-step select→buy with a focused-desc line, mouse hover+click. Titles render at the bottom as the read-only prestige ladder.
✨ Rev 2 — group ordering: favorite games sort to the top of the store (same favorites the catalogue pins), then most-played (from profile data), then the rest — your games' cosmetics are always the first thing you see. Site-wide sets (cursors) sit above the game groups.
Anywhere a cosmetic is selected in a game, it can be bought in place: locked cells in the existing selection UI show the 🏆 price; tap once to select (desc + price show), tap again / hit the gold button to buy — the exact `locked:` + two-step machinery from the Drydock. Flyer's bird grid is the template:
Defaults are free and pre-owned (count toward collection %). One "crown jewel" per game sits at 🏆 100; the birds keep a progressive tail. Launch total ≈ 🏆 2,375 across 58 items — but per the bands decision, the number that matters is per-item: nothing above a week except the flagged exceptions.
| Where | Set | Items (price 🏆) | Rules |
|---|---|---|---|
| Site-wide | Cursor skins (desktop only) | Classic FREE · Crosshair 25 · Paw 25 · Pixel Sword 50 · Neon Comet 50 · Rainbow Trail 100 | buy any |
| 🐍 Neon Snake | Food skins | Apple FREE · Cherry 10 · Golden Apple 25 · Gem 25 · Star Fruit 50 · Rainbow Orb 100 | buy any |
| 🧱 Brick Breaker | Paddle skins | Synthwave FREE · Wood Classic 10 · Neon Ice 25 · Lava Core 50 · Chrome 100 | buy any (user-specified) |
| Ball skins | Neon FREE · 8-Ball 25 · Comet 50 · Disco 50 · Plasma 100 | ||
| 🏰 Keep Defender | Castle skins | Stone Keep FREE · Oak Fort 25 · Sandcastle 50 · Ice Keep 50 · Obsidian Citadel 100 | buy any |
| 🫧 Bubble Pop | Pop effects | Classic FREE · Confetti 25 · Stars 50 · Fireworks 100 | buy any |
| Shooter bases | Aqua FREE · Candy 25 · Royal Gold 50 | ||
| 🎯 Range | Target skins | Rings FREE · Neon Donut 25 · Fruit 50 · Alien Blob 50 · Gold Star 100 | buy any |
| Hit markers | Classic FREE · Spark 25 · Boom 50 | ||
| 🗼 Stack | Block palettes | Pastel FREE · Synthwave 25 · Forest 25 · Candy 50 · Gilded Mono 100 | buy any |
| 🛸 Asteroids | Ship colors | Cyan FREE · Emerald 10 · Crimson 25 · Violet 25 · Gold 100 · CRT Green (whole-game retro tint) 50 | buy any |
| ☄️ Asteroids+ | Hull colors | Violet FREE · Teal 25 · Blood Red 50 · Gold 100 | buy any |
| Engine trails | Ion FREE · Ember 50 · Rainbow 100 | ||
| 🐤 Meadow Flyer ✨ | Birds (migrated) | Bee FREE · Robin 10 · Bluebird 25 · Parrot 50 · Owl 75 · Bielik 100 · Raróg 150 (exception) · Raven 250 (exception — #2 after Phoenix) · Phoenix 500 (exception — the aspirational one) | buy any · owned birds stay · banked pts convert 1:1 |
| 🎖️ Titles | Prestige ladder | Peasant 100 → Emperor 10,000 lifetime (unchanged) | automatic — read-only in the shop |
cosmetics.js — new shared registry, loaded like challenges.js (both catalogue AND games; added to every SW SHELL in lockstep). Per item: { id: 'snake.food.gold', game, set, name, desc, price, painter } — the painter is a tiny canvas swatch (same idiom as the shop icons), so the modal previews without loading game code. Version field from day one.gamekit_owned = { itemId: { c: cost, t: day } }. Spendable = lifetime(gamekit_done) − Σ owned costs — derived, never stored, so it can't drift. Defaults are implicit (never stored). Kept by Export/Import; per-game reset does NOT touch it (site-level purchase); Reset-all wipes it with everything else.gamekit.cosmetics → lifetime(), balance(), owned(id), buy(id) (validates balance, idempotent), selected(set)/select(set, id) (per-set choice, stored as gamekit_cos_sel), progress(game?) → {owned, total, pct}. Buying fires a GA4 shop_buy {id} (consent-gated) so prices can be tuned from data.gamekit.shopPanel()), reusing the gkm shop-cell machinery (locked/price/two-step/focdesc). Opened from the challenges drawer pill + profile bar.cosmetics.buy. Games apply the selected cosmetic in their render (a small COS = KIT.cosmetics.selected('snake.food') read).gamekit_owned at cost 0; remaining banked points added to lifetime via a synthetic gamekit_done entry ({'flappy-migrate': N} — keeps spendable = lifetime − spent consistent); old keys removed; flagged like gamekit_pts_x10.gamekit_done etc.) keep their names — this is copy only.deed: instead of price:).The tables below are the ORIGINAL review (pre-retune numbers) — kept for the record.
Every target translated into concrete play (scoring rules read from each game's code), with an eyeball verdict against the bar "a casual player clears a daily in one or two tries (~3–8 min)". This matters doubly now: the good-run bars gate the +2 🏆 trickle, so a mis-set bar distorts the economy, not just a challenge. Nothing changed yet — this is the review sheet for your testing.
| Goal | Targets (easy day / hard day — two separate goals per game in the 22-day rotation) | In play terms | Effort | Eyeball |
|---|---|---|---|---|
| 🐍 Snake | 100 / 250 | 10 / 25 apples (+10 each, no mode multipliers) | ~1 min / 3–4 min | OK / OK |
| 🫧 Bubble Pop | 1,000 / 3,000 | ~20–25 good shots (pop = group×10×level, drops ×15) / needs level 2–3 multipliers | 3–4 min / 8–12 min | OK / borderline HARD |
| 🧱 Brick Breaker | 500 / 1,500 | 50 / 150 bricks (10×level each; a full level-1 board = 180 bricks = 1,800) | 1–2 min / 3–5 min | OK-easy / OK |
| 🗼 Stack | 12 / 25 | ~10 / ~20 placements (+1 each, perfects bonus) — Zen mode trivializes both | 30–45 s / 1.5–2 min | TOO EASY / OK |
| 🐤 Meadow Flyer | 8 / 20 | ~5 / ~12 pipes (+1 each; collectibles add 2–5 in ~half the gaps) | ~20 s / 45–60 s | OK-easy / OK |
| 🎯 Range | 250 / 600 | ~15 hits with small combos / ~20+ with sustained combo (hit = 10×combo tier) — easy in 60 s mode, targets don't pin duration | one 30 s round / a good round | OK-easy / OK* |
| 🏰 Keep Defender | wave 5 / 700 | cumulative medium score ≈ 600 after wave 5 + drops → both targets ≈ the same run (first boss) | 5–8 min (same run) | OK / OK but REDUNDANT pair |
| 🛸 Asteroids | 4,000 | wave 1 (4 rocks = 2,080) + most of wave 2 — only ONE goal (every other game has two) | 3–5 min | OK |
| ☄️ Asteroids+ | 50,000 / 150,000 | survive to wave 11–12 / wave ~17–18 (cumulative ≈ 11.5k @w5, 40k @w10) | 15–20 min / 30+ min | TOO HARD / FAR TOO HARD |
| Goal | Target | Eyeball |
|---|---|---|
| play2 / play3 / genres2 (daily) | 2–3 games / 2 genres today | OK — pure variety nudges, minutes of play |
| good3 (daily) | 3 good runs today | OK — assuming sane bars (see below); with asteroids+'s current bar it's effectively "not via that game" |
| rand-daily / rand-weekly | play the pick | OK — cycles all 9 games in 9 days/weeks |
| wk-distinct5 / wk-play12 / wk-genres3 / wk-good10 | 5 games · 12 plays · 3 genres · 10 good runs per week | OK — "more work, not harder" holds (~2 plays/day covers all) |
| Game | Bar | In play terms | Eyeball |
|---|---|---|---|
| snake 100 · bubbles 1,000 · breakout 500 · flappy 8 · aim 250 | = the lower daily target | 1–4 min of decent play | OK — consistent "cleared the easy daily" definition |
| stacker | 12 | ~10 placements, ~40 s (Zen: trivial) | TOO EASY — free trickle trophies |
| tower-defense | 300 | ≈ clearing wave 3–4 on medium (below its own daily targets) | OK-easy |
| asteroids | 2,000 | ≈ clear wave 1 | OK |
| asteroids-plus | 50,000 | ≈ wave 11–12 ≈ 15–20 min | FAR TOO HARD — a "good run" costs 5× any other game's; kills the trickle there |