{{indexmenu_n>25}}
====== Складені коди ======
**Складений код** — це підсумковий код рівня, який збирається з кількох частин, розкиданих по кодах, бонусах, наскрізних бонусах та підказках. Щойно команда здобуде всі частини, рушій сам вбиває зібраний код за гравців.
> **Важливо (стосується всіх трьох способів):** підсумковий зібраний код обов'язково має бути заведений на рівні як звичайний код (або як бонус). Інакше рушій надсилатиме неіснуючу відповідь, і в гравців сторінка перезавантажуватиметься в циклі.
Реалізувати складений код можна трьома способами:
- **Вкладені шаблони** — перевірка кожної частини шаблоном на сервері, введення коду скриптом у найглибшому шаблоні. **Рекомендований спосіб.**
- **Скрипт із ''getAllParts'' / ''getAllBonuses''** — збирання коду на клієнті з відповідей, уже показаних на сторінці.
- **''code_part''** — застарілий варіант, залишений для сумісності.
===== Спосіб 1: Вкладені шаблони (рекомендовано) =====
[[ua:authors_main:task_editor:advanced:edit_templates|Шаблони]] обчислюються на сервері до надсилання сторінки. Поки команда не зібрала всі частини, підсумкового коду немає ні на екрані, ні у вихідному коді сторінки — знайти його заздалегідь неможливо.
Ідея: вкладаємо шаблони один в одного, кожен рівень вкладеності перевіряє свою частину (код, бонус чи наскрізний бонус), а в найглибшому шаблоні скриптом вбиваємо підсумковий код.
Приклад: код збирається з 1-го коду рівня, 2-го бонусу та 5-го наскрізного бонусу.
{% match code_1 }:{
{%= крокодил}:{
{% match bonus_2 }:{
{%= бегемот}:{
{% match gbonus_5 }:{
{%= кабан}:{
%}
%}
%}
%}
%}
%}
Гілка спрацьовує лише за точного збігу відповіді, тому вкладені шаблони розкриваються до '''' тільки тоді, коли вбито всі три частини. Якщо якусь частину ще не вбито, відповідний шаблон поверне порожнечу, і вкладені в нього шаблони взагалі не обчислюватимуться.
==== Якщо важливий лише факт введення, а не конкретна відповідь ====
Коли в частини коду є кілька синонімів і перевіряти треба просто «вбито чи ні», використовуйте гілку **''!any_answer!''** — вона спрацьовує на будь-яку введену відповідь, але, на відміну від ''?'', не спрацьовує, коли відповіді ще немає.
Матрьошка збирається так само, просто замість конкретних відповідей на кожному рівні вкладеності стоїть ''!any_answer!'':
{% match code_1 }:{ {%= !any_answer!}:{
{% match bonus_2 }:{ {%= !any_answer!}:{
{% match gbonus_5 }:{ {%= !any_answer!}:{
%} %}
%} %}
%} %}
> **Важливо:** не використовуйте замість ''!any_answer!'' гілку ''?'' — вона спрацьовує на будь-яке значення, **включно з ''!no_answer!''**, і код буде вбито зарано.
Способи перевірки можна змішувати в одній матрьошці: для частини коду з єдиною відповіддю писати конкретне значення, а для частини із синонімами — ''!any_answer!''.
==== Різні підсумкові коди для різних комбінацій ====
Шаблони порівнюють саме значення відповіді, тому підсумковий код може залежати від того, яким синонімом закрито кожну частину: достатньо прописати кілька гілок із різними ''enter()''. Так робляться «розгалужені» складені коди, які неможливо зібрати простим склеюванням частин.
==== Де розміщувати ====
* У **тексті завдання** (режим «Джерело») — як у прикладах вище.
* У полі **«Завдання»** того бонусу, який цим складеним кодом і закривається — найкращий варіант, якщо за складений код належить бонус. Текст завдання бонусу показується лише до введення правильної відповіді, тому після закриття бонусу шаблон більше не обчислюється.
* У полі **«Скрипт завдання»** — тоді службові рядки шаблону закоментуйте подвійним слешем, щоб редактор коду не лаявся на синтаксис (докладніше — у розділі [[ua:authors_main:task_editor:advanced:edit_templates#шаблони_всередині_javascript|Шаблони всередині javascript]]):
// {% match code_1}:{ {%= крокодил}:{
// {% match bonus_2}:{ {%= бегемот}:{
enter('ЗООПАРК');
// %} %}
// %} %}
Що можна перевіряти: ''code_N'', ''bonus_N'', ''gbonus_N'' (а також ''code_first_N'', ''bonus_first_N'', ''gbonus_first_N'' — найперша вбита відповідь). Наскрізні бонуси перевіряються навіть на тих рівнях, де вони не виведені на екран. Повний перелік параметрів — на сторінці [[ua:authors_main:task_editor:advanced:edit_templates|Шаблони]].
===== Спосіб 2: Скрипт із getAllParts / getAllBonuses =====
Функції збирають підсумковий код із відповідей, які вже відображаються на сторінці.
// Склеює відповіді в порядку переліку аргументів
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.
===== Спосіб 3: code_part (застарілий) =====
Частини коду прописуються в тексті завдання або в тексті рішення бонусів та штрафних підказок (у режимі «Джерело»):
* **''номер_складеного_коду''** — порядковий номер складеного коду, якщо їх на рівні кілька (якщо він один — ставте ''0'').
* **'''частинакоду'''** — частина коду рядком, обов'язково в лапках (навіть якщо це число).
* **''число_складених_частин''** — скільки всього частин потрібно зібрати. Щойно на сторінці опиниться зазначена кількість частин, рушій вб'є склеєний код.
Особливості способу:
* Частини склеюються **в порядку виконання ''code_part''**, тобто в порядку виведення блоків на сторінці: спочатку завдання, потім підказки, потім бонуси, потім наскрізні бонуси. Задати свій порядок не можна — під час перестановки бонусів підсумковий код зміниться.
* Перелічувати, звідки брати частини, не потрібно: рушій збирає всі ''code_part'' з однаковим номером, які опинилися на сторінці. Частини можна вільно розкидати по підказках та бонусах, не відстежуючи їхні номери.
* Частину коду задає автор, тому вона не залежить від того, яким синонімом закрито бонус чи підказку (на відміну від способу 2). Але й урахувати конкретний синонім теж не можна — для цього потрібен спосіб 1.
* Загальна кількість частин указується в кожному виклику, тому при зміні їхньої кількості правити доведеться одразу всі частини.
* Частини коду видно у вихідному коді сторінки одразу після відкриття бонусу/підказки.
===== Що обрати =====
^ Спосіб ^ Де обчислюється ^ Порядок частин ^ Коли використовувати ^
| Вкладені шаблони | На сервері | Задає автор | Найуніверсальніший спосіб: працює із синонімами й не показує підсумковий код заздалегідь. Писати потрібно найбільше — матрьошку зручно згенерувати через AI |
| ''getAllParts'' / ''getAllBonuses'' | У браузері | Задає автор (порядок аргументів) | Найменше писати, але погано підходить, якщо у відповідей на частини є синоніми |
| ''code_part'' | У браузері | Порядок виведення на сторінці | Із синонімами працює, але скрипт треба вручну прописати в кожній частині |
Для способу 1 довгу матрьошку шаблонів зручно згенерувати нейромережею — див. [[ua:authors_main:task_editor:ai_authoring|Редагування та генерація завдань за допомогою AI]].