- project.godot: joypad events on the ten existing actions (left stick move,
A jump, right trigger/RB fire, X reload, B/LB grenade, Start pause, Back
fullscreen), four new look_* actions on the right stick (deadzone 0.2) and
ui_accept/ui_cancel redefined with the pad buttons A/B while keeping
Enter/KP Enter/Space/Esc: the 4.7.1 engine maps no pad button on those.
- scripts/player.gd: gamepad_mode turns on by itself on the first pad input;
_can_aim() replaces the "mouse captured" gate of shoot and grenade (the pad
never captures the pointer, same trap already fixed for touch);
_handle_gamepad_look() converts the right stick into equivalent relative
mouse pixels (900 px/s at full deflection, m^1.8 response) and still goes
through apply_look(); restart accepts A/X and the death text follows the
device in use.
- scripts/start_screen.gd: pad hint shown only when a controller is connected,
refreshed on Input.joy_connection_changed.
- tools/test_gamepad.gd: 33 checks on map structure, keyboard preservation,
real event pipeline, gamepad_mode and analog look.
- docs/GAMEPAD.md: mapping, code map, verification, known limit (kiosk name
entry still needs a keyboard: on-screen keyboard is the next step).
Verified: test_gamepad 33/33, test_fullscreen_shortcut 8/8, test_touch_controls
14/14 (--touch), test_grenade 24/24, test_boss 50/50, test_rebalance_branding
14/14, test_player_profile 30/30. test_start_screen keeps its 2 pre-existing
headless failures (identical on HEAD).
New remappable action `toggle_fullscreen` (Alt+F) handled in main.gd::_input(),
so it works in the menu, during a match with the pointer captured and in the boss
sandbox; the event is marked handled so the key does not reach the rest of the game.
toggle_fullscreen() switches between WINDOW_MODE_FULLSCREEN and WINDOW_MODE_WINDOWED;
the state lives in main.fullscreen (initialised from the real window mode) instead of
querying the driver on every press, so the toggle is deterministic and testable. On
Web it is a no-op because fullscreen belongs to the page.
Desktop HUD hint updated. New tools/test_fullscreen_shortcut.gd: 8 checks (action and
key mapping, alternation, bare F inert, works mid-match without freeing the cursor).
Verified on a real display: window_get_mode 0 -> 3 -> 0.
- assets/audio/music/zombie_industrial_loop.ogg: 57.60 s Ogg Vorbis loop
generated locally with YuE2-3B on the Tesla V100 (score written for this
track; vocals removed with HTDemucs). The loop is spliced at the track's
structural repeat with a 0.6 s crossfade: measured seam dip <= 1.6 dB.
- scripts/main.gd: "Music" AudioStreamPlayer at -11 dB, started at boot on
desktop and on the start click on Web (browser autoplay policy). It forces
stream.loop at runtime because the Web staging step re-imports the OGG with
loop=false.
- tools/test_music.gd: soundtrack test (loop, length, volume, playback,
still playing after player death).
- docs/MUSIC.md: source, loop construction, verification, licence.
- docs/WEB-DEPLOY.md: release ab6054111f5919a8 notes.
Initial commit of the project.