← Dev Log
BallOrcs2 min read

Playtesters asked, the ball answered: arrow keys, orbit camera, a heavier jump

We played the Windows build like real players and wrote down every 'why can't I…' — then fixed the lot. Arrow keys now work alongside WASD.

In plain words

We played the Windows build like real players and wrote down every "why can't I…" — then fixed the lot. Arrow keys now work alongside WASD. The camera swings around you on Q/E, the right stick, or a right-mouse drag. The ball moves like it has weight: it accelerates toward where you point, brakes hard when you reverse, and coasts a little slide when you let go. The jump is heavier and squashes flat on landing before springing back. And there's finally a pause menu where you can rebind every key and have it stick. One knock-on: our robot playtester used to cheat by knowing the old physics, so we had to teach it to actually play like a person again.

Under the hood

  • Controls pass (5a1d041): arrow keys join the move_* actions; a new orbit camera adds camera_left/right/up/down on Q/E + right stick + right-mouse-drag. PlayerBall swapped constant torque for a velocity-target model — it accelerates toward the input, actively brakes opposing velocity (harder when reversing), and coasts a short speed-proportional slide on release. Visual roll is synced to ground speed (ω = v/r).
  • Options menu: Esc opens a process_mode = ALWAYS pause menu (Resume/Options/Quit); Options lists every remappable action with click-to-rebind and Reset, persisted to user://input_binds.cfg and applied at startup. Built entirely in code via InputSettings + PauseMenu autoloads — no main.tscn dependency. A follow-up (ad90c5f) routes every panel through _show_panel() so keyboard and gamepad players get focus for free.
  • Ball feel (4f71ede): gravity_scale up to 2.0 for a snappier hang time, jump impulse raised 9 → 13 to hold roughly the same apex (h = v²/2g). Squash-and-stretch lives on the visual mesh only — stretch +1.0 on jump, squash −0.45 on landing, decaying back at 9/s with rough volume conservation. Camera pitch also gets physical R/F keys.
  • Re-teaching the robot (c2e473c, 789e7f9): the new slide/brake feel broke the goal bot — full-speed jumps sailed ~25m past 5m platforms, and it hopped at walls forever, tanking from ~950m to ~300m in 90s. GoalSeekPolicy now approaches step climbs like a human: line up straight, shed speed to a ~3 m/s hop pace, time the jump from projectile prediction, release keys mid-flight, and retreat-and-rerun instead of bonking in place. It also derives jump kinematics from the player's actual jump_impulse/gravity rather than hardcoded constants, so future feel tweaks can't silently fool it. Verified: wins on seeds 1–5 × keyboard+gamepad.
  • Naming the build you soaked (1e14ba2): GAME_BUILD_FINGERPRINT was exported but compiled in nowhere, so every binary reported "dev". SConstruct now injects it as a guarded C string and scheduled jobs stamp the same v<year.week>+<shortsha> formula — playtest reports now name the exact release they tested, and the scheduled build:linux artifact is bit-identical to the release rebuild. A Monday WSL keeper task holds the VM open so the weekly train can actually fire.
#gameplay#controls#game-feel#playtest