ua:authors_main:task_editor:advanced:composite_codes

Складені коди

Складений код — це підсумковий код рівня, який збирається з кількох частин, розкиданих по кодах, бонусах, наскрізних бонусах та підказках. Щойно команда здобуде всі частини, рушій сам вбиває зібраний код за гравців.

Важливо (стосується всіх трьох способів): підсумковий зібраний код обов'язково має бути заведений на рівні як звичайний код (або як бонус). Інакше рушій надсилатиме неіснуючу відповідь, і в гравців сторінка перезавантажуватиметься в циклі.

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

  1. Вкладені шаблони — перевірка кожної частини шаблоном на сервері, введення коду скриптом у найглибшому шаблоні. Рекомендований спосіб.
  2. Скрипт із getAllParts / getAllBonuses — збирання коду на клієнті з відповідей, уже показаних на сторінці.
  3. 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(). Так робляться «розгалужені» складені коди, які неможливо зібрати простим склеюванням частин.

  • У тексті завдання (режим «Джерело») — як у прикладах вище.
  • У полі «Завдання» того бонусу, який цим складеним кодом і закривається — найкращий варіант, якщо за складений код належить бонус. Текст завдання бонусу показується лише до введення правильної відповіді, тому після закриття бонусу шаблон більше не обчислюється.
  • У полі «Скрипт завдання» — тоді службові рядки шаблону закоментуйте подвійним слешем, щоб редактор коду не лаявся на синтаксис (докладніше — у розділі Шаблони всередині javascript):
// {% 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 з однаковим номером, які опинилися на сторінці. Частини можна вільно розкидати по підказках та бонусах, не відстежуючи їхні номери.
  • Частину коду задає автор, тому вона не залежить від того, яким синонімом закрито бонус чи підказку (на відміну від способу 2). Але й урахувати конкретний синонім теж не можна — для цього потрібен спосіб 1.
  • Загальна кількість частин указується в кожному виклику, тому при зміні їхньої кількості правити доведеться одразу всі частини.
  • Частини коду видно у вихідному коді сторінки одразу після відкриття бонусу/підказки.
Спосіб Де обчислюється Порядок частин Коли використовувати
Вкладені шаблони На сервері Задає автор Найуніверсальніший спосіб: працює із синонімами й не показує підсумковий код заздалегідь. Писати потрібно найбільше — матрьошку зручно згенерувати через AI
getAllParts / getAllBonuses У браузері Задає автор (порядок аргументів) Найменше писати, але погано підходить, якщо у відповідей на частини є синоніми
code_part У браузері Порядок виведення на сторінці Із синонімами працює, але скрипт треба вручну прописати в кожній частині

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

  • ua/authors_main/task_editor/advanced/composite_codes.txt
  • Last modified: 2026/08/06 09:42
  • (external edit)