feat(economy): add /lootbox mystery box (coin sink with random reward)
A pay-to-open box (1000 coins) with a weighted reward: coin tiers (usually a net loss - the sink), a random 30-min earn/exp buff, or a rare jackpot. All rolling lives in do_open_lootbox for testability; the command adds a short reveal. - New core module lootbox.py; extracted consumables.grant_buff (reused by both consumables and lootbox) to avoid duplicating the buff-stacking logic. - New lootboxes_opened stat; pending schema syncs as a number automatically. - Added /consumables, /lootbox, /vanity to the help embed (the first two were previously missing from /help). Tests cover charging, insufficient/banned, the coin and buff outcomes, the net-vs-reward invariant, and that balance never goes negative. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013VbAVsrZuYesea99mPMmPT
This commit is contained in:
@@ -18,6 +18,7 @@ __all__ = [
|
||||
'CONSUMABLES_UI',
|
||||
'CONSUMABLE_DESCRIPTIONS',
|
||||
'VANITY_UI',
|
||||
'LOOTBOX_UI',
|
||||
'JAILED_UI',
|
||||
'SHOP_BTN',
|
||||
'DAILY_UI',
|
||||
@@ -257,6 +258,23 @@ VANITY_UI: dict[str, str] = {
|
||||
"unequipped": "Märk eemaldatud - su profiil on jälle tavaline.",
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Lootbox (pay-to-open mystery box, a coin sink with a random reward)
|
||||
# ---------------------------------------------------------------------------
|
||||
LOOTBOX_UI: dict[str, str] = {
|
||||
"title": "🎁 Õnnekast",
|
||||
"opening": "🎁 Avan õnnekasti...",
|
||||
"coins_small": "🪙 Leidsid põhjast paar münti: **+{coins}**",
|
||||
"coins_medium": "💰 Korralik saak: **+{coins}**",
|
||||
"coins_big": "💎 Suur õnn: **+{coins}**",
|
||||
"jackpot": "🎉 **JACKPOT!** **+{coins}**",
|
||||
"buff_earn": "⚡ Boonus: teenimine **×2** järgmiseks **{min} minutiks**!",
|
||||
"buff_exp": "✨ Boonus: EXP **×2** järgmiseks **{min} minutiks**!",
|
||||
"foot_win": "Netovõit: +{net} · Saldo: {balance}",
|
||||
"foot_loss": "Netokahjum: {net} · Saldo: {balance}",
|
||||
"foot_buff": "Saldo: {balance}",
|
||||
}
|
||||
|
||||
JAILED_UI: dict[str, str] = {
|
||||
"title": "🔒 Praegu vanglas",
|
||||
"empty": "Kõik on vabad! Vanglas pole kedagi.",
|
||||
|
||||
Reference in New Issue
Block a user