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() в скрипте задания.
  • authors_main/task_editor/advanced/server_actions.txt
  • Последние изменения: 2026/09/18 06:51
  • (внешнее изменение)