• v0.3.0 cd38b55eb1

    v0.3.0 Stable

    joe released this 2026-08-15 20:11:31 +01:00 | 67 commits to main since this release

    Added

    • A main menu — Play, Settings, Quit — and a settings menu behind it: calibration,
      audio, video, bindings and an input test.
    • Audio and video settings screens. Latency offset, volumes and the effects bypass;
      fullscreen, V-Sync and the frame limit. Fullscreen and the frame limit apply immediately;
      V-Sync says on the row that it needs a restart rather than appearing to do nothing.
    • A bindings screen listing every action and what is bound to it. Read-only for now —
      editing it needs a mode, not a rewrite, since capture already exists.
    • The input test now returns to settings after 10 seconds with nothing pressed, and says so
      on screen. It consumes every input while open, so a player diagnosing a broken Back
      binding could otherwise have had no way out.

    Fixed

    • Opening a screen immediately acted on the keypress that opened it — choosing Settings
      landed straight in Calibration. raylib refreshes input at the end of a frame, and
      switching screens skipped the draw, so the same press was still down when the new screen
      read it. Every transition now absorbs the input that caused it.

    • Leaving a song shared a button with the drum. The arcade layout puts every face
      button on the drum while Back conventionally sits on one of them, so hitting the drum
      could quit the song. Leaving a song is now its own action, defaulting to Start/Select on
      a pad, and conflicting bindings are reported at startup.

    • Controllers were not detected. The game listened to gamepad index 0, which is rarely
      the controller: an 8BitDo Ultimate 2C presents its keyboard interface at index 0 and the
      actual joystick at index 1, and the indices shift as devices come and go. input.gamepad
      now defaults to "all" and listens to every device, so a controller works with no
      configuration. "none", an index, or part of a device name still pin it.

    • Configs written by 0.2.0 still load: the old input.gamepad_index is accepted, ignored,
      and reported once, rather than being rejected and silently taking the player's calibration
      with it.

    Changed

    • Bindings are now actions, and every control is bindable. Previously drum hits came
      from config while menu keys were hardcoded in Rust, and "back" during a song was a
      keyboard-only check in the main loop — so there was no way to leave a song on a gamepad,
      and nothing a settings menu could have enumerated. Now [input.bindings] maps ten actions
      to any number of inputs: keys, pad buttons (pad:NAME, or pad2:NAME for one device),
      and pad axes (axis:LEFT_Y+), with back bound on both keyboard and pad everywhere.
    • Drum actions carry a side (don_left / don_right), which nothing uses yet but big notes
      needing both hands eventually will.
    • Configs from earlier versions are migrated, not discarded: custom don/ka keys move
      into the new bindings and the change is reported.

    Added

    • --save-config writes the config with every binding spelled out.
    • --test-input, which lists the devices being listened to and names every key and button as
      it arrives. Written because "my controller does nothing" is almost always the wrong device
      being polled, and that is invisible without it.
    Downloads