feat(input): a Walk key for the keyboard, held or toggled, with its speed #2345
Open
mooki000 wants to merge 2 commits from
mooki000/walk-key into main
pull from: mooki000/walk-key
merge into: MagicBeanDev:main
MagicBeanDev:main
MagicBeanDev:github/pr/2893
MagicBeanDev:github/pr/2890
MagicBeanDev:github/pr/2887
MagicBeanDev:github/pr/2878
MagicBeanDev:github/pr/2875
MagicBeanDev:github/pr/2874
MagicBeanDev:github/pr/2873
MagicBeanDev:github/pr/2871
MagicBeanDev:github/pr/2756
MagicBeanDev:github/pr/2897
MagicBeanDev:github/pr/2896
MagicBeanDev:github/pr/2718
MagicBeanDev:github/pr/2842
MagicBeanDev:github/pr/2691
MagicBeanDev:github/pr/2895
MagicBeanDev:github/pr/2743
MagicBeanDev:github/pr/2765
MagicBeanDev:github/pr/2708
MagicBeanDev:github/pr/2732
MagicBeanDev:github/pr/2755
MagicBeanDev:github/pr/2817
MagicBeanDev:github/pr/2876
MagicBeanDev:release-please--branches--main
MagicBeanDev:release-please--branches--main--release-notes
MagicBeanDev:github/pr/2778
MagicBeanDev:github/pr/2888
MagicBeanDev:github/pr/2866
MagicBeanDev:github/pr/2877
MagicBeanDev:github/pr/2800
MagicBeanDev:github/pr/2829
MagicBeanDev:github/pr/2850
MagicBeanDev:github/pr/2889
MagicBeanDev:github/pr/2882
MagicBeanDev:github/pr/2860
MagicBeanDev:github/pr/2849
MagicBeanDev:github/pr/2886
MagicBeanDev:github/pr/2794
MagicBeanDev:github/pr/2840
MagicBeanDev:github/pr/2830
MagicBeanDev:github/pr/2834
MagicBeanDev:github/pr/2719
MagicBeanDev:github/pr/2742
MagicBeanDev:github/pr/2741
MagicBeanDev:github/pr/2820
MagicBeanDev:github/pr/2771
MagicBeanDev:github/pr/2859
MagicBeanDev:github/pr/2858
MagicBeanDev:github/pr/2823
MagicBeanDev:github/pr/2757
MagicBeanDev:github/pr/2769
MagicBeanDev:github/pr/2844
MagicBeanDev:github/pr/2843
MagicBeanDev:github/pr/2673
MagicBeanDev:github/pr/2855
MagicBeanDev:github/pr/2739
MagicBeanDev:github/pr/2807
MagicBeanDev:github/pr/2851
MagicBeanDev:github/pr/2789
MagicBeanDev:github/pr/2814
MagicBeanDev:github/pr/2818
MagicBeanDev:github/pr/2774
MagicBeanDev:github/pr/2772
MagicBeanDev:github/pr/2750
MagicBeanDev:github/pr/2786
MagicBeanDev:github/pr/2785
MagicBeanDev:github/pr/2782
MagicBeanDev:github/pr/2779
MagicBeanDev:github/pr/2775
MagicBeanDev:github/pr/2706
MagicBeanDev:github/pr/2766
MagicBeanDev:github/pr/2747
MagicBeanDev:github/pr/2759
MagicBeanDev:github/pr/2745
MagicBeanDev:github/pr/2740
MagicBeanDev:github/pr/2733
MagicBeanDev:github/pr/2725
MagicBeanDev:github/pr/2727
MagicBeanDev:github/pr/2728
MagicBeanDev:github/pr/2729
MagicBeanDev:github/pr/2721
MagicBeanDev:github/pr/2722
MagicBeanDev:github/pr/2715
MagicBeanDev:github/pr/2714
MagicBeanDev:github/pr/2707
MagicBeanDev:github/pr/2703
MagicBeanDev:github/pr/2705
MagicBeanDev:github/pr/2697
MagicBeanDev:github/pr/2679
MagicBeanDev:github/pr/2676
MagicBeanDev:github/pr/2669
MagicBeanDev:docs/what-hookshot-connects-to
MagicBeanDev:fix/hdr-encode-test
MagicBeanDev:fix/main-tests
MagicBeanDev:fix/play-cache-files
MagicBeanDev:perf/game-barrier-order
MagicBeanDev:feat/heap-lazy
MagicBeanDev:feat/texture-detail
MagicBeanDev:perf/astc-opaque-bc1
MagicBeanDev:fix/fs-dir-lock
MagicBeanDev:fix/framegen-native-kept
MagicBeanDev:fix/update-no-downgrade
MagicBeanDev:port/k10-gcn-f16-mirrors
MagicBeanDev:fix/framegen-mult-cap
MagicBeanDev:chore/release-as-2.1.1
MagicBeanDev:perf/pcache-load-switch
MagicBeanDev:fix/prepare-progress-log
MagicBeanDev:fix/update-closes-stale-game
MagicBeanDev:fix/hdr-scaled-sampled
MagicBeanDev:perf/first-start-preset
MagicBeanDev:perf/zero-upload
MagicBeanDev:fix/vcore-escape-2s
MagicBeanDev:test/fake-gh-atomic
MagicBeanDev:perf/batch-idle-flush
MagicBeanDev:test/finish-stub-a
MagicBeanDev:chore/record-2.1.0
MagicBeanDev:fix/main-red-tests
MagicBeanDev:fix/test-display-startup-driver-cache
MagicBeanDev:feat/mesh-shader-mode
MagicBeanDev:fix/menu-probes-at-startup
MagicBeanDev:fix/fps-counter-classic
MagicBeanDev:fix/test-log-batch-flake
MagicBeanDev:fix/narrow-screen-hud
MagicBeanDev:ci/prereleases
MagicBeanDev:release/v2.0.15
MagicBeanDev:hotfix/v2.0.15
MagicBeanDev:fix/present-ahead-replay
MagicBeanDev:release/v2.0.13
MagicBeanDev:fix/bracket-paths-2013
MagicBeanDev:fix/hdr-overlays-2013
MagicBeanDev:fix/fps-counter-scale-2013
MagicBeanDev:fix/stick-seen-at-rest
MagicBeanDev:hotfix/menu-fits-screen
MagicBeanDev:fix/f1-always-opens-menu
MagicBeanDev:fix/ini-keep-lines
MagicBeanDev:claude/cranky-pike-7cf247
MagicBeanDev:perf/texture-answer-flat
MagicBeanDev:fix/stamp-test-modules
MagicBeanDev:fix/appimage-fonts
MagicBeanDev:fix/display-awake
MagicBeanDev:release/v2.0.12
MagicBeanDev:fix/discord-windows
MagicBeanDev:rc/v2.0.12-tests
MagicBeanDev:fix/dlss-keep-feature
MagicBeanDev:rc/v2.0.12
MagicBeanDev:button-icons
No reviewers
Labels
Clear labels
accessibility
Barrier affecting people with disabilities
autorelease: pending
autorelease: tagged
bug
Something isn't working
dependencies
Pull requests that update a dependency file
documentation
Improvements or additions to documentation
duplicate
This issue or pull request already exists
enhancement
New feature or request
github_actions
Pull requests that update GitHub Actions code
good first issue
Good for newcomers
help wanted
Extra attention is needed
invalid
This doesn't seem right
question
Further information is requested
testing wanted
wontfix
This will not be worked on
No labels
accessibility
autorelease: pending
autorelease: tagged
bug
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
question
testing wanted
wontfix
Milestone
Clear milestone
No items
No milestone
Assignees
Clear assignees
No assignees
2 participants
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Hookshot!2345
Loading…
Reference in a new issue
No description provided.
Delete branch "mooki000/walk-key"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What this is for: keyboard players can walk. A Walk key (Caps Lock by default, held or toggled) makes the movement
keys tilt the stick part of the way, set by a new Walk speed row; today the keys only run. What is measured: on
Arch Linux with an RTX 4090 (NVIDIA 615.78.08), on
main49f75dc8, in headless runs in Kokiri Forest: how fast Linkmoves and whether he walks or runs at each share of the stick (1.03 m/s at 15%, 1.47 m/s at 45% to 50%, 4.50 m/s at
100%), which set the row's default (45%) and range (15% to 90%); the key path itself with keys held in the key table
by a test-only probe (Caps Lock with W or S: 1.47 m/s, without: 4.50 m/s), Hold and Toggle; the two menu rows and the
Controls page row in pictures; a new game-free test that fails on
main. Not measured: Windows game runtime, a real keyboard(the game ran headless), controllers (unchanged), first-person aiming while walking, places other than Kokiri Forest.
Closes #2344.
Problem
On the keyboard Link can only run: the movement keys push the stick all the way (
host/nn_hid.c,* 32767), so aplayer without a controller has no way to walk (narrow ledges, sneaking past guards, a slower pace on a path).
What changed
HOS_KEY_WALK; inikey_walk). Its defaultkey is Caps Lock, which no other control has and which sits beside A and Shift, so it can be held with WASD. It is
rebound, cleared and reset like Move forward, takes a second key, and can be a mouse button (while the mouse is
captured, as the other bindings).
walk_mode): Hold (the default: Link walks while the key is held) or Toggle (one presswalks, the next runs again). A press counts only while the keys are the game's: not while the Insert menu is open or
the window is behind another one, and a key still held when they come back counts after its release.
walk_speed): how far the movement keys tilt the stick while Link walks, 15% to 90% insteps of 5, default 45%. A diagonal is scaled by its length (W+A walks too). The numbers come from the measurement
below: 15% is Link's slowest walk (10% is no slower), 45% the lowest share at his walk's top speed, and from 55% he
speeds up into a jog; the rows above 55% are there for a player who wants a slower run.
(
HOS_INPUT_SCRIPT,HOS_INPUT_LIVE) keep their tilt, and so does running (the diagonal included).no key until one is bound (
hid: no Walk key: ...in the log).hid: walking: the movement keys tilt the left stick to 45% (0, 14745)(the first tilt at each share) andhid: walking on/off (Walk mode Toggle).gpu/vk/vk_api.h), answered invk_replay.cpp's option lambda; the host reads them live.Updated 2026-11-11 after review: the scripted survey checked all 134 open PRs, fetched the 13 heads that change
vk_api.h, and found neither ID in main nor those heads. The refreshed inventory now puts #2357's FOV 51 on main;#2530 uses 49 for Keyboard and #2261 uses 60 for Item wheel. Saved
walk_mode/walk_speedkeys are unchanged.docs/development.md.tests/test_walk_key.py(new) compilesread_input, the binding table and the walk helpers fromhost/nn_hid.cagainst fake keys, window, pad, mouse and options files. All original source-text wiring/docchecks are restored, updated to 52/53. The compiled fixture includes the actual header and statically checks both
allocations; its behavior checks exercise the host's reads using those constants.
tests/test_bound_keys.py(its prelude needsVK_CAPITAL) andtests/test_input_background.py(cuts the newhelpers
read_inputcalls) are updated. All four unrelated background wiring checks are restored verbatim;no check from main is removed. The merged
tests/test_option_ids.pykeeps all five negative cases and everyassertion, with its two Walk collision values and reservations updated from 49/50 to 52/53.
How it was tested
Checks.
Latest refresh, 2026-11-11: head
5ab213a6on8fcc8c22. After #2357 merged, I rebased again and kept both FOV andWalk formatters. The feature remains the first commit; review repairs are folded into the second. All four background
wiring checks and the original Walk wiring/doc checks are restored, not removed. Main's two-slot pad-binding fixture
locks and its five option-ID collision cases are retained, with the Walk values updated. No new game run or Windows
run is claimed for this refresh; the older
Source-regression CI passed on
796b1bdf, not this new head.5ab213a6,test_walk_key.py,test_bound_keys.pyandtest_input_background.pypass with GCC 16.2.1 andClang 23.1.3. The merged option-ID check passes with both: 43 unique IDs, all five collision variants rejected.
compiler. Before the last rebase, the restored wiring guards and compiled fixture rejected 32 mutations per
compiler on
cb984dc3; wrong host mode/speed IDs caused five/six runtime CHECK failures respectively.preserved, exclusive input suppresses the keyboard, and Walk returns afterwards. This is a compiled input fixture,
not a new game or real socket session.
hs-idle.sh, with the dependency Python and 32 checks at once. Load is thewrapper's before/after reading, not a quiet-machine performance measurement:
5ab213a6on8fcc8c228fcc8c22The raw failure sets differ. Both fail
test_env_on.pyat main'sHOS_FPS_LOGuse inhost/oot_high_fps.c:15.Walk also had a compiler killed by SIGKILL in
test_depth_sample_types.pyand a 600.1 s timeout intest_recorder_sync.py; both passed on main (recorder took 590.8 s there). Main alone failedtest_appimage_package_retry.pyon an extra enrollment/retry; it passed in Walk's full run. These test files andthe high-fps/appimage sources are unchanged by Walk. No raw full-suite parity is claimed.
The three differing checks were then run serially on
5ab213a6through the same test gate:test_depth_sample_types.pytest_recorder_sync.pytest_appimage_package_retry.pyThat serial run ended 3 passed, 0 failed, 0 skipped in 265 s, wrapper load 111.79 → 77.18. The original
failures remain recorded above; the common base failure is
test_env_on.py, not changed by this PR.The final core-dump check reported
No coredumps found.Added 2026-11-11:
tests/test_walk_key.pypasses in Windows part 1/2 on37687e2f. That shard fails only on main’s ASTCscanffixture, whose fix is #2397. This proves the compiled input check on Windows, not physical input or gameplay.37687e2fon7759a6f3, including #2380.test_walk_key.py,test_bound_keys.pyandtest_input_background.pypass with GCC and Clang. A throwaway variant that suppresses the Walk tilt fails the compiled behavioral checks with both compilers. The earlier test against main49f75dc8failed because the Walk helper was absent.37687e2f:386 passed, 1 failed, 10 skipped in 144 s; onlytest_updater_asset_digest.pyfails because this machine has no .NET 8 reference packs. The two vcore tests fixed by #2380 now pass. A compiled header check reportswalk_mode=49 walk_speed=50 camera_speed=48.python -I -B tests/run_all.pyon the original branch (Linux, clang 23): 363 passed, 2 failed, 10 skipped. The two fail onmainon this machine as well and do not touch this change:test_updater_asset_digest.py(no .NET 8 referencepacks installed) and
test_wayland_libdecor_hint.py(clang 23's-Wunused-but-set-globalunder-Werror).In the game: Arch Linux (kernel 7.2.15), i9-13900K, RTX 4090, NVIDIA 615.78.08, base
main49f75dc8, head78af2f74, 2026-11-11, headless runs (no window) with 1280x720 pictures, load average 2 to 4 for the speed and key
runs, my save in Kokiri Forest. The build was this branch plus a local probe that is not part of this pull request: it lets the input
script hold the left stick at a share of the way, logs Link's position and the forward speed the game sets on him every
250 ms together with the stick that
GetNpadStateshanded the game, and holds key codes in the key table that SDL'skeyboard fills on Linux, so the keyboard's own path (
bound_down,walk_held,move_keys_stick) ran although no keycan reach a headless game. Speeds are medians of 9 or 10 readings per 2.6 s hold, forward and back, the first reading of
each hold (the turn) left out:
at 1.47 m/s; W or S alone gave (0, ±32767) and he ran at 4.50 m/s; W+A and S+D with Caps Lock gave (∓10426, ±10426),
45% along the diagonal, and he walked at 1.47 m/s. The log showed
hid: walking: the movement keys tilt the left stick to 45% (0, 14745).hid: walking onand W then walked (stick 14745,1.47 m/s), the next press
hid: walking offand W ran (32767, 4.50 m/s), the next on again and S+D walked along thediagonal, the last off. The options file afterwards held
walk_mode=1,walk_speed=45,key_walk=20,0(CapsLock, no second key).
row's lower bound has changed since); the Toggle run and the menu pictures were taken again on this version
(78af2f74 plus the probe), while other work loaded the machine (load average 129 at its start; it gives log lines
and pictures, no timing).
The runs, as the harness printed them (exit 124 is the run's own time limit;
nvrm=1is oneNVRM: memMap_IMPL: CPU mapping not supportedline in the kernel log, which the game's start usually draws fromthis driver and which is no fault):
The Toggle sequence of walk-menu2, from its log (the script that reads it asserts the order and the stick values):
Pictures (1280x720 headless shots, cropped to the game and to the menu's rows):
Left: S held with Caps Lock, Link walks towards the camera with his arms hanging. Right: S alone, he runs, leaning
forward with his arms pumping.
The two new rows sit between Motion and Controls. Panel 1: Walk mode selected with Toggle chosen (Hold is the
default) and its help text. Panel 2: Walk speed selected at 45% and its help text.
The new last row of the Controls page, after Camera right: Walk, no gamepad button, Caps Lock as its key.
Not tested
in the game's key table by the test-only probe described above; the press itself (SDL's scancode 57 on Linux,
VK_CAPITALon Windows) was not exercised.Risks
be slower by the same share. Aiming with the camera keys or the mouse is not changed. Not tried in the game.
bind another key).
vk_api.his part of the shader caches' stamp (nx2/build.py907-912), so, as with any change to that header, thefirst start of a build with this translates the shaders once more.
MKWVK_API_VERSIONstays at the base's 18; this change adds option/key identifiers, not host/renderer table entries. Build the host and renderer together; mixing binaries from different versions was not tested.Overlaps
Updated 2026-11-11 after the FOV merge: 79 open PRs touch one of this branch's eleven files; six have additional
text conflicts (nine hunks). Each reported hunk was read; no combined game run was made.
collide with Walk's 52/53; keep all input wiring checks.
are now on the base. Their code and checks are retained; FOV's Walk collision cases now test 52/53.
Assisted-by: Claude Opus 5.5
Co-Authored-By: Claude Opus 5.5 [email protected]
Assisted-by: GPT-6 Astra
Co-Authored-By: GPT-6 Astra [email protected]
Rebased onto main
b744b1ec. It merged without a conflict, but its test would not have built there: theread_inputthattests/test_walk_key.pycuts out ofhost/nn_hid.cnow callshos_control_input()(#926) and readsHOS_INPUT_EXCLUSIVEwithenv_on()(#2042). The test now getsgpu/vk/compat/hookshot_env.hwith-includeand stubs the control bridge as off, astests/test_input_background.pydoes on main. The source lines of this pull request are unchanged.With the control socket: its input keeps its own stick tilt, like scripted input, and an exclusive socket input keeps the keyboard out while it lasts, Walk included.
Rerun on the new head (
8a14b300): the branch's three tests pass with gcc 16 and clang 23, andtest_walk_key.pystill fails against main's source.tests/run_all.py: 374 passed, 4 failed, 10 skipped. All four fail on main too on this machine; two of them are main'stest_vcore_fs_open.pyandtest_vcore_video_acquire.py, which #2380 fixes, so expect those two red here until it is merged. The game runs in the description are from the old base (49f75dc8) and were not repeated.Nice, well measured and the test is a good one (it fails on main, passes here). I read the code and found nothing wrong in it:
walk_heldresets properly while the keys are not the game's, the diagonal scaling is right, Caps Lock isVK_CAPITALread with the 0x8000 bit on Windows and mapped to scancode 57 on Linux, and no other control uses it. The stick dead zone (option 11) is applied only to pads, so it does not touch the keyboard's tilt, and #2286 is merged and #1600 touches the pad path only, so I see no interaction with either. The menu rows are plainRowentries and I see nothing in the diff that the tests which cut code out ofvk_menu.cppwould trip on (you updatedtest_bound_keysandtest_input_backgroundfor the new prelude and helpers).One real problem: option id 46 collides with #2366 (open, "a new face or new controls show while the game runs"), which defines
HOS_OPT_PROMPTS = 46invk_api.hand answers it in the same option lambda. This one takes 46 and 47. On main, 45 and 48 (Camera speed) are now taken, so the free ids are 49 and up, except #2261 (60). Whichever of the two lands second has to renumber. Easiest is to move Walk to ids that nobody has claimed (49 and 50 are free as far as I can see, #1945's 48 is already on main) so this can merge independently.CI: the Python source checks fail only on
test_vcore_fs_open.pyandtest_vcore_video_acquire.py, which you noted fail on main and #2380 fixes; the appimage job died on an Ubuntu mirror 504 (infrastructure); Windows Vulkan back end build passes. Not for this PR to fix, but it will need a rerun once #2380 is in.Minor, not blocking: the first-person aiming risk you list is real for keyboard players who aim with WASD, worth a line in the readme if you try it in game.
@ -28,6 +28,10 @@ enum { HOS_OPT_DLSS_JITTER_W = 24, HOS_OPT_DLSS_JITTER_H, HOS_OPT_DLSS_JITTER_PH/* (hookshot) the Audio tab's rows (host/nn_audio.c reads them every 100 ms): the volume in percent, and no sound while46 is also taken by #2366 (
HOS_OPT_PROMPTS = 46). Please pick ids that are free, e.g. 49 and 50 (main has 45 and 48 now, #2261 has 60), and update the comment lines invk_menu.hthat name 46 and 47.Moved Walk mode/speed to 49/50 and updated both
vk_menu.hcomments in37687e2f. The host and renderer use the same constants; a compiled header check reportswalk_mode=49 walk_speed=50 camera_speed=48. Saved named keys are unchanged. #2366 can keep 46; its remaining overlaps are text conflicts, not shared IDs.Also rebased onto
7759a6f3, including #2380. The three input checks pass with GCC and Clang. The full suite is386 passed, 1 failed, 10 skipped; only the missing .NET 8 reference packs fail here. I removed the source-text wiring assertions rather than repinning the IDs; the compiled behavior check still rejects a variant with Walk tilt suppressed, with both compilers.No new game run after this rebase/renumber; first-person aiming remains explicitly untested.
tests/test_walk_key.pypasses on Windows on37687e2f. Windows part 1/2 fails only ontests/test_native_astc_texture_count.py(the knownscanfCRT deprecation); #2397 contains that fix. The description now records this Windows game-free coverage. Physical keyboard input and Windows gameplay remain untested.I think i prefer Alt as walk. its consistent with many other default control schemes in other implementations with walk keys.
@pmwork-personal thanks. Walk is rebindable on the Controls page. This CI refresh keeps Caps Lock; the default choice can be settled separately. The readme already calls out its effect on capitals.
Rebased onto
47ed9f14, now796b1bdf, including the merged #2397 repair and #2366 live prompts. The latter exposed a fixture bug: the test selected an earlierhos_binddeclaration instead of its definition. The range search is fixed, and all three input checks pass with GCC and Clang. Walk still uses 49/50. No new gameplay, physical-input or first-person-aiming proof is claimed.Update 2026-11-11: the refreshed source-regression workflow is green on
796b1bdf: both Windows and both Ubuntu shards pass. This is game-free CI evidence, not a new game run.The code is sound (Caps Lock is scancode 57, a conflicting old ini leaves Walk unbound with a log line, and no API bump is needed). Two things before merge:
tests/test_input_background.pydrops four checks unrelated to this feature: the background block reads pads but not keyboard or mouse,t.optionmaps 4 topad_background, and the "Controller in background" row exists. All four still pass on this branch, so they can simply go back in. AGENTS.md asks for checks to be updated, not removed.HOS_OPT_WALK_MODE = 49matches #2357'sHOS_OPT_FOV = 49. The two PRs touch different hunks, so git won't flag it. Yourif (id == HOS_OPT_WALK_MODE)comes first, so the game would read Walk mode (0/1) as the FOV percentage, whichoot_fov.cthen rejects. Whichever lands second has to renumber; please coordinate with @polaco1782.There's also an open question from a commenter about Alt instead of Caps Lock as the default.
This now conflicts with main in
gpu/vk/vk_menu.cpp,host/nn_hid.c,readme.md. Could you merge main into the branch (or rebase) when you get a chance? I'll take another look once it's up to date.I fixed both points in
5ab213a6:vk_api.h. Neither ID was claimed; the refreshed table now puts FOV 51 on main and still finds 52/53 free. #2530 claims 49 for Keyboard. The real header is compiled with the host's reads, and the renderer, menu comments and wiring checks agree.The three input checks and the 43-ID guard pass with GCC and Clang; suppressed Walk tilt fails at runtime, and all 13 socket-fixture states pass. The updated description keeps both unequal raw suite results with their loads; the three differing depth/recorder/appimage checks all pass when run serially.
I kept Caps Lock for now: Walk is rebindable on the Controls page, and I can change the default if the maintainers prefer another key.
I rebased onto
8fcc8c22after the FOV merge, keeping both formatters, main's two-slot pad bindings and its documentation additions. No new game run, physical-input or first-person-aiming proof is claimed.Rebased the pushed
5ab213a6onto current main87991bc8asc3c7d19e, keeping both commits and their complete authors/messages/trailers. The resolutions retain all five ocarina-note controls, keyboard prompts, camera handover, upscaler reset and current translated hints beside Walk's unchanged Hold/Caps Lock/45% defaults, 15–90% range and IDs 52/53. Fixtures retain all assertions; the new note-layer integration also asserts that an inactive note layer consumes no controller input. GCC passed all 122 selected checks; Clang passed 121 with main's inherited background-input warning. The suite was 469 passed / 2 inherited failures / 20 skipped: that warning and the known release-script race. The last rebase adds only #2671 and changes no PR file blob; Walk/ocarina/wiring checks, final-main negatives, #2671's offline check and Windows-target syntax ran again. The final PR gate passes. No second full suite, game run or native Windows execution is claimed. Sources: the #2345 evidence and final-handoff ledger above.Both of my points are fixed at c3c7d19e.
tests/test_input_background.pynow only adds to main's checks, with the four I asked about back unchanged, and Walk uses option ids 52 and 53 (gpu/vk/vk_api.h:34), which nothing on main uses (main has 45 to 48, and #2357's FOV took 51). The bind table grows by one entry at its end, saved by name askey_walk,options_versionis untouched and no API bump is needed.I merged it into current main and ran
test_walk_key.py,test_bound_keys.py,test_input_background.py,test_ocarina_note_bindings.py,test_ocarina_notes.py,test_option_ids.py,test_menu_i18n.pyandtest_env_on.py: all pass, and CI is green on this head. Leaving Walk unbound with a log line when an older ini already gives Caps Lock to another control (binds_load) is the right upgrade path.Caps Lock versus Alt as the default is the maintainers' call, and it's rebindable either way. First-person aiming while walking is still untested, as you say.
Wouldn't shift/ctrl be a better key? More common
Both are taken in the default layout: Shift is B and Ctrl is the left-stick click (
key_defaultinhost/nn_hid.c), so Walk on either means moving one of those to another key. Caps Lock was the free key beside them, which is the only reason it was picked. The row is rebound on the Controls page like any other, so a player who wants Walk on Shift or Ctrl can swap them today.Caps Lock has a cost, to be fair: every press also flips the system's Caps Lock state, and I have not tried it on a physical keyboard (the runs were headless, as the description says).
If you would rather have Walk on Ctrl by default, with the stick click moved to another key or left without one, say which and I will change the default table, the README row and the test. One thing to decide with it: a player whose saved bindings already name Ctrl for the stick click would start with Walk unbound (the existing rule for a default key that is taken), not with the two swapped.
Rebased onto main
3c2d80cf3; new head2202ab57d.Walk mode and speed now use 49 and 50, the numbers main reserves for Walk, because 52 went to Skip opening. Saved option names are unchanged.
No other gameplay change: Caps Lock, Hold, 45% and the 15–90% range remain. The default key still awaits the maintainer's preference.
Four input fixtures now declare CRT usage before headers; every assertion is retained. The fork's Windows run uses
45f3e06c2; all five patches are identical at this final head.Focused checks: 24 passed with GCC 16 and 24 with Clang 23. A full run of the project's checks in my fork, Windows included, is green on
45f3e06c: the same five commits one main commit earlier (git range-diffmarks each=), so it was not repeated for this head.The earlier full suite was 497 passed, 3 failed, 20 skipped: two failures on main too, now fixed there; the compiler SIGKILL passed alone with fewer workers.
First windowless Kokiri run: three inspected menu pictures, Toggle walking/running 1.467 / 4.500 m/s, and Hold running 4.500 m/s.
Hold walking was not measured in that run: first-load shader compilation swallowed the short holds.
One ordinary completion run, same binary: Hold walking/running 1.469 / 4.500 m/s, nine readings each after the first.
Both walking results round to the description's 1.47 m/s, running to 4.50 m/s. Physical input and Windows gameplay remain untested.
Runs were built at
7e536c33, before the final refresh: the Walk code is identical, but the intervening main renderer changes were not rerun.Joey-Magnus's earlier approval was for
c3c7d19eand predates this refresh.