{{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]] — зоны на местности