It's simpler than that. He creates image buttons for the current state (or start) of the free roam event and then calls ui.interact() to wait for the user input, then handles the click, and goes to the next ui.interact() for the next action. The rest is standard Renpy behavior.