Meta Progression
In short
Every run that ends, won, lost or abandoned, pays meta points (shown as PTS). Points buy batters, perks (upgrades that can then appear in the shop) and cosmetics. Runs also give XP, and the account level decides which batters and cosmetics are for sale (XP and Levels). Map progress is the third thing that carries over (Map Select and Unlocks).
How it works
At the end of a solo run (RunManager.EndRun), in this order:
RecordMap(not for the daily): best score per map and difficulty, and the next unlock on a win.AwardRun: meta points,runsPlayed + 1,runsWon + 1on a win, andbestScoreif beaten.AwardXp: account XP and the batter’s XP (XP and Levels).- Leaderboard entries, then
SaveSystem.Saveand the run checkpoint is deleted. - Only then the MAP BEATEN! or GAME OVER cutscene (if the run ended in play and cutscenes are on), then the results. Quitting mid-cutscene loses nothing. See Cutscenes.
Meta points (MetaProgression.AwardRun):
base = inningsCleared x 10 + score / 500 (whole number) + (won ? 50 : 0)
points = round(base x MetaPoints(difficulty)) // x1, x1.5, x2.5
Spending points. All unlocks share one list of ids, SaveData.unlockedIds, filled by TryUnlock(id, cost).
| What | Where | Rule |
|---|---|---|
| Batters | title screen, arrows beside the batter, purple UNLOCK button with a gem and the cost | Needs the batter’s requiredLevel account level first; shows REACH LV n until then |
| Perks (locked upgrades) | top bar PERKS popup, “PERK UNLOCKS”, one purple button each showing a gem and the cost | No level needed. Once unlocked they can appear in the shop |
| Cosmetics | CUSTOMIZE, BUY | Needs the item’s requiredLevel account level first. See Customization |
The PERKS tab lights up when you can afford at least one locked perk. The top bar also shows your account level badge (LV n with a progress bar) and your points (n PTS in a purple-rimmed pill).
The points icon. Meta points are always drawn with a purple gem (UIGlyphs.PointGem) and run coins with a gold
coin, so the two never get mixed up: the top bar, UNLOCK and perk buttons, Customize prices and POINTS EARNED on
the results screen. See Shop and Economy for coins.
Picking a batter. Only an unlocked batter can be selected (SELECT, then SELECTED). The title screen shows
their description, their batting style (for example “HIGH TRAJECTORY - PULL HITTER”, plus “SUPER CURVE” when
their curve is 1.3 or more), POWER / CONTACT / TIMING bars (including level perks), their character level and next
perk, and what they wear. SelectedBatter falls back to the first unlocked batter if the saved one is locked or gone.
Numbers
| What | Value | Where to tune |
|---|---|---|
| Points per inning cleared | 10 | MetaProgression.AwardRun |
| Points per 500 score | 1 | MetaProgression.AwardRun |
| Points for beating the map | 50 | MetaProgression.AwardRun |
| Difficulty multiplier | x1 / x1.5 / x2.5 | Difficulties.MetaPoints |
| Baked Bean | 40 PTS, account LV 2 | DefaultContent |
| String Bean | 60 PTS, account LV 4 | DefaultContent |
| Pinto | 90 PTS, account LV 6 | DefaultContent |
| Pocket Metronome perk | 60 PTS | DefaultContent (unlockCost) |
| Titanium Bat perk | 80 PTS | DefaultContent (unlockCost) |
Example: winning a Normal run with a score of 14,200 pays 9 x 10 + 28 + 50 = 168 points; a base of 168 on Hard pays 420.
In the code
| File | What it does |
|---|---|
Assets/_Project/Scripts/Progression/MetaProgression.cs | AwardRun, TryUnlock, TryBuy, CanBuy, IsUnlocked, UpgradePool, LockedUpgrades, SelectedBatter, dev tools |
Assets/_Project/Scripts/Progression/SaveData.cs | metaPoints, unlockedIds, bestScore, runsPlayed, runsWon, selectedBatterId, maps |
Assets/_Project/Scripts/Run/RunManager.cs | EndRun calls every award step |
Assets/_Project/Scripts/UI/LobbyNav.cs | Top bar (PLAY, CUSTOMIZE, PERKS, BATTING CAGE, INDEX, LV badge, PTS) and the PERK UNLOCKS popup |
Assets/_Project/Scripts/UI/MainMenuView.cs | Batter picker, UNLOCK / SELECT, title card with BEST and WINS / RUNS |
Gotchas
- Abandoning a run still pays points and XP for what you cleared.
- The daily run pays points and XP and can set
bestScore, but unlocks no map. - In co-op, points and XP are paid but a team score never replaces your solo
bestScore(countsForBest: false). - Rounding uses
Mathf.RoundToInt, which rounds .5 to the nearest even number (x1.5 can land on .5). - Owning something always counts, even if your level is later lower (dev tools); buying is what needs the level.
- Points are saved to
save.jsonat once on every purchase; there is no refund or respec. - Dev menu: add points, unlock or lock every batter, upgrade and cosmetic. See Dev Menu and Shortcuts.
Related
- XP and Levels: the account and batter levels that gate purchases
- Map Select and Unlocks: map progress
- Customization: spending points on cosmetics
- Batters: every batter, their stats and price
- Upgrades: which upgrades are perks
- Save System: where it is stored
- Index Screen: the INDEX tab on the same top bar