From d4365728fecbaf93a76948f81caab832816fef6a Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Sun, 12 Jul 2026 12:07:58 +0300 Subject: [PATCH] Fixing minor bugs in texts, encoding, UI --- resources/config/npcs_uni_interior.json | 2 +- resources/config/quests.json | 8 +- resources/config/translate_names.json | 4 +- resources/dialogue/cutscenes008.json | 22 +- resources/dialogue/dorm_dialogues003.json | 8 +- resources/dialogue/translate_cutscenes.json | 4 +- resources/dialogue/translate_dialogues.json | 100 +++--- .../dialogue/uni_exterior_dialogues002.json | 4 +- .../dialogue/uni_interior_dialogues_009.json | 232 ++++++------- resources/w/ui/img/{ => inv}/Inventory001.png | 0 resources/w/ui/portrait_screen_inventory.json | 26 +- .../w/ui/portrait_screen_inventory_item.json | 26 +- resources/w/ui/portrait_screen_journal.json | 24 +- .../w/ui/portrait_screen_journal_item.json | 24 +- resources/w/ui/screen_inventory.json | 23 +- resources/w/ui/screen_journal.json | 23 +- resources/w/ui/screen_phone.json | 6 +- .../w/ui_en/portrait_screen_inventory.json | 26 +- .../ui_en/portrait_screen_inventory_item.json | 26 +- .../w/ui_en/portrait_screen_journal.json | 24 +- .../w/ui_en/portrait_screen_journal_item.json | 24 +- resources/w/ui_en/screen_inventory.json | 23 +- resources/w/ui_en/screen_journal.json | 23 +- src/AudioPlayerAsync.cpp | 2 +- src/BoneAnimatedModelNew.cpp | 2 +- src/BoneAnimatedModelNew.h | 2 +- src/Character.cpp | 2 +- src/Character.h | 2 +- src/CharacterState.cpp | 2 +- src/CharacterState.h | 2 +- src/Game.cpp | 14 +- src/GameState.cpp | 2 +- src/GameState.h | 2 +- src/ISaveable.h | 2 +- src/Localization.cpp | 57 +++- src/Localization.h | 4 +- src/Location.cpp | 6 +- src/Location.h | 2 +- src/LocationEditor.cpp | 11 +- src/LocationEditor.h | 2 +- src/LocationState.cpp | 2 +- src/LocationState.h | 2 +- src/MenuManager.cpp | 60 +++- src/MenuManager.h | 3 +- src/ScriptEngine.cpp | 2 +- src/ScriptEngine.h | 2 +- src/TeleportZone.cpp | 2 +- src/TeleportZone.h | 2 +- src/cutscene/CutsceneDatabase.cpp | 2 +- src/cutscene/CutsceneDatabase.h | 2 +- src/cutscene/CutsceneOverlay.cpp | 2 +- src/cutscene/CutsceneOverlay.h | 2 +- src/cutscene/CutsceneRuntime.cpp | 2 +- src/cutscene/CutsceneRuntime.h | 2 +- src/cutscene/CutsceneTypes.h | 2 +- src/dialogue/DialogueDatabase.cpp | 2 +- src/dialogue/DialogueDatabase.h | 2 +- src/dialogue/DialogueOverlay.cpp | 2 +- src/dialogue/DialogueOverlay.h | 2 +- src/dialogue/DialogueRuntime.cpp | 2 +- src/dialogue/DialogueRuntime.h | 2 +- src/dialogue/DialogueSystem.cpp | 2 +- src/dialogue/DialogueSystem.h | 2 +- src/dialogue/DialogueTypes.h | 2 +- src/dialogue/TranslationDatabase.cpp | 2 +- src/dialogue/TranslationDatabase.h | 2 +- src/items/GameObjectLoader.cpp | 2 +- src/items/GameObjectLoader.h | 2 +- src/items/InteractiveObject.cpp | 2 +- src/items/InteractiveObject.h | 2 +- src/items/InteractiveObjectState.h | 2 +- src/items/Item.cpp | 2 +- src/items/Item.h | 2 +- src/items/ItemRegistry.cpp | 2 +- src/items/ItemRegistry.h | 2 +- src/main.cpp | 4 +- src/navigation/PathFinder.cpp | 11 +- src/navigation/PathFinder.h | 2 +- src/quest/QuestJournal.cpp | 2 +- src/quest/QuestJournal.h | 2 +- src/quest/QuestTypes.h | 2 +- src/render/ShaderManager.h | 2 +- src/render/ShadowMap.cpp | 2 +- src/render/ShadowMap.h | 2 +- src/render/UiQuad.h | 2 +- src/utils/Utils.cpp | 313 +++++++++++++----- src/utils/Utils.h | 16 + 87 files changed, 883 insertions(+), 404 deletions(-) rename resources/w/ui/img/{ => inv}/Inventory001.png (100%) diff --git a/resources/config/npcs_uni_interior.json b/resources/config/npcs_uni_interior.json index 29b809d..93a61bd 100644 --- a/resources/config/npcs_uni_interior.json +++ b/resources/config/npcs_uni_interior.json @@ -2,7 +2,7 @@ "npcs": [ { "id": "npc_teacher01", - "name": "Аида Джаныбековна", + "name": "Аида Дженибековна", "animationIdlePath": "resources/w/new_anims/teacher_stand_idle001_small.anim", "animationWalkPath": "resources/w/new_anims/teacher_walk001_small.anim", "meshTextures": { diff --git a/resources/config/quests.json b/resources/config/quests.json index 0385304..bf39c1b 100644 --- a/resources/config/quests.json +++ b/resources/config/quests.json @@ -20,7 +20,7 @@ "objectives": [ { "id": "ghost_lore_aiperi", "text": "Поговорить с Айпери", "completed": 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": "История Бегимай еще более загадочная. Во время сдачи курсовой работы в университете происходила генеральная уборка. По случайности, ее курсовая работа оказалась в стопке бумаг на выброс. В результате курсач оказался на помойке, а преподаватель, не обнаружив курсовую работу, поставил ей ноль баллов. По словам Алика, курсовая работа до сих пор лежит в куче мусора во дворе университета.", "objectives": [ { "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": "Манасоведение", "status": "Available", "autoComplete": true, - "description": "Скоро будет модуль по Манасоведению, а я еще ни разу не ходил на лекции. Сегодня у нас лекция по Манасоведению, надо ее посетить и получить у преподавательницы Аиды Джаныбековной задание на модуль.", + "description": "Скоро будет модуль по Манасоведению, а я еще ни разу не ходил на лекции. Сегодня у нас лекция по Манасоведению, надо ее посетить и получить у преподавательницы Аиды Дженибековной задание на модуль.", "objectives": [ { "id": "study_beginning_lecture", "text": "Посетить лекцию", "completed": false }, { "id": "study_beginning_task", "text": "Получить задание на модуль", "completed": false } @@ -61,7 +61,7 @@ "id": "study_project", "title": "Эссе манасчи", "status": "Hidden", - "description": "Преподавательница по манасоведению Аида Джаныбековна дала мне задачу - найти в библиотеке книгу про манасчи Жусупа Мамая, и написать по этой книге эссе. Книгу нельзя выносить из библиотеки, но можно воспользоваться стоящим в библиотеке компьютером, чтобы написать эссе. Эссе нужно успеть написать до завтра.", + "description": "Преподавательница по манасоведению Аида Дженибековна дала мне задачу - найти в библиотеке книгу про манасчи Жусупа Мамая, и написать по этой книге эссе. Книгу нельзя выносить из библиотеки, но можно воспользоваться стоящим в библиотеке компьютером, чтобы написать эссе. Эссе нужно успеть написать до завтра.", "objectives": [ { "id": "study_project_book", "text": "Найти книгу", "completed": false }, { "id": "study_project_write", "text": "Написать эссе", "completed": false }, diff --git a/resources/config/translate_names.json b/resources/config/translate_names.json index 5623ed3..3504eda 100644 --- a/resources/config/translate_names.json +++ b/resources/config/translate_names.json @@ -11,8 +11,8 @@ "en": "Aiperi" }, { - "key": "Аида Джаныбековна", - "ru": "Аида Джаныбековна", + "key": "Аида Дженибековна", + "ru": "Аида Дженибековна", "en": "Aida Dzhanybekovna" }, { diff --git a/resources/dialogue/cutscenes008.json b/resources/dialogue/cutscenes008.json index 5f3f6bf..9017929 100644 --- a/resources/dialogue/cutscenes008.json +++ b/resources/dialogue/cutscenes008.json @@ -333,77 +333,77 @@ ], "lines": [ { - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "text": "Опаздывающие, заходите скорее и занимайте свои места! Лекция начинается!", "durationMs": 4000, "waitForConfirm": false, "luaCallback": "" }, { - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "text": "В эпизоде \"Семетей\" трилогии \"Манас\", изменники Канчоро и Кыяз захватывают власть над кыргызами.", "durationMs": 3200, "waitForConfirm": false, "luaCallback": "" }, { - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "text": "Чтобы спасти раненого богатыря Семетея, фея Кёкмончок с помощью заклинания уводит его в иной мир.", "durationMs": 3201, "waitForConfirm": false, "luaCallback": "" }, { - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "text": "Этот мир описан в эпосе Манас как Кайып или Аль-Гайб, но некоторые ученые называют его миром теней.", "durationMs": 3202, "waitForConfirm": false, "luaCallback": "" }, { - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "text": "В этом мире обитают феи, духи и джинны. Простым смертным в этот мир дорога закрыта.", "durationMs": 3200, "waitForConfirm": false, "luaCallback": "" }, { - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "text": "Время там течет по другому - за один день в теневом мире могут пройти годы жизни обычного мира.", "durationMs": 3200, "waitForConfirm": false, "luaCallback": "" }, { - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "text": "Обычно, мир теней никак не пересекается с нашим миром живых людей.", "durationMs": 3200, "waitForConfirm": false, "luaCallback": "" }, { - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "text": "Но в критические моменты для народа, обитатели теневого мира могут приходить в наш мир.", "durationMs": 3200, "waitForConfirm": false, "luaCallback": "" }, { - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "text": "Совсем недавно закончилась пандемия, а сегодня мир захлестнули кровавые войны.", "durationMs": 3200, "waitForConfirm": false, "luaCallback": "" }, { - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "text": "В такие кризисные моменты истории, грань между мирами становится особенно тонкой.", "durationMs": 3200, "waitForConfirm": false, "luaCallback": "" }, { - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "text": "На сегодня лекция завершена. Все свободны! Задания на этот модуль вы получите индивидуально!", "durationMs": 4000, "waitForConfirm": false, diff --git a/resources/dialogue/dorm_dialogues003.json b/resources/dialogue/dorm_dialogues003.json index 84fbf9e..42241bc 100644 --- a/resources/dialogue/dorm_dialogues003.json +++ b/resources/dialogue/dorm_dialogues003.json @@ -92,7 +92,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_phone.png", - "text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "text": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "next": "line_2", "chatBubble": "in" }, @@ -756,7 +756,7 @@ "type": "Line", "speaker": "Алик", "portrait": "resources/dialogue/portrait_student_boy.png", - "text": "А ведь у нас в этом году новая преподавательница, Аида Джаныбековна!", + "text": "А ведь у нас в этом году новая преподавательница, Аида Дженибековна!", "next": "line_27" }, { @@ -780,7 +780,7 @@ "type": "Line", "speaker": "Алик", "portrait": "resources/dialogue/portrait_student_boy.png", - "text": "Так что Аида Джаныбековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.", + "text": "Так что Аида Дженибековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.", "next": "line_30" }, { @@ -828,7 +828,7 @@ "type": "Line", "speaker": "Алик", "portrait": "resources/dialogue/portrait_student_boy.png", - "text": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Джаныбековна.", + "text": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Дженибековна.", "next": "line_23" }, { diff --git a/resources/dialogue/translate_cutscenes.json b/resources/dialogue/translate_cutscenes.json index e8b3447..771f994 100644 --- a/resources/dialogue/translate_cutscenes.json +++ b/resources/dialogue/translate_cutscenes.json @@ -1,8 +1,8 @@ { "dialogue_translations": [ { - "key": "Аида Джаныбековна", - "ru": "Аида Джаныбековна", + "key": "Аида Дженибековна", + "ru": "Аида Дженибековна", "en": "Aida Dzhanybekovna" }, { diff --git a/resources/dialogue/translate_dialogues.json b/resources/dialogue/translate_dialogues.json index a579b32..3b939a4 100644 --- a/resources/dialogue/translate_dialogues.json +++ b/resources/dialogue/translate_dialogues.json @@ -41,8 +41,8 @@ "en": "Aiperi" }, { - "key": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", - "ru": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "key": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "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." }, { @@ -301,8 +301,8 @@ "en": "I don't think I've ever seen you in a Manas studies class." }, { - "key": "А ведь у нас в этом году новая преподавательница, Аида Джаныбековна!", - "ru": "А ведь у нас в этом году новая преподавательница, Аида Джаныбековна!", + "key": "А ведь у нас в этом году новая преподавательница, Аида Дженибековна!", + "ru": "А ведь у нас в этом году новая преподавательница, Аида Дженибековна!", "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." }, { - "key": "Так что Аида Джаныбековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.", - "ru": "Так что Аида Джаныбековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.", + "key": "Так что Аида Дженибековна еще норм. Подойди к ней, возьми задание на модуль, и начни ходить на пары. Тогда ты сдашь экзамен успешно.", + "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." }, { @@ -346,8 +346,8 @@ "en": "But she's touchy, try not to anger her. You'll only create problems for yourself." }, { - "key": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Джаныбековна.", - "ru": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Джаныбековна.", + "key": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Дженибековна.", + "ru": "Говорят, ей не очень нравится наша новая преподавательница по манасоведению, Аида Дженибековна.", "en": "They say she doesn't really like our new Manas studies teacher, Aida Dzhanybekovna." }, { @@ -476,8 +476,8 @@ "en": "The car is locked." }, { - "key": "Кажется, на этой машине в универ приезжает Аида Джаныбековна.", - "ru": "Кажется, на этой машине в универ приезжает Аида Джаныбековна.", + "key": "Кажется, на этой машине в универ приезжает Аида Дженибековна.", + "ru": "Кажется, на этой машине в универ приезжает Аида Дженибековна.", "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?" }, { - "key": "Помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", - "ru": "Помнишь мы скидывались на торт для Аиды Джаныбековой? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "key": "Помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и нож для торта. И я до сих пор не получила назад ничего.", + "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." }, { @@ -581,8 +581,8 @@ "en": "No wonder I didn't see you at the lecture. Did you skip?" }, { - "key": "Да... Только не говори Аиде Джаныбековой что я здесь.", - "ru": "Да... Только не говори Аиде Джаныбековой что я здесь.", + "key": "Да... Только не говори Аиде Дженибековной что я здесь.", + "ru": "Да... Только не говори Аиде Дженибековной что я здесь.", "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?" }, { - "key": "Постарайся только Аиде Джаныбековой особо на глаза не попадаться. ", - "ru": "Постарайся только Аиде Джаныбековой особо на глаза не попадаться.", + "key": "Постарайся только Аиде Дженибековной особо на глаза не попадаться. ", + "ru": "Постарайся только Аиде Дженибековной особо на глаза не попадаться.", "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?" }, { - "key": "Аида Джаныбековна", - "ru": "Аида Джаныбековна", + "key": "Аида Дженибековна", + "ru": "Аида Дженибековна", "en": "Aida Dzhanybekovna" }, { @@ -686,8 +686,8 @@ "en": "Could you open the teachers' room for me?" }, { - "key": "Аида Джаныбековна", - "ru": "Аида Джаныбековна", + "key": "Аида Дженибековна", + "ru": "Аида Дженибековна", "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." }, { - "key": "Извините, Аида Джаныбековна, я могу пойти уже?", - "ru": "Извините, Аида Джаныбековна, я могу пойти уже?", + "key": "Извините, Аида Дженибековна, я могу пойти уже?", + "ru": "Извините, Аида Дженибековна, я могу пойти уже?", "en": "Excuse me, Aida Dzhanybekovna, can I go now?" }, { @@ -896,8 +896,8 @@ "en": "Okay…" }, { - "key": "Аида Джаныбековна, вы помните Бегимай? Она вам курсовую хотела сдать.", - "ru": "Аида Джаныбековна, вы помните Бегимай? Она вам курсовую хотела сдать.", + "key": "Аида Дженибековна, вы помните Бегимай? Она вам курсовую хотела сдать.", + "ru": "Аида Дженибековна, вы помните Бегимай? Она вам курсовую хотела сдать.", "en": "Aida Dzhanybekovna, do you remember Begimai? She wanted to submit her term paper to you." }, { @@ -921,8 +921,8 @@ "en": "Good!" }, { - "key": "Аида Джаныбековна, здравствуйте!", - "ru": "Аида Джаныбековна, здравствуйте!", + "key": "Аида Дженибековна, здравствуйте!", + "ru": "Аида Дженибековна, здравствуйте!", "en": "Aida Dzhanybekovna, hello!" }, { @@ -956,8 +956,8 @@ "en": "I should return the book to its place before leaving the library." }, { - "key": "Иначе Аида Джаныбековна меня убъет.", - "ru": "Иначе Аида Джаныбековна меня убъет.", + "key": "Иначе Аида Дженибековна меня убъет.", + "ru": "Иначе Аида Дженибековна меня убъет.", "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." }, { - "key": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", - "ru": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", + "key": "Аида Дженибековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", + "ru": "Аида Дженибековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", "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." }, { - "key": "Поэтому, с этого года у нас этот предмет ведет Аида Джаныбековна.", - "ru": "Поэтому, с этого года у нас этот предмет ведет Аида Джаныбековна.", + "key": "Поэтому, с этого года у нас этот предмет ведет Аида Дженибековна.", + "ru": "Поэтому, с этого года у нас этот предмет ведет Аида Дженибековна.", "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." }, { - "key": "Здравствуйте Аида Джаныбековна!", - "ru": "Здравствуйте Аида Джаныбековна!", + "key": "Здравствуйте Аида Дженибековна!", + "ru": "Здравствуйте Аида Дженибековна!", "en": "Hello Aida Dzhanybekovna!" }, { @@ -1631,8 +1631,8 @@ "en": "So, Bekzat, is your essay about Zhusup Mamai ready for submission?" }, { - "key": "Прощу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", - "ru": "Прощу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", + "key": "Прощу прощения Аида Дженибековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", + "ru": "Прощу прощения Аида Дженибековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", "en": "I apologize, Aida Zhanybekovna, I really tried, but I encountered force majeure circumstances." }, { @@ -2171,8 +2171,8 @@ "en": "Mmm, cake." }, { - "key": "Но если я возьму кусочек, Аида Джаныбековна меня убьет.", - "ru": "Но если я возьму кусочек, Аида Джаныбековна меня убьет.", + "key": "Но если я возьму кусочек, Аида Дженибековна меня убьет.", + "ru": "Но если я возьму кусочек, Аида Дженибековна меня убьет.", "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." }, { - "key": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", - "ru": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "key": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "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." }, { - "key": "Помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", - "ru": "Помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "key": "Помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "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." }, { @@ -2196,13 +2196,13 @@ "en": "And secondly, I somehow don’t want to catch Aida’s eye." }, { - "key": "Да... Только не говори Аиде Джаныбековной что я здесь.", - "ru": "Да... Только не говори Аиде Джаныбековной что я здесь.", + "key": "Да... Только не говори Аиде Дженибековной что я здесь.", + "ru": "Да... Только не говори Аиде Дженибековной что я здесь.", "en": "Yes... Just don't tell Aida Dzhanybekovna that I'm here." }, { - "key": "Постарайся только Аиде Джаныбековной особо на глаза не попадаться. ", - "ru": "Постарайся только Аиде Джаныбековной особо на глаза не попадаться.", + "key": "Постарайся только Аиде Дженибековной особо на глаза не попадаться. ", + "ru": "Постарайся только Аиде Дженибековной особо на глаза не попадаться.", "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." }, { - "key": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", - "ru": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", + "key": "Аида Дженибековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", + "ru": "Аида Дженибековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", "en": "Aida Dzhanybekovna saw me in the teachers' room and made me write an essay on this stupid book." }, { - "key": "Прошу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", - "ru": "Прошу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", + "key": "Прошу прощения Аида Дженибековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", + "ru": "Прошу прощения Аида Дженибековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", "en": "I apologize, Aida Dzhanybekovna, I really tried, but I encountered force majeure circumstances." } ] diff --git a/resources/dialogue/uni_exterior_dialogues002.json b/resources/dialogue/uni_exterior_dialogues002.json index 3c059d5..8e2e50d 100644 --- a/resources/dialogue/uni_exterior_dialogues002.json +++ b/resources/dialogue/uni_exterior_dialogues002.json @@ -271,7 +271,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_phone.png", - "text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "text": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "next": "line_2", "chatBubble": "in" }, @@ -420,7 +420,7 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Кажется, на этой машине в универ приезжает Аида Джаныбековна.", + "text": "Кажется, на этой машине в универ приезжает Аида Дженибековна.", "next": "end_1" }, { diff --git a/resources/dialogue/uni_interior_dialogues_009.json b/resources/dialogue/uni_interior_dialogues_009.json index 4d541ba..f7d651e 100644 --- a/resources/dialogue/uni_interior_dialogues_009.json +++ b/resources/dialogue/uni_interior_dialogues_009.json @@ -156,7 +156,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_aiperi.png", - "text": "Помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "text": "Помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "next": "line_7" }, { @@ -236,7 +236,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_aiperi.png", - "text": "Да... Только не говори Аиде Джаныбековной что я здесь.", + "text": "Да... Только не говори Аиде Дженибековной что я здесь.", "next": "line_18" }, { @@ -268,7 +268,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_aiperi.png", - "text": "Постарайся только Аиде Джаныбековной особо на глаза не попадаться. ", + "text": "Постарайся только Аиде Дженибековной особо на глаза не попадаться. ", "next": "line_23" }, { @@ -450,7 +450,7 @@ { "id": "line_1", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Бекзат, что тебе нужно?", "next": "condition_1" @@ -527,7 +527,7 @@ { "id": "line_8", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Зачем тебе в учительскую?", "next": "line_9" @@ -543,7 +543,7 @@ { "id": "line_10", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Это разве твой нож? Этот нож принадлежит Айпери.", "next": "line_11" @@ -551,7 +551,7 @@ { "id": "line_11", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Пусть она сама лично и приходит.", "next": "line_12" @@ -559,7 +559,7 @@ { "id": "line_12", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "А ты даже не смей заходить в учительскую без моего разрешения!", "next": "condition_3" @@ -596,7 +596,7 @@ { "id": "line_3", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Тогда не отвлекай меня, я занята!", "next": "condition_2" @@ -617,7 +617,7 @@ { "id": "line_5", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Кстати, если встретишь Айпери, передай ей, чтобы она подошла ко мне.", "next": "line_6" @@ -625,7 +625,7 @@ { "id": "line_6", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я ей отдам нож, и заодно я дам ей новое задание на модуль.", "next": "setflag_1" @@ -677,7 +677,7 @@ { "id": "line_20", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я же сказала, дай мне сначала найти книги в библиотеке.", "next": "line_21" @@ -685,7 +685,7 @@ { "id": "line_21", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Когда я закончу с книжными делами, подойдешь ко мне и получишь задание.", "next": "line_4" @@ -693,7 +693,7 @@ { "id": "line_15", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я тебя сегодня впервые вижу на парах.", "next": "line_16" @@ -709,7 +709,7 @@ { "id": "line_17", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Хорошо, я дам тебе какое-нибудь задание, но не сейчас.", "next": "line_18" @@ -717,7 +717,7 @@ { "id": "line_18", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я занята, как видишь, я пытаюсь разобраться в каталоге книг в этой библиотеке.", "next": "line_19" @@ -725,7 +725,7 @@ { "id": "line_19", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Когда я закончу, можешь подойти.", "next": "setflag_2" @@ -751,7 +751,7 @@ { "id": "line_1", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Бекзат, ты что делаешь в учительской?", "next": "line_7" @@ -759,7 +759,7 @@ { "id": "line_7", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Тебя не предупреждали, что без моего разрешения в учительскую заходить нельзя?", "next": "line_8" @@ -767,7 +767,7 @@ { "id": "line_8", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Как ты вообще сюда попал?", "next": "line_9" @@ -783,7 +783,7 @@ { "id": "line_10", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Вот лиса! Я же сказала ей, чтобы она лично забрала нож. А она взяла и тебя отправила.", "next": "line_11" @@ -791,7 +791,7 @@ { "id": "line_11", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты точно отдашь этот нож Айпери?", "next": "line_21" @@ -807,7 +807,7 @@ { "id": "line_22", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Хорошо. Когда встретишь ее, отдай нож и передай ей, что я ее жду.", "next": "line_12" @@ -817,13 +817,13 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Извините, Аида Джаныбековна, я могу пойти уже?", + "text": "Извините, Аида Дженибековна, я могу пойти уже?", "next": "line_13" }, { "id": "line_13", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Нет, Бекзат. Ты вломился в учительскую, и теперь хочешь просто так уйти? Не получится.", "next": "line_14" @@ -831,7 +831,7 @@ { "id": "line_14", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я придумала для тебя особенное задание на этот модуль.", "next": "line_2" @@ -839,7 +839,7 @@ { "id": "line_2", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Подготовь эссе по теме \"Манас в изложении Жусупа Мамая\".", "next": "line_15" @@ -847,7 +847,7 @@ { "id": "line_15", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты не сможешь найти ничего по этой теме в интернете. Даже и не пытайся. Тебе придется писать эссе по книге.", "next": "line_3" @@ -855,7 +855,7 @@ { "id": "line_3", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Книга про Жусупа Мамая лежит в библиотеке, но забирать ее из библиотеки нельзя.", "next": "line_4" @@ -871,7 +871,7 @@ { "id": "line_5", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Там в библиотеке есть компьютер, напиши эссе прямо на нем.", "next": "line_16" @@ -887,7 +887,7 @@ { "id": "line_17", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "До завтра.", "next": "line_18" @@ -903,7 +903,7 @@ { "id": "line_19", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "В твоих интересах успеть. Завтра покажешь мне, что у тебя получилось.", "next": "line_20" @@ -911,7 +911,7 @@ { "id": "line_20", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Не сдашь модуль - пойдешь на второй год. В другой раз не будешь трогать вещи в учительской без разрешения.", "next": "line_6" @@ -941,14 +941,14 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Аида Джаныбековна, вы помните Бегимай? Она вам курсовую хотела сдать.", + "text": "Аида Дженибековна, вы помните Бегимай? Она вам курсовую хотела сдать.", "objectiveComplete": "ghost_lore.ghost_lore_teacher", "next": "line_2" }, { "id": "line_2", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Да, она говорила что приносила курсовую, но у меня ее нигде нет.", "next": "line_3" @@ -956,7 +956,7 @@ { "id": "line_3", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Если ты найдешь и покажешь мне ее курсовую работу, я выставлю ей оценку.", "next": "end_1" @@ -974,7 +974,7 @@ { "id": "line_1", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Бекзат, зачетка Бегимай у тебя. Отправляйся в теневой мир и покажи зачетку призраку Бегимай, чтобы она освободилась.", "objectiveComplete": "", @@ -1005,7 +1005,7 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Аида Джаныбековна, здравствуйте!", + "text": "Аида Дженибековна, здравствуйте!", "objectiveComplete": "ghost_lore.ghost_lore_teacher", "next": "line_2" }, @@ -1020,7 +1020,7 @@ { "id": "line_3", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Хорошо, давай посмотрим.", "next": "line_4" @@ -1028,7 +1028,7 @@ { "id": "line_4", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Да, я вижу что курсовая написана хорошо, я ставлю ей максимальный балл.", "objectiveComplete": "ghost_coursework.ghost_coursework_mark", @@ -1037,7 +1037,7 @@ { "id": "line_5", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Вот держи зачетку с оценкой.", "objectiveComplete": "ghost_release.ghost_release_mark", @@ -1046,7 +1046,7 @@ { "id": "line_7", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Теперь иди в теневой мир и покажи зачетку Бегимай. Расскажи ей, что она сдала курсовую работу.", "next": "line_6" @@ -1082,7 +1082,7 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Иначе Аида Джаныбековна меня убъет.", + "text": "Иначе Аида Дженибековна меня убъет.", "next": "end_1" }, { @@ -2252,7 +2252,7 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Аида Джаныбековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", + "text": "Аида Дженибековна увидела меня в учительской, и заставила писать эссе по этой тупой книге.", "next": "line_9" }, { @@ -2401,7 +2401,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_aiperi.png", - "text": "Поэтому, с этого года у нас этот предмет ведет Аида Джаныбековна.", + "text": "Поэтому, с этого года у нас этот предмет ведет Аида Дженибековна.", "next": "line_23" }, { @@ -2508,7 +2508,7 @@ "type": "Line", "speaker": "Айпери", "portrait": "resources/dialogue/portrait_phone.png", - "text": "Бекзат, помнишь мы скидывались на торт для Аиды Джаныбековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", + "text": "Бекзат, помнишь мы скидывались на торт для Аиды Дженибековной? Я тогда еще приносила скатерть, тарелки и серебряный нож для торта. И я до сих пор не получила назад ничего.", "next": "line_2", "chatBubble": "in" }, @@ -3058,7 +3058,7 @@ { "id": "line_1", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Бекзат, ты подготовил эссе на тему \"Манас в изложении Жусупа Мамая\"?", "objectiveComplete": "", @@ -3075,7 +3075,7 @@ { "id": "line_4", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Найди книгу про Жусупа Мамая в библиотеке, а потом садись за компьютер и пиши!", "next": "line_3" @@ -3083,7 +3083,7 @@ { "id": "line_3", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Пока не выполнишь свое задание на модуль, можешь даже и не подходить ко мне.", "next": "end_1" @@ -3103,7 +3103,7 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Здравствуйте Аида Джаныбековна!", + "text": "Здравствуйте Аида Дженибековна!", "objectiveComplete": "", "next": "condition_8" }, @@ -3123,7 +3123,7 @@ { "id": "line_99", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ну что Бекзат, эссе про Жусупа Мамая готово к сдаче?", "next": "line_2" @@ -3133,13 +3133,13 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Прошу прощения Аида Джаныбековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", + "text": "Прошу прощения Аида Дженибековна, я правда старался, но у меня возникли обстоятельства непреодолимой силы.", "next": "line_3" }, { "id": "line_3", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "И что же помешало тебе написать эссе?", "next": "line_4" @@ -3171,7 +3171,7 @@ { "id": "line_6", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Какое еще заклинание? У тебя эта записка с собой?", "next": "line_7" @@ -3187,7 +3187,7 @@ { "id": "line_8", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Надеюсь, ты не читал это заклинание?", "next": "line_9" @@ -3211,7 +3211,7 @@ { "id": "line_12", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Это заклинание переместило тебя в мир теней. ", "next": "line_13" @@ -3219,7 +3219,7 @@ { "id": "line_13", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Этот мир предназначен для фей и джиннов. Обычные люди туда попасть не могут. Но у тебя это как-то получилось.", "next": "line_14" @@ -3235,7 +3235,7 @@ { "id": "line_15", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Не забывай, я изучаю фольклор в целом и Манас в частности. Если бы ты не засыпал над книгами, ты бы тоже много интересного узнал про мир от наших предков.", "next": "line_16" @@ -3243,7 +3243,7 @@ { "id": "line_16", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я освобождаю тебя от задания по эссе. И взамен я дам тебе другое задание. Если хочешь сдать модуль, тебе придется выполнить его.", "next": "line_17", @@ -3260,7 +3260,7 @@ { "id": "line_18", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "В универе завелся призрак. Конечно, его не получится увидеть вживую.", "next": "line_19" @@ -3268,7 +3268,7 @@ { "id": "line_19", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Но иногда по вечерам я слышу плач из лекционного зала.", "next": "line_20" @@ -3276,7 +3276,7 @@ { "id": "line_20", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "А на утро бывает так, что все зачетки в шкафу раскиданы как попало.", "next": "line_21" @@ -3284,7 +3284,7 @@ { "id": "line_21", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Призрак обитает где-то в теневом мире. Попади туда и наладь с ним диалог. Узнай, кто он и что ему нужно.", "next": "line_22" @@ -3292,7 +3292,7 @@ { "id": "line_22", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Если ты успешно избавишься от призрака, я поставлю тебе максимальный балл за модуль.", "next": "setflag_4" @@ -3311,7 +3311,7 @@ { "id": "line_23", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "У тебя есть еще вопросы, Бекзат?", "next": "choice_1" @@ -3360,7 +3360,7 @@ { "id": "line_25", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Теневой мир это мир, в котором обитают феи, духи и джинны. Он существовал всегда.", "next": "line_26" @@ -3368,7 +3368,7 @@ { "id": "line_26", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Обычные люди, не воители, туда не попадают обычно. Кроме тебя, тебе это как-то удалось.", "next": "line_31" @@ -3376,7 +3376,7 @@ { "id": "line_31", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Спрашивай что хочешь, я попробую объяснить.", "next": "choice_2" @@ -3431,7 +3431,7 @@ { "id": "line_30", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я думаю, в мир теней проецируются только фундаментальные объекты, типа зданий, деревьев, рельефа.", "next": "line_27" @@ -3439,7 +3439,7 @@ { "id": "line_27", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Это происходит потому, что в теневом мире время течет сильно медленнее, чем в нашем мире.", "next": "line_32" @@ -3447,7 +3447,7 @@ { "id": "line_32", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Двери у нас слишком часто открываются и закрываются, поэтому в теневом мире они \"размываются\" или попадают в суперпозицию.", "next": "line_28" @@ -3455,7 +3455,7 @@ { "id": "line_28", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Поэтому в мире теней ты можешь спокойно пройти через дверной проем. Но сквозь стены ты пройти не сможешь, они более плотные.", "next": "line_49" @@ -3475,7 +3475,7 @@ { "id": "line_34", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Это их мир, и они там живут. Я думаю что увидев тебя, обитатели теневого мира тоже были шокированы.", "next": "line_35" @@ -3483,7 +3483,7 @@ { "id": "line_35", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Но кое в чем ты прав. Здесь в универе, призраков раньше не было. Всякая чертовщина начала происходить совсем недавно.", "next": "line_36" @@ -3491,7 +3491,7 @@ { "id": "line_36", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты должен узнать, откуда здесь появился призрак, и заставить его исчезнуть.", "next": "line_37" @@ -3499,7 +3499,7 @@ { "id": "line_37", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Помимо призрака, есть еще и тени. Но ты не беспокойся, это всего лишь проекции негативных мыслей.", "next": "line_38" @@ -3507,7 +3507,7 @@ { "id": "line_38", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Просто избавляйся от теней, когда встретишь их. А когда ты изгонишь призрака, тени исчезнут сами. ", "next": "line_49" @@ -3523,7 +3523,7 @@ { "id": "line_40", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Время в мире теней течет значительно медленнее, чем в нашем.", "next": "line_41" @@ -3531,7 +3531,7 @@ { "id": "line_41", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "И похоже, что течение времени там нелинейное.", "next": "line_42" @@ -3539,7 +3539,7 @@ { "id": "line_42", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Это объясняет, почему в теневом мире есть деревья и строения, но отсутствуют двери, автомобили, и прочее.", "next": "line_43" @@ -3547,7 +3547,7 @@ { "id": "line_43", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Объекты в нашем мире должны долго находится на одном месте, прежде чем их проекция появится в мире теней.", "next": "line_49" @@ -3563,7 +3563,7 @@ { "id": "line_45", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Если ты потеряешь сознание в теневом мире, то ты принудительно вернешься в наш мир.", "next": "line_46" @@ -3571,7 +3571,7 @@ { "id": "line_46", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Также избегай света луны, луна тоже может вернуть тебя в мир людей. Лучше вообще не выходи из помещения. ", "next": "line_47" @@ -3579,7 +3579,7 @@ { "id": "line_47", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Если ты задержишься, и в человеческом мире настанет утро, тебя тоже выбросит из теневого мира.", "next": "line_48" @@ -3587,7 +3587,7 @@ { "id": "line_48", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Но ты не беспокойся. Даже если тебя выбросит из теневого мира, ты всегда сможешь повторить свою попытку на следующую ночь.", "next": "line_49" @@ -3595,7 +3595,7 @@ { "id": "line_49", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "У тебя есть еще вопросы про теневой мир?", "next": "choice_2" @@ -3611,7 +3611,7 @@ { "id": "line_51", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты хочешь что-нибудь еще обсудить?", "next": "choice_1" @@ -3627,7 +3627,7 @@ { "id": "line_53", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Нет, это не я. И на самом деле, я немного обеспокоена этим.", "next": "line_56" @@ -3635,7 +3635,7 @@ { "id": "line_56", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Когда я узнала, что в университете начались паранормальные явления, я сразу поняла что это призрак в теневом мире.", "next": "line_54" @@ -3643,7 +3643,7 @@ { "id": "line_54", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я знаю заклинание, которое тебе дали. У этого заклинания есть еще одно условие - оно сработает только на людей, которые чисты сердцем.", "next": "line_57" @@ -3651,7 +3651,7 @@ { "id": "line_57", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я взяла серебряный нож Айпери и пробовала прочитать заклинание, и у меня не получилось.", "next": "line_55" @@ -3659,7 +3659,7 @@ { "id": "line_55", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Тогда я предположила, что Айпери уж точно сможет прочитать заклинание и попасть в теневой мир.", "next": "line_58" @@ -3667,7 +3667,7 @@ { "id": "line_58", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Как раз поэтому я хотела вернуть нож ей лично. И заодно отправить ее в теневой мир.", "next": "line_59" @@ -3675,7 +3675,7 @@ { "id": "line_59", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Но ты смешал все мои планы. Сначала ты забрал нож, а потом кто-то подсунул тебе записку.", "next": "line_60" @@ -3683,7 +3683,7 @@ { "id": "line_60", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Это очень странно. Как будто кто-то играет против меня, и кто-то специально ввел тебя в игру заместо Айпери.", "next": "line_61" @@ -3707,7 +3707,7 @@ { "id": "line_63", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Узнай что нужно призраку, и постарайся уговорить его покинуть университет.", "next": "line_64" @@ -3715,7 +3715,7 @@ { "id": "line_64", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Или ты хочешь вместо этого писать эссе про Жусупа Мамая?", "next": "line_65" @@ -3781,7 +3781,7 @@ { "id": "line_72", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Я не знаю ни одной студентки по имени Бегимай.", "next": "line_73" @@ -3789,7 +3789,7 @@ { "id": "line_73", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Но с другой стороны, я здесь преподаю только с этого года. Возможно, Бегимай училась у предыдущего преподавателя?", "next": "line_74" @@ -3805,7 +3805,7 @@ { "id": "line_75", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Опроси студентов и узнай подробнее, кто эта призрак Бегимай и откуда она взялась.", "next": "line_76" @@ -3813,7 +3813,7 @@ { "id": "line_76", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Потом возвращайся ко мне, и мы обсудим, что делать дальше.", "next": "setflag_1" @@ -3840,7 +3840,7 @@ { "id": "line_78", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "У тебя есть еще вопросы?", "next": "choice_4" @@ -3885,7 +3885,7 @@ { "id": "line_67", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Переходи в теневой мир, а затем иди в лекционный зал.", "next": "line_68" @@ -3893,7 +3893,7 @@ { "id": "line_68", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Постарайся поговорить с призраком, и узнать, что ему нужно.", "next": "line_69" @@ -3901,7 +3901,7 @@ { "id": "line_69", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Потом возвращайся ко мне, и мы обсудим, как можно его изгнать.", "next": "line_77" @@ -3964,7 +3964,7 @@ { "id": "line_95", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Найди курсовую работу Бегимай и принеси мне ее. Я проверю курсовую вместо предыдущего преподавателя и выставлю ей оценку.", "next": "line_77" @@ -3985,7 +3985,7 @@ { "id": "line_97", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Иди к шкафу в учительской. Среди зачетных книжек найти зачетку Бегимай и принеси мне. Я поставлю ей оценку за курсовую работу.", "next": "line_77" @@ -3993,7 +3993,7 @@ { "id": "line_96", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты уже нашел курсовую работу Бегимай?", "next": "line_92" @@ -4041,7 +4041,7 @@ { "id": "line_87", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Печальная история.", "next": "line_88" @@ -4049,7 +4049,7 @@ { "id": "line_88", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Судя по всему, чтобы освободить ее, нужно найти ее курсовую работу и поставить ей оценку.", "next": "line_89" @@ -4057,7 +4057,7 @@ { "id": "line_89", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Ты нашел ее курсовую работу?", "next": "condition_4" @@ -4086,7 +4086,7 @@ { "id": "line_93", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Да, вижу. Курсовая работа написана очень хорошо. Пожалуй, я могу выставить за нее максимальный балл.", "next": "line_98" @@ -4094,7 +4094,7 @@ { "id": "line_98", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Теперь поищи в шкафу зачетку Бегимай, и принеси мне, я выставлю ей оценку.", "next": "setflag_3" @@ -4125,7 +4125,7 @@ { "id": "line_91", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Найди и принеси мне ее. Я проверю работу за предыдущего преподавателя и выставлю ей оценку.", "next": "setflag_2" @@ -4150,7 +4150,7 @@ { "id": "line_1", "type": "Line", - "speaker": "Аида Джаныбековна", + "speaker": "Аида Дженибековна", "portrait": "resources/dialogue/portrait_teacher.png", "text": "Бекзат, я сейчас занята, не мешай мне!", "next": "end_1" @@ -4178,7 +4178,7 @@ "type": "Line", "speaker": "Бекзат", "portrait": "resources/dialogue/portrait_hero_neutral.png", - "text": "Но если я возьму кусочек, Аида Джаныбековна меня убьет.", + "text": "Но если я возьму кусочек, Аида Дженибековна меня убьет.", "next": "end_1" }, { diff --git a/resources/w/ui/img/Inventory001.png b/resources/w/ui/img/inv/Inventory001.png similarity index 100% rename from resources/w/ui/img/Inventory001.png rename to resources/w/ui/img/inv/Inventory001.png diff --git a/resources/w/ui/portrait_screen_inventory.json b/resources/w/ui/portrait_screen_inventory.json index f99b63e..15e7f0a 100644 --- a/resources/w/ui/portrait_screen_inventory.json +++ b/resources/w/ui/portrait_screen_inventory.json @@ -8,14 +8,32 @@ "horizontal_align": "center", "children": [ { - "type": "StaticImage", - "name": "background", + "type": "Button", + "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, "height": 1200, - "y": 68, + "y": 68, "horizontal_gravity": "center", "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", diff --git a/resources/w/ui/portrait_screen_inventory_item.json b/resources/w/ui/portrait_screen_inventory_item.json index 42755d5..bdebba8 100644 --- a/resources/w/ui/portrait_screen_inventory_item.json +++ b/resources/w/ui/portrait_screen_inventory_item.json @@ -8,14 +8,32 @@ "horizontal_align": "center", "children": [ { - "type": "StaticImage", - "name": "background", + "type": "Button", + "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, "height": 1200, - "y": 68, + "y": 68, "horizontal_gravity": "center", "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", diff --git a/resources/w/ui/portrait_screen_journal.json b/resources/w/ui/portrait_screen_journal.json index 37c3bb6..83270e2 100644 --- a/resources/w/ui/portrait_screen_journal.json +++ b/resources/w/ui/portrait_screen_journal.json @@ -7,15 +7,33 @@ "vertical_align": "top", "horizontal_align": "center", "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", - "name": "background", + "type": "Button", + "name": "journalMain", "width": 640, "height": 1200, "y": 68, "horizontal_gravity": "center", "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", diff --git a/resources/w/ui/portrait_screen_journal_item.json b/resources/w/ui/portrait_screen_journal_item.json index 5a34114..e899566 100644 --- a/resources/w/ui/portrait_screen_journal_item.json +++ b/resources/w/ui/portrait_screen_journal_item.json @@ -7,15 +7,33 @@ "vertical_align": "top", "horizontal_align": "center", "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", - "name": "background", + "type": "Button", + "name": "journalMain", "width": 640, "height": 1200, "y": 68, "horizontal_gravity": "center", "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", diff --git a/resources/w/ui/screen_inventory.json b/resources/w/ui/screen_inventory.json index abc47dd..75907eb 100644 --- a/resources/w/ui/screen_inventory.json +++ b/resources/w/ui/screen_inventory.json @@ -8,13 +8,30 @@ "horizontal_align": "center", "children": [ { - "type": "StaticImage", - "name": "background", + "type": "Button", + "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, "height": 585, "horizontal_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", diff --git a/resources/w/ui/screen_journal.json b/resources/w/ui/screen_journal.json index 359da5c..c4a5fbe 100644 --- a/resources/w/ui/screen_journal.json +++ b/resources/w/ui/screen_journal.json @@ -7,15 +7,32 @@ "vertical_align": "top", "horizontal_align": "center", "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", - "name": "background", + "type": "Button", + "name": "journalMain", "width": 1266, "height": 585, "y": 68, "horizontal_gravity": "center", "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", diff --git a/resources/w/ui/screen_phone.json b/resources/w/ui/screen_phone.json index 06a502c..15a36d5 100644 --- a/resources/w/ui/screen_phone.json +++ b/resources/w/ui/screen_phone.json @@ -21,7 +21,7 @@ "pressed": "resources/transparent.png" } }, - { + { "type": "Button", "name": "phoneMain", "horizontal_gravity": "center", @@ -47,7 +47,7 @@ "height": 120.4, "texture": "resources/w/ui/img/phone2/ClockDay001.png" }, - { + { "type": "StaticImage", "name": "phoneTimeNight", "horizontal_gravity": "center", @@ -57,7 +57,7 @@ "height": 120.4, "texture": "resources/w/ui/img/phone2/ClockNight001.png" }, - { + { "type": "StaticImage", "name": "phoneTimeDawn", "horizontal_gravity": "center", diff --git a/resources/w/ui_en/portrait_screen_inventory.json b/resources/w/ui_en/portrait_screen_inventory.json index 1ca5bb9..0de48d7 100644 --- a/resources/w/ui_en/portrait_screen_inventory.json +++ b/resources/w/ui_en/portrait_screen_inventory.json @@ -8,14 +8,32 @@ "horizontal_align": "center", "children": [ { - "type": "StaticImage", - "name": "background", + "type": "Button", + "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, "height": 1200, - "y": 68, + "y": 68, "horizontal_gravity": "center", "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", diff --git a/resources/w/ui_en/portrait_screen_inventory_item.json b/resources/w/ui_en/portrait_screen_inventory_item.json index eb88fea..75501f3 100644 --- a/resources/w/ui_en/portrait_screen_inventory_item.json +++ b/resources/w/ui_en/portrait_screen_inventory_item.json @@ -8,14 +8,32 @@ "horizontal_align": "center", "children": [ { - "type": "StaticImage", - "name": "background", + "type": "Button", + "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, "height": 1200, - "y": 68, + "y": 68, "horizontal_gravity": "center", "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", diff --git a/resources/w/ui_en/portrait_screen_journal.json b/resources/w/ui_en/portrait_screen_journal.json index fb5b947..b32f5c5 100644 --- a/resources/w/ui_en/portrait_screen_journal.json +++ b/resources/w/ui_en/portrait_screen_journal.json @@ -7,15 +7,33 @@ "vertical_align": "top", "horizontal_align": "center", "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", - "name": "background", + "type": "Button", + "name": "journalMain", "width": 640, "height": 1200, "y": 68, "horizontal_gravity": "center", "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", diff --git a/resources/w/ui_en/portrait_screen_journal_item.json b/resources/w/ui_en/portrait_screen_journal_item.json index bf2021a..1df1946 100644 --- a/resources/w/ui_en/portrait_screen_journal_item.json +++ b/resources/w/ui_en/portrait_screen_journal_item.json @@ -8,14 +8,32 @@ "horizontal_align": "center", "children": [ { - "type": "StaticImage", - "name": "background", + "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": "Button", + "name": "journalMain", "width": 640, "height": 1200, "y": 68, "horizontal_gravity": "center", "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", diff --git a/resources/w/ui_en/screen_inventory.json b/resources/w/ui_en/screen_inventory.json index 1e47e77..5851b6e 100644 --- a/resources/w/ui_en/screen_inventory.json +++ b/resources/w/ui_en/screen_inventory.json @@ -8,13 +8,30 @@ "horizontal_align": "center", "children": [ { - "type": "StaticImage", - "name": "background", + "type": "Button", + "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, "height": 585, "horizontal_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", diff --git a/resources/w/ui_en/screen_journal.json b/resources/w/ui_en/screen_journal.json index f8c60e9..2f608d8 100644 --- a/resources/w/ui_en/screen_journal.json +++ b/resources/w/ui_en/screen_journal.json @@ -7,15 +7,32 @@ "vertical_align": "top", "horizontal_align": "center", "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", - "name": "background", + "type": "Button", + "name": "journalMain", "width": 1266, "height": 585, "y": 68, "horizontal_gravity": "center", "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", diff --git a/src/AudioPlayerAsync.cpp b/src/AudioPlayerAsync.cpp index b4dcddc..b259e11 100644 --- a/src/AudioPlayerAsync.cpp +++ b/src/AudioPlayerAsync.cpp @@ -1,4 +1,4 @@ -#include "AudioPlayerAsync.h" +#include "AudioPlayerAsync.h" #include #ifdef __EMSCRIPTEN__ diff --git a/src/BoneAnimatedModelNew.cpp b/src/BoneAnimatedModelNew.cpp index d516ba4..9919afe 100644 --- a/src/BoneAnimatedModelNew.cpp +++ b/src/BoneAnimatedModelNew.cpp @@ -1,4 +1,4 @@ -#include "BoneAnimatedModelNew.h" +#include "BoneAnimatedModelNew.h" #include #include #include diff --git a/src/BoneAnimatedModelNew.h b/src/BoneAnimatedModelNew.h index fb02635..5f5026a 100644 --- a/src/BoneAnimatedModelNew.h +++ b/src/BoneAnimatedModelNew.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "render/Renderer.h" #include diff --git a/src/Character.cpp b/src/Character.cpp index 3224722..3a18464 100644 --- a/src/Character.cpp +++ b/src/Character.cpp @@ -1,4 +1,4 @@ -#include "Character.h" +#include "Character.h" #include "render/TextRenderer.h" #include #include diff --git a/src/Character.h b/src/Character.h index 19a881e..6f9bbd9 100644 --- a/src/Character.h +++ b/src/Character.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "CharacterState.h" #include "BoneAnimatedModelNew.h" #include "render/Renderer.h" diff --git a/src/CharacterState.cpp b/src/CharacterState.cpp index 5490854..f5cea4a 100644 --- a/src/CharacterState.cpp +++ b/src/CharacterState.cpp @@ -1,4 +1,4 @@ -#include "CharacterState.h" +#include "CharacterState.h" namespace ZL { diff --git a/src/CharacterState.h b/src/CharacterState.h index 3663f38..a334044 100644 --- a/src/CharacterState.h +++ b/src/CharacterState.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/src/Game.cpp b/src/Game.cpp index ff73a3a..3c3ace5 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -412,13 +412,15 @@ namespace ZL nlohmann::json root; gameState.save(root); const std::string path = "resources/config/start_state.json"; + /* std::ofstream file(path); if (file.is_open()) { file << root.dump(2); std::cout << "[reset] Saved initial state snapshot to " << path << std::endl; } else { std::cerr << "[reset] Could not open " << path << " for writing" << std::endl; - } + }*/ + saveJsonToFile(root, path); } void Game::createLocations() @@ -1664,7 +1666,7 @@ namespace ZL SaveSlotInfo Game::readSlotInfo(int slot) const { 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 {}; try { nlohmann::json root = nlohmann::json::parse(content); @@ -1683,18 +1685,20 @@ namespace ZL nlohmann::json root; gameState.save(root); std::string path = "save_slot" + std::to_string(slot) + ".json"; - std::ofstream file(path); + + /*std::ofstream file(path); if (file.is_open()) { file << root.dump(2); } else { std::cerr << "[save] Could not open " << path << " for writing" << std::endl; - } + }*/ + saveJsonToFile(root, path); } void Game::loadGame(int slot) { 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()) { std::cerr << "[save] Save file not found or empty: " << path << std::endl; return; diff --git a/src/GameState.cpp b/src/GameState.cpp index f9fbf65..98d5f6d 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -1,4 +1,4 @@ -#include "GameState.h" +#include "GameState.h" #include #include #include diff --git a/src/GameState.h b/src/GameState.h index b21fc56..2236572 100644 --- a/src/GameState.h +++ b/src/GameState.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "items/Item.h" #include "quest/QuestJournal.h" #include "Location.h" diff --git a/src/ISaveable.h b/src/ISaveable.h index 4f25b14..fb244ff 100644 --- a/src/ISaveable.h +++ b/src/ISaveable.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "external/nlohmann/json.hpp" namespace ZL { diff --git a/src/Localization.cpp b/src/Localization.cpp index 7ef445e..8427a18 100644 --- a/src/Localization.cpp +++ b/src/Localization.cpp @@ -1,9 +1,16 @@ -#include "Localization.h" +#include "Localization.h" #include "external/nlohmann/json.hpp" #include "utils/Utils.h" #include +// Платформозависимые инклюды для детекции языка +#if defined(_WIN32) +#include +#elif defined(__EMSCRIPTEN__) +#include +#endif + namespace ZL { Language g_currentLanguage = Language::Russian; @@ -55,8 +62,15 @@ std::string readLocalizedConfigFile(const std::string& basePath, const std::stri } void loadLanguageSetting() { - const std::string content = readTextFile("settings.json"); - if (content.empty()) return; + const std::string content = readSavedTextFile("settings.json"); + + // Если файла настроек нет (content пустой), определяем язык системы и выходим + if (content.empty()) { + g_currentLanguage = detectSystemLanguage(); + std::cout << "[settings] No settings.json found. System language detected: " + << languageToCode(g_currentLanguage) << std::endl; + return; + } try { 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 diff --git a/src/Localization.h b/src/Localization.h index 7543112..e6cad38 100644 --- a/src/Localization.h +++ b/src/Localization.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include 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. void loadLanguageSetting(); +Language detectSystemLanguage(); + } // namespace ZL diff --git a/src/Location.cpp b/src/Location.cpp index 4faca7e..8b6641e 100644 --- a/src/Location.cpp +++ b/src/Location.cpp @@ -1,4 +1,4 @@ -#include "Location.h" +#include "Location.h" #include "utils/Utils.h" #include "render/OpenGlExtensions.h" #include @@ -20,11 +20,15 @@ namespace ZL { extern const char* CONST_ZIP_FILE; + + static constexpr float CAMERA_FOV_Y = 1.0f / 1.5f; // How close the player needs to be to a peaceful NPC before the // on_npc_interact callback fires and the conversation begins. static constexpr float NPC_TALK_DISTANCE = 1.35f; + static constexpr float RENDER_DISTRANCE = 50.f; + static float distancePointToSegmentXZ(const Eigen::Vector3f& p, const Eigen::Vector3f& a, const Eigen::Vector3f& b) diff --git a/src/Location.h b/src/Location.h index d7f8a82..06c06d8 100644 --- a/src/Location.h +++ b/src/Location.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "render/Renderer.h" #include "Environment.h" diff --git a/src/LocationEditor.cpp b/src/LocationEditor.cpp index 928bcc8..859a920 100644 --- a/src/LocationEditor.cpp +++ b/src/LocationEditor.cpp @@ -1,4 +1,4 @@ -#include "LocationEditor.h" +#include "LocationEditor.h" #include "Location.h" #include "Character.h" #include "utils/Utils.h" @@ -415,6 +415,7 @@ namespace ZL } const std::string filename = baseName + ".json"; + /* std::ofstream out(filename); if (out.is_open()) { out << j.dump(4); @@ -422,7 +423,8 @@ namespace ZL << " interactive object(s) to " << filename << "\n"; } else { std::cerr << "[IO_EDITOR] Failed to open " << filename << " for writing\n"; - } + }*/ + saveJsonToFile(j, filename); } void LocationEditor::saveAll() @@ -522,14 +524,15 @@ namespace ZL } const std::string filename = baseName + ".json"; - std::ofstream out(filename); + /*std::ofstream out(filename); if (out.is_open()) { out << j.dump(4); std::cout << "[GAME_EDITOR] Saved " << editorPlacedObjects.size() << " object(s) to " << filename << "\n"; } else { std::cerr << "[GAME_EDITOR] Failed to open " << filename << " for writing\n"; - } + }*/ + saveJsonToFile(j, filename); } } // namespace ZL diff --git a/src/LocationEditor.h b/src/LocationEditor.h index a5c373e..dceda60 100644 --- a/src/LocationEditor.h +++ b/src/LocationEditor.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/LocationState.cpp b/src/LocationState.cpp index 7168969..266873d 100644 --- a/src/LocationState.cpp +++ b/src/LocationState.cpp @@ -1,4 +1,4 @@ -#include "LocationState.h" +#include "LocationState.h" namespace ZL { diff --git a/src/LocationState.h b/src/LocationState.h index 2421714..19aed93 100644 --- a/src/LocationState.h +++ b/src/LocationState.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "external/nlohmann/json.hpp" #include "ISaveable.h" diff --git a/src/MenuManager.cpp b/src/MenuManager.cpp index a7de627..c8a00de 100644 --- a/src/MenuManager.cpp +++ b/src/MenuManager.cpp @@ -1,4 +1,4 @@ -#include "MenuManager.h" +#include "MenuManager.h" #include "Game.h" #include "Localization.h" #include "items/ItemRegistry.h" @@ -672,10 +672,16 @@ namespace ZL { const bool portrait = isPortraitMode(); uiManager.pushMenuFromSavedRoot(portrait ? portraitInventoryListRoot : newInventoryRoot); - uiManager.setButtonCallback("inventoryExitButton", [this](const std::string&) { + uiManager.setButtonCallback("inventoryExitButton2", [this](const std::string&) { closeInventory(); }); + uiManager.setButtonCallback("inventoryExitButton", [this](const std::string&) { + closeInventory(); + }); + + uiManager.setButtonCallback("inventoryMain", [this](const std::string&) {}); + const auto& items = inventory->getItems(); const int maxSlots = 9; for (int i = 0; i < maxSlots; ++i) { @@ -772,6 +778,15 @@ namespace ZL { 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] = { "item1name","item2name","item3name", "item4name","item5name","item6name", @@ -1576,6 +1591,14 @@ namespace ZL { 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]; auto img = uiManager.findStaticImage("selectedItemPic"); @@ -1604,6 +1627,15 @@ namespace ZL { 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]); if (!quest) return; const auto& def = quest->definition; @@ -1665,6 +1697,13 @@ namespace ZL { uiManager.updateAllLayouts(); refreshQuestJournalUi(); } + /* + void MenuManager::closePortraitJournalItemCompletely() { + journalMenuStackDepth_ = 1; + uiManager.popMenu(); + uiManager.updateAllLayouts(); + refreshQuestJournalUi(); + }*/ void MenuManager::resetPhoneChatNodes() { static const char* kChatNodes[] = { @@ -2054,19 +2093,14 @@ namespace ZL { void MenuManager::saveSettings() { nlohmann::json root; - root["musicVolume"] = audioPlayer_.getMusicVolume(); - root["soundVolume"] = audioPlayer_.getSoundVolume(); + root["musicVolume"] = audioPlayer_.getMusicVolume(); + root["soundVolume"] = audioPlayer_.getSoundVolume(); root["musicEnabled"] = audioPlayer_.isMusicEnabled(); root["soundEnabled"] = audioPlayer_.isSoundEnabled(); - root["fullscreen"] = Environment::isFullscreen; - root["language"] = ZL::languageToCode(ZL::g_currentLanguage); + root["fullscreen"] = Environment::isFullscreen; + root["language"] = ZL::languageToCode(ZL::g_currentLanguage); - std::ofstream file("settings.json"); - if (file.is_open()) { - file << root.dump(2); - } else { - std::cerr << "[settings] Could not open settings.json for writing" << std::endl; - } + saveJsonToFile(root, "settings.json"); } void MenuManager::loadSettings() { @@ -2079,7 +2113,7 @@ namespace ZL { // loaded, before this function ever runs. ZL::loadLanguageSetting(); - const std::string content = ZL::readTextFile("settings.json"); + const std::string content = ZL::readSavedTextFile("settings.json"); if (content.empty()) return; try { const nlohmann::json root = nlohmann::json::parse(content); diff --git a/src/MenuManager.h b/src/MenuManager.h index 7b81f79..78de0dc 100644 --- a/src/MenuManager.h +++ b/src/MenuManager.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "render/Renderer.h" #include "Environment.h" #include "render/TextureManager.h" @@ -164,6 +164,7 @@ namespace ZL { void closePortraitInventoryItem(); void openPortraitQuestJournalItem(int index); void closePortraitJournalItem(); + //void closePortraitJournalItemCompletely(); void showAboutScreen(); void showSettingsScreen(); diff --git a/src/ScriptEngine.cpp b/src/ScriptEngine.cpp index cd07736..87fc1e3 100644 --- a/src/ScriptEngine.cpp +++ b/src/ScriptEngine.cpp @@ -1,4 +1,4 @@ -#include "ScriptEngine.h" +#include "ScriptEngine.h" #include "Game.h" #include #include diff --git a/src/ScriptEngine.h b/src/ScriptEngine.h index d5100dd..f64a436 100644 --- a/src/ScriptEngine.h +++ b/src/ScriptEngine.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/src/TeleportZone.cpp b/src/TeleportZone.cpp index dd97395..3a69a74 100644 --- a/src/TeleportZone.cpp +++ b/src/TeleportZone.cpp @@ -1,4 +1,4 @@ -#include "TeleportZone.h" +#include "TeleportZone.h" #include "render/Renderer.h" #include "render/TextureManager.h" diff --git a/src/TeleportZone.h b/src/TeleportZone.h index 6e28652..839762c 100644 --- a/src/TeleportZone.h +++ b/src/TeleportZone.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/src/cutscene/CutsceneDatabase.cpp b/src/cutscene/CutsceneDatabase.cpp index 8677a5e..23fb882 100644 --- a/src/cutscene/CutsceneDatabase.cpp +++ b/src/cutscene/CutsceneDatabase.cpp @@ -1,4 +1,4 @@ -#include "cutscene/CutsceneDatabase.h" +#include "cutscene/CutsceneDatabase.h" #include "utils/Utils.h" #include diff --git a/src/cutscene/CutsceneDatabase.h b/src/cutscene/CutsceneDatabase.h index a40a12e..0f4cf8d 100644 --- a/src/cutscene/CutsceneDatabase.h +++ b/src/cutscene/CutsceneDatabase.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "cutscene/CutsceneTypes.h" #include "external/nlohmann/json.hpp" diff --git a/src/cutscene/CutsceneOverlay.cpp b/src/cutscene/CutsceneOverlay.cpp index 1b7ef5b..88187c5 100644 --- a/src/cutscene/CutsceneOverlay.cpp +++ b/src/cutscene/CutsceneOverlay.cpp @@ -1,4 +1,4 @@ -#include "cutscene/CutsceneOverlay.h" +#include "cutscene/CutsceneOverlay.h" #include "dialogue/DialogueTypes.h" #include "Environment.h" diff --git a/src/cutscene/CutsceneOverlay.h b/src/cutscene/CutsceneOverlay.h index 1b41168..104a315 100644 --- a/src/cutscene/CutsceneOverlay.h +++ b/src/cutscene/CutsceneOverlay.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "cutscene/CutsceneTypes.h" #include "dialogue/DialogueTypes.h" diff --git a/src/cutscene/CutsceneRuntime.cpp b/src/cutscene/CutsceneRuntime.cpp index a3953dc..d26f58c 100644 --- a/src/cutscene/CutsceneRuntime.cpp +++ b/src/cutscene/CutsceneRuntime.cpp @@ -1,4 +1,4 @@ -#include "cutscene/CutsceneRuntime.h" +#include "cutscene/CutsceneRuntime.h" #include #include diff --git a/src/cutscene/CutsceneRuntime.h b/src/cutscene/CutsceneRuntime.h index 4295667..ae1817b 100644 --- a/src/cutscene/CutsceneRuntime.h +++ b/src/cutscene/CutsceneRuntime.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "cutscene/CutsceneDatabase.h" #include "dialogue/DialogueTypes.h" diff --git a/src/cutscene/CutsceneTypes.h b/src/cutscene/CutsceneTypes.h index 7026f4f..63e2813 100644 --- a/src/cutscene/CutsceneTypes.h +++ b/src/cutscene/CutsceneTypes.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/dialogue/DialogueDatabase.cpp b/src/dialogue/DialogueDatabase.cpp index 2cf96c3..31dd2fc 100644 --- a/src/dialogue/DialogueDatabase.cpp +++ b/src/dialogue/DialogueDatabase.cpp @@ -1,4 +1,4 @@ -#include "dialogue/DialogueDatabase.h" +#include "dialogue/DialogueDatabase.h" #include "utils/Utils.h" #include diff --git a/src/dialogue/DialogueDatabase.h b/src/dialogue/DialogueDatabase.h index 3a09239..6c6ac22 100644 --- a/src/dialogue/DialogueDatabase.h +++ b/src/dialogue/DialogueDatabase.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "dialogue/DialogueTypes.h" #include "external/nlohmann/json.hpp" diff --git a/src/dialogue/DialogueOverlay.cpp b/src/dialogue/DialogueOverlay.cpp index a708dc5..a50df86 100644 --- a/src/dialogue/DialogueOverlay.cpp +++ b/src/dialogue/DialogueOverlay.cpp @@ -1,4 +1,4 @@ -#include "dialogue/DialogueOverlay.h" +#include "dialogue/DialogueOverlay.h" #include "dialogue/DialogueTypes.h" #include "GameConstants.h" diff --git a/src/dialogue/DialogueOverlay.h b/src/dialogue/DialogueOverlay.h index 5d11c9f..3d2b8bf 100644 --- a/src/dialogue/DialogueOverlay.h +++ b/src/dialogue/DialogueOverlay.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "dialogue/DialogueRuntime.h" #include "render/Renderer.h" diff --git a/src/dialogue/DialogueRuntime.cpp b/src/dialogue/DialogueRuntime.cpp index 32ba69a..3d0e408 100644 --- a/src/dialogue/DialogueRuntime.cpp +++ b/src/dialogue/DialogueRuntime.cpp @@ -1,4 +1,4 @@ -#include "dialogue/DialogueRuntime.h" +#include "dialogue/DialogueRuntime.h" #include #include diff --git a/src/dialogue/DialogueRuntime.h b/src/dialogue/DialogueRuntime.h index 8321e1f..c103ccb 100644 --- a/src/dialogue/DialogueRuntime.h +++ b/src/dialogue/DialogueRuntime.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "dialogue/DialogueDatabase.h" #include "dialogue/TranslationDatabase.h" diff --git a/src/dialogue/DialogueSystem.cpp b/src/dialogue/DialogueSystem.cpp index cc1767b..14edafa 100644 --- a/src/dialogue/DialogueSystem.cpp +++ b/src/dialogue/DialogueSystem.cpp @@ -1,4 +1,4 @@ -#include "dialogue/DialogueSystem.h" +#include "dialogue/DialogueSystem.h" namespace ZL::Dialogue { diff --git a/src/dialogue/DialogueSystem.h b/src/dialogue/DialogueSystem.h index 028aa0b..b4af404 100644 --- a/src/dialogue/DialogueSystem.h +++ b/src/dialogue/DialogueSystem.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "external/nlohmann/json.hpp" #include "dialogue/DialogueOverlay.h" diff --git a/src/dialogue/DialogueTypes.h b/src/dialogue/DialogueTypes.h index 1424825..4955af9 100644 --- a/src/dialogue/DialogueTypes.h +++ b/src/dialogue/DialogueTypes.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "cutscene/CutsceneTypes.h" #include diff --git a/src/dialogue/TranslationDatabase.cpp b/src/dialogue/TranslationDatabase.cpp index 484adc9..6635b88 100644 --- a/src/dialogue/TranslationDatabase.cpp +++ b/src/dialogue/TranslationDatabase.cpp @@ -1,4 +1,4 @@ -#include "dialogue/TranslationDatabase.h" +#include "dialogue/TranslationDatabase.h" #include "utils/Utils.h" #include diff --git a/src/dialogue/TranslationDatabase.h b/src/dialogue/TranslationDatabase.h index 9b93a54..e63b00d 100644 --- a/src/dialogue/TranslationDatabase.h +++ b/src/dialogue/TranslationDatabase.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "Localization.h" #include "external/nlohmann/json.hpp" diff --git a/src/items/GameObjectLoader.cpp b/src/items/GameObjectLoader.cpp index 1d49d2a..9e6c20e 100644 --- a/src/items/GameObjectLoader.cpp +++ b/src/items/GameObjectLoader.cpp @@ -1,4 +1,4 @@ -#include "GameObjectLoader.h" +#include "GameObjectLoader.h" #include #include #include diff --git a/src/items/GameObjectLoader.h b/src/items/GameObjectLoader.h index 04cb282..8f7c029 100644 --- a/src/items/GameObjectLoader.h +++ b/src/items/GameObjectLoader.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/src/items/InteractiveObject.cpp b/src/items/InteractiveObject.cpp index fc09cba..1dad594 100644 --- a/src/items/InteractiveObject.cpp +++ b/src/items/InteractiveObject.cpp @@ -1,4 +1,4 @@ -#include "InteractiveObject.h" +#include "InteractiveObject.h" #include "render/Renderer.h" #include "render/TextureManager.h" #include "../TextModel.h" diff --git a/src/items/InteractiveObject.h b/src/items/InteractiveObject.h index c9b6e09..6a75768 100644 --- a/src/items/InteractiveObject.h +++ b/src/items/InteractiveObject.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/src/items/InteractiveObjectState.h b/src/items/InteractiveObjectState.h index 172f049..c56bba2 100644 --- a/src/items/InteractiveObjectState.h +++ b/src/items/InteractiveObjectState.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/src/items/Item.cpp b/src/items/Item.cpp index 3d691de..23a02af 100644 --- a/src/items/Item.cpp +++ b/src/items/Item.cpp @@ -1,4 +1,4 @@ -#include "Item.h" +#include "Item.h" #include "ItemRegistry.h" #include "external/nlohmann/json.hpp" #include diff --git a/src/items/Item.h b/src/items/Item.h index f72afe6..076e594 100644 --- a/src/items/Item.h +++ b/src/items/Item.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/src/items/ItemRegistry.cpp b/src/items/ItemRegistry.cpp index 6465095..72fed5d 100644 --- a/src/items/ItemRegistry.cpp +++ b/src/items/ItemRegistry.cpp @@ -1,4 +1,4 @@ -#include "ItemRegistry.h" +#include "ItemRegistry.h" #include "utils/Utils.h" #include "Localization.h" #include "external/nlohmann/json.hpp" diff --git a/src/items/ItemRegistry.h b/src/items/ItemRegistry.h index 4401743..2cdd174 100644 --- a/src/items/ItemRegistry.h +++ b/src/items/ItemRegistry.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include "Item.h" diff --git a/src/main.cpp b/src/main.cpp index 2b690b4..a810093 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -132,6 +132,8 @@ int main(int argc, char* argv[]) { // since we now handle SDL_FINGERDOWN directly for multi-touch support. SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "0"); + ZL::emscriptenInitFileSystem(); + 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 // 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()) { try { const nlohmann::json settingsRoot = nlohmann::json::parse(settingsContent); diff --git a/src/navigation/PathFinder.cpp b/src/navigation/PathFinder.cpp index 0cb27a5..6cb916a 100644 --- a/src/navigation/PathFinder.cpp +++ b/src/navigation/PathFinder.cpp @@ -1,4 +1,4 @@ -#include "navigation/PathFinder.h" +#include "navigation/PathFinder.h" #include "external/nlohmann/json.hpp" #include "utils/Utils.h" #include @@ -584,16 +584,20 @@ bool PathFinder::saveConfig(const std::string& path) const } root["obstacles"] = obstArr; + /* std::ofstream f(path); if (!f.is_open()) { return false; } f << root.dump(2); - return f.good(); + return f.good();*/ + + return saveJsonToFile(root, path); } bool PathFinder::saveGrid(const std::string& path) const { +#if defined(_WIN32) if (!ready) return false; std::ofstream f(path); if (!f.is_open()) return false; @@ -615,6 +619,9 @@ bool PathFinder::saveGrid(const std::string& path) const f << '\n'; } return f.good(); +#else + return false; +#endif } bool PathFinder::loadGrid(const std::string& path, const std::string& zipPath) diff --git a/src/navigation/PathFinder.h b/src/navigation/PathFinder.h index c3669ca..f804bb3 100644 --- a/src/navigation/PathFinder.h +++ b/src/navigation/PathFinder.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "render/Renderer.h" #include diff --git a/src/quest/QuestJournal.cpp b/src/quest/QuestJournal.cpp index 36407a4..76fe7b7 100644 --- a/src/quest/QuestJournal.cpp +++ b/src/quest/QuestJournal.cpp @@ -1,4 +1,4 @@ -#include "quest/QuestJournal.h" +#include "quest/QuestJournal.h" #include "external/nlohmann/json.hpp" #include "utils/Utils.h" #include "Localization.h" diff --git a/src/quest/QuestJournal.h b/src/quest/QuestJournal.h index 3e14854..aff62fc 100644 --- a/src/quest/QuestJournal.h +++ b/src/quest/QuestJournal.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "quest/QuestTypes.h" #include "ISaveable.h" diff --git a/src/quest/QuestTypes.h b/src/quest/QuestTypes.h index 9deb493..2d80f69 100644 --- a/src/quest/QuestTypes.h +++ b/src/quest/QuestTypes.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/render/ShaderManager.h b/src/render/ShaderManager.h index 1b6c695..c30b420 100644 --- a/src/render/ShaderManager.h +++ b/src/render/ShaderManager.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "render/OpenGlExtensions.h" #include "utils/Utils.h" diff --git a/src/render/ShadowMap.cpp b/src/render/ShadowMap.cpp index e437722..69b2477 100644 --- a/src/render/ShadowMap.cpp +++ b/src/render/ShadowMap.cpp @@ -1,4 +1,4 @@ -#include "ShadowMap.h" +#include "ShadowMap.h" #include "Environment.h" #include #include diff --git a/src/render/ShadowMap.h b/src/render/ShadowMap.h index 1a10d9c..8259b16 100644 --- a/src/render/ShadowMap.h +++ b/src/render/ShadowMap.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "render/OpenGlExtensions.h" #include diff --git a/src/render/UiQuad.h b/src/render/UiQuad.h index f4ad2ca..7ea5b80 100644 --- a/src/render/UiQuad.h +++ b/src/render/UiQuad.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "render/Renderer.h" #include "UiManager.h" diff --git a/src/utils/Utils.cpp b/src/utils/Utils.cpp index 3e7d863..dbe3305 100644 --- a/src/utils/Utils.cpp +++ b/src/utils/Utils.cpp @@ -16,126 +16,133 @@ #include #endif +#if defined(_WIN32) +#include +#include +#elif defined(__EMSCRIPTEN__) +#include +#endif + namespace ZL { - std::string readTextFile(const std::string &filename) { + std::string readTextFile(const std::string& filename) { #ifdef __ANDROID__ - SDL_RWops* file = SDL_RWFromFile(filename.c_str(), "rb"); - if (!file) { + SDL_RWops* file = SDL_RWFromFile(filename.c_str(), "rb"); + if (!file) { #ifdef DEBUG - __android_log_print(ANDROID_LOG_ERROR, "Utils", - "Failed to open: %s", filename.c_str()); + __android_log_print(ANDROID_LOG_ERROR, "Utils", + "Failed to open: %s", filename.c_str()); #endif - return ""; - } + return ""; + } - Sint64 size = SDL_RWsize(file); - if (size <= 0) { - SDL_RWclose(file); - return ""; - } + Sint64 size = SDL_RWsize(file); + if (size <= 0) { + SDL_RWclose(file); + return ""; + } - std::string content(size, '\0'); - if (SDL_RWread(file, &content[0], size, 1) != 1) { - SDL_RWclose(file); - return ""; - } + std::string content(size, '\0'); + if (SDL_RWread(file, &content[0], size, 1) != 1) { + SDL_RWclose(file); + return ""; + } - SDL_RWclose(file); - return content; + SDL_RWclose(file); + return content; #else - std::ifstream f(filename); - if (!f.is_open()) { - return ""; - } - return std::string((std::istreambuf_iterator(f)), - std::istreambuf_iterator()); + std::ifstream f(filename); + if (!f.is_open()) { + return ""; + } + return std::string((std::istreambuf_iterator(f)), + std::istreambuf_iterator()); #endif - } + } - std::vector readFile(const std::string &filename) { + std::vector readFile(const std::string& filename) { #ifdef __ANDROID__ - SDL_RWops* file = SDL_RWFromFile(filename.c_str(), "rb"); - if (!file) { - return {}; - } + SDL_RWops* file = SDL_RWFromFile(filename.c_str(), "rb"); + if (!file) { + return {}; + } - Sint64 size = SDL_RWsize(file); - if (size <= 0) { - SDL_RWclose(file); - return {}; - } + Sint64 size = SDL_RWsize(file); + if (size <= 0) { + SDL_RWclose(file); + return {}; + } - std::vector data(size); - if (SDL_RWread(file, data.data(), size, 1) != 1) { - SDL_RWclose(file); - return {}; - } + std::vector data(size); + if (SDL_RWread(file, data.data(), size, 1) != 1) { + SDL_RWclose(file); + return {}; + } - SDL_RWclose(file); - return data; + SDL_RWclose(file); + return data; #else - std::ifstream file(filename, std::ios::binary | std::ios::ate); - if (!file) { - return {}; - } + std::ifstream file(filename, std::ios::binary | std::ios::ate); + if (!file) { + return {}; + } - std::streamsize size = file.tellg(); - if (size <= 0) { - return {}; - } + std::streamsize size = file.tellg(); + if (size <= 0) { + return {}; + } - file.seekg(0, std::ios::beg); - std::vector buffer(size); + file.seekg(0, std::ios::beg); + std::vector buffer(size); - if (!file.read(buffer.data(), size)) { - return {}; - } + if (!file.read(buffer.data(), size)) { + return {}; + } - return buffer; + return buffer; #endif - } + } std::vector readFileFromZIP(const std::string& filename, const std::string& zipfilename) { #ifdef EMSCRIPTEN - int zipErr = 0; - zip_t* archive = zip_open(zipfilename.c_str(), ZIP_RDONLY, &zipErr); - if (!archive) { + int zipErr = 0; + zip_t* archive = zip_open(zipfilename.c_str(), ZIP_RDONLY, &zipErr); + if (!archive) { 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; - if (cleanFilename.rfind("./", 0) == 0) cleanFilename = cleanFilename.substr(2); + std::string cleanFilename = filename; + if (cleanFilename.rfind("./", 0) == 0) cleanFilename = cleanFilename.substr(2); - zip_stat_t fileStat; - zip_stat_init(&fileStat); - if (zip_stat(archive, cleanFilename.c_str(), 0, &fileStat) != 0 || !(fileStat.valid & ZIP_STAT_SIZE)) { - zip_close(archive); + zip_stat_t fileStat; + zip_stat_init(&fileStat); + if (zip_stat(archive, cleanFilename.c_str(), 0, &fileStat) != 0 || !(fileStat.valid & ZIP_STAT_SIZE)) { + zip_close(archive); 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); - if (!zipFile) { - zip_close(archive); + zip_file_t* zipFile = zip_fopen(archive, cleanFilename.c_str(), 0); + if (!zipFile) { + zip_close(archive); 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 fileData(static_cast(fileStat.size)); - zip_int64_t bytesRead = zip_fread(zipFile, fileData.data(), fileStat.size); + std::vector fileData(static_cast(fileStat.size)); + zip_int64_t bytesRead = zip_fread(zipFile, fileData.data(), fileStat.size); - // Обязательно закрываем всё перед проверкой результата или throw - zip_fclose(zipFile); - zip_close(archive); + // Обязательно закрываем всё перед проверкой результата или throw + zip_fclose(zipFile); + zip_close(archive); - if (bytesRead < 0 || static_cast(bytesRead) != fileStat.size) { + if (bytesRead < 0 || static_cast(bytesRead) != fileStat.size) { 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 if (zipfilename.empty()) { @@ -205,4 +212,140 @@ namespace ZL } 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(f)), + std::istreambuf_iterator()); + } + 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 + } + }; \ No newline at end of file diff --git a/src/utils/Utils.h b/src/utils/Utils.h index 9b88b58..0ab2a46 100644 --- a/src/utils/Utils.h +++ b/src/utils/Utils.h @@ -9,6 +9,12 @@ #include #include +#include +#include +#include +#include +#include "external/nlohmann/json.hpp" + namespace ZL { std::string readTextFile(const std::string& filename); @@ -19,4 +25,14 @@ namespace ZL 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); + } \ No newline at end of file