uk:authors_main:task_editor:advanced:server_actions

Серверні дії {! ... !}

Маркер {! … !} — службовий рядок у тексті завдання. Рушій вирізає його з тексту й сам робить те, що в ньому написано: вбиває код від імені команди або завершує команді гру. Гравець маркера не бачить — ні на сторінці, ні у вихідному коді.

Вбити код можна було й раніше — скриптом, <script>enter('код')</script>. Різниця в тому, де лежить код. У скрипта він у сторінці гравця: відкрий вихідний код — і ось він. Маркер виконує сервер, і в сторінку не потрапляє ні код, ні сам маркер.

Приклад у грі

{! code ньютон !}                               вбити код
{! code ньютон, лейбніц !}                      вбити кілька кодів
{! finish_game !}                               завершити команді гру
{! on gps 51.5299 -0.1275: code ньютон !}       вбити код, коли гравець дійшов до точки
{! on gps 51.5299 -0.1275: code ньютон: zone двір !}   дві дії одним маркером
  • Дію та її аргументи розділяє пробіл: code ньютон, а не code: ньютон.
  • Двокрапка ділить маркер на частини — умову й дії. Умова пишеться першою, зі слова on; умова поки одна — точка на місцевості, про неї сторінка GPS.
  • Дій може бути кілька, через двокрапку: вони спрацьовують по черзі, так само, якби стояли окремими маркерами. Якщо не розібралася одна, не спрацьовує весь маркер.
  • Усередині маркера можна писати коментар /* … */, як у шаблонах. Гравцеві його не видно, а тестувальник побачить його підписом.

Окремого «якщо» в маркера немає: він спрацьовує, поки видно текст, у якому стоїть. Потрібна умова виходить вибором місця:

Де стоїть маркер Коли спрацьовує
Текст завдання одразу, як завдання відкрили
Підказка коли підказка прийшла або її взяли
Опис бонусу поки бонус не розв'язано
Текст після розв'язання бонусу коли бонус розв'язано
Наскрізний бонус на кожному завданні, де цей бонус діє
Гілка шаблону {% match %} коли спрацювала ця гілка

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

  • Код зараховується команді так само, як вбитий гравцем, а бонус за нього нараховується як зазвичай — часом або балами.
  • Спроб команди це не витрачає: ліміт відповідей маркер не чіпає.
  • У журналі відповідей такий код записано без гравця — його вбив рушій, а не людина.
  • Один маркер — один раз. Маркер у тексті завдання видно на кожному завантаженні сторінки, але код, який уже вбито, він пропускає. Той самий маркер, поставлений і в тексті завдання, і в бонусі, — це одна дія.
  • Код має бути кодом або бонусом цього завдання, підходить і наскрізний бонус. Чужий код маркер мовчки пропустить, а редактор попередить про це під час збереження.

Усе це — про маркер без умови. Код gps-зони (on gps) сервер не вбиває сам, а називає сторінці гравця, і та вбиває його звичайною відповіддю: у журналі він записаний за гравцем, який дійшов. Докладніше — GPS.

Маркер усередині гілки шаблону спрацьовує, коли гілка відкрилася. А відкрити її може код, який вбив інший маркер. Так збирається ланцюжок:

{! code старт !}
{% match code_1 }:{ {%= старт}:{ {! code другий !} %} %}

Завдання відкрили — сервер вбив старт, гілка за першим сектором відкрилася, і маркер у ній вбив другий. Гравцеві не треба перезавантажувати сторінку: рушій дограває ланцюжок у тому самому запиті. Якщо вбитий код закрив завдання, маркери наступного завдання спрацюють, щойно команда на нього перейшла.

Так само зручно збирати складений код: у найглибший шаблон матрьошки замість <script>enter('ПІДСУМОК')</script> ставиться {! code ПІДСУМОК !}, і підсумкового коду немає в сторінці навіть тієї миті, коли він вбивається.

Звичайний code спрацьовує один раз. Якщо потрібно, щоб маркер вбивав код знову й знову, перед кодом пишеться умова про поле у квадратних дужках:

{! code [c1 !=] зона_а !}     вбити, якщо в секторі 1 зараз НЕ цей код
{! code [c2 <] 3ворота !}     вбити, якщо в секторі 2 код з меншим числом на початку
  • Поле пишеться так само, як у скриптах: c1 — сектор, b2 — бонус, gb3 — наскрізний бонус.
  • Код рівно один, і він має бути відповіддю саме цього поля. Інакше поле від коду не зміниться, і маркер вбивав би його нескінченно, — тому таке збереження редактор відхилить.
  • Операторів два. != — «у полі зараз інше»: сектор зберігає останній код, що до нього ввійшов, тож два маркери з різними кодами на один сектор роблять із нього перемикач. < — «у полі код з меншим числом на початку»: так робиться пріоритет, коли важливий найкращий із досягнутих результатів. Код для < мусить починатися з цифри.

Найбільше умова про поле потрібна в gps-іграх, де перемикач команда рухає ногами, — приклади на сторінці GPS.

Два маркери, що змагаються за одне поле в одному відмальовуванні, рушій не перекидатиме туди-сюди: застосує перший, зупиниться й напише про це тестувальникові.

{! finish_game !} закриває команді всю лінійку одразу: завдання, на якому вона стоїть, і всі, до яких вона не дійшла. Команда одразу бачить фінішну сторінку, ніби розв'язала останнє завдання.

У статистиці такі завдання позначено «Гру завершено». У завдання, на якому команда стояла, записано час, який вона на ньому провела; у тих, куди вона не дійшла, час нульовий.

Аргументів і умови в дії немає. Завершити гру за точкою на місцевості — це два кроки: зона вбиває код, а finish_game стоїть у гілці шаблону за цим кодом.

{! on gps 51.5299 -0.1275: code фініш !}
{% match code_1 }:{ {%= фініш}:{ {! finish_game !} %} %}
Обережно: у тестувальника finish_game спрацьовує так само, як у команди, — інакше кінцівку не перевірити. Тестувальникові це не страшно, «Рестарт гри» в панелі тестування починає все заново. А команді в справжній грі повернути закриті завдання нічим.

Маркер невидимий, і зі сторінки не зрозуміти, спрацював він чи ні. Для цього в тестувальника в панелі тестування внизу сторінки є вкладка «Дії» — вона з'являється, коли маркери на цьому завантаженні щось зробили або в них знайшлася помилка.

Вкладка «Дії»: що вбили маркери на цьому завантаженні сторінки

Рядків буває більше, ніж маркерів: рушій проходить завдання заново після кожного вбитого коду, і вже зроблене позначає «код уже було вбито».

  • вбито код — маркер спрацював;
  • код уже було вбито — маркер на місці, але робити йому нічого;
  • такого коду в завданні немає - дію пропущено — одрук у коді або код з іншого завдання;
  • поле вже таке, якого просить умова — умова про поле не пропустила;
  • гру завершено, закрито завдань — спрацював finish_game;
  • ланцюжок замкнувся на цьому маркері — два маркери змагаються за одне поле;
  • помилки розбору маркера — червоним угорі.

Маркери з умовою on gps показує сусідня вкладка «GPS»: там зони на карті, і позицію гравця можна посунути, не виходячи з дому. Докладніше — GPS.

Відхиляє збереження:

  • маркер, який не розібрався: незнайома дія, code без коду, немає закривального !};
  • маркер усередині маркера;
  • маркер у назві коду або підказки;
  • умову про поле, якого в завданні немає, або код, що не є відповіддю цього поля;
  • finish_game з умовою або з аргументами.

Попереджає, але зберігає:

  • код, якого немає серед кодів і бонусів завдання, — його можна дописати наступним збереженням;
  • gps-маркери без gps_start() у скрипті завдання.
  • uk/authors_main/task_editor/advanced/server_actions.txt
  • Востаннє змінено: 2026/09/18 06:51
  • (зовнішнє редагування)