Составной код — это итоговый код уровня, который собирается из нескольких частей, разбросанных по кодам, бонусам, сквозным бонусам и подсказкам. Как только команда добывает все части, движок сам вбивает собранный код за игроков.
Важно (относится ко всем трём способам): итоговый собранный код обязательно должен быть заведён на уровне как обычный код (или как бонус). Иначе движок будет отправлять несуществующий ответ, и у игроков страница будет перезагружаться в цикле.
Реализовать составной код можно тремя способами:
getAllParts / getAllBonuses — сборка кода на клиенте из ответов, уже показанных на странице.code_part — устаревший вариант, оставлен для совместимости.Шаблоны вычисляются на сервере до отправки страницы. Пока команда не собрала все части, итогового кода нет ни на экране, ни в исходном коде страницы — найти его заранее невозможно.
Идея: вкладываем шаблоны друг в друга, каждый уровень вложенности проверяет свою часть (код, бонус или сквозной бонус), а в самом внутреннем шаблоне скриптом вбиваем итоговый код.
Пример: код собирается из 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 — самый первый вбитый ответ). Сквозные бонусы проверяются даже на тех уровнях, где они не выведены на экран. Полный список параметров — на странице Шаблоны.
Функции собирают итоговый код из ответов, которые уже отображаются на странице.
// Склеивает ответы в порядке перечисления аргументов enter(getAllParts('c1', 'b2', 'gb5'));
getAllParts(…) — принимает id элементов, в которых движок показывает вбитые ответы:c1, c2, … — коды уровня;b1, b2, … — бонусы уровня;gb1, gb2, … — сквозные бонусы.enter() на нём просто ничего не сделает.Если все части лежат в подряд идущих бонусах, удобнее короткая форма:
// Склеивает ответы бонусов с 1-го по 4-й: то же, что getAllParts('b1','b2','b3','b4') enter(getAllBonuses(1, 4));
Скрипт пишется в поле «Скрипт задания» и выполняется при каждом обновлении уровня. Повторных отправок бояться не нужно: enter() вбивает код только один раз.
Учтите, что склеивается ответ, который вбила команда. Если у части кода есть синонимы, разные команды получат разные итоговые строки — либо заведите на итоговый код все возможные варианты, либо используйте способ 1.
Части кода прописываются в тексте задания или в тексте решения бонусов и штрафных подсказок (в режиме «Источник»):
<script>code_part(номер_составного_кода, 'частькода', число_составных_частей)</script>
номер_составного_кода — порядковый номер составного кода, если их на уровне несколько (если он один — ставьте 0).'частькода' — часть кода строкой, обязательно в кавычках (даже если это число).число_составных_частей — сколько всего частей нужно собрать. Как только на странице окажется указанное количество частей, движок вобьёт склеенный код.Особенности способа:
code_part, то есть в порядке вывода блоков на странице: сначала задание, потом подсказки, потом бонусы, потом сквозные бонусы. Свой порядок задать нельзя — при перестановке бонусов итоговый код изменится.code_part с одинаковым номером, которые оказались на странице. Части можно свободно раскидывать по подсказкам и бонусам, не отслеживая их номера.| Способ | Где вычисляется | Порядок частей | Когда использовать |
|---|---|---|---|
| Вложенные шаблоны | На сервере | Задаёт автор | Самый универсальный способ: работает с синонимами и не показывает итоговый код заранее. Писать нужно больше всего — матрёшку удобно сгенерировать через AI |
getAllParts / getAllBonuses | В браузере | Задаёт автор (порядок аргументов) | Меньше всего писать, но плохо подходит, если у ответов на части есть синонимы |
code_part | В браузере | Порядок вывода на странице | С синонимами работает, но скрипт надо вручную прописать в каждой части |
Для способа 1 длинную матрёшку шаблонов удобно сгенерировать нейросетью — см. Редактирование и генерация заданий с помощью AI.