2026-05-05
Market economy hardening — case pricing, house edge, jackpot, multi-open animation & Discord DMs
▶
// BALANCE — case & capsule repricing
- All 23 cases repriced to 70% EV — every case cost was calculated against real market_prices DB values using actual drop rates (79.9% blue → 0.26% gold) and condition weights; the house edge is now a consistent 30% across every container. Previous prices ranged from 0.98× to 5.67× EV (pure profit for players)
- All 19 Katowice / Cologne 2014 capsules repriced — same 75% EV target applied to sticker capsules using real sticker market prices; Titan Kat14 repriced from 45k → 5.6M pts
- Buy key button added — keys can now be purchased directly from the Cases page wallet bar; the + key label was removed from crate price cards since keys are a separate purchase
// BALANCE — Mines house edge
- Mines multiplier reduced by 15% — all payouts now use HOUSE_EDGE = 0.85 applied to the mathematically fair odds; long-term play is always negative EV
- Bet limits tightened — minimum raised from 10 → 1,000 pts, maximum lowered from 50,000 → 5,000 pts; eliminates micro-grinding and limits single-session swings
// BALANCE — Economy
- 8% market sell tax — P2P trades now destroy 8% of the sale price; buyers pay full price, sellers receive 92%. Shown explicitly in the buy confirmation dialog so it is never perceived as a bug
- Prestige costs 25,000 pts — prestiging now has a real point cost deducted at confirmation; the /rank GE line notes the price
- /prestige two-step confirmation — /prestige shows cost and opens a 30-second window; /prestige y confirms and spends the points; the window expires automatically via a task callback
// NEW — Jackpot improvements
- Jackpot entry withdrawal — players can now remove their own items from an open pot before the spin using a red ✕ button on their entry row
- Per-entry pot display — the pot now shows each deposited skin (name, condition, value, win chance %) with an animated probability bar, instead of per-player summaries
// NEW — Multi-open strip animation
- ×3 / ×5 / ×10 now plays stacked roll strips — multi-open no longer shows a spinner card grid; all N cases are fetched in parallel then N independent reel strips animate simultaneously, each revealing its result after the 6-second roll — the same experience as single open, stacked vertically
- Each strip labeled #1…#N — small index label in the top-left corner of each strip for easy tracking
// NEW — Discord ticket DMs
- Bot DMs owner on every ticket event — color-coded embeds sent on ticket created (orange), replied (blue), closed (green) and deleted (red); works for both in-game and Hub tickets
- Source field in embed — each DM shows whether the ticket came from in-game or from the Hub
- Hub ticket notifications wired up — Hub ticket creation (POST /hub/api/tickets) previously had no notification path; now fires the same DM as in-game tickets via a shared notify.js module
// FIX
- DM inbox broken — clicking conversations or starting a new DM did nothing; root cause was pollTimer referenced in clearTimeout() but never declared, throwing a ReferenceError that silently killed openThread() on load
- Footer attribution — all three sites now credit built by yako · @moriamvr (Discord handle) in the page footer
- perf.js / favicon / og-image returned 401 — these assets were being caught by the auth middleware before the static file handler; fixed with explicit pre-auth app.get() routes