Frequently asked questions
Everything that doesn't fit neatly into a command reference, including how to run Shockwave for games that aren't League of Legends.
General
What does Shockwave actually do?
It looks at who's sitting in a voice channel, splits them into two teams (random, drafted, or balanced by elo, a skill rating like a chess rating: it rises when you win and falls when you lose), optionally hands out lane roles, moves everyone into their team's voice channel with a Start button, and tracks the result, including an optional betting economy and a ranked elo ladder. Everything runs through Discord slash commands and buttons. Nobody has to leave the app.
Are Shockwave's images AI generated?
No, every image Shockwave posts (trading cards, team cards, tournament brackets, matchup graphics) is made programmatically with Pillow, a Python image-creation library. Layouts, colors, and text are drawn by code, not generated by an AI model.
Do I need to be a server admin to use it?
No, for most commands. Anyone in the voice channel can build teams, start a game, wager, or
check /stats. Adding the bot to a server requires the
Manage Server permission (that's a Discord requirement
for any bot invite, not something Shockwave adds), and one command,
/set correct-winner, which fixes a misreported result, is
restricted to members with Manage Server so it can't
be abused to rewrite outcomes after the fact.
Is the gold economy real money?
No, it's an entirely in-server, made-up currency with no cash value or exchange. Everyone
gets 1000 free gold once a day with /daily, and it exists purely to
add stakes to /wagering on games.
Does my elo or balance carry over between servers?
No, every stat Shockwave tracks (elo, gold balance, win/loss record, betting history) is scoped per-server. Playing ranked games in one Discord server has no effect on your numbers in another.
What happens if the bot restarts mid-game?
Team rosters, betting state, and the original voice channel are all persisted to disk as they happen, not held only in memory, so a restart doesn't wipe an in-progress game. The one exception is an open betting countdown's exact timer, which restarts fresh (betting just stays open until the game is reported or cancelled instead of auto-closing). If that matters, the Cancel Game button on the report message cleanly ends the round and refunds any bets placed so far.
Can teams be uneven, or bigger/smaller than 5v5?
Yes. /set team-size tells a captain draft (/make-teams draft) when each side is full, so extra people in the voice channel stay spectators instead of getting drafted.
/make-teams random ignores it and just splits whoever's in the voice channel down the middle. Odd
numbers land one extra player on a side. Lane roles (use_roles on
/make-teams random, reassignable afterward with the roster's Random
Roles or Balanced Roles button) are the one feature that specifically needs exactly 5-a-side,
since there are five named lanes to hand out.
Using Shockwave for games other than League
Almost everything about Shockwave is game-agnostic: team formation, moving voice channels, betting, and ranked elo don't know or care what you're actually playing. A server can track any number of games side by side, each with its own elo and stats. There's exactly one League-specific feature, and it's opt-in.
How does Shockwave know which game we're playing?
/set game sets it. Give it a name already in the autocomplete list,
or type a brand new one to start tracking it. "League" is the default for a server that's never
run it. Elo, game record, and ranked record are all tracked separately per game, so switching
never touches another game's numbers, only whichever one is currently active. The same goes for
/team stats's persistent tournament win/loss record. Gold balance and
betting record stay one shared pool across every game, same as always.
What's actually League-specific?
Only lane roles: Top / Jungle / Mid / Bottom / Support, assigned by
use_roles on /make-teams random or
reassigned with the roster's own Random Roles or Balanced Roles button. Those only work while
League is the active game (via /set game). Every other game skips them
entirely, with a note explaining why if you ask for them anyway. Everything else (random or
drafted team splits, moving voice channels, the betting economy, ranked elo and team balancing) has
nothing to do with League and works identically for any team-based game played by a
voice-channel-sized group.
How do I set it up for another game?
Run /set game with the game's name, then /set
channels with team1/team2 once. From there it's /make-teams
random or /make-teams draft, with
ranked:true if you want elo tracked. Every roster's own confirmation
message names the active game and reminds you how to switch it, so it's always visible which
game's numbers a game you're about to start will count toward. This works for Valorant 5-stacks,
Rocket League 3v3s, a chess club splitting into two draft brackets, or any other group that needs
to be divided into sides and moved somewhere.
Can I get lane-style roles for a different game?
Not out of the box. The five roles are hardcoded to League's lanes. If your game has its own fixed positions (an FPS's entry/support/anchor, for example) and you're comfortable editing Python, the role list lives in a small, self-contained spot in the codebase. Swapping the five names is the whole change. See the self-hosting guide if you're running your own instance and want to make that kind of tweak.
Does ranked elo make sense for a non-League game?
Yes, the elo system is a standard win/loss rating (the same math chess ratings use), not
anything League-flavored. ranked:true on
/make-teams random or /make-teams draft
balances teams by the active game's current elo and adjusts it after a reported result, regardless
of what game you're actually playing. /stats and
/leaderboard always show whichever game is currently active.
Just for fun
Why is it called "Shockwave"?
It's a League of Legends reference: Orianna's ultimate, Command: Shockwave, pulls everyone caught in it together into one place. That's more or less exactly what the bot does to a voice channel full of people: gather everyone up and move them where they need to be. The name stuck as the project's namesake.
Report a bug
Found something broken? Open an issue on GitHub.