Customization

In short

Cosmetics are looks only: no stats. There are four slots (hat, glasses, shoes, bat), one item worn per slot. Items are bought once with meta points, and most need an account level before they go on sale. A cosmetic bat changes how your bat looks; the shop’s Bat upgrade still gives the stats. A call sign is a free title over your batter, opened by account level.

How it works

The screen (top bar CUSTOMIZE):

  • Left sidebar: HATS, GLASSES, SHOES, BATS, CALL SIGN, then CLOTHES, GLOVES, EMOTES greyed out with a SOON pill.
  • Middle: your selected batter on a spotlit stage. Left-drag spins (a flick keeps coasting), right-drag tilts, middle-drag or arrow keys / WASD pan, the wheel zooms toward the cursor, double-click resets. It slowly turns by itself until you touch it. Picking a category frames that part of the body; BATS switches to the batting stance.
  • Footer: POSE: STANDING / POSE: STANCE and RESET VIEW. There is no back button: the PLAY tab or Esc returns to the title screen.
  • Right: a grid of item tiles with rendered thumbnails. The first tile is NONE (empty slot). Locked tiles are dimmed with a lock and a purple price pill (a gem and the cost) or, if your level is too low, LV n. The equipped tile has a yellow border and a check.
  • Detail card under the grid: name, blurb and one action.

Buying and wearing:

  1. Hovering a tile tries the item on the batter right away; moving off puts back what you wear.
  2. Clicking an owned tile equips it (clicking NONE empties the slot).
  3. Over the button, a locked item shows its price as a purple pill with a gem (n PTS; greyed while your level is too low). The detail card button is one of: REACH LV n (greyed, your account level is too low), BUY (spends the points and equips it), EQUIP, EQUIPPED, REMOVE (on the NONE tile) or NOTHING WORN.
  4. MetaProgression.Equip saves at once and raises CosmeticsChanged, so the batter in the box updates.

One loadout for every batter. SaveData.cosmetics holds one id per slot (hatId, glassesId, shoesId, batId), shared by all batters. A new save wears nothing (“Wearing: nothing yet” on the title screen).

Bats. A Bat cosmetic is a model from the BatModelLibrary. In an at-bat the bat shown is: the dev override if any, else your equipped Bat cosmetic, else the model of your Bat-slot upgrade. Stats always come from the upgrade. Co-op spectators see the batter’s own bat, never their own cosmetic.

Call signs (CALL SIGN category): a list of titles. Each shows WEAR, WEARING, or a lock and LV n. They cost nothing; the account level opens them. The worn one is shown over your batter on the title screen. If the saved one is locked or unknown, the first open one (ROOKIE) is worn.

Numbers

WhatValueWhere to tune
SlotsHat, Glasses, Shoes, BatCosmeticSlot
Free from the startBall Cap, Shades, Sneakers (0 PTS, no level)DefaultContent
Cheapest bought itemHickory bat, 20 PTS, LV 2DefaultContent
Dearest itemOld Faithful bat, 70 PTS, LV 10DefaultContent
Call sign levels1, 3, 5, 7, 10, 15, 20DefaultContent
Grid4 columns of 96 px tilesCustomizeView.GridColumns, TileSize

Full price and level lists: Cosmetics and Call Signs.

In the code

FileWhat it does
Assets/_Project/Scripts/UI/CustomizeView.csThe screen: sidebar, tiles, detail card, try-on, orbit camera, call sign list
Assets/_Project/Scripts/Data/CosmeticDefinition.csCosmeticSlot, CosmeticStyle, price, requiredLevel, fit offset / rotation / scale, optional prefab
Assets/_Project/Scripts/Data/CallSignDefinition.csid, text, requiredLevel
Assets/_Project/Scripts/Progression/MetaProgression.csIsUnlocked, CanBuy, TryBuy, Equip, Unequip, Equipped, SelectedCallSign
Assets/_Project/Scripts/Progression/SaveData.csCosmeticLoadout, callSignId
Assets/_Project/Scripts/Batting/AtBatController.csSetBatModel picks which bat model shows
Assets/_Project/Scripts/Batting/CosmeticBuilder.csBuilds the code-made hats, glasses and shoes
Assets/_Project/Scripts/UI/ThumbnailRenderer.csTile pictures: For(item) queues a request, LateUpdate renders it, then it is cached for the session

Gotchas

  • Owning an item always counts, whatever your level. The level only gates buying.
  • Cosmetic ids share one unlock list with batters and upgrades, which is why they carry a slot prefix (hat_, glasses_, shoes_, bat_).
  • An equipped id that no longer exists in the content, or is locked again (dev lock all), simply stops showing.
  • While a top-bar popup is open, hover try-on and camera drags are off.
  • A tile’s picture appears one frame after it is first asked for. Thumbnails render in LateUpdate, not from OnGUI: rendering a camera mid-frame from OnGUI threw URP’s “UniversalCameraData has already been created” (fixed in PR #45). An item with no model gets no picture and is not retried.
  • String Bean has a new model since PR #44 (flat toon colours, no texture). See Characters and Rigs.
  • Fit Mode (dev only: the purple FIT button in the Editor, or Ctrl+Shift+F in any build) docks a socket and item editor on the stage. See Fit Mode.

Not built

CLOTHES, GLOVES and EMOTES are placeholders marked SOON. Uniforms with stats are not started.