{{indexmenu_n>22}}
====== Серверные действия {! ... !} ======
**Маркер** ''{! ... !}'' — служебная строка в тексте задания. Движок вырезает её из текста и сам делает то, что в ней написано: вбивает код от имени команды или завершает команде игру. Игрок маркера не видит — ни на странице, ни в исходном коде.
Вбить код можно было и раньше — скриптом, ''''. Разница в том, где лежит код. У скрипта он в странице игрока: открой исходник — и вот он. Маркер исполняет сервер, и в страницу не попадает ни код, ни сам маркер.
[[https://qeng.org/game.php?jump_to&gid=3493&task_id=84063|Пример в игре]]
===== Как пишется =====
{! code ньютон !} вбить код
{! code ньютон, лейбниц !} вбить несколько кодов
{! finish_game !} завершить команде игру
{! on gps 51.5299 -0.1275: code ньютон !} вбить код, когда игрок дошёл до точки
{! on gps 51.5299 -0.1275: code ньютон: zone двор !} два действия одним маркером
* Действие и его аргументы разделяет **пробел**: ''code ньютон'', а не ''code: ньютон''.
* **Двоеточие** делит маркер на части — условие и действия. Условие пишется первым, со слова ''on''; условие пока одно — точка на местности, о нём страница [[authors_main:task_editor:advanced:gps|GPS]].
* Действий может быть несколько, через двоеточие: они срабатывают по порядку, как если бы стояли отдельными маркерами. Если не разобралось одно, не срабатывает весь маркер.
* Внутри маркера можно писать комментарий ''/* ... */'', как в шаблонах. Игроку его не видно, а тестер увидит его подписью.
===== Когда срабатывает =====
Отдельного «если» у маркера нет: **он срабатывает, пока виден текст, в котором стоит.** Нужное условие получается выбором места:
^ Где стоит маркер ^ Когда срабатывает ^
| Текст задания | сразу, как задание открыли |
| Подсказка | когда подсказка пришла или её взяли |
| Описание бонуса | пока бонус не решён |
| Текст после решения бонуса | когда бонус решён |
| Сквозной бонус | на любом задании, где этот бонус действует |
| Ветка шаблона ''{% match %}'' | когда сработала эта ветка |
Не работает маркер в названии кода и в названии подсказки — такое сохранение редактор отклонит. **В скрипте задания маркер тоже не работает:** скрипт движок собирает отдельно, и маркер там останется просто текстом. Ставьте его в текст задания, подсказки или бонуса.
===== Что значит «вбил сервер» =====
* Код засчитывается команде так же, как вбитый игроком, а бонус за него начисляется как обычно — временем или баллами.
* Попыток команды это не тратит: лимит ответов маркер не трогает.
* В журнале ответов такой код записан **без игрока** — его вбил движок, а не человек.
* **Один маркер — один раз.** Маркер в тексте задания виден на каждой загрузке страницы, но код, который уже вбит, он пропускает. Тот же маркер, поставленный и в тексте задания, и в бонусе, — это одно действие.
* Код должен быть кодом или бонусом этого задания, подходит и сквозной бонус. Чужой код маркер молча пропустит, а редактор предупредит об этом при сохранении.
Всё это — про маркер без условия. Код gps-зоны (''on gps'') сервер не вбивает сам, а называет странице игрока, и та вбивает его обычным ответом: в журнале он записан за игроком, который дошёл. Подробнее — [[authors_main:task_editor:advanced:gps|GPS]].
===== Цепочки =====
Маркер внутри ветки шаблона срабатывает, когда ветка открылась. А открыть её может код, который вбил другой маркер. Так собирается цепочка:
{! code старт !}
{% match code_1 }:{ {%= старт}:{ {! code второй !} %} %}
Задание открыли — сервер вбил ''старт'', ветка по первому сектору открылась, и маркер в ней вбил ''второй''. Игроку не нужно перезагружать страницу: движок доигрывает цепочку за тот же запрос. Если вбитый код закрыл задание, маркеры следующего задания сработают, как только команда на него перешла.
Так же удобно собирать [[authors_main:task_editor:advanced:composite_codes|составной код]]: в самый внутренний шаблон матрёшки вместо '''' ставится ''{! code ИТОГ !}'', и итогового кода нет в странице даже в момент, когда он вбивается.
===== Условие о поле: переключатель =====
Обычный ''code'' срабатывает один раз. Если нужно, чтобы маркер вбивал код снова и снова, перед кодом пишется **условие о поле** в квадратных скобках:
{! code [c1 !=] зона_а !} вбить, если в секторе 1 сейчас НЕ этот код
{! code [c2 <] 3ворота !} вбить, если в секторе 2 код с меньшим числом в начале
* Поле пишется так же, как в скриптах: ''c1'' — сектор, ''b2'' — бонус, ''gb3'' — сквозной бонус.
* Код ровно один, и он должен быть ответом **именно этого поля**. Иначе поле от кода не изменится, и маркер вбивал бы его бесконечно, — поэтому такое сохранение редактор отклонит.
* Оператора два. ''!='' — «в поле сейчас другое»: сектор хранит последний вошедший в него код, так что два маркера с разными кодами на один сектор делают из него переключатель. ''<'' — «в поле код с меньшим числом в начале»: так делается приоритет, когда важен лучший из достигнутых результатов. Код для ''<'' обязан начинаться с цифры.
Больше всего условие о поле нужно в gps-играх, где переключатель команда двигает ногами, — примеры на странице [[authors_main:task_editor:advanced:gps|GPS]].
Два маркера, которые спорят за одно поле в одной отрисовке, движок не будет перекидывать туда-сюда: применит первый, остановится и напишет об этом тестеру.
===== Завершить игру: finish_game =====
''{! finish_game !}'' закрывает команде **всю линейку разом**: задание, на котором она стоит, и все, до которых она не дошла. Команда сразу видит финишную страницу, как если бы решила последнее задание.
В статистике такие задания помечены «Игра завершена». У задания, на котором команда стояла, записано время, которое она на нём провела; у тех, куда она не дошла, время нулевое.
Аргументов и условия у действия нет. Завершить игру по точке на местности — это два шага: зона вбивает код, а ''finish_game'' стоит в ветке шаблона по этому коду.
{! on gps 51.5299 -0.1275: code финиш !}
{% match code_1 }:{ {%= финиш}:{ {! finish_game !} %} %}
> **Осторожно:** у тестера ''finish_game'' срабатывает так же, как у команды, — иначе концовку было бы не проверить. Тестеру это не страшно, «Рестарт игры» в панели тестирования начинает всё заново. А команде в настоящей игре вернуть закрытые задания нечем.
===== Как проверить: вкладка «Действия» =====
Маркер невидим, и по странице не понять, сработал он или нет. Для этого у тестера в панели тестирования внизу страницы есть вкладка **«Действия»** — она появляется, когда маркеры на этой загрузке что-то сделали или в них нашлась ошибка.
{{ :authors_main:task_editor:advanced:server_actions_tab.png?800 |Вкладка «Действия»: что вбили маркеры на этой загрузке страницы}}
Строк бывает больше, чем маркеров: движок проходит задание заново после каждого вбитого кода, и уже сделанное отмечает «код уже был вбит».
* **вбит код** — маркер сработал;
* **код уже был вбит** — маркер на месте, но делать ему нечего;
* **такого кода в задании нет — действие пропущено** — опечатка в коде или код из другого задания;
* **поле уже такое, какого просит условие** — условие о поле не пустило;
* **игра завершена, закрыто заданий** — сработал ''finish_game'';
* **цепочка замкнулась на этом маркере** — два маркера спорят за одно поле;
* ошибки разбора маркера — красным сверху.
Маркеры с условием ''on gps'' показывает соседняя вкладка «GPS»: там зоны на карте, и позицию игрока можно подвинуть, не выходя из дома. Подробнее — [[authors_main:task_editor:advanced:gps|GPS]].
===== Что проверяет редактор при сохранении =====
Отклоняет сохранение:
* маркер, который не разобрался: незнакомое действие, ''code'' без кода, нет закрывающего ''!}'';
* маркер внутри маркера;
* маркер в названии кода или подсказки;
* условие о поле, которого в задании нет, или код, который не является ответом этого поля;
* ''finish_game'' с условием или с аргументами.
Предупреждает, но сохраняет:
* код, которого нет среди кодов и бонусов задания, — его можно дописать следующим сохранением;
* gps-маркеры без ''gps_start()'' в скрипте задания.
===== Дополнительная информация =====
* [[authors_main:task_editor:advanced:edit_templates|Шаблоны]] — ветки, внутри которых маркер срабатывает по условию
* [[authors_main:task_editor:advanced:composite_codes|Составные коды]]
* [[authors_main:task_editor:advanced:gps|GPS]] — зоны на местности