The keys and gamepad buttons, and the arcade (coin-op) mode. New to OpenSWOS? Start with INSTALL.md.
| Action | Keyboard | Gamepad (any pad) |
|---|---|---|
| Navigate | Arrow keys | D-pad / left stick |
| Select | Right Ctrl / Space / Left Ctrl / Enter | A or B button |
| Quit | Esc (only at the top-level main menu) or window close (✕) | — |
| Action | Keyboard | Gamepad 1 |
|---|---|---|
| Move | Arrow keys | D-pad / left stick |
| Kick / shoot / pass / tackle | Right Ctrl / Space / Left Ctrl / Enter | A or B |
| Pause / unpause | P |
+ / Start (tap) |
| Statistics | S |
− / Back |
| Instant replay | R |
Y |
| Replay after the match | H |
X |
| Substitutions | Triple-tap left or right, ball out of play | the same (L / R do nothing yet) |
| Quit the match | Esc |
Hold + / Start or hold the right-stick click (0.7 s) |
Play itself only ever uses two pad buttons — A and B for fire, B doubling as skip — so the rest are free, and everything the match understands beyond fire and direction is a KEY. The pad bindings above inject those keys, which is what makes them reachable on a console (no keyboard) and without reaching for one on a desktop. Quit is a HOLD deliberately: it ends the match, and a 0.7 s hold is not something you do by accident -- not even with a handheld's grip on the right stick (the5ar, for the Retroid, which has no keyboard). Start pauses on its RELEASE, and only when the hold did not fire. HOME / Guide is left alone — it belongs to the system on a Switch.
Older versions of this table listed
QandWfor the substitution menus. That was wrong: through the keycode LUTQlands on a value the match does not handle andWon its explicit no-op. The real keys are UP and DOWN, and arrow keys are deliberately kept out of the key FIFO so they stay movement — so before the pad bindings there was no key route to the substitution menus at all, only the triple-tap.
Player 2 is gamepad-only (the keyboard stays single-player so the arrow keys don't get hijacked when a P2 pad is plugged in but unused).
| Action | Gamepad 2 |
|---|---|
| Move | D-pad / left stick |
| Kick / etc. | A or B |
Two pads connected at startup map to P1 / P2 in enumeration order. Pads can be hot-plugged; new pads fill the lowest empty slot.
More pads than players? Every connected controller is opened (up to
eight), but only two are played. To choose yours, press fire on it during
the intro: it becomes P1 (and the press skips the intro, as usual). If it
was P2's pad the two swap; otherwise the old P1 pad is left unused. A pad
that isn't played takes over when a played one is unplugged. SWOS.log
says which is which.
| Key | Action |
|---|---|
| Alt + Enter | Toggle fullscreen / windowed (uses the launch --fullscreen flavour) |
+ / - |
Increase / decrease windowed scale (1× → 2× → 3× → 4×). Ignored while fullscreen. |
| F9 / F11 / F12 / PrintScreen | Save screenshot to bin/swos_shotNNN.png |
SDL only drives gamepads it has a mapping for. If your pad isn't in SDL's
built-in DB (Xbox, PS4/5, Switch Pro, most Logitechs are covered), download
gamecontrollerdb.txt
and drop it next to the binary — it'll be picked up at startup.
SWOS.log lists every detected joystick and whether SDL has a mapping for
it.
A coin-op presentation layer over the same match engine: no front-end, no career, no save/load UI. The cabinet boots into an attract loop, takes credits, plays short first-goal-wins matches, and has an operator service menu in the style of a Midway/NBA Hangtime cabinet. It's a PC-only extra — the Amiga game is the definitive product, and with arcade mode off nothing here is reachable.
Turn it on in SWOS.ini (there is no command-line flag, so a stray argument
can't knock a cabinet out of coin-op):
[arcade]
enabled=trueDefault rules: 45-second matches, first goal wins (golden goal), a draw goes straight to sudden-death penalties, winner stays on. A challenger inserts a credit to take the seat. Match length is counted in game frames, not wall-clock, so it stays deterministic.
Cabinet keys (MAME layout, all rebindable via key_* in [arcade]):
| Key | Function |
|---|---|
5 / 6 |
Insert coin — player 1 / player 2 |
1 / 2 |
Start — player 1 / player 2 |
F2 |
Service (operator) menu |
The F2 service menu edits the game rules live — mode, game_seconds,
golden goal, penalties-on-draw, goal replay — and writes them back to
SWOS.ini, so an operator never has to hand-edit the file.
docs/ARCADE.md is the full spec: attract-reel structure, the service-menu
visual style and font, arcade-exclusive pitch art, high-score/name entry,
the CONTINUE? countdown, and the real-cabinet hardware target.