public void TransitionState(Player player) { // Interaction state changes have precendence over other state // changes, so they are checked before everything else. if (current == State.interacting) { if (player.InteractKeyPressed() && !player.TooFarFromInteractable()) { return; } player.EndInteract(); current = State.initial; } else { if (player.InteractKeyPressed()) { var startedInteracting = player.TryBeginInteract(); if (startedInteracting) { current = State.interacting; return; } } } if (current == State.onGround) { if (player.JumpKeyPressed()) { current = State.jumping; player.OnFirstFrameOfJump(); return; } } else if (current == State.jumping) { if (player.JumpTimeUp()) { if (player.JumpKeyPressed()) { current = State.initial; player.OnLastFrameOfJump(); } } else { return; } } current = player.IsOnGround() ? State.onGround : State.inAir; }