Fixing minor bugs in texts, encoding, UI

This commit is contained in:
Vladislav Khorev 2026-07-12 12:07:58 +03:00
parent 79413e7319
commit d4365728fe
87 changed files with 883 additions and 404 deletions

View File

@ -2,7 +2,7 @@
"npcs": [ "npcs": [
{ {
"id": "npc_teacher01", "id": "npc_teacher01",
"name": "Аида Джаныбековна", "name": "Аида Дженибековна",
"animationIdlePath": "resources/w/new_anims/teacher_stand_idle001_small.anim", "animationIdlePath": "resources/w/new_anims/teacher_stand_idle001_small.anim",
"animationWalkPath": "resources/w/new_anims/teacher_walk001_small.anim", "animationWalkPath": "resources/w/new_anims/teacher_walk001_small.anim",
"meshTextures": { "meshTextures": {

View File

@ -20,7 +20,7 @@
"objectives": [ "objectives": [
{ "id": "ghost_lore_aiperi", "text": "Поговорить с Айпери", "completed": false }, { "id": "ghost_lore_aiperi", "text": "Поговорить с Айпери", "completed": false },
{ "id": "ghost_lore_alik", "text": "Поговорить с Аликом", "completed": false, "visible": false }, { "id": "ghost_lore_alik", "text": "Поговорить с Аликом", "completed": false, "visible": false },
{ "id": "ghost_lore_teacher", "text": "Поговорить с Аидой Джаныбековной", "completed": false } { "id": "ghost_lore_teacher", "text": "Поговорить с Аидой Дженибековной", "completed": false }
] ]
}, },
{ {
@ -31,7 +31,7 @@
"description": "История Бегимай еще более загадочная. Во время сдачи курсовой работы в университете происходила генеральная уборка. По случайности, ее курсовая работа оказалась в стопке бумаг на выброс. В результате курсач оказался на помойке, а преподаватель, не обнаружив курсовую работу, поставил ей ноль баллов. По словам Алика, курсовая работа до сих пор лежит в куче мусора во дворе университета.", "description": "История Бегимай еще более загадочная. Во время сдачи курсовой работы в университете происходила генеральная уборка. По случайности, ее курсовая работа оказалась в стопке бумаг на выброс. В результате курсач оказался на помойке, а преподаватель, не обнаружив курсовую работу, поставил ей ноль баллов. По словам Алика, курсовая работа до сих пор лежит в куче мусора во дворе университета.",
"objectives": [ "objectives": [
{ "id": "ghost_coursework_find", "text": "Найти курсовую работу Бегимай", "completed": false }, { "id": "ghost_coursework_find", "text": "Найти курсовую работу Бегимай", "completed": false },
{ "id": "ghost_coursework_mark", "text": "Показать курсовую работу Аиде Джаныбековной", "completed": false } { "id": "ghost_coursework_mark", "text": "Показать курсовую работу Аиде Дженибековной", "completed": false }
] ]
}, },
{ {
@ -51,7 +51,7 @@
"title": "Манасоведение", "title": "Манасоведение",
"status": "Available", "status": "Available",
"autoComplete": true, "autoComplete": true,
"description": "Скоро будет модуль по Манасоведению, а я еще ни разу не ходил на лекции. Сегодня у нас лекция по Манасоведению, надо ее посетить и получить у преподавательницы Аиды Джаныбековной задание на модуль.", "description": "Скоро будет модуль по Манасоведению, а я еще ни разу не ходил на лекции. Сегодня у нас лекция по Манасоведению, надо ее посетить и получить у преподавательницы Аиды Дженибековной задание на модуль.",
"objectives": [ "objectives": [
{ "id": "study_beginning_lecture", "text": "Посетить лекцию", "completed": false }, { "id": "study_beginning_lecture", "text": "Посетить лекцию", "completed": false },
{ "id": "study_beginning_task", "text": "Получить задание на модуль", "completed": false } { "id": "study_beginning_task", "text": "Получить задание на модуль", "completed": false }
@ -61,7 +61,7 @@
"id": "study_project", "id": "study_project",
"title": "Эссе манасчи", "title": "Эссе манасчи",
"status": "Hidden", "status": "Hidden",
"description": "Преподавательница по манасоведению Аида Джаныбековна дала мне задачу - найти в библиотеке книгу про манасчи Жусупа Мамая, и написать по этой книге эссе. Книгу нельзя выносить из библиотеки, но можно воспользоваться стоящим в библиотеке компьютером, чтобы написать эссе. Эссе нужно успеть написать до завтра.", "description": "Преподавательница по манасоведению Аида Дженибековна дала мне задачу - найти в библиотеке книгу про манасчи Жусупа Мамая, и написать по этой книге эссе. Книгу нельзя выносить из библиотеки, но можно воспользоваться стоящим в библиотеке компьютером, чтобы написать эссе. Эссе нужно успеть написать до завтра.",
"objectives": [ "objectives": [
{ "id": "study_project_book", "text": "Найти книгу", "completed": false }, { "id": "study_project_book", "text": "Найти книгу", "completed": false },
{ "id": "study_project_write", "text": "Написать эссе", "completed": false }, { "id": "study_project_write", "text": "Написать эссе", "completed": false },

View File

@ -11,8 +11,8 @@
"en": "Aiperi" "en": "Aiperi"
}, },
{ {
"key": "Аида Джаныбековна", "key": "Аида Дженибековна",
"ru": "Аида Джаныбековна", "ru": "Аида Дженибековна",
"en": "Aida Dzhanybekovna" "en": "Aida Dzhanybekovna"
}, },
{ {

View File

@ -333,77 +333,77 @@
], ],
"lines": [ "lines": [
{ {
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"text": "Опаздывающие, заходите скорее и занимайте свои места! Лекция начинается!", "text": "Опаздывающие, заходите скорее и занимайте свои места! Лекция начинается!",
"durationMs": 4000, "durationMs": 4000,
"waitForConfirm": false, "waitForConfirm": false,
"luaCallback": "" "luaCallback": ""
}, },
{ {
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"text": "В эпизоде \"Семетей\" трилогии \"Манас\", изменники Канчоро и Кыяз захватывают власть над кыргызами.", "text": "В эпизоде \"Семетей\" трилогии \"Манас\", изменники Канчоро и Кыяз захватывают власть над кыргызами.",
"durationMs": 3200, "durationMs": 3200,
"waitForConfirm": false, "waitForConfirm": false,
"luaCallback": "" "luaCallback": ""
}, },
{ {
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"text": "Чтобы спасти раненого богатыря Семетея, фея Кёкмончок с помощью заклинания уводит его в иной мир.", "text": "Чтобы спасти раненого богатыря Семетея, фея Кёкмончок с помощью заклинания уводит его в иной мир.",
"durationMs": 3201, "durationMs": 3201,
"waitForConfirm": false, "waitForConfirm": false,
"luaCallback": "" "luaCallback": ""
}, },
{ {
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"text": "Этот мир описан в эпосе Манас как Кайып или Аль-Гайб, но некоторые ученые называют его миром теней.", "text": "Этот мир описан в эпосе Манас как Кайып или Аль-Гайб, но некоторые ученые называют его миром теней.",
"durationMs": 3202, "durationMs": 3202,
"waitForConfirm": false, "waitForConfirm": false,
"luaCallback": "" "luaCallback": ""
}, },
{ {
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"text": "В этом мире обитают феи, духи и джинны. Простым смертным в этот мир дорога закрыта.", "text": "В этом мире обитают феи, духи и джинны. Простым смертным в этот мир дорога закрыта.",
"durationMs": 3200, "durationMs": 3200,
"waitForConfirm": false, "waitForConfirm": false,
"luaCallback": "" "luaCallback": ""
}, },
{ {
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"text": "Время там течет по другому - за один день в теневом мире могут пройти годы жизни обычного мира.", "text": "Время там течет по другому - за один день в теневом мире могут пройти годы жизни обычного мира.",
"durationMs": 3200, "durationMs": 3200,
"waitForConfirm": false, "waitForConfirm": false,
"luaCallback": "" "luaCallback": ""
}, },
{ {
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"text": "Обычно, мир теней никак не пересекается с нашим миром живых людей.", "text": "Обычно, мир теней никак не пересекается с нашим миром живых людей.",
"durationMs": 3200, "durationMs": 3200,
"waitForConfirm": false, "waitForConfirm": false,
"luaCallback": "" "luaCallback": ""
}, },
{ {
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"text": "Но в критические моменты для народа, обитатели теневого мира могут приходить в наш мир.", "text": "Но в критические моменты для народа, обитатели теневого мира могут приходить в наш мир.",
"durationMs": 3200, "durationMs": 3200,
"waitForConfirm": false, "waitForConfirm": false,
"luaCallback": "" "luaCallback": ""
}, },
{ {
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"text": "Совсем недавно закончилась пандемия, а сегодня мир захлестнули кровавые войны.", "text": "Совсем недавно закончилась пандемия, а сегодня мир захлестнули кровавые войны.",
"durationMs": 3200, "durationMs": 3200,
"waitForConfirm": false, "waitForConfirm": false,
"luaCallback": "" "luaCallback": ""
}, },
{ {
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"text": "В такие кризисные моменты истории, грань между мирами становится особенно тонкой.", "text": "В такие кризисные моменты истории, грань между мирами становится особенно тонкой.",
"durationMs": 3200, "durationMs": 3200,
"waitForConfirm": false, "waitForConfirm": false,
"luaCallback": "" "luaCallback": ""
}, },
{ {
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"text": "На сегодня лекция завершена. Все свободны! Задания на этот модуль вы получите индивидуально!", "text": "На сегодня лекция завершена. Все свободны! Задания на этот модуль вы получите индивидуально!",
"durationMs": 4000, "durationMs": 4000,
"waitForConfirm": false, "waitForConfirm": false,

View File

@ -92,7 +92,7 @@
"type": "Line", "type": "Line",
"speaker": "Айпери", "speaker": "Айпери",
"portrait": "resources/dialogue/portrait_phone.png", "portrait": "resources/dialogue/portrait_phone.png",
"text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "text": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.",
"next": "line_2", "next": "line_2",
"chatBubble": "in" "chatBubble": "in"
}, },
@ -756,7 +756,7 @@
"type": "Line", "type": "Line",
"speaker": "Алик", "speaker": "Алик",
"portrait": "resources/dialogue/portrait_student_boy.png", "portrait": "resources/dialogue/portrait_student_boy.png",
"text": "А ведь у нас в этом году новая преподавательница, Аида Джаныбековна!", "text": "А ведь у нас в этом году новая преподавательница, Аида Дженибековна!",
"next": "line_27" "next": "line_27"
}, },
{ {
@ -780,7 +780,7 @@
"type": "Line", "type": "Line",
"speaker": "Алик", "speaker": "Алик",
"portrait": "resources/dialogue/portrait_student_boy.png", "portrait": "resources/dialogue/portrait_student_boy.png",
"text": "Так что Аида Джаныбековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.", "text": "Так что Аида Дженибековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.",
"next": "line_30" "next": "line_30"
}, },
{ {
@ -828,7 +828,7 @@
"type": "Line", "type": "Line",
"speaker": "Алик", "speaker": "Алик",
"portrait": "resources/dialogue/portrait_student_boy.png", "portrait": "resources/dialogue/portrait_student_boy.png",
"text": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Джаныбековна.", "text": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Дженибековна.",
"next": "line_23" "next": "line_23"
}, },
{ {

View File

@ -1,8 +1,8 @@
{ {
"dialogue_translations": [ "dialogue_translations": [
{ {
"key": "Аида Джаныбековна", "key": "Аида Дженибековна",
"ru": "Аида Джаныбековна", "ru": "Аида Дженибековна",
"en": "Aida Dzhanybekovna" "en": "Aida Dzhanybekovna"
}, },
{ {

View File

@ -41,8 +41,8 @@
"en": "Aiperi" "en": "Aiperi"
}, },
{ {
"key": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", "key": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.",
"ru": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", "ru": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.",
"en": "Bekzat, remember we chipped in for a cake for Aida Dzhanybekova? I brought a tablecloth, plates, and a cake knife back then. And I still haven't gotten anything back." "en": "Bekzat, remember we chipped in for a cake for Aida Dzhanybekova? I brought a tablecloth, plates, and a cake knife back then. And I still haven't gotten anything back."
}, },
{ {
@ -301,8 +301,8 @@
"en": "I don't think I've ever seen you in a Manas studies class." "en": "I don't think I've ever seen you in a Manas studies class."
}, },
{ {
"key": "А ведь у нас в этом году новая преподавательница, Аида Джаныбековна!", "key": "А ведь у нас в этом году новая преподавательница, Аида Дженибековна!",
"ru": "А ведь у нас в этом году новая преподавательница, Аида Джаныбековна!", "ru": "А ведь у нас в этом году новая преподавательница, Аида Дженибековна!",
"en": "But we have a new teacher this year, Aida Dzhanybekovna!" "en": "But we have a new teacher this year, Aida Dzhanybekovna!"
}, },
{ {
@ -316,8 +316,8 @@
"en": "The previous teacher was a real beast, he failed everyone, and we had a hard time passing our coursework." "en": "The previous teacher was a real beast, he failed everyone, and we had a hard time passing our coursework."
}, },
{ {
"key": "Так что Аида Джаныбековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.", "key": "Так что Аида Дженибековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.",
"ru": "Так что Аида Джаныбековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.", "ru": "Так что Аида Дженибековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.",
"en": "So Aida Dzhanybekovna is still okay. Go to her, take the assignment for the module, and start going to class. Then you'll pass the exam successfully." "en": "So Aida Dzhanybekovna is still okay. Go to her, take the assignment for the module, and start going to class. Then you'll pass the exam successfully."
}, },
{ {
@ -346,8 +346,8 @@
"en": "But she's touchy, try not to anger her. You'll only create problems for yourself." "en": "But she's touchy, try not to anger her. You'll only create problems for yourself."
}, },
{ {
"key": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Джаныбековна.", "key": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Дженибековна.",
"ru": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Джаныбековна.", "ru": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Дженибековна.",
"en": "They say she doesn't really like our new Manas studies teacher, Aida Dzhanybekovna." "en": "They say she doesn't really like our new Manas studies teacher, Aida Dzhanybekovna."
}, },
{ {
@ -476,8 +476,8 @@
"en": "The car is locked." "en": "The car is locked."
}, },
{ {
"key": "Кажется, на этой машине в универ приезжает Аида Джаныбековна.", "key": "Кажется, на этой машине в универ приезжает Аида Дженибековна.",
"ru": "Кажется, на этой машине в универ приезжает Аида Джаныбековна.", "ru": "Кажется, на этой машине в универ приезжает Аида Дженибековна.",
"en": "It seems that Aida Dzhanybekovna arrives at the university in this car." "en": "It seems that Aida Dzhanybekovna arrives at the university in this car."
}, },
{ {
@ -541,8 +541,8 @@
"en": "Why don't you read my messages?" "en": "Why don't you read my messages?"
}, },
{ {
"key": "Помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", "key": "Помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.",
"ru": "Помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", "ru": "Помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.",
"en": "Remember when we chipped in for a cake for Aida Dzhanibekova? I even brought a tablecloth, plates, and a cake knife. And I still haven't gotten anything back." "en": "Remember when we chipped in for a cake for Aida Dzhanibekova? I even brought a tablecloth, plates, and a cake knife. And I still haven't gotten anything back."
}, },
{ {
@ -581,8 +581,8 @@
"en": "No wonder I didn't see you at the lecture. Did you skip?" "en": "No wonder I didn't see you at the lecture. Did you skip?"
}, },
{ {
"key": "Да... Только не говори Аиде Джаныбековой что я здесь.", "key": "Да... Только не говори Аиде Дженибековной что я здесь.",
"ru": "Да... Только не говори Аиде Джаныбековой что я здесь.", "ru": "Да... Только не говори Аиде Дженибековной что я здесь.",
"en": "Yes... Just don't tell Aida Dzhanibekova that I'm here." "en": "Yes... Just don't tell Aida Dzhanibekova that I'm here."
}, },
{ {
@ -596,8 +596,8 @@
"en": "How can I get into the teachers' room if it's closed?" "en": "How can I get into the teachers' room if it's closed?"
}, },
{ {
"key": "Постарайся только Аиде Джаныбековой особо на глаза не попадаться. ", "key": "Постарайся только Аиде Дженибековной особо на глаза не попадаться. ",
"ru": "Постарайся только Аиде Джаныбековой особо на глаза не попадаться.", "ru": "Постарайся только Аиде Дженибековной особо на глаза не попадаться.",
"en": "Just try not to catch Aida Dzhanibekova's eye." "en": "Just try not to catch Aida Dzhanibekova's eye."
}, },
{ {
@ -656,8 +656,8 @@
"en": "This is not funny anymore, how will I get out of here?" "en": "This is not funny anymore, how will I get out of here?"
}, },
{ {
"key": "Аида Джаныбековна", "key": "Аида Дженибековна",
"ru": "Аида Джаныбековна", "ru": "Аида Дженибековна",
"en": "Aida Dzhanybekovna" "en": "Aida Dzhanybekovna"
}, },
{ {
@ -686,8 +686,8 @@
"en": "Could you open the teachers' room for me?" "en": "Could you open the teachers' room for me?"
}, },
{ {
"key": "Аида Джаныбековна", "key": "Аида Дженибековна",
"ru": "Аида Джаныбековна", "ru": "Аида Дженибековна",
"en": "Aida Dzhanybekovna" "en": "Aida Dzhanybekovna"
}, },
{ {
@ -826,8 +826,8 @@
"en": "Okay. When you meet her, give her the knife and tell her I'm waiting for her." "en": "Okay. When you meet her, give her the knife and tell her I'm waiting for her."
}, },
{ {
"key": "Извините, Аида Джаныбековна, я могу пойти уже?", "key": "Извините, Аида Дженибековна, я могу пойти уже?",
"ru": "Извините, Аида Джаныбековна, я могу пойти уже?", "ru": "Извините, Аида Дженибековна, я могу пойти уже?",
"en": "Excuse me, Aida Dzhanybekovna, can I go now?" "en": "Excuse me, Aida Dzhanybekovna, can I go now?"
}, },
{ {
@ -896,8 +896,8 @@
"en": "Okay…" "en": "Okay…"
}, },
{ {
"key": "Аида Джаныбековна, вы помните Бегимай? Она вам курсовую хотела сдать.", "key": "Аида Дженибековна, вы помните Бегимай? Она вам курсовую хотела сдать.",
"ru": "Аида Джаныбековна, вы помните Бегимай? Она вам курсовую хотела сдать.", "ru": "Аида Дженибековна, вы помните Бегимай? Она вам курсовую хотела сдать.",
"en": "Aida Dzhanybekovna, do you remember Begimai? She wanted to submit her term paper to you." "en": "Aida Dzhanybekovna, do you remember Begimai? She wanted to submit her term paper to you."
}, },
{ {
@ -921,8 +921,8 @@
"en": "Good!" "en": "Good!"
}, },
{ {
"key": "Аида Джаныбековна, здравствуйте!", "key": "Аида Дженибековна, здравствуйте!",
"ru": "Аида Джаныбековна, здравствуйте!", "ru": "Аида Дженибековна, здравствуйте!",
"en": "Aida Dzhanybekovna, hello!" "en": "Aida Dzhanybekovna, hello!"
}, },
{ {
@ -956,8 +956,8 @@
"en": "I should return the book to its place before leaving the library." "en": "I should return the book to its place before leaving the library."
}, },
{ {
"key": "Иначе Аида Джаныбековна меня убъет.", "key": "Иначе Аида Дженибековна меня убъет.",
"ru": "Иначе Аида Джаныбековна меня убъет.", "ru": "Иначе Аида Дженибековна меня убъет.",
"en": "Otherwise Aida Dzhanybekovna will kill me." "en": "Otherwise Aida Dzhanybekovna will kill me."
}, },
{ {
@ -1376,8 +1376,8 @@
"en": "You'll see worse things than that. Go to the dorm and get some sleep." "en": "You'll see worse things than that. Go to the dorm and get some sleep."
}, },
{ {
"key": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", "key": "Аида Дженибековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.",
"ru": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", "ru": "Аида Дженибековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.",
"en": "Aida Dzhanybekovna saw me in the teachers' room and made me write an essay on this stupid book." "en": "Aida Dzhanybekovna saw me in the teachers' room and made me write an essay on this stupid book."
}, },
{ {
@ -1446,8 +1446,8 @@
"en": "The cops came, investigators questioned the university rector, and there was such a scandal. The previous Manas studies professor was suspended." "en": "The cops came, investigators questioned the university rector, and there was such a scandal. The previous Manas studies professor was suspended."
}, },
{ {
"key": "Поэтому, с этого года у нас этот предмет ведет Аида Джаныбековна.", "key": "Поэтому, с этого года у нас этот предмет ведет Аида Дженибековна.",
"ru": "Поэтому, с этого года у нас этот предмет ведет Аида Джаныбековна.", "ru": "Поэтому, с этого года у нас этот предмет ведет Аида Дженибековна.",
"en": "Therefore, starting this year, Aida Dzhanybekovna has been teaching this subject." "en": "Therefore, starting this year, Aida Dzhanybekovna has been teaching this subject."
}, },
{ {
@ -1621,8 +1621,8 @@
"en": "Until you complete your assignment for the module, you don't even have to come near me." "en": "Until you complete your assignment for the module, you don't even have to come near me."
}, },
{ {
"key": "Здравствуйте Аида Джаныбековна!", "key": "Здравствуйте Аида Дженибековна!",
"ru": "Здравствуйте Аида Джаныбековна!", "ru": "Здравствуйте Аида Дженибековна!",
"en": "Hello Aida Dzhanybekovna!" "en": "Hello Aida Dzhanybekovna!"
}, },
{ {
@ -1631,8 +1631,8 @@
"en": "So, Bekzat, is your essay about Zhusup Mamai ready for submission?" "en": "So, Bekzat, is your essay about Zhusup Mamai ready for submission?"
}, },
{ {
"key": "Прощу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", "key": "Прощу прощения Аида Дженибековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.",
"ru": "Прощу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", "ru": "Прощу прощения Аида Дженибековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.",
"en": "I apologize, Aida Zhanybekovna, I really tried, but I encountered force majeure circumstances." "en": "I apologize, Aida Zhanybekovna, I really tried, but I encountered force majeure circumstances."
}, },
{ {
@ -2171,8 +2171,8 @@
"en": "Mmm, cake." "en": "Mmm, cake."
}, },
{ {
"key": "Но если я возьму кусочек, Аида Джаныбековна меня убьет.", "key": "Но если я возьму кусочек, Аида Дженибековна меня убьет.",
"ru": "Но если я возьму кусочек, Аида Джаныбековна меня убьет.", "ru": "Но если я возьму кусочек, Аида Дженибековна меня убьет.",
"en": "But if I take a piece, Aida Dzhanybekovna will kill me." "en": "But if I take a piece, Aida Dzhanybekovna will kill me."
}, },
{ {
@ -2181,13 +2181,13 @@
"en": "There are books on jurisprudence and law here." "en": "There are books on jurisprudence and law here."
}, },
{ {
"key": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "key": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.",
"ru": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "ru": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.",
"en": "Bekzat, remember how we chipped in for a cake for Aida Dzhanybekovna? I even brought a tablecloth, plates, and a silver cake knife. And I still haven't gotten anything back." "en": "Bekzat, remember how we chipped in for a cake for Aida Dzhanybekovna? I even brought a tablecloth, plates, and a silver cake knife. And I still haven't gotten anything back."
}, },
{ {
"key": "Помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "key": "Помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.",
"ru": "Помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "ru": "Помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.",
"en": "Remember when we chipped in for a cake for Aida Dzhanybekovna? I even brought a tablecloth, plates, and a silver cake knife. And I still haven't gotten anything back." "en": "Remember when we chipped in for a cake for Aida Dzhanybekovna? I even brought a tablecloth, plates, and a silver cake knife. And I still haven't gotten anything back."
}, },
{ {
@ -2196,13 +2196,13 @@
"en": "And secondly, I somehow dont want to catch Aidas eye." "en": "And secondly, I somehow dont want to catch Aidas eye."
}, },
{ {
"key": "Да... Только не говори Аиде Джаныбековной что я здесь.", "key": "Да... Только не говори Аиде Дженибековной что я здесь.",
"ru": "Да... Только не говори Аиде Джаныбековной что я здесь.", "ru": "Да... Только не говори Аиде Дженибековной что я здесь.",
"en": "Yes... Just don't tell Aida Dzhanybekovna that I'm here." "en": "Yes... Just don't tell Aida Dzhanybekovna that I'm here."
}, },
{ {
"key": "Постарайся только Аиде Джаныбековной особо на глаза не попадаться. ", "key": "Постарайся только Аиде Дженибековной особо на глаза не попадаться. ",
"ru": "Постарайся только Аиде Джаныбековной особо на глаза не попадаться.", "ru": "Постарайся только Аиде Дженибековной особо на глаза не попадаться.",
"en": "Just try not to catch Aida Dzhanibekovna's eye." "en": "Just try not to catch Aida Dzhanibekovna's eye."
}, },
{ {
@ -2246,13 +2246,13 @@
"en": "You'll see worse things than that. Go to the dorm and get some sleep." "en": "You'll see worse things than that. Go to the dorm and get some sleep."
}, },
{ {
"key": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", "key": "Аида Дженибековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.",
"ru": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", "ru": "Аида Дженибековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.",
"en": "Aida Dzhanybekovna saw me in the teachers' room and made me write an essay on this stupid book." "en": "Aida Dzhanybekovna saw me in the teachers' room and made me write an essay on this stupid book."
}, },
{ {
"key": "Прошу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", "key": "Прошу прощения Аида Дженибековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.",
"ru": "Прошу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", "ru": "Прошу прощения Аида Дженибековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.",
"en": "I apologize, Aida Dzhanybekovna, I really tried, but I encountered force majeure circumstances." "en": "I apologize, Aida Dzhanybekovna, I really tried, but I encountered force majeure circumstances."
} }
] ]

View File

@ -271,7 +271,7 @@
"type": "Line", "type": "Line",
"speaker": "Айпери", "speaker": "Айпери",
"portrait": "resources/dialogue/portrait_phone.png", "portrait": "resources/dialogue/portrait_phone.png",
"text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "text": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.",
"next": "line_2", "next": "line_2",
"chatBubble": "in" "chatBubble": "in"
}, },
@ -420,7 +420,7 @@
"type": "Line", "type": "Line",
"speaker": "Бекзат", "speaker": "Бекзат",
"portrait": "resources/dialogue/portrait_hero_neutral.png", "portrait": "resources/dialogue/portrait_hero_neutral.png",
"text": "Кажется, на этой машине в универ приезжает Аида Джаныбековна.", "text": "Кажется, на этой машине в универ приезжает Аида Дженибековна.",
"next": "end_1" "next": "end_1"
}, },
{ {

View File

@ -156,7 +156,7 @@
"type": "Line", "type": "Line",
"speaker": "Айпери", "speaker": "Айпери",
"portrait": "resources/dialogue/portrait_aiperi.png", "portrait": "resources/dialogue/portrait_aiperi.png",
"text": "Помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "text": "Помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.",
"next": "line_7" "next": "line_7"
}, },
{ {
@ -236,7 +236,7 @@
"type": "Line", "type": "Line",
"speaker": "Айпери", "speaker": "Айпери",
"portrait": "resources/dialogue/portrait_aiperi.png", "portrait": "resources/dialogue/portrait_aiperi.png",
"text": "Да... Только не говори Аиде Джаныбековной что я здесь.", "text": "Да... Только не говори Аиде Дженибековной что я здесь.",
"next": "line_18" "next": "line_18"
}, },
{ {
@ -268,7 +268,7 @@
"type": "Line", "type": "Line",
"speaker": "Айпери", "speaker": "Айпери",
"portrait": "resources/dialogue/portrait_aiperi.png", "portrait": "resources/dialogue/portrait_aiperi.png",
"text": "Постарайся только Аиде Джаныбековной особо на глаза не попадаться. ", "text": "Постарайся только Аиде Дженибековной особо на глаза не попадаться. ",
"next": "line_23" "next": "line_23"
}, },
{ {
@ -450,7 +450,7 @@
{ {
"id": "line_1", "id": "line_1",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Бекзат, что тебе нужно?", "text": "Бекзат, что тебе нужно?",
"next": "condition_1" "next": "condition_1"
@ -527,7 +527,7 @@
{ {
"id": "line_8", "id": "line_8",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Зачем тебе в учительскую?", "text": "Зачем тебе в учительскую?",
"next": "line_9" "next": "line_9"
@ -543,7 +543,7 @@
{ {
"id": "line_10", "id": "line_10",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Это разве твой нож? Этот нож принадлежит Айпери.", "text": "Это разве твой нож? Этот нож принадлежит Айпери.",
"next": "line_11" "next": "line_11"
@ -551,7 +551,7 @@
{ {
"id": "line_11", "id": "line_11",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Пусть она сама лично и приходит.", "text": "Пусть она сама лично и приходит.",
"next": "line_12" "next": "line_12"
@ -559,7 +559,7 @@
{ {
"id": "line_12", "id": "line_12",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "А ты даже не смей заходить в учительскую без моего разрешения!", "text": "А ты даже не смей заходить в учительскую без моего разрешения!",
"next": "condition_3" "next": "condition_3"
@ -596,7 +596,7 @@
{ {
"id": "line_3", "id": "line_3",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Тогда не отвлекай меня, я занята!", "text": "Тогда не отвлекай меня, я занята!",
"next": "condition_2" "next": "condition_2"
@ -617,7 +617,7 @@
{ {
"id": "line_5", "id": "line_5",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Кстати, если встретишь Айпери, передай ей, чтобы она подошла ко мне.", "text": "Кстати, если встретишь Айпери, передай ей, чтобы она подошла ко мне.",
"next": "line_6" "next": "line_6"
@ -625,7 +625,7 @@
{ {
"id": "line_6", "id": "line_6",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Я ей отдам нож, и заодно я дам ей новое задание на модуль.", "text": "Я ей отдам нож, и заодно я дам ей новое задание на модуль.",
"next": "setflag_1" "next": "setflag_1"
@ -677,7 +677,7 @@
{ {
"id": "line_20", "id": "line_20",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Я же сказала, дай мне сначала найти книги в библиотеке.", "text": "Я же сказала, дай мне сначала найти книги в библиотеке.",
"next": "line_21" "next": "line_21"
@ -685,7 +685,7 @@
{ {
"id": "line_21", "id": "line_21",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Когда я закончу с книжными делами, подойдешь ко мне и получишь задание.", "text": "Когда я закончу с книжными делами, подойдешь ко мне и получишь задание.",
"next": "line_4" "next": "line_4"
@ -693,7 +693,7 @@
{ {
"id": "line_15", "id": "line_15",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Я тебя сегодня впервые вижу на парах.", "text": "Я тебя сегодня впервые вижу на парах.",
"next": "line_16" "next": "line_16"
@ -709,7 +709,7 @@
{ {
"id": "line_17", "id": "line_17",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Хорошо, я дам тебе какое-нибудь задание, но не сейчас.", "text": "Хорошо, я дам тебе какое-нибудь задание, но не сейчас.",
"next": "line_18" "next": "line_18"
@ -717,7 +717,7 @@
{ {
"id": "line_18", "id": "line_18",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Я занята, как видишь, я пытаюсь разобраться в каталоге книг в этой библиотеке.", "text": "Я занята, как видишь, я пытаюсь разобраться в каталоге книг в этой библиотеке.",
"next": "line_19" "next": "line_19"
@ -725,7 +725,7 @@
{ {
"id": "line_19", "id": "line_19",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Когда я закончу, можешь подойти.", "text": "Когда я закончу, можешь подойти.",
"next": "setflag_2" "next": "setflag_2"
@ -751,7 +751,7 @@
{ {
"id": "line_1", "id": "line_1",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Бекзат, ты что делаешь в учительской?", "text": "Бекзат, ты что делаешь в учительской?",
"next": "line_7" "next": "line_7"
@ -759,7 +759,7 @@
{ {
"id": "line_7", "id": "line_7",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Тебя не предупреждали, что без моего разрешения в учительскую заходить нельзя?", "text": "Тебя не предупреждали, что без моего разрешения в учительскую заходить нельзя?",
"next": "line_8" "next": "line_8"
@ -767,7 +767,7 @@
{ {
"id": "line_8", "id": "line_8",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Как ты вообще сюда попал?", "text": "Как ты вообще сюда попал?",
"next": "line_9" "next": "line_9"
@ -783,7 +783,7 @@
{ {
"id": "line_10", "id": "line_10",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Вот лиса! Я же сказала ей, чтобы она лично забрала нож. А она взяла и тебя отправила.", "text": "Вот лиса! Я же сказала ей, чтобы она лично забрала нож. А она взяла и тебя отправила.",
"next": "line_11" "next": "line_11"
@ -791,7 +791,7 @@
{ {
"id": "line_11", "id": "line_11",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Ты точно отдашь этот нож Айпери?", "text": "Ты точно отдашь этот нож Айпери?",
"next": "line_21" "next": "line_21"
@ -807,7 +807,7 @@
{ {
"id": "line_22", "id": "line_22",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Хорошо. Когда встретишь ее, отдай нож и передай ей, что я ее жду.", "text": "Хорошо. Когда встретишь ее, отдай нож и передай ей, что я ее жду.",
"next": "line_12" "next": "line_12"
@ -817,13 +817,13 @@
"type": "Line", "type": "Line",
"speaker": "Бекзат", "speaker": "Бекзат",
"portrait": "resources/dialogue/portrait_hero_neutral.png", "portrait": "resources/dialogue/portrait_hero_neutral.png",
"text": "Извините, Аида Джаныбековна, я могу пойти уже?", "text": "Извините, Аида Дженибековна, я могу пойти уже?",
"next": "line_13" "next": "line_13"
}, },
{ {
"id": "line_13", "id": "line_13",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Нет, Бекзат. Ты вломился в учительскую, и теперь хочешь просто так уйти? Не получится.", "text": "Нет, Бекзат. Ты вломился в учительскую, и теперь хочешь просто так уйти? Не получится.",
"next": "line_14" "next": "line_14"
@ -831,7 +831,7 @@
{ {
"id": "line_14", "id": "line_14",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Я придумала для тебя особенное задание на этот модуль.", "text": "Я придумала для тебя особенное задание на этот модуль.",
"next": "line_2" "next": "line_2"
@ -839,7 +839,7 @@
{ {
"id": "line_2", "id": "line_2",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Подготовь эссе по теме \"Манас в изложении Жусупа Мамая\".", "text": "Подготовь эссе по теме \"Манас в изложении Жусупа Мамая\".",
"next": "line_15" "next": "line_15"
@ -847,7 +847,7 @@
{ {
"id": "line_15", "id": "line_15",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Ты не сможешь найти ничего по этой теме в интернете. Даже и не пытайся. Тебе придется писать эссе по книге.", "text": "Ты не сможешь найти ничего по этой теме в интернете. Даже и не пытайся. Тебе придется писать эссе по книге.",
"next": "line_3" "next": "line_3"
@ -855,7 +855,7 @@
{ {
"id": "line_3", "id": "line_3",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Книга про Жусупа Мамая лежит в библиотеке, но забирать ее из библиотеки нельзя.", "text": "Книга про Жусупа Мамая лежит в библиотеке, но забирать ее из библиотеки нельзя.",
"next": "line_4" "next": "line_4"
@ -871,7 +871,7 @@
{ {
"id": "line_5", "id": "line_5",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Там в библиотеке есть компьютер, напиши эссе прямо на нем.", "text": "Там в библиотеке есть компьютер, напиши эссе прямо на нем.",
"next": "line_16" "next": "line_16"
@ -887,7 +887,7 @@
{ {
"id": "line_17", "id": "line_17",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "До завтра.", "text": "До завтра.",
"next": "line_18" "next": "line_18"
@ -903,7 +903,7 @@
{ {
"id": "line_19", "id": "line_19",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "В твоих интересах успеть. Завтра покажешь мне, что у тебя получилось.", "text": "В твоих интересах успеть. Завтра покажешь мне, что у тебя получилось.",
"next": "line_20" "next": "line_20"
@ -911,7 +911,7 @@
{ {
"id": "line_20", "id": "line_20",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Не сдашь модуль - пойдешь на второй год. В другой раз не будешь трогать вещи в учительской без разрешения.", "text": "Не сдашь модуль - пойдешь на второй год. В другой раз не будешь трогать вещи в учительской без разрешения.",
"next": "line_6" "next": "line_6"
@ -941,14 +941,14 @@
"type": "Line", "type": "Line",
"speaker": "Бекзат", "speaker": "Бекзат",
"portrait": "resources/dialogue/portrait_hero_neutral.png", "portrait": "resources/dialogue/portrait_hero_neutral.png",
"text": "Аида Джаныбековна, вы помните Бегимай? Она вам курсовую хотела сдать.", "text": "Аида Дженибековна, вы помните Бегимай? Она вам курсовую хотела сдать.",
"objectiveComplete": "ghost_lore.ghost_lore_teacher", "objectiveComplete": "ghost_lore.ghost_lore_teacher",
"next": "line_2" "next": "line_2"
}, },
{ {
"id": "line_2", "id": "line_2",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Да, она говорила что приносила курсовую, но у меня ее нигде нет.", "text": "Да, она говорила что приносила курсовую, но у меня ее нигде нет.",
"next": "line_3" "next": "line_3"
@ -956,7 +956,7 @@
{ {
"id": "line_3", "id": "line_3",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Если ты найдешь и покажешь мне ее курсовую работу, я выставлю ей оценку.", "text": "Если ты найдешь и покажешь мне ее курсовую работу, я выставлю ей оценку.",
"next": "end_1" "next": "end_1"
@ -974,7 +974,7 @@
{ {
"id": "line_1", "id": "line_1",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Бекзат, зачетка Бегимай у тебя. Отправляйся в теневой мир и покажи зачетку призраку Бегимай, чтобы она освободилась.", "text": "Бекзат, зачетка Бегимай у тебя. Отправляйся в теневой мир и покажи зачетку призраку Бегимай, чтобы она освободилась.",
"objectiveComplete": "", "objectiveComplete": "",
@ -1005,7 +1005,7 @@
"type": "Line", "type": "Line",
"speaker": "Бекзат", "speaker": "Бекзат",
"portrait": "resources/dialogue/portrait_hero_neutral.png", "portrait": "resources/dialogue/portrait_hero_neutral.png",
"text": "Аида Джаныбековна, здравствуйте!", "text": "Аида Дженибековна, здравствуйте!",
"objectiveComplete": "ghost_lore.ghost_lore_teacher", "objectiveComplete": "ghost_lore.ghost_lore_teacher",
"next": "line_2" "next": "line_2"
}, },
@ -1020,7 +1020,7 @@
{ {
"id": "line_3", "id": "line_3",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Хорошо, давай посмотрим.", "text": "Хорошо, давай посмотрим.",
"next": "line_4" "next": "line_4"
@ -1028,7 +1028,7 @@
{ {
"id": "line_4", "id": "line_4",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Да, я вижу что курсовая написана хорошо, я ставлю ей максимальный балл.", "text": "Да, я вижу что курсовая написана хорошо, я ставлю ей максимальный балл.",
"objectiveComplete": "ghost_coursework.ghost_coursework_mark", "objectiveComplete": "ghost_coursework.ghost_coursework_mark",
@ -1037,7 +1037,7 @@
{ {
"id": "line_5", "id": "line_5",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Вот держи зачетку с оценкой.", "text": "Вот держи зачетку с оценкой.",
"objectiveComplete": "ghost_release.ghost_release_mark", "objectiveComplete": "ghost_release.ghost_release_mark",
@ -1046,7 +1046,7 @@
{ {
"id": "line_7", "id": "line_7",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Теперь иди в теневой мир и покажи зачетку Бегимай. Расскажи ей, что она сдала курсовую работу.", "text": "Теперь иди в теневой мир и покажи зачетку Бегимай. Расскажи ей, что она сдала курсовую работу.",
"next": "line_6" "next": "line_6"
@ -1082,7 +1082,7 @@
"type": "Line", "type": "Line",
"speaker": "Бекзат", "speaker": "Бекзат",
"portrait": "resources/dialogue/portrait_hero_neutral.png", "portrait": "resources/dialogue/portrait_hero_neutral.png",
"text": "Иначе Аида Джаныбековна меня убъет.", "text": "Иначе Аида Дженибековна меня убъет.",
"next": "end_1" "next": "end_1"
}, },
{ {
@ -2252,7 +2252,7 @@
"type": "Line", "type": "Line",
"speaker": "Бекзат", "speaker": "Бекзат",
"portrait": "resources/dialogue/portrait_hero_neutral.png", "portrait": "resources/dialogue/portrait_hero_neutral.png",
"text": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", "text": "Аида Дженибековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.",
"next": "line_9" "next": "line_9"
}, },
{ {
@ -2401,7 +2401,7 @@
"type": "Line", "type": "Line",
"speaker": "Айпери", "speaker": "Айпери",
"portrait": "resources/dialogue/portrait_aiperi.png", "portrait": "resources/dialogue/portrait_aiperi.png",
"text": "Поэтому, с этого года у нас этот предмет ведет Аида Джаныбековна.", "text": "Поэтому, с этого года у нас этот предмет ведет Аида Дженибековна.",
"next": "line_23" "next": "line_23"
}, },
{ {
@ -2508,7 +2508,7 @@
"type": "Line", "type": "Line",
"speaker": "Айпери", "speaker": "Айпери",
"portrait": "resources/dialogue/portrait_phone.png", "portrait": "resources/dialogue/portrait_phone.png",
"text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "text": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.",
"next": "line_2", "next": "line_2",
"chatBubble": "in" "chatBubble": "in"
}, },
@ -3058,7 +3058,7 @@
{ {
"id": "line_1", "id": "line_1",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Бекзат, ты подготовил эссе на тему \"Манас в изложении Жусупа Мамая\"?", "text": "Бекзат, ты подготовил эссе на тему \"Манас в изложении Жусупа Мамая\"?",
"objectiveComplete": "", "objectiveComplete": "",
@ -3075,7 +3075,7 @@
{ {
"id": "line_4", "id": "line_4",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Найди книгу про Жусупа Мамая в библиотеке, а потом садись за компьютер и пиши!", "text": "Найди книгу про Жусупа Мамая в библиотеке, а потом садись за компьютер и пиши!",
"next": "line_3" "next": "line_3"
@ -3083,7 +3083,7 @@
{ {
"id": "line_3", "id": "line_3",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Пока не выполнишь свое задание на модуль, можешь даже и не подходить ко мне.", "text": "Пока не выполнишь свое задание на модуль, можешь даже и не подходить ко мне.",
"next": "end_1" "next": "end_1"
@ -3103,7 +3103,7 @@
"type": "Line", "type": "Line",
"speaker": "Бекзат", "speaker": "Бекзат",
"portrait": "resources/dialogue/portrait_hero_neutral.png", "portrait": "resources/dialogue/portrait_hero_neutral.png",
"text": "Здравствуйте Аида Джаныбековна!", "text": "Здравствуйте Аида Дженибековна!",
"objectiveComplete": "", "objectiveComplete": "",
"next": "condition_8" "next": "condition_8"
}, },
@ -3123,7 +3123,7 @@
{ {
"id": "line_99", "id": "line_99",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Ну что Бекзат, эссе про Жусупа Мамая готово к сдаче?", "text": "Ну что Бекзат, эссе про Жусупа Мамая готово к сдаче?",
"next": "line_2" "next": "line_2"
@ -3133,13 +3133,13 @@
"type": "Line", "type": "Line",
"speaker": "Бекзат", "speaker": "Бекзат",
"portrait": "resources/dialogue/portrait_hero_neutral.png", "portrait": "resources/dialogue/portrait_hero_neutral.png",
"text": "Прошу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", "text": "Прошу прощения Аида Дженибековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.",
"next": "line_3" "next": "line_3"
}, },
{ {
"id": "line_3", "id": "line_3",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "И что же помешало тебе написать эссе?", "text": "И что же помешало тебе написать эссе?",
"next": "line_4" "next": "line_4"
@ -3171,7 +3171,7 @@
{ {
"id": "line_6", "id": "line_6",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Какое еще заклинание? У тебя эта записка с собой?", "text": "Какое еще заклинание? У тебя эта записка с собой?",
"next": "line_7" "next": "line_7"
@ -3187,7 +3187,7 @@
{ {
"id": "line_8", "id": "line_8",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Надеюсь, ты не читал это заклинание?", "text": "Надеюсь, ты не читал это заклинание?",
"next": "line_9" "next": "line_9"
@ -3211,7 +3211,7 @@
{ {
"id": "line_12", "id": "line_12",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Это заклинание переместило тебя в мир теней. ", "text": "Это заклинание переместило тебя в мир теней. ",
"next": "line_13" "next": "line_13"
@ -3219,7 +3219,7 @@
{ {
"id": "line_13", "id": "line_13",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Этот мир предназначен для фей и джиннов. Обычные люди туда попасть не могут. Но у тебя это как-то получилось.", "text": "Этот мир предназначен для фей и джиннов. Обычные люди туда попасть не могут. Но у тебя это как-то получилось.",
"next": "line_14" "next": "line_14"
@ -3235,7 +3235,7 @@
{ {
"id": "line_15", "id": "line_15",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Не забывай, я изучаю фольклор в целом и Манас в частности. Если бы ты не засыпал над книгами, ты бы тоже много интересного узнал про мир от наших предков.", "text": "Не забывай, я изучаю фольклор в целом и Манас в частности. Если бы ты не засыпал над книгами, ты бы тоже много интересного узнал про мир от наших предков.",
"next": "line_16" "next": "line_16"
@ -3243,7 +3243,7 @@
{ {
"id": "line_16", "id": "line_16",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Я освобождаю тебя от задания по эссе. И взамен я дам тебе другое задание. Если хочешь сдать модуль, тебе придется выполнить его.", "text": "Я освобождаю тебя от задания по эссе. И взамен я дам тебе другое задание. Если хочешь сдать модуль, тебе придется выполнить его.",
"next": "line_17", "next": "line_17",
@ -3260,7 +3260,7 @@
{ {
"id": "line_18", "id": "line_18",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "В универе завелся призрак. Конечно, его не получится увидеть вживую.", "text": "В универе завелся призрак. Конечно, его не получится увидеть вживую.",
"next": "line_19" "next": "line_19"
@ -3268,7 +3268,7 @@
{ {
"id": "line_19", "id": "line_19",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Но иногда по вечерам я слышу плач из лекционного зала.", "text": "Но иногда по вечерам я слышу плач из лекционного зала.",
"next": "line_20" "next": "line_20"
@ -3276,7 +3276,7 @@
{ {
"id": "line_20", "id": "line_20",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "А на утро бывает так, что все зачетки в шкафу раскиданы как попало.", "text": "А на утро бывает так, что все зачетки в шкафу раскиданы как попало.",
"next": "line_21" "next": "line_21"
@ -3284,7 +3284,7 @@
{ {
"id": "line_21", "id": "line_21",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Призрак обитает где-то в теневом мире. Попади туда и наладь с ним диалог. Узнай, кто он и что ему нужно.", "text": "Призрак обитает где-то в теневом мире. Попади туда и наладь с ним диалог. Узнай, кто он и что ему нужно.",
"next": "line_22" "next": "line_22"
@ -3292,7 +3292,7 @@
{ {
"id": "line_22", "id": "line_22",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Если ты успешно избавишься от призрака, я поставлю тебе максимальный балл за модуль.", "text": "Если ты успешно избавишься от призрака, я поставлю тебе максимальный балл за модуль.",
"next": "setflag_4" "next": "setflag_4"
@ -3311,7 +3311,7 @@
{ {
"id": "line_23", "id": "line_23",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "У тебя есть еще вопросы, Бекзат?", "text": "У тебя есть еще вопросы, Бекзат?",
"next": "choice_1" "next": "choice_1"
@ -3360,7 +3360,7 @@
{ {
"id": "line_25", "id": "line_25",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Теневой мир это мир, в котором обитают феи, духи и джинны. Он существовал всегда.", "text": "Теневой мир это мир, в котором обитают феи, духи и джинны. Он существовал всегда.",
"next": "line_26" "next": "line_26"
@ -3368,7 +3368,7 @@
{ {
"id": "line_26", "id": "line_26",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Обычные люди, не воители, туда не попадают обычно. Кроме тебя, тебе это как-то удалось.", "text": "Обычные люди, не воители, туда не попадают обычно. Кроме тебя, тебе это как-то удалось.",
"next": "line_31" "next": "line_31"
@ -3376,7 +3376,7 @@
{ {
"id": "line_31", "id": "line_31",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Спрашивай что хочешь, я попробую объяснить.", "text": "Спрашивай что хочешь, я попробую объяснить.",
"next": "choice_2" "next": "choice_2"
@ -3431,7 +3431,7 @@
{ {
"id": "line_30", "id": "line_30",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Я думаю, в мир теней проецируются только фундаментальные объекты, типа зданий, деревьев, рельефа.", "text": "Я думаю, в мир теней проецируются только фундаментальные объекты, типа зданий, деревьев, рельефа.",
"next": "line_27" "next": "line_27"
@ -3439,7 +3439,7 @@
{ {
"id": "line_27", "id": "line_27",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Это происходит потому, что в теневом мире время течет сильно медленнее, чем в нашем мире.", "text": "Это происходит потому, что в теневом мире время течет сильно медленнее, чем в нашем мире.",
"next": "line_32" "next": "line_32"
@ -3447,7 +3447,7 @@
{ {
"id": "line_32", "id": "line_32",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Двери у нас слишком часто открываются и закрываются, поэтому в теневом мире они \"размываются\" или попадают в суперпозицию.", "text": "Двери у нас слишком часто открываются и закрываются, поэтому в теневом мире они \"размываются\" или попадают в суперпозицию.",
"next": "line_28" "next": "line_28"
@ -3455,7 +3455,7 @@
{ {
"id": "line_28", "id": "line_28",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Поэтому в мире теней ты можешь спокойно пройти через дверной проем. Но сквозь стены ты пройти не сможешь, они более плотные.", "text": "Поэтому в мире теней ты можешь спокойно пройти через дверной проем. Но сквозь стены ты пройти не сможешь, они более плотные.",
"next": "line_49" "next": "line_49"
@ -3475,7 +3475,7 @@
{ {
"id": "line_34", "id": "line_34",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Это их мир, и они там живут. Я думаю что увидев тебя, обитатели теневого мира тоже были шокированы.", "text": "Это их мир, и они там живут. Я думаю что увидев тебя, обитатели теневого мира тоже были шокированы.",
"next": "line_35" "next": "line_35"
@ -3483,7 +3483,7 @@
{ {
"id": "line_35", "id": "line_35",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Но кое в чем ты прав. Здесь в универе, призраков раньше не было. Всякая чертовщина начала происходить совсем недавно.", "text": "Но кое в чем ты прав. Здесь в универе, призраков раньше не было. Всякая чертовщина начала происходить совсем недавно.",
"next": "line_36" "next": "line_36"
@ -3491,7 +3491,7 @@
{ {
"id": "line_36", "id": "line_36",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Ты должен узнать, откуда здесь появился призрак, и заставить его исчезнуть.", "text": "Ты должен узнать, откуда здесь появился призрак, и заставить его исчезнуть.",
"next": "line_37" "next": "line_37"
@ -3499,7 +3499,7 @@
{ {
"id": "line_37", "id": "line_37",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Помимо призрака, есть еще и тени. Но ты не беспокойся, это всего лишь проекции негативных мыслей.", "text": "Помимо призрака, есть еще и тени. Но ты не беспокойся, это всего лишь проекции негативных мыслей.",
"next": "line_38" "next": "line_38"
@ -3507,7 +3507,7 @@
{ {
"id": "line_38", "id": "line_38",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Просто избавляйся от теней, когда встретишь их. А когда ты изгонишь призрака, тени исчезнут сами. ", "text": "Просто избавляйся от теней, когда встретишь их. А когда ты изгонишь призрака, тени исчезнут сами. ",
"next": "line_49" "next": "line_49"
@ -3523,7 +3523,7 @@
{ {
"id": "line_40", "id": "line_40",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Время в мире теней течет значительно медленнее, чем в нашем.", "text": "Время в мире теней течет значительно медленнее, чем в нашем.",
"next": "line_41" "next": "line_41"
@ -3531,7 +3531,7 @@
{ {
"id": "line_41", "id": "line_41",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "И похоже, что течение времени там нелинейное.", "text": "И похоже, что течение времени там нелинейное.",
"next": "line_42" "next": "line_42"
@ -3539,7 +3539,7 @@
{ {
"id": "line_42", "id": "line_42",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Это объясняет, почему в теневом мире есть деревья и строения, но отсутствуют двери, автомобили, и прочее.", "text": "Это объясняет, почему в теневом мире есть деревья и строения, но отсутствуют двери, автомобили, и прочее.",
"next": "line_43" "next": "line_43"
@ -3547,7 +3547,7 @@
{ {
"id": "line_43", "id": "line_43",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Объекты в нашем мире должны долго находится на одном месте, прежде чем их проекция появится в мире теней.", "text": "Объекты в нашем мире должны долго находится на одном месте, прежде чем их проекция появится в мире теней.",
"next": "line_49" "next": "line_49"
@ -3563,7 +3563,7 @@
{ {
"id": "line_45", "id": "line_45",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Если ты потеряешь сознание в теневом мире, то ты принудительно вернешься в наш мир.", "text": "Если ты потеряешь сознание в теневом мире, то ты принудительно вернешься в наш мир.",
"next": "line_46" "next": "line_46"
@ -3571,7 +3571,7 @@
{ {
"id": "line_46", "id": "line_46",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Также избегай света луны, луна тоже может вернуть тебя в мир людей. Лучше вообще не выходи из помещения. ", "text": "Также избегай света луны, луна тоже может вернуть тебя в мир людей. Лучше вообще не выходи из помещения. ",
"next": "line_47" "next": "line_47"
@ -3579,7 +3579,7 @@
{ {
"id": "line_47", "id": "line_47",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Если ты задержишься, и в человеческом мире настанет утро, тебя тоже выбросит из теневого мира.", "text": "Если ты задержишься, и в человеческом мире настанет утро, тебя тоже выбросит из теневого мира.",
"next": "line_48" "next": "line_48"
@ -3587,7 +3587,7 @@
{ {
"id": "line_48", "id": "line_48",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Но ты не беспокойся. Даже если тебя выбросит из теневого мира, ты всегда сможешь повторить свою попытку на следующую ночь.", "text": "Но ты не беспокойся. Даже если тебя выбросит из теневого мира, ты всегда сможешь повторить свою попытку на следующую ночь.",
"next": "line_49" "next": "line_49"
@ -3595,7 +3595,7 @@
{ {
"id": "line_49", "id": "line_49",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "У тебя есть еще вопросы про теневой мир?", "text": "У тебя есть еще вопросы про теневой мир?",
"next": "choice_2" "next": "choice_2"
@ -3611,7 +3611,7 @@
{ {
"id": "line_51", "id": "line_51",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Ты хочешь что-нибудь еще обсудить?", "text": "Ты хочешь что-нибудь еще обсудить?",
"next": "choice_1" "next": "choice_1"
@ -3627,7 +3627,7 @@
{ {
"id": "line_53", "id": "line_53",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Нет, это не я. И на самом деле, я немного обеспокоена этим.", "text": "Нет, это не я. И на самом деле, я немного обеспокоена этим.",
"next": "line_56" "next": "line_56"
@ -3635,7 +3635,7 @@
{ {
"id": "line_56", "id": "line_56",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Когда я узнала, что в университете начались паранормальные явления, я сразу поняла что это призрак в теневом мире.", "text": "Когда я узнала, что в университете начались паранормальные явления, я сразу поняла что это призрак в теневом мире.",
"next": "line_54" "next": "line_54"
@ -3643,7 +3643,7 @@
{ {
"id": "line_54", "id": "line_54",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Я знаю заклинание, которое тебе дали. У этого заклинания есть еще одно условие - оно сработает только на людей, которые чисты сердцем.", "text": "Я знаю заклинание, которое тебе дали. У этого заклинания есть еще одно условие - оно сработает только на людей, которые чисты сердцем.",
"next": "line_57" "next": "line_57"
@ -3651,7 +3651,7 @@
{ {
"id": "line_57", "id": "line_57",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Я взяла серебряный нож Айпери и пробовала прочитать заклинание, и у меня не получилось.", "text": "Я взяла серебряный нож Айпери и пробовала прочитать заклинание, и у меня не получилось.",
"next": "line_55" "next": "line_55"
@ -3659,7 +3659,7 @@
{ {
"id": "line_55", "id": "line_55",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Тогда я предположила, что Айпери уж точно сможет прочитать заклинание и попасть в теневой мир.", "text": "Тогда я предположила, что Айпери уж точно сможет прочитать заклинание и попасть в теневой мир.",
"next": "line_58" "next": "line_58"
@ -3667,7 +3667,7 @@
{ {
"id": "line_58", "id": "line_58",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Как раз поэтому я хотела вернуть нож ей лично. И заодно отправить ее в теневой мир.", "text": "Как раз поэтому я хотела вернуть нож ей лично. И заодно отправить ее в теневой мир.",
"next": "line_59" "next": "line_59"
@ -3675,7 +3675,7 @@
{ {
"id": "line_59", "id": "line_59",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Но ты смешал все мои планы. Сначала ты забрал нож, а потом кто-то подсунул тебе записку.", "text": "Но ты смешал все мои планы. Сначала ты забрал нож, а потом кто-то подсунул тебе записку.",
"next": "line_60" "next": "line_60"
@ -3683,7 +3683,7 @@
{ {
"id": "line_60", "id": "line_60",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Это очень странно. Как будто кто-то играет против меня, и кто-то специально ввел тебя в игру заместо Айпери.", "text": "Это очень странно. Как будто кто-то играет против меня, и кто-то специально ввел тебя в игру заместо Айпери.",
"next": "line_61" "next": "line_61"
@ -3707,7 +3707,7 @@
{ {
"id": "line_63", "id": "line_63",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Узнай что нужно призраку, и постарайся уговорить его покинуть университет.", "text": "Узнай что нужно призраку, и постарайся уговорить его покинуть университет.",
"next": "line_64" "next": "line_64"
@ -3715,7 +3715,7 @@
{ {
"id": "line_64", "id": "line_64",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Или ты хочешь вместо этого писать эссе про Жусупа Мамая?", "text": "Или ты хочешь вместо этого писать эссе про Жусупа Мамая?",
"next": "line_65" "next": "line_65"
@ -3781,7 +3781,7 @@
{ {
"id": "line_72", "id": "line_72",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Я не знаю ни одной студентки по имени Бегимай.", "text": "Я не знаю ни одной студентки по имени Бегимай.",
"next": "line_73" "next": "line_73"
@ -3789,7 +3789,7 @@
{ {
"id": "line_73", "id": "line_73",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Но с другой стороны, я здесь преподаю только с этого года. Возможно, Бегимай училась у предыдущего преподавателя?", "text": "Но с другой стороны, я здесь преподаю только с этого года. Возможно, Бегимай училась у предыдущего преподавателя?",
"next": "line_74" "next": "line_74"
@ -3805,7 +3805,7 @@
{ {
"id": "line_75", "id": "line_75",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Опроси студентов и узнай подробнее, кто эта призрак Бегимай и откуда она взялась.", "text": "Опроси студентов и узнай подробнее, кто эта призрак Бегимай и откуда она взялась.",
"next": "line_76" "next": "line_76"
@ -3813,7 +3813,7 @@
{ {
"id": "line_76", "id": "line_76",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Потом возвращайся ко мне, и мы обсудим, что делать дальше.", "text": "Потом возвращайся ко мне, и мы обсудим, что делать дальше.",
"next": "setflag_1" "next": "setflag_1"
@ -3840,7 +3840,7 @@
{ {
"id": "line_78", "id": "line_78",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "У тебя есть еще вопросы?", "text": "У тебя есть еще вопросы?",
"next": "choice_4" "next": "choice_4"
@ -3885,7 +3885,7 @@
{ {
"id": "line_67", "id": "line_67",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Переходи в теневой мир, а затем иди в лекционный зал.", "text": "Переходи в теневой мир, а затем иди в лекционный зал.",
"next": "line_68" "next": "line_68"
@ -3893,7 +3893,7 @@
{ {
"id": "line_68", "id": "line_68",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Постарайся поговорить с призраком, и узнать, что ему нужно.", "text": "Постарайся поговорить с призраком, и узнать, что ему нужно.",
"next": "line_69" "next": "line_69"
@ -3901,7 +3901,7 @@
{ {
"id": "line_69", "id": "line_69",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Потом возвращайся ко мне, и мы обсудим, как можно его изгнать.", "text": "Потом возвращайся ко мне, и мы обсудим, как можно его изгнать.",
"next": "line_77" "next": "line_77"
@ -3964,7 +3964,7 @@
{ {
"id": "line_95", "id": "line_95",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Найди курсовую работу Бегимай и принеси мне ее. Я проверю курсовую вместо предыдущего преподавателя и выставлю ей оценку.", "text": "Найди курсовую работу Бегимай и принеси мне ее. Я проверю курсовую вместо предыдущего преподавателя и выставлю ей оценку.",
"next": "line_77" "next": "line_77"
@ -3985,7 +3985,7 @@
{ {
"id": "line_97", "id": "line_97",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Иди к шкафу в учительской. Среди зачетных книжек найти зачетку Бегимай и принеси мне. Я поставлю ей оценку за курсовую работу.", "text": "Иди к шкафу в учительской. Среди зачетных книжек найти зачетку Бегимай и принеси мне. Я поставлю ей оценку за курсовую работу.",
"next": "line_77" "next": "line_77"
@ -3993,7 +3993,7 @@
{ {
"id": "line_96", "id": "line_96",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Ты уже нашел курсовую работу Бегимай?", "text": "Ты уже нашел курсовую работу Бегимай?",
"next": "line_92" "next": "line_92"
@ -4041,7 +4041,7 @@
{ {
"id": "line_87", "id": "line_87",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Печальная история.", "text": "Печальная история.",
"next": "line_88" "next": "line_88"
@ -4049,7 +4049,7 @@
{ {
"id": "line_88", "id": "line_88",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Судя по всему, чтобы освободить ее, нужно найти ее курсовую работу и поставить ей оценку.", "text": "Судя по всему, чтобы освободить ее, нужно найти ее курсовую работу и поставить ей оценку.",
"next": "line_89" "next": "line_89"
@ -4057,7 +4057,7 @@
{ {
"id": "line_89", "id": "line_89",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Ты нашел ее курсовую работу?", "text": "Ты нашел ее курсовую работу?",
"next": "condition_4" "next": "condition_4"
@ -4086,7 +4086,7 @@
{ {
"id": "line_93", "id": "line_93",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Да, вижу. Курсовая работа написана очень хорошо. Пожалуй, я могу выставить за нее максимальный балл.", "text": "Да, вижу. Курсовая работа написана очень хорошо. Пожалуй, я могу выставить за нее максимальный балл.",
"next": "line_98" "next": "line_98"
@ -4094,7 +4094,7 @@
{ {
"id": "line_98", "id": "line_98",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Теперь поищи в шкафу зачетку Бегимай, и принеси мне, я выставлю ей оценку.", "text": "Теперь поищи в шкафу зачетку Бегимай, и принеси мне, я выставлю ей оценку.",
"next": "setflag_3" "next": "setflag_3"
@ -4125,7 +4125,7 @@
{ {
"id": "line_91", "id": "line_91",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Найди и принеси мне ее. Я проверю работу за предыдущего преподавателя и выставлю ей оценку.", "text": "Найди и принеси мне ее. Я проверю работу за предыдущего преподавателя и выставлю ей оценку.",
"next": "setflag_2" "next": "setflag_2"
@ -4150,7 +4150,7 @@
{ {
"id": "line_1", "id": "line_1",
"type": "Line", "type": "Line",
"speaker": "Аида Джаныбековна", "speaker": "Аида Дженибековна",
"portrait": "resources/dialogue/portrait_teacher.png", "portrait": "resources/dialogue/portrait_teacher.png",
"text": "Бекзат, я сейчас занята, не мешай мне!", "text": "Бекзат, я сейчас занята, не мешай мне!",
"next": "end_1" "next": "end_1"
@ -4178,7 +4178,7 @@
"type": "Line", "type": "Line",
"speaker": "Бекзат", "speaker": "Бекзат",
"portrait": "resources/dialogue/portrait_hero_neutral.png", "portrait": "resources/dialogue/portrait_hero_neutral.png",
"text": "Но если я возьму кусочек, Аида Джаныбековна меня убьет.", "text": "Но если я возьму кусочек, Аида Дженибековна меня убьет.",
"next": "end_1" "next": "end_1"
}, },
{ {

View File

@ -8,14 +8,32 @@
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "inventoryExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": 0,
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{
"type": "Button",
"name": "inventoryMain",
"width": 640, "width": 640,
"height": 1200, "height": 1200,
"y": 68, "y": 68,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "top", "vertical_gravity": "top",
"texture": "resources/w/ui/img/inv/PortraitInventoryBkg001.png" "textures": {
"normal": "resources/w/ui/img/inv/PortraitInventoryBkg001.png",
"hover": "resources/w/ui/img/inv/PortraitInventoryBkg001.png",
"pressed": "resources/w/ui/img/inv/PortraitInventoryBkg001.png"
}
}, },
{ {
"type": "StaticImage", "type": "StaticImage",

View File

@ -8,14 +8,32 @@
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "inventoryExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": 0,
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{
"type": "Button",
"name": "inventoryMain",
"width": 640, "width": 640,
"height": 1200, "height": 1200,
"y": 68, "y": 68,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "top", "vertical_gravity": "top",
"texture": "resources/w/ui/img/inv/PortraitInventoryItemBkg003.png" "textures": {
"normal": "resources/w/ui/img/inv/PortraitInventoryItemBkg003.png",
"hover": "resources/w/ui/img/inv/PortraitInventoryItemBkg003.png",
"pressed": "resources/w/ui/img/inv/PortraitInventoryItemBkg003.png"
}
}, },
{ {
"type": "Button", "type": "Button",

View File

@ -7,15 +7,33 @@
"vertical_align": "top", "vertical_align": "top",
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{
"type": "Button",
"name": "journalExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": 0,
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "journalMain",
"width": 640, "width": 640,
"height": 1200, "height": 1200,
"y": 68, "y": 68,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "top", "vertical_gravity": "top",
"texture": "resources/w/ui/img/journal/PortraitQuestJournalBkg002.png" "textures": {
"normal": "resources/w/ui/img/journal/PortraitQuestJournalBkg002.png",
"hover": "resources/w/ui/img/journal/PortraitQuestJournalBkg002.png",
"pressed": "resources/w/ui/img/journal/PortraitQuestJournalBkg002.png"
}
}, },
{ {
"type": "Button", "type": "Button",

View File

@ -7,15 +7,33 @@
"vertical_align": "top", "vertical_align": "top",
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{
"type": "Button",
"name": "journalItemExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": 0,
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "journalMain",
"width": 640, "width": 640,
"height": 1200, "height": 1200,
"y": 68, "y": 68,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "top", "vertical_gravity": "top",
"texture": "resources/w/ui/img/journal/PortraitQuestJournalItemBkg002.png" "textures": {
"normal": "resources/w/ui/img/journal/PortraitQuestJournalItemBkg002.png",
"hover": "resources/w/ui/img/journal/PortraitQuestJournalItemBkg002.png",
"pressed": "resources/w/ui/img/journal/PortraitQuestJournalItemBkg002.png"
}
}, },
{ {
"type": "Button", "type": "Button",

View File

@ -8,13 +8,30 @@
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "inventoryExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{
"type": "Button",
"name": "inventoryMain",
"width": 1266, "width": 1266,
"height": 585, "height": 585,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "center", "vertical_gravity": "center",
"texture": "resources/w/ui/img/Inventory001.png" "textures": {
"normal": "resources/w/ui/img/inv/Inventory001.png",
"hover": "resources/w/ui/img/inv/Inventory001.png",
"pressed": "resources/w/ui/img/inv/Inventory001.png"
}
}, },
{ {
"type": "StaticImage", "type": "StaticImage",

View File

@ -7,15 +7,32 @@
"vertical_align": "top", "vertical_align": "top",
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{
"type": "Button",
"name": "journalExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "journalMain",
"width": 1266, "width": 1266,
"height": 585, "height": 585,
"y": 68, "y": 68,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "top", "vertical_gravity": "top",
"texture": "resources/w/ui/img/journal/QuestJournal003.png" "textures": {
"normal": "resources/w/ui/img/journal/QuestJournal003.png",
"hover": "resources/w/ui/img/journal/QuestJournal003.png",
"pressed": "resources/w/ui/img/journal/QuestJournal003.png"
}
}, },
{ {
"type": "Button", "type": "Button",

View File

@ -21,7 +21,7 @@
"pressed": "resources/transparent.png" "pressed": "resources/transparent.png"
} }
}, },
{ {
"type": "Button", "type": "Button",
"name": "phoneMain", "name": "phoneMain",
"horizontal_gravity": "center", "horizontal_gravity": "center",
@ -47,7 +47,7 @@
"height": 120.4, "height": 120.4,
"texture": "resources/w/ui/img/phone2/ClockDay001.png" "texture": "resources/w/ui/img/phone2/ClockDay001.png"
}, },
{ {
"type": "StaticImage", "type": "StaticImage",
"name": "phoneTimeNight", "name": "phoneTimeNight",
"horizontal_gravity": "center", "horizontal_gravity": "center",
@ -57,7 +57,7 @@
"height": 120.4, "height": 120.4,
"texture": "resources/w/ui/img/phone2/ClockNight001.png" "texture": "resources/w/ui/img/phone2/ClockNight001.png"
}, },
{ {
"type": "StaticImage", "type": "StaticImage",
"name": "phoneTimeDawn", "name": "phoneTimeDawn",
"horizontal_gravity": "center", "horizontal_gravity": "center",

View File

@ -8,14 +8,32 @@
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "inventoryExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": 0,
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{
"type": "Button",
"name": "inventoryMain",
"width": 640, "width": 640,
"height": 1200, "height": 1200,
"y": 68, "y": 68,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "top", "vertical_gravity": "top",
"texture": "resources/w/ui_en/img/inv/PortraitInventoryBkg001.png" "textures": {
"normal": "resources/w/ui_en/img/inv/PortraitInventoryBkg001.png",
"hover": "resources/w/ui_en/img/inv/PortraitInventoryBkg001.png",
"pressed": "resources/w/ui_en/img/inv/PortraitInventoryBkg001.png"
}
}, },
{ {
"type": "StaticImage", "type": "StaticImage",

View File

@ -8,14 +8,32 @@
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "inventoryExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": 0,
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{
"type": "Button",
"name": "inventoryMain",
"width": 640, "width": 640,
"height": 1200, "height": 1200,
"y": 68, "y": 68,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "top", "vertical_gravity": "top",
"texture": "resources/w/ui_en/img/inv/PortraitInventoryItemBkg003.png" "textures": {
"normal": "resources/w/ui_en/img/inv/PortraitInventoryItemBkg003.png",
"hover": "resources/w/ui_en/img/inv/PortraitInventoryItemBkg003.png",
"pressed": "resources/w/ui_en/img/inv/PortraitInventoryItemBkg003.png"
}
}, },
{ {
"type": "Button", "type": "Button",

View File

@ -7,15 +7,33 @@
"vertical_align": "top", "vertical_align": "top",
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{
"type": "Button",
"name": "journalExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": 0,
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "journalMain",
"width": 640, "width": 640,
"height": 1200, "height": 1200,
"y": 68, "y": 68,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "top", "vertical_gravity": "top",
"texture": "resources/w/ui_en/img/journal/PortraitQuestJournalBkg002.png" "textures": {
"normal": "resources/w/ui_en/img/journal/PortraitQuestJournalBkg002.png",
"hover": "resources/w/ui_en/img/journal/PortraitQuestJournalBkg002.png",
"pressed": "resources/w/ui_en/img/journal/PortraitQuestJournalBkg002.png"
}
}, },
{ {
"type": "Button", "type": "Button",

View File

@ -8,14 +8,32 @@
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "journalItemExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": 0,
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{
"type": "Button",
"name": "journalMain",
"width": 640, "width": 640,
"height": 1200, "height": 1200,
"y": 68, "y": 68,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "top", "vertical_gravity": "top",
"texture": "resources/w/ui_en/img/journal/PortraitQuestJournalItemBkg002.png" "textures": {
"normal": "resources/w/ui_en/img/journal/PortraitQuestJournalItemBkg002.png",
"hover": "resources/w/ui_en/img/journal/PortraitQuestJournalItemBkg002.png",
"pressed": "resources/w/ui_en/img/journal/PortraitQuestJournalItemBkg002.png"
}
}, },
{ {
"type": "Button", "type": "Button",

View File

@ -8,13 +8,30 @@
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "inventoryExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{
"type": "Button",
"name": "inventoryMain",
"width": 1266, "width": 1266,
"height": 585, "height": 585,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "center", "vertical_gravity": "center",
"texture": "resources/w/ui_en/img/Inventory001.png" "textures": {
"normal": "resources/w/ui_en/img/inv/Inventory001.png",
"hover": "resources/w/ui_en/img/inv/Inventory001.png",
"pressed": "resources/w/ui_en/img/inv/Inventory001.png"
}
}, },
{ {
"type": "StaticImage", "type": "StaticImage",

View File

@ -7,15 +7,32 @@
"vertical_align": "top", "vertical_align": "top",
"horizontal_align": "center", "horizontal_align": "center",
"children": [ "children": [
{
"type": "Button",
"name": "journalExitButton2",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"width": "match_parent",
"height": "match_parent",
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
},
{ {
"type": "StaticImage", "type": "Button",
"name": "background", "name": "journalMain",
"width": 1266, "width": 1266,
"height": 585, "height": 585,
"y": 68, "y": 68,
"horizontal_gravity": "center", "horizontal_gravity": "center",
"vertical_gravity": "top", "vertical_gravity": "top",
"texture": "resources/w/ui_en/img/journal/QuestJournal003.png" "textures": {
"normal": "resources/w/ui_en/img/journal/QuestJournal003.png",
"hover": "resources/w/ui_en/img/journal/QuestJournal003.png",
"pressed": "resources/w/ui_en/img/journal/QuestJournal003.png"
}
}, },
{ {
"type": "Button", "type": "Button",

View File

@ -1,4 +1,4 @@
#include "AudioPlayerAsync.h" #include "AudioPlayerAsync.h"
#include <iostream> #include <iostream>
#ifdef __EMSCRIPTEN__ #ifdef __EMSCRIPTEN__

View File

@ -1,4 +1,4 @@
#include "BoneAnimatedModelNew.h" #include "BoneAnimatedModelNew.h"
#include <regex> #include <regex>
#include <string> #include <string>
#include <fstream> #include <fstream>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "render/Renderer.h" #include "render/Renderer.h"
#include <unordered_map> #include <unordered_map>

View File

@ -1,4 +1,4 @@
#include "Character.h" #include "Character.h"
#include "render/TextRenderer.h" #include "render/TextRenderer.h"
#include <cmath> #include <cmath>
#include <iostream> #include <iostream>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "CharacterState.h" #include "CharacterState.h"
#include "BoneAnimatedModelNew.h" #include "BoneAnimatedModelNew.h"
#include "render/Renderer.h" #include "render/Renderer.h"

View File

@ -1,4 +1,4 @@
#include "CharacterState.h" #include "CharacterState.h"
namespace ZL { namespace ZL {

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <string> #include <string>
#include <vector> #include <vector>
#include <unordered_map> #include <unordered_map>

View File

@ -412,13 +412,15 @@ namespace ZL
nlohmann::json root; nlohmann::json root;
gameState.save(root); gameState.save(root);
const std::string path = "resources/config/start_state.json"; const std::string path = "resources/config/start_state.json";
/*
std::ofstream file(path); std::ofstream file(path);
if (file.is_open()) { if (file.is_open()) {
file << root.dump(2); file << root.dump(2);
std::cout << "[reset] Saved initial state snapshot to " << path << std::endl; std::cout << "[reset] Saved initial state snapshot to " << path << std::endl;
} else { } else {
std::cerr << "[reset] Could not open " << path << " for writing" << std::endl; std::cerr << "[reset] Could not open " << path << " for writing" << std::endl;
} }*/
saveJsonToFile(root, path);
} }
void Game::createLocations() void Game::createLocations()
@ -1664,7 +1666,7 @@ namespace ZL
SaveSlotInfo Game::readSlotInfo(int slot) const SaveSlotInfo Game::readSlotInfo(int slot) const
{ {
std::string path = "save_slot" + std::to_string(slot) + ".json"; std::string path = "save_slot" + std::to_string(slot) + ".json";
std::string content = ZL::readTextFile(path); std::string content = ZL::readSavedTextFile(path);
if (content.empty()) return {}; if (content.empty()) return {};
try { try {
nlohmann::json root = nlohmann::json::parse(content); nlohmann::json root = nlohmann::json::parse(content);
@ -1683,18 +1685,20 @@ namespace ZL
nlohmann::json root; nlohmann::json root;
gameState.save(root); gameState.save(root);
std::string path = "save_slot" + std::to_string(slot) + ".json"; std::string path = "save_slot" + std::to_string(slot) + ".json";
std::ofstream file(path);
/*std::ofstream file(path);
if (file.is_open()) { if (file.is_open()) {
file << root.dump(2); file << root.dump(2);
} else { } else {
std::cerr << "[save] Could not open " << path << " for writing" << std::endl; std::cerr << "[save] Could not open " << path << " for writing" << std::endl;
} }*/
saveJsonToFile(root, path);
} }
void Game::loadGame(int slot) void Game::loadGame(int slot)
{ {
std::string path = "save_slot" + std::to_string(slot) + ".json"; std::string path = "save_slot" + std::to_string(slot) + ".json";
std::string content = ZL::readTextFile(path); std::string content = ZL::readSavedTextFile(path);
if (content.empty()) { if (content.empty()) {
std::cerr << "[save] Save file not found or empty: " << path << std::endl; std::cerr << "[save] Save file not found or empty: " << path << std::endl;
return; return;

View File

@ -1,4 +1,4 @@
#include "GameState.h" #include "GameState.h"
#include <ctime> #include <ctime>
#include <iomanip> #include <iomanip>
#include <sstream> #include <sstream>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "items/Item.h" #include "items/Item.h"
#include "quest/QuestJournal.h" #include "quest/QuestJournal.h"
#include "Location.h" #include "Location.h"

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"
namespace ZL { namespace ZL {

View File

@ -1,9 +1,16 @@
#include "Localization.h" #include "Localization.h"
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"
#include "utils/Utils.h" #include "utils/Utils.h"
#include <iostream> #include <iostream>
// Платформозависимые инклюды для детекции языка
#if defined(_WIN32)
#include <windows.h>
#elif defined(__EMSCRIPTEN__)
#include <emscripten.h>
#endif
namespace ZL { namespace ZL {
Language g_currentLanguage = Language::Russian; Language g_currentLanguage = Language::Russian;
@ -55,8 +62,15 @@ std::string readLocalizedConfigFile(const std::string& basePath, const std::stri
} }
void loadLanguageSetting() { void loadLanguageSetting() {
const std::string content = readTextFile("settings.json"); const std::string content = readSavedTextFile("settings.json");
if (content.empty()) return;
// Если файла настроек нет (content пустой), определяем язык системы и выходим
if (content.empty()) {
g_currentLanguage = detectSystemLanguage();
std::cout << "[settings] No settings.json found. System language detected: "
<< languageToCode(g_currentLanguage) << std::endl;
return;
}
try { try {
const nlohmann::json root = nlohmann::json::parse(content); const nlohmann::json root = nlohmann::json::parse(content);
@ -68,4 +82,41 @@ void loadLanguageSetting() {
} }
} }
Language detectSystemLanguage() {
#if defined(__EMSCRIPTEN__)
// Получаем первые два символа языка из браузера (0 - English, 1 - Russian, -1 - другой)
int res = EM_ASM_INT({
var lang = (navigator.language || navigator.userLanguage || 'en').toLowerCase();
if (lang.startsWith('ru')) return 1;
if (lang.startsWith('en')) return 0;
return -1;
});
if (res == 1) return Language::Russian;
if (res == 0) return Language::English;
#elif defined(_WIN32)
LANGID langId = GetUserDefaultUILanguage();
WORD primaryLang = PRIMARYLANGID(langId);
if (primaryLang == LANG_RUSSIAN) return Language::Russian;
if (primaryLang == LANG_ENGLISH) return Language::English;
#else
// Linux / SteamOS
const char* langEnv = std::getenv("LC_ALL");
if (!langEnv || *langEnv == '\0') {
langEnv = std::getenv("LANG");
}
if (langEnv && *langEnv != '\0') {
std::string langStr(langEnv);
// Ищем префиксы "ru" или "en" в начале строки (например, ru_RU.UTF-8)
if (langStr.rfind("ru", 0) == 0) return Language::Russian;
if (langStr.rfind("en", 0) == 0) return Language::English;
}
#endif
// Дефолтный фоллбек, если язык системы не поддерживается игрой (например, немецкий)
return Language::English;
}
} // namespace ZL } // namespace ZL

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <string> #include <string>
namespace ZL { namespace ZL {
@ -29,4 +29,6 @@ std::string readLocalizedConfigFile(const std::string& basePath, const std::stri
// location scripts start dialogues eagerly as soon as they're loaded. // location scripts start dialogues eagerly as soon as they're loaded.
void loadLanguageSetting(); void loadLanguageSetting();
Language detectSystemLanguage();
} // namespace ZL } // namespace ZL

View File

@ -1,4 +1,4 @@
#include "Location.h" #include "Location.h"
#include "utils/Utils.h" #include "utils/Utils.h"
#include "render/OpenGlExtensions.h" #include "render/OpenGlExtensions.h"
#include <iostream> #include <iostream>
@ -20,11 +20,15 @@ namespace ZL
{ {
extern const char* CONST_ZIP_FILE; extern const char* CONST_ZIP_FILE;
static constexpr float CAMERA_FOV_Y = 1.0f / 1.5f; static constexpr float CAMERA_FOV_Y = 1.0f / 1.5f;
// How close the player needs to be to a peaceful NPC before the // How close the player needs to be to a peaceful NPC before the
// on_npc_interact callback fires and the conversation begins. // on_npc_interact callback fires and the conversation begins.
static constexpr float NPC_TALK_DISTANCE = 1.35f; static constexpr float NPC_TALK_DISTANCE = 1.35f;
static constexpr float RENDER_DISTRANCE = 50.f;
static float distancePointToSegmentXZ(const Eigen::Vector3f& p, static float distancePointToSegmentXZ(const Eigen::Vector3f& p,
const Eigen::Vector3f& a, const Eigen::Vector3f& a,
const Eigen::Vector3f& b) const Eigen::Vector3f& b)

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "render/Renderer.h" #include "render/Renderer.h"
#include "Environment.h" #include "Environment.h"

View File

@ -1,4 +1,4 @@
#include "LocationEditor.h" #include "LocationEditor.h"
#include "Location.h" #include "Location.h"
#include "Character.h" #include "Character.h"
#include "utils/Utils.h" #include "utils/Utils.h"
@ -415,6 +415,7 @@ namespace ZL
} }
const std::string filename = baseName + ".json"; const std::string filename = baseName + ".json";
/*
std::ofstream out(filename); std::ofstream out(filename);
if (out.is_open()) { if (out.is_open()) {
out << j.dump(4); out << j.dump(4);
@ -422,7 +423,8 @@ namespace ZL
<< " interactive object(s) to " << filename << "\n"; << " interactive object(s) to " << filename << "\n";
} else { } else {
std::cerr << "[IO_EDITOR] Failed to open " << filename << " for writing\n"; std::cerr << "[IO_EDITOR] Failed to open " << filename << " for writing\n";
} }*/
saveJsonToFile(j, filename);
} }
void LocationEditor::saveAll() void LocationEditor::saveAll()
@ -522,14 +524,15 @@ namespace ZL
} }
const std::string filename = baseName + ".json"; const std::string filename = baseName + ".json";
std::ofstream out(filename); /*std::ofstream out(filename);
if (out.is_open()) { if (out.is_open()) {
out << j.dump(4); out << j.dump(4);
std::cout << "[GAME_EDITOR] Saved " << editorPlacedObjects.size() std::cout << "[GAME_EDITOR] Saved " << editorPlacedObjects.size()
<< " object(s) to " << filename << "\n"; << " object(s) to " << filename << "\n";
} else { } else {
std::cerr << "[GAME_EDITOR] Failed to open " << filename << " for writing\n"; std::cerr << "[GAME_EDITOR] Failed to open " << filename << " for writing\n";
} }*/
saveJsonToFile(j, filename);
} }
} // namespace ZL } // namespace ZL

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <vector> #include <vector>
#include <string> #include <string>

View File

@ -1,4 +1,4 @@
#include "LocationState.h" #include "LocationState.h"
namespace ZL { namespace ZL {

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"
#include "ISaveable.h" #include "ISaveable.h"

View File

@ -1,4 +1,4 @@
#include "MenuManager.h" #include "MenuManager.h"
#include "Game.h" #include "Game.h"
#include "Localization.h" #include "Localization.h"
#include "items/ItemRegistry.h" #include "items/ItemRegistry.h"
@ -672,10 +672,16 @@ namespace ZL {
const bool portrait = isPortraitMode(); const bool portrait = isPortraitMode();
uiManager.pushMenuFromSavedRoot(portrait ? portraitInventoryListRoot : newInventoryRoot); uiManager.pushMenuFromSavedRoot(portrait ? portraitInventoryListRoot : newInventoryRoot);
uiManager.setButtonCallback("inventoryExitButton", [this](const std::string&) { uiManager.setButtonCallback("inventoryExitButton2", [this](const std::string&) {
closeInventory(); closeInventory();
}); });
uiManager.setButtonCallback("inventoryExitButton", [this](const std::string&) {
closeInventory();
});
uiManager.setButtonCallback("inventoryMain", [this](const std::string&) {});
const auto& items = inventory->getItems(); const auto& items = inventory->getItems();
const int maxSlots = 9; const int maxSlots = 9;
for (int i = 0; i < maxSlots; ++i) { for (int i = 0; i < maxSlots; ++i) {
@ -772,6 +778,15 @@ namespace ZL {
audioPlayer_.playSoundAsync("audio/656126__itsthegoodstuff__paging-through-book.ogg"); audioPlayer_.playSoundAsync("audio/656126__itsthegoodstuff__paging-through-book.ogg");
}); });
uiManager.setButtonCallback("journalExitButton2", [this](const std::string&) {
closeQuestJournal();
audioPlayer_.playSoundAsync("audio/656126__itsthegoodstuff__paging-through-book.ogg");
});
uiManager.setButtonCallback("journalMain", [this](const std::string&) {});
static const char* kItemNames[9] = { static const char* kItemNames[9] = {
"item1name","item2name","item3name", "item1name","item2name","item3name",
"item4name","item5name","item6name", "item4name","item5name","item6name",
@ -1576,6 +1591,14 @@ namespace ZL {
audioPlayer_.playSoundAsync("audio/sound_bag001.ogg"); audioPlayer_.playSoundAsync("audio/sound_bag001.ogg");
}); });
uiManager.setButtonCallback("inventoryExitButton2", [this](const std::string&) {
closePortraitInventoryItem();
audioPlayer_.playSoundAsync("audio/sound_bag001.ogg");
});
uiManager.setButtonCallback("inventoryMain", [this](const std::string&) {});
const auto& item = items[index]; const auto& item = items[index];
auto img = uiManager.findStaticImage("selectedItemPic"); auto img = uiManager.findStaticImage("selectedItemPic");
@ -1604,6 +1627,15 @@ namespace ZL {
audioPlayer_.playSoundAsync("audio/255571__stradie__flipping-paper.ogg"); audioPlayer_.playSoundAsync("audio/255571__stradie__flipping-paper.ogg");
}); });
uiManager.setButtonCallback("journalItemExitButton2", [this](const std::string&) {
closeQuestJournal();
audioPlayer_.playSoundAsync("audio/656126__itsthegoodstuff__paging-through-book.ogg");
});
uiManager.setButtonCallback("journalMain", [this](const std::string&) {});
Quest::QuestState* quest = gameState_.questJournal.findQuest(visibleQuestIds[index]); Quest::QuestState* quest = gameState_.questJournal.findQuest(visibleQuestIds[index]);
if (!quest) return; if (!quest) return;
const auto& def = quest->definition; const auto& def = quest->definition;
@ -1665,6 +1697,13 @@ namespace ZL {
uiManager.updateAllLayouts(); uiManager.updateAllLayouts();
refreshQuestJournalUi(); refreshQuestJournalUi();
} }
/*
void MenuManager::closePortraitJournalItemCompletely() {
journalMenuStackDepth_ = 1;
uiManager.popMenu();
uiManager.updateAllLayouts();
refreshQuestJournalUi();
}*/
void MenuManager::resetPhoneChatNodes() { void MenuManager::resetPhoneChatNodes() {
static const char* kChatNodes[] = { static const char* kChatNodes[] = {
@ -2054,19 +2093,14 @@ namespace ZL {
void MenuManager::saveSettings() { void MenuManager::saveSettings() {
nlohmann::json root; nlohmann::json root;
root["musicVolume"] = audioPlayer_.getMusicVolume(); root["musicVolume"] = audioPlayer_.getMusicVolume();
root["soundVolume"] = audioPlayer_.getSoundVolume(); root["soundVolume"] = audioPlayer_.getSoundVolume();
root["musicEnabled"] = audioPlayer_.isMusicEnabled(); root["musicEnabled"] = audioPlayer_.isMusicEnabled();
root["soundEnabled"] = audioPlayer_.isSoundEnabled(); root["soundEnabled"] = audioPlayer_.isSoundEnabled();
root["fullscreen"] = Environment::isFullscreen; root["fullscreen"] = Environment::isFullscreen;
root["language"] = ZL::languageToCode(ZL::g_currentLanguage); root["language"] = ZL::languageToCode(ZL::g_currentLanguage);
std::ofstream file("settings.json"); saveJsonToFile(root, "settings.json");
if (file.is_open()) {
file << root.dump(2);
} else {
std::cerr << "[settings] Could not open settings.json for writing" << std::endl;
}
} }
void MenuManager::loadSettings() { void MenuManager::loadSettings() {
@ -2079,7 +2113,7 @@ namespace ZL {
// loaded, before this function ever runs. // loaded, before this function ever runs.
ZL::loadLanguageSetting(); ZL::loadLanguageSetting();
const std::string content = ZL::readTextFile("settings.json"); const std::string content = ZL::readSavedTextFile("settings.json");
if (content.empty()) return; if (content.empty()) return;
try { try {
const nlohmann::json root = nlohmann::json::parse(content); const nlohmann::json root = nlohmann::json::parse(content);

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "render/Renderer.h" #include "render/Renderer.h"
#include "Environment.h" #include "Environment.h"
#include "render/TextureManager.h" #include "render/TextureManager.h"
@ -164,6 +164,7 @@ namespace ZL {
void closePortraitInventoryItem(); void closePortraitInventoryItem();
void openPortraitQuestJournalItem(int index); void openPortraitQuestJournalItem(int index);
void closePortraitJournalItem(); void closePortraitJournalItem();
//void closePortraitJournalItemCompletely();
void showAboutScreen(); void showAboutScreen();
void showSettingsScreen(); void showSettingsScreen();

View File

@ -1,4 +1,4 @@
#include "ScriptEngine.h" #include "ScriptEngine.h"
#include "Game.h" #include "Game.h"
#include <iostream> #include <iostream>
#include <stdexcept> #include <stdexcept>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <string> #include <string>
#include <memory> #include <memory>
#include <unordered_map> #include <unordered_map>

View File

@ -1,4 +1,4 @@
#include "TeleportZone.h" #include "TeleportZone.h"
#include "render/Renderer.h" #include "render/Renderer.h"
#include "render/TextureManager.h" #include "render/TextureManager.h"

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <string> #include <string>
#include <memory> #include <memory>
#include <Eigen/Core> #include <Eigen/Core>

View File

@ -1,4 +1,4 @@
#include "cutscene/CutsceneDatabase.h" #include "cutscene/CutsceneDatabase.h"
#include "utils/Utils.h" #include "utils/Utils.h"
#include <iostream> #include <iostream>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "cutscene/CutsceneTypes.h" #include "cutscene/CutsceneTypes.h"
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"

View File

@ -1,4 +1,4 @@
#include "cutscene/CutsceneOverlay.h" #include "cutscene/CutsceneOverlay.h"
#include "dialogue/DialogueTypes.h" #include "dialogue/DialogueTypes.h"
#include "Environment.h" #include "Environment.h"

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "cutscene/CutsceneTypes.h" #include "cutscene/CutsceneTypes.h"
#include "dialogue/DialogueTypes.h" #include "dialogue/DialogueTypes.h"

View File

@ -1,4 +1,4 @@
#include "cutscene/CutsceneRuntime.h" #include "cutscene/CutsceneRuntime.h"
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "cutscene/CutsceneDatabase.h" #include "cutscene/CutsceneDatabase.h"
#include "dialogue/DialogueTypes.h" #include "dialogue/DialogueTypes.h"

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <string> #include <string>
#include <vector> #include <vector>

View File

@ -1,4 +1,4 @@
#include "dialogue/DialogueDatabase.h" #include "dialogue/DialogueDatabase.h"
#include "utils/Utils.h" #include "utils/Utils.h"
#include <iostream> #include <iostream>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "dialogue/DialogueTypes.h" #include "dialogue/DialogueTypes.h"
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"

View File

@ -1,4 +1,4 @@
#include "dialogue/DialogueOverlay.h" #include "dialogue/DialogueOverlay.h"
#include "dialogue/DialogueTypes.h" #include "dialogue/DialogueTypes.h"
#include "GameConstants.h" #include "GameConstants.h"

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "dialogue/DialogueRuntime.h" #include "dialogue/DialogueRuntime.h"
#include "render/Renderer.h" #include "render/Renderer.h"

View File

@ -1,4 +1,4 @@
#include "dialogue/DialogueRuntime.h" #include "dialogue/DialogueRuntime.h"
#include <algorithm> #include <algorithm>
#include <iostream> #include <iostream>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "dialogue/DialogueDatabase.h" #include "dialogue/DialogueDatabase.h"
#include "dialogue/TranslationDatabase.h" #include "dialogue/TranslationDatabase.h"

View File

@ -1,4 +1,4 @@
#include "dialogue/DialogueSystem.h" #include "dialogue/DialogueSystem.h"
namespace ZL::Dialogue { namespace ZL::Dialogue {

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"
#include "dialogue/DialogueOverlay.h" #include "dialogue/DialogueOverlay.h"

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "cutscene/CutsceneTypes.h" #include "cutscene/CutsceneTypes.h"
#include <string> #include <string>

View File

@ -1,4 +1,4 @@
#include "dialogue/TranslationDatabase.h" #include "dialogue/TranslationDatabase.h"
#include "utils/Utils.h" #include "utils/Utils.h"
#include <iostream> #include <iostream>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "Localization.h" #include "Localization.h"
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"

View File

@ -1,4 +1,4 @@
#include "GameObjectLoader.h" #include "GameObjectLoader.h"
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <cmath> #include <cmath>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <string> #include <string>
#include <vector> #include <vector>
#include <memory> #include <memory>

View File

@ -1,4 +1,4 @@
#include "InteractiveObject.h" #include "InteractiveObject.h"
#include "render/Renderer.h" #include "render/Renderer.h"
#include "render/TextureManager.h" #include "render/TextureManager.h"
#include "../TextModel.h" #include "../TextModel.h"

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <string> #include <string>
#include <memory> #include <memory>
#include <optional> #include <optional>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <string> #include <string>
#include <optional> #include <optional>
#include <functional> #include <functional>

View File

@ -1,4 +1,4 @@
#include "Item.h" #include "Item.h"
#include "ItemRegistry.h" #include "ItemRegistry.h"
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"
#include <algorithm> #include <algorithm>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <string> #include <string>
#include <memory> #include <memory>
#include <vector> #include <vector>

View File

@ -1,4 +1,4 @@
#include "ItemRegistry.h" #include "ItemRegistry.h"
#include "utils/Utils.h" #include "utils/Utils.h"
#include "Localization.h" #include "Localization.h"
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
#include "Item.h" #include "Item.h"

View File

@ -132,6 +132,8 @@ int main(int argc, char* argv[]) {
// since we now handle SDL_FINGERDOWN directly for multi-touch support. // since we now handle SDL_FINGERDOWN directly for multi-touch support.
SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "0"); SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "0");
ZL::emscriptenInitFileSystem();
emscripten_set_main_loop(MainLoop, 0, 1); emscripten_set_main_loop(MainLoop, 0, 1);
@ -252,7 +254,7 @@ int main(int argc, char *argv[]) {
// window, so it opens directly in the right mode instead of flashing // window, so it opens directly in the right mode instead of flashing
// windowed -> fullscreen once settings are loaded later during setupPart2(). // windowed -> fullscreen once settings are loaded later during setupPart2().
{ {
const std::string settingsContent = ZL::readTextFile("settings.json"); const std::string settingsContent = ZL::readSavedTextFile("settings.json");
if (!settingsContent.empty()) { if (!settingsContent.empty()) {
try { try {
const nlohmann::json settingsRoot = nlohmann::json::parse(settingsContent); const nlohmann::json settingsRoot = nlohmann::json::parse(settingsContent);

View File

@ -1,4 +1,4 @@
#include "navigation/PathFinder.h" #include "navigation/PathFinder.h"
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"
#include "utils/Utils.h" #include "utils/Utils.h"
#include <algorithm> #include <algorithm>
@ -584,16 +584,20 @@ bool PathFinder::saveConfig(const std::string& path) const
} }
root["obstacles"] = obstArr; root["obstacles"] = obstArr;
/*
std::ofstream f(path); std::ofstream f(path);
if (!f.is_open()) { if (!f.is_open()) {
return false; return false;
} }
f << root.dump(2); f << root.dump(2);
return f.good(); return f.good();*/
return saveJsonToFile(root, path);
} }
bool PathFinder::saveGrid(const std::string& path) const bool PathFinder::saveGrid(const std::string& path) const
{ {
#if defined(_WIN32)
if (!ready) return false; if (!ready) return false;
std::ofstream f(path); std::ofstream f(path);
if (!f.is_open()) return false; if (!f.is_open()) return false;
@ -615,6 +619,9 @@ bool PathFinder::saveGrid(const std::string& path) const
f << '\n'; f << '\n';
} }
return f.good(); return f.good();
#else
return false;
#endif
} }
bool PathFinder::loadGrid(const std::string& path, const std::string& zipPath) bool PathFinder::loadGrid(const std::string& path, const std::string& zipPath)

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "render/Renderer.h" #include "render/Renderer.h"
#include <Eigen/Core> #include <Eigen/Core>

View File

@ -1,4 +1,4 @@
#include "quest/QuestJournal.h" #include "quest/QuestJournal.h"
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"
#include "utils/Utils.h" #include "utils/Utils.h"
#include "Localization.h" #include "Localization.h"

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "quest/QuestTypes.h" #include "quest/QuestTypes.h"
#include "ISaveable.h" #include "ISaveable.h"

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <string> #include <string>
#include <vector> #include <vector>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "render/OpenGlExtensions.h" #include "render/OpenGlExtensions.h"
#include "utils/Utils.h" #include "utils/Utils.h"

View File

@ -1,4 +1,4 @@
#include "ShadowMap.h" #include "ShadowMap.h"
#include "Environment.h" #include "Environment.h"
#include <iostream> #include <iostream>
#include <cmath> #include <cmath>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "render/OpenGlExtensions.h" #include "render/OpenGlExtensions.h"
#include <Eigen/Dense> #include <Eigen/Dense>

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "render/Renderer.h" #include "render/Renderer.h"
#include "UiManager.h" #include "UiManager.h"

View File

@ -16,126 +16,133 @@
#include <android/log.h> #include <android/log.h>
#endif #endif
#if defined(_WIN32)
#include <windows.h>
#include <shlobj.h>
#elif defined(__EMSCRIPTEN__)
#include <emscripten.h>
#endif
namespace ZL namespace ZL
{ {
std::string readTextFile(const std::string &filename) { std::string readTextFile(const std::string& filename) {
#ifdef __ANDROID__ #ifdef __ANDROID__
SDL_RWops* file = SDL_RWFromFile(filename.c_str(), "rb"); SDL_RWops* file = SDL_RWFromFile(filename.c_str(), "rb");
if (!file) { if (!file) {
#ifdef DEBUG #ifdef DEBUG
__android_log_print(ANDROID_LOG_ERROR, "Utils", __android_log_print(ANDROID_LOG_ERROR, "Utils",
"Failed to open: %s", filename.c_str()); "Failed to open: %s", filename.c_str());
#endif #endif
return ""; return "";
} }
Sint64 size = SDL_RWsize(file); Sint64 size = SDL_RWsize(file);
if (size <= 0) { if (size <= 0) {
SDL_RWclose(file); SDL_RWclose(file);
return ""; return "";
} }
std::string content(size, '\0'); std::string content(size, '\0');
if (SDL_RWread(file, &content[0], size, 1) != 1) { if (SDL_RWread(file, &content[0], size, 1) != 1) {
SDL_RWclose(file); SDL_RWclose(file);
return ""; return "";
} }
SDL_RWclose(file); SDL_RWclose(file);
return content; return content;
#else #else
std::ifstream f(filename); std::ifstream f(filename);
if (!f.is_open()) { if (!f.is_open()) {
return ""; return "";
} }
return std::string((std::istreambuf_iterator<char>(f)), return std::string((std::istreambuf_iterator<char>(f)),
std::istreambuf_iterator<char>()); std::istreambuf_iterator<char>());
#endif #endif
} }
std::vector<char> readFile(const std::string &filename) { std::vector<char> readFile(const std::string& filename) {
#ifdef __ANDROID__ #ifdef __ANDROID__
SDL_RWops* file = SDL_RWFromFile(filename.c_str(), "rb"); SDL_RWops* file = SDL_RWFromFile(filename.c_str(), "rb");
if (!file) { if (!file) {
return {}; return {};
} }
Sint64 size = SDL_RWsize(file); Sint64 size = SDL_RWsize(file);
if (size <= 0) { if (size <= 0) {
SDL_RWclose(file); SDL_RWclose(file);
return {}; return {};
} }
std::vector<char> data(size); std::vector<char> data(size);
if (SDL_RWread(file, data.data(), size, 1) != 1) { if (SDL_RWread(file, data.data(), size, 1) != 1) {
SDL_RWclose(file); SDL_RWclose(file);
return {}; return {};
} }
SDL_RWclose(file); SDL_RWclose(file);
return data; return data;
#else #else
std::ifstream file(filename, std::ios::binary | std::ios::ate); std::ifstream file(filename, std::ios::binary | std::ios::ate);
if (!file) { if (!file) {
return {}; return {};
} }
std::streamsize size = file.tellg(); std::streamsize size = file.tellg();
if (size <= 0) { if (size <= 0) {
return {}; return {};
} }
file.seekg(0, std::ios::beg); file.seekg(0, std::ios::beg);
std::vector<char> buffer(size); std::vector<char> buffer(size);
if (!file.read(buffer.data(), size)) { if (!file.read(buffer.data(), size)) {
return {}; return {};
} }
return buffer; return buffer;
#endif #endif
} }
std::vector<char> readFileFromZIP(const std::string& filename, const std::string& zipfilename) { std::vector<char> readFileFromZIP(const std::string& filename, const std::string& zipfilename) {
#ifdef EMSCRIPTEN #ifdef EMSCRIPTEN
int zipErr = 0; int zipErr = 0;
zip_t* archive = zip_open(zipfilename.c_str(), ZIP_RDONLY, &zipErr); zip_t* archive = zip_open(zipfilename.c_str(), ZIP_RDONLY, &zipErr);
if (!archive) { if (!archive) {
std::cout << "Failed to open ZIP: " << zipfilename << " (error code " << zipErr << ")" << std::endl; std::cout << "Failed to open ZIP: " << zipfilename << " (error code " << zipErr << ")" << std::endl;
throw std::runtime_error("Failed to open ZIP: " + zipfilename); throw std::runtime_error("Failed to open ZIP: " + zipfilename);
} }
std::string cleanFilename = filename; std::string cleanFilename = filename;
if (cleanFilename.rfind("./", 0) == 0) cleanFilename = cleanFilename.substr(2); if (cleanFilename.rfind("./", 0) == 0) cleanFilename = cleanFilename.substr(2);
zip_stat_t fileStat; zip_stat_t fileStat;
zip_stat_init(&fileStat); zip_stat_init(&fileStat);
if (zip_stat(archive, cleanFilename.c_str(), 0, &fileStat) != 0 || !(fileStat.valid & ZIP_STAT_SIZE)) { if (zip_stat(archive, cleanFilename.c_str(), 0, &fileStat) != 0 || !(fileStat.valid & ZIP_STAT_SIZE)) {
zip_close(archive); zip_close(archive);
std::cout << "Failed to stat file in ZIP: " << cleanFilename << " in " << zipfilename << std::endl; std::cout << "Failed to stat file in ZIP: " << cleanFilename << " in " << zipfilename << std::endl;
throw std::runtime_error("Can't stat file in ZIP: " + cleanFilename); throw std::runtime_error("Can't stat file in ZIP: " + cleanFilename);
} }
zip_file_t* zipFile = zip_fopen(archive, cleanFilename.c_str(), 0); zip_file_t* zipFile = zip_fopen(archive, cleanFilename.c_str(), 0);
if (!zipFile) { if (!zipFile) {
zip_close(archive); zip_close(archive);
std::cout << "Failed to open file in ZIP: " << cleanFilename << std::endl; std::cout << "Failed to open file in ZIP: " << cleanFilename << std::endl;
throw std::runtime_error("Can't open file in ZIP: " + cleanFilename); throw std::runtime_error("Can't open file in ZIP: " + cleanFilename);
} }
std::vector<char> fileData(static_cast<size_t>(fileStat.size)); std::vector<char> fileData(static_cast<size_t>(fileStat.size));
zip_int64_t bytesRead = zip_fread(zipFile, fileData.data(), fileStat.size); zip_int64_t bytesRead = zip_fread(zipFile, fileData.data(), fileStat.size);
// Обязательно закрываем всё перед проверкой результата или throw // Обязательно закрываем всё перед проверкой результата или throw
zip_fclose(zipFile); zip_fclose(zipFile);
zip_close(archive); zip_close(archive);
if (bytesRead < 0 || static_cast<zip_uint64_t>(bytesRead) != fileStat.size) { if (bytesRead < 0 || static_cast<zip_uint64_t>(bytesRead) != fileStat.size) {
std::cout << "Failed to read file from ZIP: " << cleanFilename << " (bytes read: " << bytesRead << ", expected: " << fileStat.size << ")" << std::endl; std::cout << "Failed to read file from ZIP: " << cleanFilename << " (bytes read: " << bytesRead << ", expected: " << fileStat.size << ")" << std::endl;
throw std::runtime_error("Error reading data from ZIP: " + cleanFilename); throw std::runtime_error("Error reading data from ZIP: " + cleanFilename);
} }
return fileData; return fileData;
#else #else
if (zipfilename.empty()) { if (zipfilename.empty()) {
@ -205,4 +212,140 @@ namespace ZL
} }
return false; return false;
} }
bool saveJsonToFile(const nlohmann::json& root, const std::string& filename) {
namespace fs = std::filesystem;
try {
fs::path dir = getSaveDirectory();
fs::create_directories(dir);
fs::path filePath = dir / filename;
std::ofstream file(filePath);
if (file.is_open()) {
file << root.dump(2);
file.close(); // Явно закрываем стрим перед синхронизацией
emscriptenSyncFs();
return file.good();
}
else {
std::cerr << "[settings] Could not open " << filePath << " for writing" << std::endl;
}
}
catch (const fs::filesystem_error& e) {
std::cerr << "[settings] Filesystem error: " << e.what() << std::endl;
}
return false;
}
std::filesystem::path getSaveDirectory() {
namespace fs = std::filesystem;
fs::path baseDir;
#if defined(__EMSCRIPTEN__)
// Для Web монтируем IDBFS обычно в локальную папку /offline или /home/webuser
// Чтобы не усложнять иерархию в IndexedDB, можно использовать фиксированный корень
baseDir = "/offline";
#elif defined(_WIN32)
wchar_t* appDataPath = nullptr;
if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &appDataPath))) {
baseDir = appDataPath;
CoTaskMemFree(appDataPath);
}
else {
const char* envAppData = std::getenv("APPDATA");
baseDir = envAppData ? envAppData : fs::current_path();
}
#else
const char* xdgConfig = std::getenv("XDG_CONFIG_HOME");
if (xdgConfig && *xdgConfig != '\0') {
baseDir = xdgConfig;
}
else {
const char* home = std::getenv("HOME");
baseDir = home ? fs::path(home) / ".config" : fs::current_path();
}
#endif
// На Web-платформе можно опустить имя разработчика, либо оставить для единообразия.
// Если в EMSCRIPTEN монтируется `/offline`, структура останется чистой.
return baseDir / "Fish Run Games" / "Shadow Over Bishkek Demo";
}
std::string readSavedTextFile(const std::string& filename) {
namespace fs = std::filesystem;
try {
fs::path dir = getSaveDirectory();
fs::path filePath = dir / filename;
// Быстрая проверка: если файла вообще нет, сразу выходим
if (!fs::exists(filePath)) {
return "";
}
std::ifstream f(filePath, std::ios::in | std::ios::binary);
if (!f.is_open()) {
std::cerr << "[settings] Could not open " << filePath << " for reading" << std::endl;
return "";
}
// Эффективное чтение всего файла в строку
return std::string((std::istreambuf_iterator<char>(f)),
std::istreambuf_iterator<char>());
}
catch (const fs::filesystem_error& e) {
std::cerr << "[settings] Filesystem error during read: " << e.what() << std::endl;
}
return "";
}
void emscriptenSyncFs()
{
#if defined(__EMSCRIPTEN__)
EM_ASM({
FS.syncfs(false, function(err) {
if (err) {
console.error("Failed to syncfs to IndexedDB:", err);
}
});
});
#endif
//For other OS - do nothing
}
void emscriptenInitFileSystem()
{
#if defined(__EMSCRIPTEN__)
// 1. Создаем точку монтирования в памяти
fs::create_directories("/offline");
// 2. Монтируем IDBFS в эту точку
EM_ASM({
FS.mount(IDBFS, {}, '/offline');
// 3. Синхронизируем из IndexedDB в VFS (true = из IDB в память)
// Этот вызов асинхронный. Настройки станут доступны только после его завершения.
FS.syncfs(true, function(err) {
if (err) {
console.error("Error loading filesystem from IndexedDB:", err);
}
else {
console.log("IndexedDB successfully synced to VFS.");
// Здесь при необходимости можно вызвать коллбэк в C++
// для отложенной загрузки файла настроек, если это критично.
}
});
});
#endif
}
}; };

View File

@ -9,6 +9,12 @@
#include <unordered_map> #include <unordered_map>
#include <array> #include <array>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <cstdlib>
#include "external/nlohmann/json.hpp"
namespace ZL namespace ZL
{ {
std::string readTextFile(const std::string& filename); std::string readTextFile(const std::string& filename);
@ -19,4 +25,14 @@ namespace ZL
bool findString(const char* in, char* list); bool findString(const char* in, char* list);
std::filesystem::path getSaveDirectory();
std::string readSavedTextFile(const std::string& filename);
void emscriptenSyncFs();
void emscriptenInitFileSystem();
bool saveJsonToFile(const nlohmann::json& root, const std::string& filename);
} }