Cosmetics

In short

17 items in four slots (Hat, Glasses, Shoes, Bat). They change looks only. Three are free (Ball Cap, Shades, Sneakers); the rest cost meta points and also need an account level before they can be bought. You wear at most one per slot.

How it works

  • Buying: in CUSTOMIZE, MetaProgression.TryBuy(cosmetic) needs CanBuy (owned already, or account level >= requiredLevel) and enough points. A locked item’s tile shows LV n until your level is high enough, then the points gem and its price (#38); the detail panel shows <cost> PTS with the gem (dimmed while the level is too low) and BUY or REACH LV n. See Customization and XP and Levels.
  • Wearing: Equip saves the item id per slot in SaveData.cosmetics (hatId, glassesId, shoesId, batId; empty = nothing). Nothing is worn by default, even the free items.
  • Hats, glasses, shoes are code-built shapes chosen by style in CosmeticBuilder, coloured with primaryColor and secondaryColor, placed on the character’s sockets. A cosmetic may instead set a prefab.
  • Bats (style = Model) are 3D models from Resources/BatModelLibrary, keyed by the cosmetic id (bat_03 …). An equipped bat cosmetic overrides the look of the Bat upgrade you hold; the upgrade keeps its stats. Spectators see the batter’s own bat.
  • When the account levels up, the results screen lists NEW ITEMS TO BUY: ... for cosmetics that just became buyable.
  • Cosmetics are not listed in the main menu INDEX (it has no cosmetics tab).
  • Tile pictures come from UI/ThumbnailRenderer. Since #45 a first request is queued and rendered in LateUpdate (rendering from OnGUI threw a URP error), so a new tile is blank for a frame before its picture appears.

Numbers

idNameSlotStylePriceAccount levelDescriptionPrimary / secondary colour
hat_capBall CapHatBallCapfreenone”Team colours, bill forward.”(0.15, 0.3, 0.8) / (0.92, 0.92, 0.96)
hat_topTop HatHatTopHat303”Formal wear for a formal beatdown.”(0.08, 0.08, 0.1) / (0.85, 0.1, 0.15)
hat_cowboyCowboy HatHatCowboyHat456”Yeehaw.”(0.72, 0.5, 0.25) / (0.35, 0.2, 0.1)
glasses_shadesShadesGlassesSunglassesfreenone”Too cool to squint.”(0.1, 0.1, 0.12) / (0.05, 0.05, 0.08)
glasses_nerdNerd GlassesGlassesNerdGlasses252”Launch angle? Calculated.”(0.85, 0.92, 1) / (0.1, 0.1, 0.12)
glasses_monocleMonocleGlassesMonocle507”Quite.”(0.9, 0.95, 1) / (1, 0.82, 0.3)
shoes_sneakersSneakersShoesSneakersfreenone”Fresh out of the box.”white / (0.9, 0.2, 0.2)
shoes_cleatsCleatsShoesCleats354”Dig in.”(0.08, 0.08, 0.1) / (0.95, 0.95, 0.95)
shoes_clownClown ShoesShoesClownShoes608”Honk.”(0.9, 0.15, 0.15) / (1, 0.85, 0.1)
bat_03HickoryBatModel202”Old-school grain.”(model)
bat_04Blue StreakBatModel252”Painted to go fast.”(model)
bat_07LumberjackBatModel303”Timber.”(model)
bat_08Night StickBatModel354”Dark and quiet.”(model)
bat_09Candy CaneBatModel405”Sweet swings.”(model)
bat_11Gold GloveBatModel507”Shiny. Very shiny.”(model)
bat_12ThunderBatModel608”Boom.”(model)
bat_13Old FaithfulBatModel7010”Never let you down.”(model)

Prices are meta points (PTS). Totals: 3 free items; buying everything else costs 575 points (hats 75, glasses 75, shoes 95, bats 330).

Unlocks by account level

LevelNew items to buy
2Hickory, Blue Streak, Nerd Glasses
3Top Hat, Lumberjack
4Cleats, Night Stick
5Candy Cane
6Cowboy Hat
7Monocle, Gold Glove
8Clown Shoes, Thunder
10Old Faithful

Fit defaults on every item: offset (0, 0, 0), rotation (0, 0, 0), scale 1, referenceSize 0.3 m. See Fit Mode.

In the code

FileWhat it does
Assets/_Project/Scripts/Data/DefaultContent.csCosmetic(id, name, slot, style, description, unlocked, cost, primary, secondary); RequireLevel(...)
Assets/_Project/Scripts/Data/CosmeticDefinition.csCosmeticSlot, CosmeticStyle, unlock and fit fields
Assets/_Project/Scripts/Progression/MetaProgression.csIsUnlocked, CanBuy, TryBuy, Equip, Unequip, Equipped
Assets/_Project/Scripts/Batting/CosmeticBuilder.csBuilds the code shapes per CosmeticStyle
Assets/_Project/Resources/BatModelLibrary.assetBat prefabs for bat_03 … bat_13 and the four Bat upgrades

Gotchas

  • Ids are prefixed by slot (hat_, glasses_, shoes_, bat_) because unlock ids share one namespace with batters and upgrades in SaveData.unlockedIds.
  • Bat numbers skip (03, 04, 07, 08, 09, 11, 12, 13): they match model files in the bat library.
  • An equipped id that no longer exists in the content, or is locked again (the dev menu’s lock-all), simply stops showing.
  • The README lists “High end / rare cosmetics” as not started.