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