Key EV and $bw Calculator Beta

Expected keys per hour for wishlist characters across different $bw values
Mode:
Paste your $bonus output✓
Run $bonus in Mudae, copy the reply, paste it here.
A few other details✓
How to find pool size
Standard ($wa/$ha/$wg/$hg)
$limroul
1. Run $left — note the total roulette size.
2. Run $dld or $dl — note how many are disabled.
3. Run $adl — note antidisabled count. For precision, run $imat <series> for each series and sum.
4. Enter: (total from $left) − (disabled) + (antidisabled)

$ma/$mg, $wx/$hx, $serverdisable may also affect pool size.

1. Run $limroul — note the value.
2. Find antidisabled for your roulette type:
$wa → $adltwg-   $ha → $adlthg-
$wg → $adltwg   $hg → $adlthg
3. The number in parentheses at the top is antidisabled size.
4. Enter: (limroul) + (antidisabled)
Your optimal $bw✓
How to use this calculator
1
Run $bonus in Discord and paste the bot reply into the left box.
2
Run $wlsz+z! in Discord and paste the bot reply into the right box.
3
Under Other inputs, fill in Base pool size (see the hint in that field), $setrolls bonus if applicable, and check Uses slash commands to roll if you roll with / commands. Then click Calculate.
Tip: Both copy methods work — select the message text and copy (Ctrl+C), or right-click the Discord message → Copy Text. It's fine if extra text gets included (timestamps, username, other lines) — the calculator only looks for the relevant lines and ignores everything else.
Paste $bonus output here:
Paste $wlsz+z! output here:
Values auto-populated from $bonus paste — edit to override
From $bonus✓
The +N value on the Rolls per hour line
Your current $bw investment
Rolls locked in $bk
"Spawn bonus for wishes" — combined total ($bw + $k + slash) at current $bw
Combined total, e.g. "(= 3779%)" from the starwish line
"Chance to get an additional key on wishes"
Base rolls from $setrolls (leave blank if unused)
Each level = 10% of perk 1 bonus applied to the character itself (0–10). Auto-inferred from wishlist.
Rolling with / commands gives a +10% spawn bonus to both wishes and starwishes
Total characters in the roulette pool
How to find this
Standard ($wa/$ha/$wg/$hg)
$limroul
1. Run $left — note the total roulette size.
2. Run $dld or $dl — note how many are disabled.
3. Run $adl — note antidisabled count. For precision, run $imat <series> for each series and sum.
4. Enter: (total from $left) − (disabled) + (antidisabled)

$ma/$mg, $wx/$hx, $serverdisable may also affect pool size.

1. Run $limroul — note the value.
2. Find antidisabled for your roulette type:
$wa → $adltwg-   $ha → $adlthg-
$wg → $adltwg   $hg → $adlthg
3. The number in parentheses at the top is antidisabled size.
4. Enter: (limroul) + (antidisabled)
Advanced inputs
Your $persrare value (not $setrare). Leave blank or 1 if you've never changed it. Valid range 1–10.
Claimed characters that are not on your wishlist. Enter an absolute count, or switch to Ratio % to enter the claimed fraction of the base pool. Only needed if your $persrare is above 1, leave blank otherwise.Claimed characters that are not on your wishlist. Enter an absolute count, or switch to Ratio % to enter the claimed fraction of the base pool. Only needed if your $persrare is above 1, leave blank otherwise.
How to find this
If playing alone, run $mmx-w-i and use the count it shows. With others, run $mmx-w-io! @user for each person (don't forget o!) and add up the totals.
How it works
1 Net rolls per hour rolls available for wishes

Every roll in $bw or $bk is one fewer roll on actual characters. Net rolls = your base rolls minus whatever is locked in $bw and $bk.

net_rolls(bw) = base_rolls + setrolls − bw − bk
2 Spawn bonus at each $bw variable + static sources

The bonus shown in $bonus combines several sources. The calculator strips out the $bw portion and keeps the rest ($k, slash, $kt/$tuto) as a fixed offset, then recomputes the full bonus at every hypothetical $bw. Slash commands add a flat +10% to both wish and starwish.

Wish bonus from $bw (%) rolls 1–5: +20% each
rolls 6–15: +15% each
rolls 16–100: +10% each
rolls 101–200: +5% each
rolls 201+: +1% each

Extra starwish bonus from $bw (%) rolls 1–100: +10% each
rolls 101–200: +5% each
rolls 201+: +1% each

Total at each bw wish_bonus = wishBwBonus(bw) + kBonus + slashBonus
sw_bonus = wish_bonus + starwishBwBonus(bw) + ktBonusSW
3 Spawn chance a two-stage split your character vs the whole pool

A character's weight is determined by the bonuses it gets — the global wish/starwish spawn bonus from $bw, $k, and slash commands, plus any perk 1 bonus from adjacent wishlist neighbours (shop upgrade 1 feeds a portion back to the character itself).

Character weight wish: 1 + (wish_bonus(bw) + perk1) / 100
starwish: 1 + (sw_bonus(bw) + perk1) / 100

Stage 1 — wish mass (the crowding exponent) x = (WWt + SWt) / base_pool ← total wish weight ÷ pool
wishMass = 1 − (base_pool / (base_pool + WWt + SWt))1 + k_steal·x

Stage 2 — starwish congestion, then your share swMass = wishMass × (1 + k_sw·x) × (SWt/WWt) / (1 + (1 + k_sw·x) × (SWt/WWt))
p = classMass × char_wt / classWt × (1 − pity) ← × persrare factor, step 6

The spawn rate of a character can be approximated by the character's weight / total pool weight. A character's weight is determined by the bonuses it gets — the global wish/starwish spawn bonus from $bw, $k, and slash commands, plus any perk 1 bonus from adjacent wishlist neighbours (shop upgrade 1 feeds a portion back to the character itself).

The total pool weight is determined by the base pool size (1 per character) with all wishlist character weights added.

Treat numbers as relative comparisons, not exact rates.

The model used by the calculator is still being validated.

Character weight wish: 1 + (wish_bonus(bw) + perk1) / 100
starwish: 1 + (sw_bonus(bw) + perk1) / 100

p = char_wt / (base_pool + char_wt + Σ other wish wts)
4 Keys per spawn three independent sources

Every spawn of an owned character gives 1 guaranteed key, plus two independent chances for extras: the global KT tower bonus (from $bonus), which can give one or two additional keys, and perk 4 per character, which can give one additional key on top. Because expected values are additive, the formula is simply the sum of the three independent probabilities.

Perk 4 levels: lv1=+4%, lv2=+8%, lv3=+12%, lv4=+16%, lv5=+20%, lv6=+25% (+30% fully upgraded).

keys = 1 ← guaranteed
       + kt_key% / 100 ← KT tower (global)
       + perk4% / 100 ← perk 4 (per-char)
5 EV keys per hour the final number

Multiply net rolls × spawn chance × expected keys per roll. The calculator shows this for every bw value from 0 to your max.

Three rows are highlighted: your current $bw, the bw that maximises EV for the selected character, and the bw that maximises total EV across your full wishlist.

EV keys/hr (one character) EV = net_rolls(bw)
   × p(char, bw)
   × keys(char)
6 persrare the pity, and rerolls that can't reach your wishes claimed characters get skipped

Each roll first faces a small up-front chance — the pity, 1/(50 × N) — of being replaced outright by a character claimed by someone else. It never yields a wish, never yields your own characters, and shrinks as you raise $persrare.

Otherwise the normal draw happens. If it lands on a claimed (non-wished) character, $persrare rerolls — up to N attempts total, stopping on an unclaimed or wish result — and the internal rerolls draw uniformly from the base pool, which contains no wishes at all. So a reroll can never hand you a wish: raising $persrare raises your wish chance only because the pity shrinks (~+1.5% going from N=1 to N=4, and less beyond).

persrare-adjusted spawn chance pity = 1 / (50 × N) ← up-front claimed-not-yours replacement

P'_wish/sw = p_wish/sw × (1 − pity)
reroll = uniform draw from the base pool ← carries no wish weighting

When $persrare is active, any roll that lands on a claimed (but non-wished) character is rerolled up to N times. Only the Nth attempt is a forced accept — if all N rolls hit claimed characters, you get a claimed character. Enter your $persrare setting (N) first in the Advanced inputs section, and the count of claimed non-wish characters (C) only if N is above 1.

This boosts effective spawn chance for wish and unclaimed characters. The boost is bw-dependent: at lower $bw the total pool weight is smaller, so the claimed fraction r = C / totalWt is larger and the reroll benefit is greater. This means the reroll system slightly favours lower $bw values — the optimal $bw may shift downward compared to the no-reroll case, by an amount that grows with C's share of the pool.

When C = 0 or N = 1, the formula reduces to the standard spawn probability.

Persrare mechanics are still being validated.

persrare-adjusted spawn chance r = C / totalWt(bw) ← claimed fraction

P'_wish = p_wish × (1 − rN) / (1 − r)
P'_unclaimed = p_uncl × (1 − rN) / (1 − r)
P'_claimed = rN
7 Hourly limits key cap and slash roll bonus cap

Two per-hour limits affect $bw optimisation:

Key cap (2,200/hr). You cannot earn more than 2,200 keys per hour. If your total wishlist EV exceeds 2,200, the excess is wasted. In that case, the calculator shows the lowest $bw that reaches the cap — any additional $bw beyond that point provides no extra keys and costs net rolls.

Slash command bonus cap (1,440/hr). Discord rate-limits slash commands to roughly 2 per 5 seconds (1,440/hr). The first 1,440 rolls each hour receive the +10% slash spawn bonus; any rolls beyond 1,440 still work but must use $-prefix commands, which don't get the bonus. The calculator models this split when "Uses slash commands to roll" is checked — overflow rolls use a lower spawn rate.

You can combine slash and $-commands to roll faster than 1,440/hr, but only the slash rolls get the +10% spawn bonus.

Key cap effective_keys(bw) = min(totalEV(bw), 2200)

Slash bonus split slashRolls = min(netRolls(bw), 1440)
overflowRolls = netRolls(bw) − slashRolls
ev(bw) = slashRolls·pslash·keys + overflowRolls·pno−slash·keys