Skip to content
2 min read

controller feels

if you give halo1 the lowest amount of right stick input, do you know how long would it take for you to complete a full 360 degree turn?

i want this games controller support to feel like halo ce, not just “close enough" but a bit of a nostalgia trip. so i went down the rabbit hole: built my own tas tool and virtual xbox 360 controller, ran exact stick values into halo running in xemu over and over again. then wrote a script to read the game’s live camera movement out of xemu memory (using cyrix's codebase), and translated all of that into an unreal-friendly ramp system.

the goal: make aida controller movement feel classic.

the process

01. build a controller i could program

first piece was a small vibecoded windows tool that creates a virtual xbox 360 controller. let me send exact stick values into xemu. it gave me a way to do things like hold the stick at exactly .280 input for 45 minutes, repeat the same input over and over, and test tiny changes in values without human inconsistency.

0:00
/0:05
  1. start measuring

once input was deterministic, i needed to know what halo thought the camera was doing in real time. using cyrix's halocaster source code, i scripted a real-time camera pitch/yaw monitor and ran simulations for ~4 hours.

the sensitivity curve is not just “deadzone + one smooth ramp.” the game moves through specific pressure-triggered sensitivity stages, with a timed-based ramp at the final stage.

translate it into unreal

after the halo side was measured, i converted the results into a stage-based unreal preset. five low/mid stick stages, one turbo stage, and a measured stage-6 ramp duration.

shoutouts

shoutout to cyrix and stewball for the local xemuscraper reference and the halo memory-offset work. that made the "read what halo is actually doing" possible.

✌️