Mystery cards
After an official match, the prize roll can drop a sealed mystery card instead of coins, XP, or a known cosmetic. Authority owns every roll.
Knobs: shared/mysteryCards.ts.
Drop
| Knob | Value |
|---|---|
| Drop chance | 12% when the equipment bag has a free cell |
| Pity | Sealed card after 10 consecutive match rewards without one (bag still needs a free cell) |
| One card per source match | Unique on (player_id, source_match_id) |
| Bag occupancy | owned cosmetics + unopened cards |
Replay of the same match claim returns the same card.
Rarity is picked first among tiers that still have an unowned item (empty tiers drop out, weights renormalize). Inside a tier the item is uniform.
| Rarity | Weight |
|---|---|
| Common | 50% |
| Uncommon | 25% |
| Rare | 15% |
| Epic | 8% |
| Legendary | 2% |
The pool is paid and drop-only cosmetics the player does not own. Free starters are out.
Resolve (once)
| Method | What happens |
|---|---|
| Stripe | $1 Checkout locked to that card id |
| Gift code | One-use DOOR-XXXX-XXXX-XXXX (admin-minted today) |
| Monthly freebie | One per UTC calendar month |
| Sell | 100 coins; card marked sold; slot frees |
There is no re-open. Rate limit: 20 mystery-card HTTP actions / 60s / player.
Admins can grant an unopened card (give … mystery_card) or mint codes (mystery_code). A player-facing gift-code store and a revealed/sold history UI are not shipped yet.
Where it shows
Unopened cards take a bag cell on the Rankings / equipment UI. Match-over can show a sealed face. /me lists unopened cards only.