Skip to main content

Games

Lumia ships six chat-driven games. Each has its own state machine and is exposed through a default chatbot command. Where possible, the underlying state is shared with the variable functions so you can build custom flows on top.

Roulette

!roulette <amount> - bet a loyalty-point amount. ~50% chance to double it; ~50% chance to lose it.

systemOptions fieldPurpose
minBet / maxBetRange gate for the bet
winMessage / loseMessageReply templates
hideWinMessageWhen true, skips the chat reply (assumes you'll surface via an alert)
invalidInputReply for malformed bets

The win/lose result lands in roulette_result for the chatbot reply template.

Duel

!duel <user> <amount> - challenge another viewer.

Lifecycle:

  1. Challenger runs !duel @target 100. A pending duel is recorded keyed by the target's username.
  2. Target runs !accept (or the SE-equivalent !duel yes). Lumia rolls; one of them wins; points transfer.
  3. If target ignores: the duel times out after systemOptions.duration seconds.
  4. Target can !deny (or !duel no) to cancel.
  5. Broadcaster/mod can !cancelduel to wipe all pending duels.
systemOptions fieldPurpose
minBet / maxBetBet range
durationPending-duel timeout, seconds
winMessageReply on successful duel
startDuelMessageReply when a challenge opens
invalidInputReply for malformed challenges

Both !accept, !deny, and !cancelduel are exposed as variable functions ({{accept_duel}}, {{deny_duel}}, {{cancel_duel}}) so they work cross-platform - the duel is routed to whichever platform the responding user typed from.

Slots

!slots <amount> - bet, spin N icon columns, win if all match.

systemOptions fieldPurpose
minBet / maxBetBet range
iconColumnsHow many icons spin (default 3)
jackpotMessageReply on all-match
winMessage / loseMessageOther outcomes
hideWinMessageSkip the chat reply

Result lands in slots_result for the chatbot reply template.

Bet

!bet open A B… - start a parimutuel bet with named outcomes (no point cost to open). Viewers wager on outcomes; broadcaster/mod resolves a winner; pool is paid out to winners proportional to stake.

Lifecycle:

PhaseCommandEffect
Open!bet open A BStakes accepted.
Wager!bet 100 ASubtracts 100 loyalty points from caller, books a bet on A.
Close!bet closeStops accepting new wagers.
Resolve!bet resolve APays out the total pool to A's bettors, proportional to stake.

A single active bet is tracked per Lumia instance. The session resets after bet resolve (or you can wipe it with another bet open).

If no one bet on the winning outcome, the pool is forfeited (no refund). This matches SE's behaviour and discourages skewing the pool by waiting until close.

Bingo

!bingo start <max> - broadcaster opens a number-guess game in range 1-max. Viewers type !bingo <N>. First correct guess wins (the prize is whatever you announce in chat - Bingo doesn't auto-payout points).

CommandEffect
!bingo start 100Picks a random target 1-100
!bingo start 50 200Range 50-200
!bingo 75Guess. Reply is higher, lower, or wins!

A single active game is tracked per Lumia instance. Game ends when someone wins.

Votekick

!votekick <user> opens a vote; !votekick yes/no casts a vote. If the threshold of yes-votes lands within the voting window, the target gets timed out on the caller's platform.

Defaults:

  • Threshold: 5 yes-votes
  • Voting window: 90 seconds
  • Timeout duration on success: 600 seconds (10 min)

Only one active vote-kick per Lumia instance. Subsequent !votekick <user> while a vote is in progress is ignored.

The command is a single dispatcher - same template for opening and voting:

{{votekick={{message}}}}

The variable function inspects the message: if it's "yes"/"no", it counts a vote; otherwise it treats the message as a target username and opens a new vote.

Building custom games

The pattern shared by all six:

  1. Add a chatbot command (either as a default or a user command).
  2. Hook up the underlying game state.
  3. Expose a variable function ({{my_game_action=…}}) so the chatbot response can fire the action.
  4. Have the variable function update game state and return a chat-friendly result string.

The state-machine games (Bet, Bingo, Votekick) keep their state in memory and reset on Lumia restart. The point-betting games (Roulette, Duel, Slots) interact with loyalty points on every round.