← Все статьи

Twine: переменные, условия и баллы на примере диалогового тренажёра

Twine: переменные, условия и баллы на примере диалогового тренажёра

В первой статье про 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, clarified и feedback в редакторе параграфа Twine
Все значения сбрасываются в «Начале». Это пригодится при повторном прохождении.

Чтобы показать значение, достаточно написать переменную в тексте параграфа:

Баллы: $score / 6

Читатель увидит, например, «Баллы: 2 / 6». Вне команды это обычная надпись со значением переменной, а не деление числа на шесть.

3. Прибавляем баллы после выбора реплики

Откройте «Приветствие». Обычная ссылка [[Реплика->Сцена]] только переводит дальше. Здесь перед переходом нужно выполнить несколько действий, поэтому используем (link:):

(link: "Понимаю, вы рассчитывали заселиться вовремя. Извините за задержку. Давайте я помогу.")[
(set: $score to $score + 2)
(set: $feedback to "Вы признали неудобство и взяли инициативу. Гостю проще продолжить разговор, когда его слышат.")
(go-to: "Реакция 1")
]

В кавычках после link: — надпись ссылки. В квадратных скобках — действия после нажатия: взять текущий счёт, прибавить два, запомнить разбор и открыть «Реакцию 1». В Harlowe такой блок в скобках называется hook.

Реплики с link, set и go-to в редакторе Twine
У двух других реплик свой разбор и своя прибавка: один или ноль баллов.

$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>, чтобы выглядеть как слова собеседника.

Условие if и альтернативный блок else в параграфе «Реакция 2»
Условие меняет содержание сцены, хотя сама карточка на карте остаётся одной.

Держите (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. Проверяем, сохраняем и меняем под свою задачу

Запускайте весь тренажёр от «Начала» через «Сборка → Играть». Если начать проверку сразу с середины, нужные значения ещё могут быть не заданы. Сначала пройдите сильный маршрут, затем слабый и смешанный; отдельно проверьте появление дополнительной реплики и сброс при повторе.

Кнопки «Играть», «Тестировать» и «Опубликовать в файл» во вкладке «Сборка» Twine
«Опубликовать в файл» сохраняет HTML на компьютер; на сайт его нужно загрузить отдельно.

В готовом примере проверены все 21 сочетание выборов, перезапуск, обновление экрана с разбором и отображение на узком экране. Оформление и иллюстрация встроены в HTML: отдельные картинки для запуска не нужны.

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

Скачанный HTML работает без интернета и не отправляет баллы в СДО. Для такого учёта понадобится отдельная интеграция: переменная внутри истории сама по себе ещё не отчёт о прохождении.