Импорт игры или её частей из её JSON можно провести несколькими способами:
Каждый объект, который можно импортировать, можно экспортировать для получения его структуры в текущей игре, как описано в секции инструкций экспорта.
Если необходимо добавить НОВЫЕ уровни в игру, то JSON будет списком из одного или нескольких уровней, разделённых запятыми. Чтобы уровень добавился, а не обновился существующий, он должен НЕ иметь поля number внутри секции настроек task. Описание структуры уровня тут.
Если необходимо обновить СУЩЕСТВУЮЩИЕ уровни в игре, то JSON будет списком из одного или нескольких уровней, разделённых запятыми, причём поле number в секции настроек task должно быть передано (отвечает номер уровня, который редактируется). Описание структуры уровня тут.
Настройки игры из секции task, если присутствуют в JSON - значения в движке будут заменены на новые. Если поля отсутствуют в предоставленном JSON - то они будут оставлены как было.
Для остальных секций (codes, bonuses, hints), если секция присутствует в JSON - то она полностью заменит существующую. Если отсутствует - то секция остаётся, как была.
Уровень можно найти не только по номеру: если в секции task передать id уровня (его выдаёт экспорт с ids=1), то обновится именно этот уровень, даже если вы одновременно меняете ему номер. Если уровня с таким id в игре нет - импорт вернёт ошибку, а не создаст новый.
Чтобы изменить отдельные коды, бонусы или подсказки, не пересылая список целиком, есть секции *_edit.
Есть возможность залить всю игру из JSON целиком. Для этого JSON должен быть полным 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 - его можно получить экспортом с 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 нужно передать только структуру настроек игры, как описано на странице структуры JSON.
В JSON нужно передать только структуру глобальных бонусов, как описано на странице структуры JSON.
В JSON нужно передать только структуру глобальных бонусов, как описано на странице структуры JSON.
Современные чат-боты (ChatGPT, Claude, Gemini и др.) отлично справляются с генерацией и редактированием уровней, кодов, подсказок и бонусов в формате JSON для движка qeng.org.
Готовый системный промпт для настройки чат-бота вы можете найти в разделе: Использование ИИ для создания заданий.