Controls
The Controls page decides which device each of the four players uses, and lets you rebind every button and stick direction on it. Changes apply immediately and are remembered between sessions.
This feature is ported from CTR Native Expanded
by thecodingbob (PR 54 and PR 70, GPL-3.0). This page is adapted from its
docs/features/CONTROLS.md.
Opening the screen
Options → Controls. The page lists Player 1 to Player 4 with the device each
one has, and below them AP Shortcuts (see AP shortcuts).
Press Cross on a player to open that player's screen. Its title reads
CONTROLS P1 through CONTROLS P4, so you always know whose controls you are
looking at. Triangle or Start goes back to the player list, and from there
back to Options.
Choosing a device for each player
By default, every player is on Automatic: player 1 takes the first gamepad plugged in, players 2 to 4 follow in order, and the keyboard is the last fallback. You do not need to touch this for most setups: plug a controller in and whoever was waiting for one gets it. Assignment is re-sorted whenever a controller is plugged in or unplugged, including in the middle of a race.
To take control of the assignment yourself, open DEVICE with Cross. A SELECT DEVICE popup lists:
- every device no other player is using
- Automatic: resolve against whatever is free
- Disabled: players 2 to 4 only
A controller already assigned to another player is not offered in your list.
Player 1 can never be disabled. If player 1's controller disappears mid-session, the keyboard moves to player 1 and the player who had it drops back to Automatic.
Rebinding a control
Press Cross on any binding row to start listening. That row turns red and shows
..., and the control stops working while you decide.
- Let go of everything on that device first. The game waits for it to go idle, so the press that opened the row is never taken as the new binding.
- Press the key or button you want instead. The proposed binding appears in red.
- Let go of it, then press
Crossto confirm. The prompt shows the Cross icon for this step.
Triangle or Start gives up on it: the previous binding comes back and you stay
on the screen. Doing nothing for a few seconds reverts the row as well. While a
row is listening, that device stops driving the menu, so a press meant for one
control cannot leak into another.
A rebind does not start while a text field (for example on the Connection page) is being edited.
The screen only listens to the device you are editing: rebinding on the keyboard ignores your gamepad, and the other way round. A confirmed change is saved straight away.
Bindings belong to the device, not to the player: rebinding L1 on a controller
changes it for whoever that controller is assigned to. Restore Defaults puts
every binding on that device back to the shipped layout: the keyboard's
C/V/Z/X face buttons, arrows, Enter and Space, or the standard gamepad
layout for a controller.
Two identical controllers share one layout, because the game identifies them the same way. Restoring defaults on one of them restores both.
Two game controls may share a key. If a press then does two things at once, that is the cause. Reassign one of them. A game control and an AP shortcut never share a key: see AP shortcuts.
Stick deadzone
An analog stick that rests off centre steers on its own, and
DEADZONE is the answer to that: Left/Right change it in steps of 5
percent.
The figure is how much of the stick's travel to ignore around centre, from 0 to 90. 0 is the console's own behaviour and trims nothing, so leave it there unless your stick actually drifts.
Like the bindings, the figure belongs to the device rather than the player, so
it is shared by two identical controllers, and Restore Defaults puts it back to 0.
The keyboard has no axes, so the row is not shown for it. The figure is saved when
you leave the player's screen.
Steering
STEERING chooses how the left stick steers: Left, Right or Cross switch
between the two.
- Original (default) hands the game the stick as the console did. The game's own curve ignores the first third of the travel, gives 73% of full lock just short of the edge and full lock only at the very edge. A round modern stick leaves that edge as soon as it is a few degrees off horizontal, so a stick pushed hard but slightly up or down steers far less than the D-pad (about 70% at 25 degrees, 25% at the diagonal).
- Modern reshapes the stick for that curve: nothing inside the first 10% of
the travel, then steering in proportion to the stick, and full lock from about
two-thirds of the travel, which a fully pushed stick keeps up to about 45
degrees off horizontal. The game's curve has no value between 73% and full lock,
so that last step stays a jump. Only the horizontal axis changes, and the
physics are the game's own (
NativeInput_ModernSteerByteinplatform/native_input.c).
Modern also makes a smaller push count as Left or Right in the menus that read the stick, since a quarter of the travel already reaches the threshold.
Like the deadzone, the mode belongs to the device, is saved when you leave the
player's screen, and goes back to Original with Restore Defaults. To check it,
tools/controls/test_native_controls.c runs both modes through a copy of the
game's curve.
Editing someone else's controls
L1 and R1 on player 1's device switch between players, and the cursor jumps
back to the top of the list.
Everything else on the screen answers to player 1's device or the selected player's own, so the second player can rebind their own pad without player 1 handing it over. The player switch stays on player 1's shoulders on purpose.
A player set to Disabled has no device, so only player 1 can reach the screen for them, which is enough to give them a device back.
AP shortcuts
The Archipelago build has a few keyboard shortcuts of its own. AP Shortcuts,
under the players on the Controls page, lists them with their keys, and each one
is rebound like any keyboard control: Cross on the row, press the new key, let
go, then press the keyboard's Cross key (C by default) to confirm. The shortcuts
always read the keyboard, whichever player the keyboard is assigned to.
| Shortcut | Default key | What it does |
|---|---|---|
| Character Picker | Numpad 9 | Opens or closes the character picker in an adventure hub |
| Dev Progressive Mode | Numpad 0 | Testing: cycles the progressive stats test mode (no seed connected; the key works without dev_keys, only the row is hidden) |
| Dev Editable Mode | Numpad . | Testing: cycles the editable stats test mode (no seed connected; the key works without dev_keys, only the row is hidden) |
| Dev Trap Icy | Numpad 1 | Testing: fires an Icy trap |
| Dev Trap Low Gravity | Numpad 2 | Testing: fires a Low Gravity trap |
| Dev Trap No Brakes | Numpad 3 | Testing: fires a No Brakes trap |
| Dev Trap Boost | Numpad 4 | Testing: fires a Boost trap |
| Dev Trap 1st Person | Numpad 5 | Testing: fires a First Person trap |
| Dev Trap All | Numpad 6 | Testing: fires every trap |
| Dev Shortcutless | Numpad 7 | Testing: toggles Shortcutless |
| Dev Mark Quad | Numpad 8 | Testing: logs the track quad under the kart |
| Dev Demo Camera | Numpad + | Testing: toggles the demo camera |
The rows starting with Dev are hidden unless dev_keys=1 is set in
ap-config.txt, and the Dev Demo Camera row also needs debug_democam=1, the
same two settings its key needs to do anything. The two stats test mode keys still work without dev_keys; only their rows are hidden. Hidden rows keep their keys in
controls.ini, still count in the one-key rule below (a game control that takes
a hidden Dev key clears it, so it cannot fire next to that control once you turn
dev keys on), and come back with Restore Defaults. With the settings off the
cursor skips them, because they are not in the list.
One key never does two things. If you give a key to a game control and an AP
shortcut already has it, or the other way round, the newest binding wins and the
older one is cleared and shows as None. The same goes for two shortcuts. While
you confirm, the row shows the Cross icon with to replace instead of
to confirm, and the line under the list names the control that will lose the
key. Two game
controls may still share a key, as before.
The keyboard's Cross key cannot be given to a shortcut: it is how the keyboard confirms and picks menu rows, so the press is ignored and the row keeps listening. Move Cross first if you want that key for a shortcut.
Restore Defaults on the AP Shortcuts screen puts every shortcut and every keyboard game control back to the shipped keys, and Restore Defaults on the keyboard's player screen does the same. The two sets of defaults never overlap, so they are restored together. Restoring a controller's defaults leaves the shortcuts alone.
Shortcuts never fire while a text field (for example on the Connection page) is being edited, so typing a port on the number pad is safe, and never while a rebind is listening.
On a pad, the Connection page takes Cross or Start to save a text field and
Triangle to cancel it, read through that pad's own bindings.
M is not a shortcut today. It was the old map overlay toggle and is kept free
for a planned map zoom; nothing reads it in this version.
controls.ini
Your bindings and player assignment are kept in controls.ini, in the same
folder as config.ini (the folder the game is started from), and rewritten
after every change. A commented template ships as default_controls.ini: copy
it to controls.ini to start from it, or let the game write one for you. Values are readable names rather
than numbers, so the file can be edited by hand:
[Assignment]
player1 = auto
player2 = auto
[device keyboard]
name = Keyboard
cross = C
l2 = Left Ctrl
[device 03000000c0400000e11000011010000]
name = Xbox 360 Controller
cross = A
l2 = Left Trigger
deadzone = 15
steering = modern
[AP Shortcuts]
character_picker = Keypad 9
dev_trap_icy = none
Keyboard values are key names such as C, Space or Left Shift. Controller
values are button and axis names as your driver reports them, and none clears a
control. A key or value the loader does not recognize is skipped, leaving that
one control at its default rather than breaking the rest of the file.
[AP Shortcuts] holds the shortcut keys, one line per shortcut, with the same
key names as the keyboard section. A file without this section, such as one
written before the shortcuts were bindable, loads with every shortcut on its
default key. If a hand edit puts one key on both a keyboard game control and a
shortcut, the game control keeps it and the shortcut loads unbound.
auto lets a player resolve itself, disabled takes a player out, and any other
value pins that player to the named device for as long as it stays plugged in.
Controllers are matched by their hardware ID, so a pad keeps its layout across
replugs and USB ports.