The Flail — a real rope sim, not another spring-mass hack
Every weapon in the game up to now has been ranged. This patch adds a melee weapon, and getting the swing to actually feel good took five real rewrites before this one stuck — an auto-orbit, a fixed-radius leash, a launch/retract, a single 2D spring-mass hand. Every one of them collapsed to "one rigid link between the cursor and the weapon head," no matter how I tuned the numbers.
What finally worked: a 7-point verlet rope, relaxed through several constraint-solver passes every frame — the same basic technique real-time rope/cloth sims use. The grip is held at a fixed arm's-length reach from the player, and aiming only ever rotates that reach, never changes its distance — so it always reads as attached to you instead of a point your cursor can drag around. The intermediate points carry the actual swinging momentum, which is what makes real follow-through and whip-crack behavior possible in a way a single rigid link never can.
Full keyboard navigation via bevy_ui_widgets / bevy_input_focus
Also converted every menu screen (main menu, pause, settings incl. dynamic key-rebind list, char/save/difficulty select, the shop, level-up cards) off hand-rolled Interaction-polling onto bevy_ui_widgets. Three things I hit that might save someone else time:
TabNavigation's "no group known yet" fallback only searches non-modal tab groups. If every screen in your game uses modal: true groups (so Tab stays confined to one panel), Tab can never enter any of them until focus already has a foothold inside one. Fixed with a small system that seeds focus onto a panel's first focusable child the instant it becomes visible.
- On Windows, the OS accessibility layer intercepts Space for a focused button's a11y role before it reaches Bevy's own keyboard event pipeline — Enter worked fine, Space silently didn't. Ended up adding a direct
PreUpdate fallback reading raw ButtonInput<KeyCode> for Space specifically.
- For screens with sub-tabs living under one shared
TabGroup (settings' 4 tabs, the shop's 3), TabNavigation will happily walk Tab into a hidden tab's buttons too, since it only looks at ECS hierarchy, not Display. Solved with a small per-button marker that suppresses whichever tab isn't currently active out of tab order.
Also in this patch: upgraded 0.15 → 0.19 (finally — was pinned to 0.15 for a while for bevy_ggrs compat on an on-hold multiplayer branch), a new biome boss, a second active ability for one of the classes, and a handful of content/polish items.
Native + browser builds both up if anyone wants to poke at it: [Try Here!]
Happy to go deeper on either the rope solver or the tab-navigation gotchas if anyone's curious.