{{indexmenu_n>2}}
===== Импорт игры из JSON =====
===== Инструменты импорта =====
Импорт игры или её частей из её JSON можно провести несколькими способами:
- В [[authors_main:task_editor:editor|редакторе игры]] нажать **"Вставить задания из буфера..."** под списком заданий. Это самый обычный путь: редактор разберёт JSON, покажет, что в нём нашлось, и добавит выбранное в черновик — на сервер оно уедет после кнопки "Сохранить...". Подробнее: [[authors_main:task_editor:task_json|JSON задания и игры]].
- Вставить нужный JSON объект на страницу https://qeng.org/import_tasks.php, указав айди игры, и нажав Импортировать. Эта же ссылка доступна из пункта меню "Импорт заданий" на вкладке "Полезные ссылки" редактора.
- В карточке конкретного задания нажать кнопку **"JSON"** в заголовке и вставить туда JSON одного уровня. Это позволяет быстро обновлять настройки, коды, бонусы и подсказки конкретного уровня.
- (вариант для программистов) Отправить POST запрос на https://qeng.org/import_tasks.php?gid=<ваш айди игры>&json=1, в котором в body будет корректно сформированный JSON объект. Для аутентификации необходимо удержать cookie с запроса на авторизацию, о чём детально написано тут: [[api_embed_engine|Встраивание движка в другие сервисы]]
===== Варианты объектов для импорта =====
Каждый объект, который можно импортировать, можно экспортировать для получения его структуры в текущей игре, как описано в секции [[admin_json_export|инструкций экспорта]].
==== Заливка новых уровней ====
Если необходимо добавить НОВЫЕ уровни в игру, то JSON будет списком из одного или нескольких уровней, разделённых запятыми. Чтобы уровень добавился, а не обновился существующий, он должен НЕ иметь поля number внутри секции настроек task. Описание структуры уровня [[admin_api_json#Пример уровня целиком|тут]].
==== Редактирование существующих уровней ====
Если необходимо обновить СУЩЕСТВУЮЩИЕ уровни в игре, то JSON будет списком из одного или нескольких уровней, разделённых запятыми, причём поле number в секции настроек task должно быть передано (отвечает номер уровня, который редактируется). Описание структуры уровня [[admin_api_json#Пример уровня целиком|тут]].
Настройки игры из секции task, если присутствуют в JSON - значения в движке будут заменены на новые. Если поля отсутствуют в предоставленном JSON - то они будут оставлены как было.
Для остальных секций (codes, bonuses, hints), если секция присутствует в JSON - то она полностью заменит существующую. Если отсутствует - то секция остаётся, как была.
Уровень можно найти не только по номеру: если в секции task передать ''id'' уровня (его выдаёт [[admin_json_export#Экспорт с идентификаторами|экспорт с ids=1]]), то обновится именно этот уровень, даже если вы одновременно меняете ему номер. Если уровня с таким ''id'' в игре нет - импорт вернёт ошибку, а не создаст новый.
Чтобы изменить отдельные коды, бонусы или подсказки, не пересылая список целиком, есть [[#Точечное редактирование|секции *_edit]].
==== Заливка всей игры ====
Есть возможность залить всю игру из JSON целиком. Для этого JSON должен быть полным JSON игры, как описано на странице [[admin_api_json#Пример всей игры целиком|описания структуры JSON]]. Также в JSON необходимо добавить поле ''%%"delete_all_tasks": 1%%'', чтобы удалить все существующие уровни и перезалить игру заново, например:
{
"game": {
"name": "#New Unnamed Game 2",
},
"tasks": [{"task": {"number": 1, "working_name": "Название"}, "codes": [], "bonuses": [], "hints": []}],
"gbonuses": [],
"lines": [],
"delete_all_tasks": 1,
}
Настройки игры из секции game, если присутствуют в JSON - значения в движке будут заменены на новые. Если поля отсутствуют в предоставленном JSON - то они будут оставлены как было в игре раньше.
Для остальных секций (gbonuses, lines), если секция присутствует в JSON - то она полностью заменит существующую. Если отсутствует - то секция остаётся, как была.
===== Точечное редактирование =====
Секции ''codes'', ''bonuses'', ''hints'', ''gbonuses'' и ''tasks'' заменяют список целиком - это удобно, когда вы формируете игру заново, но значит, что ради одного изменённого кода приходится пересылать весь уровень.
Рядом с каждой такой секцией есть её "редактирующий" вариант: ''codes_edit'', ''bonuses_edit'', ''hints_edit'', ''gbonuses_edit'', ''tasks_edit''. В нём перечисляются только те элементы, которые вы меняете:
{
"tasks_edit": [
{
"task": {"id": 123, "working_name": "Новое название"},
/* у уровня меняется только название - текст задания пересылать не нужно */
"codes_edit": [
{"id": 56, "delete": 1},
/* этот код удаляется */
{"id": 55, "code": "abc"},
/* у этого меняется только поле code */
{"code": "новый код"}
/* а этот добавляется в конец списка */
]
}
]
}
Правила:
* элемент адресуется по ''id'' - его можно получить [[admin_json_export#Экспорт с идентификаторами|экспортом с ids=1]];
* если ''id'' нет, элемент ищется по ''number'' (порядковому номеру в списке);
* если нет ни того, ни другого - элемент добавляется в конец списка;
* ''"delete": 1'' удаляет элемент. Удаления применяются раньше остальных изменений, поэтому в одном запросе можно удалить один код и добавить другой;
* элементы, которые вы не упомянули, остаются нетронутыми - в этом всё отличие от обычной секции;
* передаются только изменившиеся поля, остальные остаются как были;
* поле ''number'' у кодов, бонусов и подсказок движок пересчитывает сам, чтобы номера шли подряд без пропусков (на них ссылаются подсказки вида ''%%%codes 2-5%%%'').
Указывать для одного списка сразу и ''codes'', и ''codes_edit'' нельзя - вторая секция правила бы элементы, которые первая только что удалила.
==== Удаление уровня ====
Уровень удаляется через ''tasks_edit'':
{
"tasks_edit": [
{"task": {"id": 123}, "delete": 1},
{"task": {"id": 124, "number": 1}}
/* и, например, сдвинуть следующий уровень на освободившийся номер */
]
}
Вместе с уровнем удаляются его коды, бонусы, подсказки и ответы команд - поэтому в уже начавшейся игре удаление уровня запрещено. Чтобы удалить все уровни сразу, используется ''%%"delete_all_tasks": 1%%'' (см. выше).
Номера уровней движок не трогает: на них ссылаются линейки, поэтому после удаления уровня перенумерацию оставшихся вы задаёте сами, в том же запросе.
==== Ошибки ====
* ''ROW_ID_NOT_FOUND'' - элемента с таким ''id'' нет в этом уровне (или в этой игре);
* ''TASK_ID_NOT_FOUND'' - уровня с таким ''id'' нет в этой игре;
* ''DUPLICATE_ROW_KEY'', ''DUPLICATE_TASK_ID'' - один и тот же элемент (уровень) упомянут в запросе дважды;
* ''DELETE_TARGET_NOT_FOUND'' - удалять нечего: элемент не найден или не назван;
* ''LIST_AND_EDIT'' - в одном запросе есть и ''codes'', и ''codes_edit'';
* ''DELETE_FORBIDDEN'' - удаление уровня в уже начавшейся игре.
==== Заливка настроек игры ====
В JSON нужно передать только структуру настроек игры, как описано на [[admin_api_json#Настройки игры|странице структуры JSON]].
==== Заливка сквозных бонусов ====
В JSON нужно передать только структуру глобальных бонусов, как описано на [[admin_api_json#Сквозные бонусы|странице структуры JSON]].
==== Заливка линеек ====
В JSON нужно передать только структуру глобальных бонусов, как описано на [[admin_api_json#Линейки|странице структуры JSON]].
===== Использование ИИ (чат-ботов) для создания и редактирования уровней =====
Современные чат-боты (ChatGPT, Claude, Gemini и др.) отлично справляются с генерацией и редактированием уровней, кодов, подсказок и бонусов в формате JSON для движка qeng.org.
Готовый системный промпт для настройки чат-бота вы можете найти в разделе: [[authors_main:authors_ai|Использование ИИ для создания заданий]].