Серверні дії {! ... !}
Маркер {! … !} — службовий рядок у тексті завдання. Рушій вирізає його з тексту й сам робить те, що в ньому написано: вбиває код від імені команди або завершує команді гру. Гравець маркера не бачить — ні на сторінці, ні у вихідному коді.
Вбити код можна було й раніше — скриптом, <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 !} закриває команді всю лінійку одразу: завдання, на якому вона стоїть, і всі, до яких вона не дійшла. Команда одразу бачить фінішну сторінку, ніби розв'язала останнє завдання.
У статистиці такі завдання позначено «Гру завершено». У завдання, на якому команда стояла, записано час, який вона на ньому провела; у тих, куди вона не дійшла, час нульовий.
Аргументів і умови в дії немає. Завершити гру за точкою на місцевості — це два кроки: зона вбиває код, а 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()у скрипті завдання.
