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:

  1. RecordMap (not for the daily): best score per map and difficulty, and the next unlock on a win.
  2. AwardRun: meta points, runsPlayed + 1, runsWon + 1 on a win, and bestScore if beaten.
  3. AwardXp: account XP and the batter’s XP (XP and Levels).
  4. Leaderboard entries, then SaveSystem.Save and the run checkpoint is deleted.
  5. 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).

WhatWhereRule
Batterstitle screen, arrows beside the batter, purple UNLOCK button with a gem and the costNeeds 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 costNo level needed. Once unlocked they can appear in the shop
CosmeticsCUSTOMIZE, BUYNeeds 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

WhatValueWhere to tune
Points per inning cleared10MetaProgression.AwardRun
Points per 500 score1MetaProgression.AwardRun
Points for beating the map50MetaProgression.AwardRun
Difficulty multiplierx1 / x1.5 / x2.5Difficulties.MetaPoints
Baked Bean40 PTS, account LV 2DefaultContent
String Bean60 PTS, account LV 4DefaultContent
Pinto90 PTS, account LV 6DefaultContent
Pocket Metronome perk60 PTSDefaultContent (unlockCost)
Titanium Bat perk80 PTSDefaultContent (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

FileWhat it does
Assets/_Project/Scripts/Progression/MetaProgression.csAwardRun, TryUnlock, TryBuy, CanBuy, IsUnlocked, UpgradePool, LockedUpgrades, SelectedBatter, dev tools
Assets/_Project/Scripts/Progression/SaveData.csmetaPoints, unlockedIds, bestScore, runsPlayed, runsWon, selectedBatterId, maps
Assets/_Project/Scripts/Run/RunManager.csEndRun calls every award step
Assets/_Project/Scripts/UI/LobbyNav.csTop bar (PLAY, CUSTOMIZE, PERKS, BATTING CAGE, INDEX, LV badge, PTS) and the PERK UNLOCKS popup
Assets/_Project/Scripts/UI/MainMenuView.csBatter 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.json at 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.