Складений код — це підсумковий код рівня, який збирається з кількох частин, розкиданих по кодах, бонусах, наскрізних бонусах та підказках. Щойно команда здобуде всі частини, рушій сам вбиває зібраний код за гравців.
Важливо (стосується всіх трьох способів): підсумковий зібраний код обов'язково має бути заведений на рівні як звичайний код (або як бонус). Інакше рушій надсилатиме неіснуючу відповідь, і в гравців сторінка перезавантажуватиметься в циклі.
Реалізувати складений код можна трьома способами:
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.