Table of Contents

Составные коды

Составной код — это итоговый код уровня, который собирается из нескольких частей, разбросанных по кодам, бонусам, сквозным бонусам и подсказкам. Как только команда добывает все части, движок сам вбивает собранный код за игроков.

Важно (относится ко всем трём способам): итоговый собранный код обязательно должен быть заведён на уровне как обычный код (или как бонус). Иначе движок будет отправлять несуществующий ответ, и у игроков страница будет перезагружаться в цикле.

Реализовать составной код можно тремя способами:

  1. Вложенные шаблоны — проверка каждой части шаблоном на сервере, ввод кода скриптом в самом внутреннем шаблоне. Рекомендуемый способ.
  2. Скрипт с getAllParts / getAllBonuses — сборка кода на клиенте из ответов, уже показанных на странице.
  3. code_part — устаревший вариант, оставлен для совместимости.

Способ 1: Вложенные шаблоны (рекомендуется)

Шаблоны вычисляются на сервере до отправки страницы. Пока команда не собрала все части, итогового кода нет ни на экране, ни в исходном коде страницы — найти его заранее невозможно.

Идея: вкладываем шаблоны друг в друга, каждый уровень вложенности проверяет свою часть (код, бонус или сквозной бонус), а в самом внутреннем шаблоне скриптом вбиваем итоговый код.

Пример: код собирается из 1-го кода уровня, 2-го бонуса и 5-го сквозного бонуса.

{% match code_1 }:{
  {%= крокодил}:{
    {% match bonus_2 }:{
      {%= бегемот}:{
        {% match gbonus_5 }:{
          {%= кабан}:{
<script>enter('ЗООПАРК')</script>
          %}
        %}
      %}
    %}
  %}
%}

Ветка срабатывает только при точном совпадении ответа, поэтому вложенные шаблоны раскрываются до <script>enter('ЗООПАРК')</script> только тогда, когда вбиты все три части. Если какая-то часть ещё не вбита, соответствующий шаблон вернёт пустоту и вложенные в него шаблоны вообще не будут вычисляться.

Если важен только факт ввода, а не конкретный ответ

Когда у части кода несколько синонимов и проверять надо просто «вбито или нет», используйте ветку !any_answer! — она срабатывает на любой введённый ответ, но, в отличие от ?, не срабатывает, когда ответа ещё нет.

Матрёшка собирается так же, просто вместо конкретных ответов на каждом уровне вложенности стоит !any_answer!:

{% match code_1 }:{ {%= !any_answer!}:{
  {% match bonus_2 }:{ {%= !any_answer!}:{
    {% match gbonus_5 }:{ {%= !any_answer!}:{
<script>enter('ЗООПАРК')</script>
    %} %}
  %} %}
%} %}
Важно: не используйте вместо !any_answer! ветку ? — она срабатывает на любое значение, включая !no_answer!, и код будет вбит раньше времени.

Способы проверки можно смешивать в одной матрёшке: для части кода с единственным ответом писать конкретное значение, а для части с синонимами — !any_answer!.

Разные итоговые коды для разных комбинаций

Шаблоны сравнивают именно значение ответа, поэтому итоговый код может зависеть от того, каким синонимом закрыта каждая часть: достаточно прописать несколько веток с разными enter(). Так делаются «ветвящиеся» составные коды, которые нельзя собрать простой склейкой частей.

Где размещать

// {% match code_1}:{ {%= крокодил}:{
//   {% match bonus_2}:{ {%= бегемот}:{
enter('ЗООПАРК');
//   %} %}
// %} %}

Что можно проверять: code_N, bonus_N, gbonus_N (а также code_first_N, bonus_first_N, gbonus_first_N — самый первый вбитый ответ). Сквозные бонусы проверяются даже на тех уровнях, где они не выведены на экран. Полный список параметров — на странице Шаблоны.

Способ 2: Скрипт с getAllParts / getAllBonuses

Функции собирают итоговый код из ответов, которые уже отображаются на странице.

// Склеивает ответы в порядке перечисления аргументов
enter(getAllParts('c1', 'b2', 'gb5'));

Если все части лежат в подряд идущих бонусах, удобнее короткая форма:

// Склеивает ответы бонусов с 1-го по 4-й: то же, что getAllParts('b1','b2','b3','b4')
enter(getAllBonuses(1, 4));

Скрипт пишется в поле «Скрипт задания» и выполняется при каждом обновлении уровня. Повторных отправок бояться не нужно: enter() вбивает код только один раз.

Учтите, что склеивается ответ, который вбила команда. Если у части кода есть синонимы, разные команды получат разные итоговые строки — либо заведите на итоговый код все возможные варианты, либо используйте способ 1.

Способ 3: code_part (устаревший)

Части кода прописываются в тексте задания или в тексте решения бонусов и штрафных подсказок (в режиме «Источник»):

<script>code_part(номер_составного_кода, 'частькода', число_составных_частей)</script>

Особенности способа:

Что выбрать

Способ Где вычисляется Порядок частей Когда использовать
Вложенные шаблоны На сервере Задаёт автор Самый универсальный способ: работает с синонимами и не показывает итоговый код заранее. Писать нужно больше всего — матрёшку удобно сгенерировать через AI
getAllParts / getAllBonuses В браузере Задаёт автор (порядок аргументов) Меньше всего писать, но плохо подходит, если у ответов на части есть синонимы
code_part В браузере Порядок вывода на странице С синонимами работает, но скрипт надо вручную прописать в каждой части

Для способа 1 длинную матрёшку шаблонов удобно сгенерировать нейросетью — см. Редактирование и генерация заданий с помощью AI.