Создание корутины в Lua 5.4 ещё не запускает рисунок. Хост вызывает coroutine.resume, и только тогда генератор работает до места, где явно отдаёт предложение через yield. По одной плитке за раз.
Красная плитка уже принята. Генератор отдаёт синий квадрат для соседней позиции. Задержимся на передаче управления. Пользователь отклоняет его и просит янтарный. Хост возобновляет приостановленную корутину с этим решением, а генератор читает его из значений, которые вернул вызов coroutine.yield. Потом готовит новое предложение.
Что меняет отказ? Позиция в палитре может сдвинуться вперёд, остаться на месте или откатиться к состоянию до предложения. От выбора зависит, как художник будет править работу. Если оставить на виду отклонённое предложение и само решение, станет понятно, почему следующая плитка другая.
Если пользователь остановился, хост просто перестаёт возобновлять корутину. Она остаётся приостановленной, а не завершённой, так что приложению нужно решить, что делать с удерживаемым состоянием и ресурсами.
Корутина Lua не является потоком ОС. У предложения, оценки и продолжения свои отдельные моменты. Явные передачи управления делают правку понятной, если ясно, что переживает каждую из них.
