Additional rules: no loops in the code. Custom language where it's not even an option. You get ifs and switch expressions, and then the code is called with the current state for each tick.
I could probably build a graphical programming environment for this language, if I get all the other stuff in place.
You should probably also have a few registers to put variables and stuff in, that survives each tick. Not an unlimited amount, but not too few so it feels cramped. Ideally the whole language will be deterministic and easily compilable to e.g. WebAssembly, so it'll be easy to build a replay-viewer, or straight up a live "full speed" view.