{{indexmenu_n>2}}
===== Імпорт гри з JSON =====
===== Інструменти імпорту =====
Імпорт гри або її частин з її JSON можна зробити кількома способами:
- У [[ua:authors_main:task_editor:editor|редакторі гри]] натиснути **"Вставити завдання з буфера..."** під списком завдань. Це найзвичайніший шлях: редактор розбере JSON, покаже, що в ньому знайшлося, і додасть обране в чернетку — на сервер воно поїде після кнопки "Зберегти...". Докладніше: [[ua: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 з запиту на авторизацію, про що детально описано тут: [[ua:authors_main:admin_api:api_embed_engine|Вбудовування движка в інші сервіси]]
===== Варіанти об'єктів для імпорту =====
Кожен об'єкт, який можна імпортувати, можна експортувати для отримання його структури в поточній грі, як описано в розділі [[ua:authors_main:admin_api:admin_json_export|інструкцій експорту]].
==== Заливка нових рівнів ====
Якщо необхідно додати НОВІ рівні в гру, то JSON буде списком з одного або кількох рівнів, розділених комами. Щоб рівень додався, а не оновився існуючий, він повинен НЕ мати поля number всередині секції налаштувань task. Опис структури рівня [[ua:authors_main:admin_api:admin_api_json#приклад_рівня_цілком|тут]].
==== Редагування існуючих рівнів ====
Якщо необхідно оновити ІСНУЮЧІ рівні в грі, то JSON буде списком з одного або кількох рівнів, розділених комами, причому поле number в секції налаштувань task має бути передано (відповідає номеру рівня, який редагується). Опис структури рівня [[ua:authors_main:admin_api:admin_api_json#приклад_рівня_цілком|тут]].
Налаштування гри з секції task, якщо присутні в JSON - значення в двигуні будуть замінені на нові. Якщо поля відсутні в наданому JSON - то вони будуть залишені як було.
Для інших секцій (codes, bonuses, hints), якщо секція присутня в JSON - то вона повністю замінить існуючу. Якщо відсутня - то секція залишається як була.
Рівень можна знайти не лише за номером: якщо в секції task передати ''id'' рівня (його видає [[ua:authors_main:admin_api:admin_json_export#експорт_з_ідентифікаторами|експорт з ids=1]]), то оновиться саме цей рівень, навіть якщо ви одночасно змінюєте йому номер. Якщо рівня з таким ''id'' у грі немає - імпорт поверне помилку, а не створить новий.
Щоб змінити окремі коди, бонуси чи підказки, не пересилаючи список цілком, є [[#точкове_редагування|секції *_edit]].
==== Заливка всієї гри ====
Є можливість залити всю гру з JSON цілком. Для цього JSON має бути повним JSON гри, як описано на сторінці [[ua:authors_main:admin_api: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'' - його можна отримати [[ua:authors_main:admin_api: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 потрібно передати тільки структуру налаштувань гри, як описано на [[ua:authors_main:admin_api:admin_api_json#налаштування_гри|сторінці структури JSON]].
==== Заливка сквозних бонусів ====
В JSON потрібно передати тільки структуру глобальних бонусів, як описано на [[ua:authors_main:admin_api:admin_api_json#наскрізні_бонуси|сторінці структури JSON]].
==== Заливка лінійок ====
В JSON потрібно передати тільки структуру глобальних бонусів, як описано на [[ua:authors_main:admin_api:admin_api_json#лінійки|сторінці структури JSON]].
===== Використання ШІ (чат-ботів) для створення та редагування рівнів =====
Сучасні чат-боти (ChatGPT, Claude, Gemini та ін.) чудово справляються з генерацією та редагуванням рівнів, кодів, підказок та бонусів у форматі JSON для двигуна qeng.org.
Готовий системний промпт для налаштування чат-бота ви можете знайти в розділі: [[ua:authors_main:authors_ai|Використання ШІ для створення завдань]].