В первой статье про Twine мы собрали историю из сцен и ссылок. Теперь научим её помнить решения читателя: прибавлять баллы, открывать дополнительные реплики и показывать подходящий разбор.
Сделаем диалоговый тренажёр «Номер ещё не готов». Вы — администратор гостиницы «Прилив». Гость приехал, а заселиться пока нельзя. За три решения нужно понять его потребность и договориться о помощи.
Сначала пройти тренажёр → · Скачать пример с исходником
Инструкция и скриншоты подготовлены в настольном Twine 2.12.1 для macOS с русским интерфейсом. Все команды относятся к Harlowe 3.3.9. Проверено 13 ноября 2026 года.

1. Открываем пример и проверяем формат
Распакуйте архив. На главном экране Twine откройте «Библиотека → Импорт» и выберите nomer-ne-gotov.html. Если программа предложит выбрать историю для импорта, отметьте её и подтвердите. Откройте «Номер ещё не готов» двойным щелчком.
В «История → Подробности» проверьте формат: Harlowe 3.3.9. У SugarCube другой синтаксис, и команды из этой статьи для него не подходят.
В проекте семь параграфов: «Начало», «Приветствие», «Реакция 1», «Уточнение», «Реакция 2», «Решение», «Результат». Решения сходятся в общие сцены, а текст меняется по условиям. Поэтому для каждой комбинации ответов не нужна отдельная концовка.
2. Заводим переменные: что история должна запомнить
Дважды щёлкните «Начало». В первой строке находятся три переменные:
(set: $score to 0, $clarified to false, $feedback to "")
$score— число: сколько баллов набрано.$clarified— логическое значение: выяснили ли мы потребность гостя. Вначалеfalse, то есть «нет».$feedback— текст: какой разбор показать после выбора. Вначале это пустая строка"".
Знак $ входит в имя переменной. Команда (set:) задаёт ей значение. Текст пишем в прямых кавычках, числа и true/false — без кавычек. Если написать "false", получится текст, а не логическое «нет».

Чтобы показать значение, достаточно написать переменную в тексте параграфа:
Баллы: $score / 6
Читатель увидит, например, «Баллы: 2 / 6». Вне команды это обычная надпись со значением переменной, а не деление числа на шесть.
3. Прибавляем баллы после выбора реплики
Откройте «Приветствие». Обычная ссылка [[Реплика->Сцена]] только переводит дальше. Здесь перед переходом нужно выполнить несколько действий, поэтому используем (link:):
(link: "Понимаю, вы рассчитывали заселиться вовремя. Извините за задержку. Давайте я помогу.")[
(set: $score to $score + 2)
(set: $feedback to "Вы признали неудобство и взяли инициативу. Гостю проще продолжить разговор, когда его слышат.")
(go-to: "Реакция 1")
]
В кавычках после link: — надпись ссылки. В квадратных скобках — действия после нажатия: взять текущий счёт, прибавить два, запомнить разбор и открыть «Реакцию 1». В Harlowe такой блок в скобках называется hook.

$score to $score + 2 увеличивает накопленное значение. А $score to 2 каждый раз заменяло бы его двойкой. Не выносите начисление в начало параграфа с разбором: при повторном входе в него команда выполнится снова.
Порядок тоже важен: (go-to:) ставим после изменений переменных. Он завершает выполнение текущего блока и переводит в другой параграф — это описано в руководстве Harlowe. Параграф с указанным именем должен существовать. Если собираете проект с нуля, создавайте нужные карточки через «Параграф → Новый».
В «Реакции 1» сохранённый разбор выводится просто как $feedback. Здесь баллы уже не начисляются.
4. Запоминаем вопрос и открываем новый вариант ответа
В «Уточнении» полезнее всего спросить, что гостю сейчас важно. Внутри этой реплики, перед переходом, есть строка:
(set: $clarified to true)
Теперь история помнит: потребность выяснили. В «Реакции 2» проверяем это значение:
(if: $clarified)[
«У меня в 15:00 онлайн-собеседование на полчаса. Нужны тишина и место, где никто не будет мешать».
]
(else:)[
«Понимаю. Но у меня совсем другие планы на это время…»
]
Если $clarified равно true, показывается первый блок. Иначе — второй. В готовом проекте эти реплики обёрнуты в <blockquote>, чтобы выглядеть как слова собеседника.

Держите (else:) рядом с соответствующим (if:): между ними можно оставить перенос строки, но не вставляйте посторонний текст или другой блок в квадратных скобках. Условия проверяются при показе сцены; сами по себе они не обновляют уже нарисованный экран. Подробнее — в справке по условиям.
В параграфе «Решение» тот же флаг управляет целой репликой. Схема такая:
(if: $clarified)[
(link: "Предложу тихую переговорную до 15:40. В 15:20 сообщу о готовности номера, а заселиться сможете после звонка.")[
(set: $score to $score + 2)
(go-to: "Результат")
]
]
Это сокращённый фрагмент: в исходнике внутри ссылки также сохраняется текст разбора в $feedback. Если вопрос не задали, реплика о переговорной не появится. Мы связываем доступное действие с тем, что участник действительно узнал в разговоре.

5. Показываем результат по сумме баллов
За каждый из трёх выборов можно получить от нуля до двух баллов. В «Результате» используем цепочку условий:
(if: $score >= 5)[Вы нашли опору для разговора.]
(else-if: $score >= 3)[План есть, заботу можно усилить.]
(else:)[Есть с чего начать.]
Вы набрали $score из 6 баллов.
$feedback
Сначала проверяем самый высокий порог: пять и больше. Затем — три и больше. Последний блок получает всё остальное. Если начать с трёх, то и шесть баллов попадут в среднюю группу. Обратите внимание на написание: else-if с дефисом.

Баллы здесь — условная учебная модель. Одинаковая сумма может получиться при разных ответах. Поэтому рядом остаётся разбор последнего решения: участник видит, помог ли он гостю на самом деле.
В конце добавьте ссылку:
[[Попробовать ещё раз->Начало]]
Она вернёт в стартовый параграф и выполнит начальный (set:): обнулит счёт, сбросит флаг и очистит разбор. Простое обновление вкладки не используйте как кнопку новой попытки: Harlowe может восстановить текущую сцену.
6. Проверяем, сохраняем и меняем под свою задачу
Запускайте весь тренажёр от «Начала» через «Сборка → Играть». Если начать проверку сразу с середины, нужные значения ещё могут быть не заданы. Сначала пройдите сильный маршрут, затем слабый и смешанный; отдельно проверьте появление дополнительной реплики и сброс при повторе.

В готовом примере проверены все 21 сочетание выборов, перезапуск, обновление экрана с разбором и отображение на узком экране. Оформление и иллюстрация встроены в HTML: отдельные картинки для запуска не нужны.
Для своего тренажёра замените ситуацию и реплики, затем настройте баллы и пороги. Начните с трёх решений: признать проблему, уточнить потребность, предложить помощь. Этого уже хватает, чтобы потренировать небольшой навык и разобрать последствия выбора.
Скачанный HTML работает без интернета и не отправляет баллы в СДО. Для такого учёта понадобится отдельная интеграция: переменная внутри истории сама по себе ещё не отчёт о прохождении.