Серверные действия {! ... !}
Маркер {! … !} — служебная строка в тексте задания. Движок вырезает её из текста и сам делает то, что в ней написано: вбивает код от имени команды или завершает команде игру. Игрок маркера не видит — ни на странице, ни в исходном коде.
Вбить код можно было и раньше — скриптом, <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()в скрипте задания.
