ну первая мысль у меня тоже про fsm была, но на пятом десятке состояний я сломался. Там потом вообще без бутылки будет не разобратсья, с такой низкой связностью
Я делал так: есть отдельно список состояний. Каждое состояние содержит в себе список указателей на команды, которые ожидает. И пара "состояние-команда" переводит в другое состояние с другим списком команд.
Отдельно обрабатывалось "любая неподошедшая команда для данного состояния". И "сразу после перехода вернуть в предыдущее состояние".
Команды я мог группировать, например группа команд "главное меню", и в разных состояниях писать просто, что там есть группа команд "главное меню" помимо отдельных команд.