Fixing android bugs and more

This commit is contained in:
Vladislav Khorev 2026-07-19 19:49:50 +03:00
parent 5b21ba615e
commit fc93eb6680
55 changed files with 1192 additions and 141 deletions

View File

@ -0,0 +1,65 @@
{
"root": {
"type": "FrameLayout",
"name": "hud_root",
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "Button",
"name": "settingsButton",
"horizontal_gravity": "right",
"vertical_gravity": "top",
"x": -35,
"y": -35,
"width": 200,
"height": 200,
"clickZoneWidth": 176,
"clickZoneHeight": 176,
"textures": {
"normal": "resources/w/ui/img/Settings001_State=Default001.png",
"hover": "resources/w/ui/img/Settings001_State=Selected001.png",
"pressed": "resources/w/ui/img/Settings001_State=Tap001.png"
}
},
{
"type": "StaticImage",
"name": "location",
"width": 380,
"height": 64,
"y": 30,
"horizontal_gravity": "center",
"vertical_gravity": "bottom",
"texture": "resources/w/ui/img/Location_dorm.png"
},
{
"type": "LinearLayout",
"orientation": "vertical",
"vertical_align": "center",
"horizontal_align": "center",
"spacing": 0,
"width": "match_parent",
"height": 600,
"y": 300,
"children": [
{
"type": "StaticImage",
"name": "hint2",
"width": 660,
"height": 201,
"horizontal_gravity": "center",
"texture": "resources/w/ui/img/Hint2android.png",
"pulse": {
"minScale": 0.92,
"maxScale": 1.08,
"periodMs": 1500
},
"fadeIn": {
"durationMs": 1000
}
}
]
}
]
}
}

View File

@ -0,0 +1,65 @@
{
"root": {
"type": "FrameLayout",
"name": "hud_root",
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "LinearLayout",
"orientation": "vertical",
"vertical_align": "center",
"horizontal_align": "center",
"spacing": 0,
"width": "match_parent",
"height": 600,
"y": 300,
"children": [
{
"type": "StaticImage",
"name": "hint4",
"width": 705,
"height": 234,
"horizontal_gravity": "center",
"texture": "resources/w/ui/img/Hint4android.png",
"pulse": {
"minScale": 0.92,
"maxScale": 1.08,
"periodMs": 1500
},
"fadeIn": {
"durationMs": 1000
}
}
]
},
{
"type": "Button",
"name": "settingsButton",
"horizontal_gravity": "right",
"vertical_gravity": "top",
"x": -35,
"y": -35,
"width": 200,
"height": 200,
"clickZoneWidth": 176,
"clickZoneHeight": 176,
"textures": {
"normal": "resources/w/ui/img/Settings001_State=Default001.png",
"hover": "resources/w/ui/img/Settings001_State=Selected001.png",
"pressed": "resources/w/ui/img/Settings001_State=Tap001.png"
}
},
{
"type": "StaticImage",
"name": "location",
"width": 380,
"height": 64,
"y": 30,
"horizontal_gravity": "center",
"vertical_gravity": "bottom",
"texture": "resources/w/ui/img/Location_dorm.png"
}
]
}
}

BIN
resources/w/ui/img/Hint2android.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
resources/w/ui/img/Hint4android.png (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
resources/w/ui/img/main/aboutPage003android.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
resources/w/ui/img/main/letters002android.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
resources/w/ui/img/phone/CharHeader001.png (Stored with Git LFS)

Binary file not shown.

BIN
resources/w/ui/img/phone/CharHeader002.png (Stored with Git LFS)

Binary file not shown.

BIN
resources/w/ui/img/phone/CharHeader003.png (Stored with Git LFS)

Binary file not shown.

BIN
resources/w/ui/img/phone/ChatCoverTop002.png (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
resources/w/ui/img/phone/PhoneChat001.png (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
resources/w/ui/img/phone2/Phone002.png (Stored with Git LFS)

Binary file not shown.

View File

@ -48,13 +48,13 @@
{
"type": "StaticImage",
"name": "chatTopCover",
"width": 638,
"height": 101.25,
"width": 882,
"height": 158,
"x": 0,
"y": 536,
"y": 569,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/phone/chat_top_cover001.png"
"texture": "resources/w/ui/img/phone/ChatCoverTop002.png"
},
{
"type": "TextButton",
@ -62,7 +62,7 @@
"horizontal_gravity": "center",
"vertical_gravity": "center",
"x": 0.0,
"y": 424,
"y": 414,
"width": 638,
"height": 112,
"text": "Айпери",

View File

@ -48,13 +48,13 @@
{
"type": "StaticImage",
"name": "chatTopCover",
"width": 638,
"height": 101.25,
"width": 882,
"height": 158,
"x": 0,
"y": 536,
"y": 569,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/phone/chat_top_cover001.png"
"texture": "resources/w/ui/img/phone/ChatCoverTop002.png"
},
{
"type": "TextButton",

View File

@ -48,13 +48,13 @@
{
"type": "StaticImage",
"name": "chatTopCover",
"width": 638,
"height": 101.25,
"width": 882,
"height": 158,
"x": 0,
"y": 536,
"y": 569,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/phone/chat_top_cover001.png"
"texture": "resources/w/ui/img/phone/ChatCoverTop002.png"
},
{
"type": "TextButton",

View File

@ -0,0 +1,67 @@
{
"root": {
"type": "FrameLayout",
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "StaticImage",
"name": "aboutBkg",
"width": 2992,
"height": 1632,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/main/MenuBkg001_v001.png"
},
{
"type": "StaticImage",
"name": "aboutPicture",
"width": 720,
"height": 720,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/main/aboutPage003android.png"
},
{
"type": "TextButton",
"name": "telegramButton",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": -240,
"x": -150,
"width": 200,
"height": 60,
"text": "Telegram-канал",
"fontSize": 40,
"color": [0.55, 0.9, 1.0, 1.0],
"textCentered": true
},
{
"type": "TextButton",
"name": "discordButton",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": -240,
"x": 150,
"width": 200,
"height": 60,
"text": "Наш Discord",
"fontSize": 40,
"color": [0.55, 0.9, 1.0, 1.0],
"textCentered": true
},
{
"type": "TextButton",
"name": "aboutBackButton",
"horizontal_gravity": "center",
"vertical_gravity": "bottom",
"y": 40,
"width": 200,
"height": 60,
"text": "Назад",
"fontSize": 40,
"textCentered": true
}
]
}
}

View File

@ -0,0 +1,359 @@
{
"root": {
"type": "FrameLayout",
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "StaticImage",
"name": "creditsBkg",
"width": 2992,
"height": 1632,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/main/MenuBkg001_v001.png"
},
{
"type": "LinearLayout",
"name": "creditsLinearLayout",
"orientation": "vertical",
"horizontal_gravity": "center",
"vertical_gravity": "top",
"horizontal_align": "left",
"animations": {
"slowScroll": {
"repeat": true,
"steps": [
{
"type": "move",
"to": [
0,
3600
],
"duration": 40.0
}
]
}
},
"width": 300,
"height": 4500,
"spacing": 20,
"children": [
{
"type": "TextView",
"name": "smallPause",
"width": 300,
"height": 700,
"text": "",
"fontSize": 40,
"textCentered": true,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsTitleText",
"width": 300,
"height": 60,
"text": "Тень над Бишкеком Демо",
"fontSize": 40,
"textCentered": true,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText1",
"width": 300,
"height": 20,
"text": "Продюсер:",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 0.85, 0.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText2",
"width": 300,
"height": 40,
"text": "Владислав Хорев",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText3",
"width": 300,
"height": 20,
"text": "Гейм-дизайн:",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 0.85, 0.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText4",
"width": 300,
"height": 20,
"text": "Владислав Хорев",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText5",
"width": 300,
"height": 40,
"text": "Лейла Боброва",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText6",
"width": 300,
"height": 20,
"text": "Сценарий:",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 0.85, 0.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText7",
"width": 300,
"height": 20,
"text": "Владислав Хорев",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText8",
"width": 300,
"height": 40,
"text": "Лейла Боброва",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText9",
"width": 300,
"height": 20,
"text": "Разработка:",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 0.85, 0.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText10",
"width": 300,
"height": 20,
"text": "Владислав Хорев",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText11",
"width": 300,
"height": 20,
"text": "Владислав Кан",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText12",
"width": 300,
"height": 20,
"text": "Бексултан Алмазбеков",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText13",
"width": 300,
"height": 40,
"text": "Сергей Зотов",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText14",
"width": 300,
"height": 20,
"text": "Персонажи и анимации:",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 0.85, 0.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText15",
"width": 300,
"height": 20,
"text": "Дмитрий Прохорчик",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText16",
"width": 300,
"height": 40,
"text": "Роман Тресцов",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText17",
"width": 300,
"height": 20,
"text": "3D ассеты:",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 0.85, 0.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText18",
"width": 300,
"height": 20,
"text": "Дмитрий Прохорчик",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText19",
"width": 300,
"height": 40,
"text": "Ishmaladi (turbosquid.com)",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText20",
"width": 300,
"height": 20,
"text": "Арты:",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 0.85, 0.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText21",
"width": 300,
"height": 40,
"text": "Maggie Tem",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText22",
"width": 300,
"height": 20,
"text": "UI/UX:",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 0.85, 0.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText23",
"width": 300,
"height": 40,
"text": "Кенже Казматова",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText24",
"width": 300,
"height": 20,
"text": "Музыка:",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 0.85, 0.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText25",
"width": 300,
"height": 40,
"text": "Pazetic_Ocean",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText26",
"width": 300,
"height": 20,
"text": "Звуки:",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 0.85, 0.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText27",
"width": 300,
"height": 300,
"text": "IENBA, ImAFoley, stradie,\nItsTheGoodstuff, uwesoundboiz,\nAnthousai, Foxfire-,\nn-lerche, CogFireStudios,\nadcbicycle, AntoineRomo,\nSmallConfusion, joedeshon,\nefectirijillo (FreeSound.org)",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
},
{
"type": "TextView",
"name": "creditsText28",
"width": 300,
"height": 40,
"text": "Некоторые арты, 3D модели\nи текстуры были созданы\nс помощью нейросетей.",
"fontSize": 32,
"textCentered": false,
"color": [1.0, 1.0, 1.0, 1.0]
}
]
},
{
"type": "Button",
"name": "creditsBackButton",
"width": "match_parent",
"height": "match_parent",
"x": 0,
"y": 0,
"textures": {
"normal": "resources/transparent.png",
"hover": "resources/transparent.png",
"pressed": "resources/transparent.png"
}
}
]
}
}

View File

@ -0,0 +1,127 @@
{
"root": {
"type": "FrameLayout",
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "StaticImage",
"name": "mainMenuBkg",
"width": 2992,
"height": 1632,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/main/MenuBkg001_v001.png"
},
{
"type": "StaticImage",
"name": "mainMenuBkg2",
"horizontal_gravity": "center",
"vertical_gravity": "bottom",
"width": 720,
"height": 720,
"texture": "resources/w/ui/img/main/main002.png"
},
{
"type": "StaticImage",
"name": "mainMenuUnderLetterBkg",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"width": 450,
"height": 900,
"texture": "resources/w/ui/img/main/under_letters002.png"
},
{
"type": "StaticImage",
"name": "mainMenuLogo",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"width": 320,
"height": 180,
"y": 235,
"texture": "resources/w/ui/img/main/letters002android.png"
},
{
"type": "LinearLayout",
"orientation": "vertical",
"horizontal_align": "center",
"vertical_align": "center",
"spacing": 24,
"y": 140,
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "TextButton",
"name": "menuStartButton",
"width": 300,
"height": 44,
"text": "Начать игру",
"fontSize": 48,
"textCentered": true
},
{
"type": "TextButton",
"name": "menuLoadButton",
"width": 300,
"height": 44,
"text": "Загрузить игру",
"fontSize": 48,
"textCentered": true
},
{
"type": "TextButton",
"name": "menuSettingsButton",
"width": 300,
"height": 44,
"text": "Настройки",
"fontSize": 48,
"textCentered": true
},
{
"type": "TextButton",
"name": "menuLanguageButton",
"width": 300,
"height": 44,
"text": "Язык / Language",
"fontSize": 48,
"textCentered": true
},
{
"type": "TextButton",
"name": "menuAboutButton",
"width": 300,
"height": 44,
"text": "О игре",
"fontSize": 48,
"textCentered": true
},
{
"type": "TextButton",
"name": "menuCreditsButton",
"width": 300,
"height": 44,
"text": "Авторы",
"fontSize": 48,
"textCentered": true
}
]
},
{
"type": "TextView",
"name": "mainMenuVersion",
"horizontal_gravity": "right",
"vertical_gravity": "bottom",
"x": 10,
"y": 10,
"width": 160,
"height": 36,
"text": "v. 1.0.1",
"fontSize": 24,
"textCentered": false,
"topAligned": true,
"paddingY": 4
}
]
}
}

View File

@ -43,22 +43,13 @@
"width": "match_parent",
"height": "match_parent"
},
{
"type": "StaticImage",
"name": "chatTopCover",
"width": 446.25,
"height": 70.82,
"x": 0,
"y": -50.82,
"horizontal_gravity": "center",
"texture": "resources/w/ui/img/phone/chat_top_cover001.png"
},
{
"type": "TextButton",
"name": "chatTitleButton",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"x": 0.0,
"y": 20.0,
"y": 280.0,
"width": 446.25,
"height": 78.4,
"text": "Айпери",

View File

@ -43,22 +43,13 @@
"width": "match_parent",
"height": "match_parent"
},
{
"type": "StaticImage",
"name": "chatTopCover",
"width": 446.25,
"height": 70.82,
"x": 0,
"y": -50.82,
"horizontal_gravity": "center",
"texture": "resources/w/ui/img/phone/chat_top_cover001.png"
},
{
"type": "TextButton",
"name": "chatTitleButton",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"x": 0.0,
"y": 20.0,
"y": 280.0,
"width": 446.25,
"height": 78.4,
"text": "Атам",

View File

@ -43,22 +43,13 @@
"width": "match_parent",
"height": "match_parent"
},
{
"type": "StaticImage",
"name": "chatTopCover",
"width": 446.25,
"height": 70.82,
"x": 0,
"y": -50.82,
"horizontal_gravity": "center",
"texture": "resources/w/ui/img/phone/chat_top_cover001.png"
},
{
"type": "TextButton",
"name": "chatTitleButton",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"x": 0.0,
"y": 20.0,
"y": 280.0,
"width": 446.25,
"height": 78.4,
"text": "БишкекНовости",

View File

@ -0,0 +1,65 @@
{
"root": {
"type": "FrameLayout",
"name": "hud_root",
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "Button",
"name": "settingsButton",
"horizontal_gravity": "right",
"vertical_gravity": "top",
"x": -35,
"y": -35,
"width": 200,
"height": 200,
"clickZoneWidth": 176,
"clickZoneHeight": 176,
"textures": {
"normal": "resources/w/ui/img/Settings001_State=Default001.png",
"hover": "resources/w/ui/img/Settings001_State=Selected001.png",
"pressed": "resources/w/ui/img/Settings001_State=Tap001.png"
}
},
{
"type": "StaticImage",
"name": "location",
"width": 380,
"height": 64,
"y": 30,
"horizontal_gravity": "center",
"vertical_gravity": "bottom",
"texture": "resources/w/ui_en/img/Location_dorm.png"
},
{
"type": "LinearLayout",
"orientation": "vertical",
"vertical_align": "center",
"horizontal_align": "center",
"spacing": 0,
"width": "match_parent",
"height": 600,
"y": 300,
"children": [
{
"type": "StaticImage",
"name": "hint2",
"width": 660,
"height": 220,
"horizontal_gravity": "center",
"texture": "resources/w/ui_en/img/Hint2android.png",
"pulse": {
"minScale": 0.88,
"maxScale": 0.95,
"periodMs": 1500
},
"fadeIn": {
"durationMs": 1000
}
}
]
}
]
}
}

View File

@ -0,0 +1,65 @@
{
"root": {
"type": "FrameLayout",
"name": "hud_root",
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "Button",
"name": "settingsButton",
"horizontal_gravity": "right",
"vertical_gravity": "top",
"x": -35,
"y": -35,
"width": 200,
"height": 200,
"clickZoneWidth": 176,
"clickZoneHeight": 176,
"textures": {
"normal": "resources/w/ui/img/Settings001_State=Default001.png",
"hover": "resources/w/ui/img/Settings001_State=Selected001.png",
"pressed": "resources/w/ui/img/Settings001_State=Tap001.png"
}
},
{
"type": "StaticImage",
"name": "location",
"width": 380,
"height": 64,
"y": 30,
"horizontal_gravity": "center",
"vertical_gravity": "bottom",
"texture": "resources/w/ui_en/img/Location_dorm.png"
},
{
"type": "LinearLayout",
"orientation": "vertical",
"vertical_align": "center",
"horizontal_align": "center",
"spacing": 0,
"width": "match_parent",
"height": 600,
"y": 300,
"children": [
{
"type": "StaticImage",
"name": "hint4",
"width": 705,
"height": 195,
"horizontal_gravity": "center",
"texture": "resources/w/ui_en/img/Hint4android.png",
"pulse": {
"minScale": 0.88,
"maxScale": 0.95,
"periodMs": 1500
},
"fadeIn": {
"durationMs": 1000
}
}
]
}
]
}
}

BIN
resources/w/ui_en/img/Hint2android.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
resources/w/ui_en/img/Hint4android.png (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
resources/w/ui_en/img/main/aboutPage003android.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
resources/w/ui_en/img/main/letters002android.png (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
resources/w/ui_en/img/phone2/Phone002.png (Stored with Git LFS)

Binary file not shown.

View File

@ -48,13 +48,13 @@
{
"type": "StaticImage",
"name": "chatTopCover",
"width": 638,
"height": 101.25,
"width": 882,
"height": 158,
"x": 0,
"y": 536,
"y": 569,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/phone/chat_top_cover001.png"
"texture": "resources/w/ui/img/phone/ChatCoverTop002.png"
},
{
"type": "TextButton",

View File

@ -48,13 +48,13 @@
{
"type": "StaticImage",
"name": "chatTopCover",
"width": 638,
"height": 101.25,
"width": 882,
"height": 158,
"x": 0,
"y": 536,
"y": 569,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/phone/chat_top_cover001.png"
"texture": "resources/w/ui/img/phone/ChatCoverTop002.png"
},
{
"type": "TextButton",

View File

@ -48,13 +48,13 @@
{
"type": "StaticImage",
"name": "chatTopCover",
"width": 638,
"height": 101.25,
"width": 882,
"height": 158,
"x": 0,
"y": 536,
"y": 569,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/phone/chat_top_cover001.png"
"texture": "resources/w/ui/img/phone/ChatCoverTop002.png"
},
{
"type": "TextButton",

View File

@ -0,0 +1,67 @@
{
"root": {
"type": "FrameLayout",
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "StaticImage",
"name": "aboutBkg",
"width": 2992,
"height": 1632,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/main/MenuBkg001_v001.png"
},
{
"type": "StaticImage",
"name": "aboutPicture",
"width": 720,
"height": 720,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui_en/img/main/aboutPage003android.png"
},
{
"type": "TextButton",
"name": "telegramButton",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": -240,
"x": -150,
"width": 200,
"height": 60,
"text": "Telegram channel",
"fontSize": 40,
"color": [0.55, 0.9, 1.0, 1.0],
"textCentered": true
},
{
"type": "TextButton",
"name": "discordButton",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"y": -240,
"x": 150,
"width": 200,
"height": 60,
"text": "Our Discord",
"fontSize": 40,
"color": [0.55, 0.9, 1.0, 1.0],
"textCentered": true
},
{
"type": "TextButton",
"name": "aboutBackButton",
"horizontal_gravity": "center",
"vertical_gravity": "bottom",
"y": 40,
"width": 200,
"height": 60,
"text": "Back",
"fontSize": 40,
"textCentered": true
}
]
}
}

View File

@ -0,0 +1,136 @@
{
"root": {
"type": "FrameLayout",
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "StaticImage",
"name": "mainMenuBkg",
"width": 2992,
"height": 1632,
"horizontal_gravity": "center",
"vertical_gravity": "center",
"texture": "resources/w/ui/img/main/MenuBkg001_v001.png"
},
{
"type": "StaticImage",
"name": "mainMenuBkg2",
"horizontal_gravity": "center",
"vertical_gravity": "bottom",
"width": 720,
"height": 720,
"texture": "resources/w/ui/img/main/main002.png"
},
{
"type": "StaticImage",
"name": "mainMenuUnderLetterBkg",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"width": 450,
"height": 900,
"texture": "resources/w/ui/img/main/under_letters002.png"
},
{
"type": "StaticImage",
"name": "mainMenuLogo",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"width": 320,
"height": 180,
"y": 235,
"texture": "resources/w/ui_en/img/main/letters002android.png"
},
{
"type": "LinearLayout",
"orientation": "vertical",
"horizontal_align": "center",
"vertical_align": "center",
"spacing": 24,
"y": 140,
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "TextButton",
"name": "menuStartButton",
"width": 300,
"height": 44,
"text": "Start Game",
"fontSize": 48,
"textCentered": true
},
{
"type": "TextButton",
"name": "menuLoadButton",
"width": 300,
"height": 44,
"text": "Load Game",
"fontSize": 48,
"textCentered": true
},
{
"type": "TextButton",
"name": "menuSettingsButton",
"width": 300,
"height": 44,
"text": "Settings",
"fontSize": 48,
"textCentered": true
},
{
"type": "TextButton",
"name": "menuLanguageButton",
"width": 300,
"height": 44,
"text": "Язык / Language",
"fontSize": 48,
"textCentered": true
},
{
"type": "TextButton",
"name": "menuAboutButton",
"width": 300,
"height": 44,
"text": "About Game",
"fontSize": 48,
"textCentered": true
},
{
"type": "TextButton",
"name": "menuCreditsButton",
"width": 300,
"height": 44,
"text": "Credits",
"fontSize": 48,
"textCentered": true
},
{
"type": "TextButton",
"name": "menuExitButton",
"width": 300,
"height": 44,
"text": "Exit",
"fontSize": 48,
"textCentered": true
}
]
},
{
"type": "TextView",
"name": "mainMenuVersion",
"horizontal_gravity": "right",
"vertical_gravity": "bottom",
"x": 10,
"y": 10,
"width": 160,
"height": 36,
"text": "v. 1.0.1",
"fontSize": 24,
"textCentered": false,
"topAligned": true,
"paddingY": 4
}
]
}
}

View File

@ -57,8 +57,9 @@
"type": "TextButton",
"name": "chatTitleButton",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"x": 0.0,
"y": 20.0,
"y": 280.0,
"width": 446.25,
"height": 78.4,
"text": "Aiperi",

View File

@ -43,22 +43,13 @@
"width": "match_parent",
"height": "match_parent"
},
{
"type": "StaticImage",
"name": "chatTopCover",
"width": 446.25,
"height": 70.82,
"x": 0,
"y": -50.82,
"horizontal_gravity": "center",
"texture": "resources/w/ui/img/phone/chat_top_cover001.png"
},
{
"type": "TextButton",
"name": "chatTitleButton",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"x": 0.0,
"y": 20.0,
"y": 280.0,
"width": 446.25,
"height": 78.4,
"text": "Dad",

View File

@ -43,22 +43,13 @@
"width": "match_parent",
"height": "match_parent"
},
{
"type": "StaticImage",
"name": "chatTopCover",
"width": 446.25,
"height": 70.82,
"x": 0,
"y": -50.82,
"horizontal_gravity": "center",
"texture": "resources/w/ui/img/phone/chat_top_cover001.png"
},
{
"type": "TextButton",
"name": "chatTitleButton",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"x": 0.0,
"y": 20.0,
"y": 280.0,
"width": 446.25,
"height": 78.4,
"text": "Bishkek.News",

View File

@ -160,9 +160,18 @@ namespace FRG {
void MenuManager::loadUiRoots(const std::string& zipFile) {
hudRoot = loadLocalizedUi("resources/w/ui/hud_step0.json", zipFile);
#ifdef __ANDROID__
hudStep1Root = loadLocalizedUi("resources/w/ui/hud_step1android.json", zipFile);
#else
hudStep1Root = loadLocalizedUi("resources/w/ui/hud_step1.json", zipFile);
#endif
hudStep2Root = loadLocalizedUi("resources/w/ui/hud_step2.json", zipFile);
#ifdef __ANDROID__
hudStep3Root = loadLocalizedUi("resources/w/ui/hud_step3android.json", zipFile);
#else
hudStep3Root = loadLocalizedUi("resources/w/ui/hud_step3.json", zipFile);
#endif
hudStep4Root = loadLocalizedUi("resources/w/ui/hud_step4.json", zipFile);
hudStep5aRoot = loadLocalizedUi("resources/w/ui/hud_step5a.json", zipFile);
hudStep5bRoot = loadLocalizedUi("resources/w/ui/hud_step5b.json", zipFile);
@ -216,9 +225,17 @@ namespace FRG {
questJournalRoot = loadLocalizedUi("resources/w/ui/screen_journal.json", zipFile);
portraitQuestJournalListRoot = loadLocalizedUi("resources/w/ui/portrait_screen_journal.json", zipFile);
portraitQuestJournalItemRoot = loadLocalizedUi("resources/w/ui/portrait_screen_journal_item.json", zipFile);
#ifdef __ANDROID__
mainMenuRoot = loadLocalizedUi("resources/w/ui/screen_main_menu_android.json", zipFile);
aboutScreenRoot = loadLocalizedUi("resources/w/ui/screen_about_android.json", zipFile);
#else
mainMenuRoot = loadLocalizedUi("resources/w/ui/screen_main_menu.json", zipFile);
aboutScreenRoot = loadLocalizedUi("resources/w/ui/screen_about.json", zipFile);
#endif
creditsScreenRoot = loadLocalizedUi("resources/w/ui/screen_credits.json", zipFile);
portraitCreditsScreenRoot = loadLocalizedUi("resources/w/ui/screen_credits_portrait.json", zipFile);
settingsScreenRoot = loadLocalizedUi("resources/w/ui/screen_settings.json", zipFile);
settingsGraphicsScreenRoot = loadLocalizedUi("resources/w/ui/screen_settings_graphics.json", zipFile);
languageScreenRoot = loadLocalizedUi("resources/w/ui/screen_language.json", zipFile);
@ -488,8 +505,17 @@ namespace FRG {
}
void MenuManager::showCreditsScreen() {
isPlayerInCreditsMenu = true;
if (isPortraitMode())
{
uiManager.pushMenuFromSavedRoot(portraitCreditsScreenRoot);
}
else
{
uiManager.pushMenuFromSavedRoot(creditsScreenRoot);
}
uiManager.setButtonCallback("creditsBackButton", [this](const std::string&) {
isPlayerInCreditsMenu = false;
uiManager.popMenu();
uiManager.updateAllLayouts();
audioPlayer_.playSoundAsync("audio/751089__smallconfusion__mechanical-plastic-click-11.ogg");
@ -642,6 +668,9 @@ namespace FRG {
refreshFullscreenToggle();
refreshShadowToggle();
#ifdef __ANDROID__
uiManager.setNodeVisible("fullScreenToggleButton", false);
#else
uiManager.setTextButtonCallback("fullScreenToggleButton", [this, refreshFullscreenToggle](const std::string&) {
Environment::setFullscreen(!Environment::isFullscreen);
refreshFullscreenToggle();
@ -649,6 +678,7 @@ namespace FRG {
uiManager.updateAllLayouts();
topUiManager.updateAllLayouts();
});
#endif
uiManager.setTextButtonCallback("shadowToggleButton", [this, refreshShadowToggle](const std::string&) {
bool newValue = !this->shadowsEnabled;
@ -2327,6 +2357,12 @@ namespace FRG {
}
void MenuManager::onOrientationChanged() {
if (isPlayerInCreditsMenu) {
uiManager.popMenu();
showCreditsScreen();
uiManager.updateAllLayouts();
return;
}
if (uiState_ == GameUiState::Inventory) {
const int savedIndex = inventorySelectedIndex_;
const bool wasOnItemDetail = (inventoryMenuStackDepth_ == 2);

View File

@ -202,6 +202,7 @@ namespace FRG {
GameUiState uiState_ = GameUiState::Gameplay;
Inventory* inventory = nullptr;
bool isPlayerInCreditsMenu = false;
int inventorySelectedIndex_ = -1;
int inventoryMenuStackDepth_ = 0;
@ -265,6 +266,8 @@ namespace FRG {
std::shared_ptr<UiNode> mainMenuRoot;
std::shared_ptr<UiNode> aboutScreenRoot;
std::shared_ptr<UiNode> creditsScreenRoot;
std::shared_ptr<UiNode> portraitCreditsScreenRoot;
std::shared_ptr<UiNode> settingsScreenRoot;
std::shared_ptr<UiNode> settingsGraphicsScreenRoot;
std::shared_ptr<UiNode> languageScreenRoot;
@ -317,11 +320,11 @@ namespace FRG {
// OFFSET_UP / OFFSET_DOWN = how far the FBO extends above / below screen center.
// Height = UP + DOWN. Quad: y0 = projH/2 - DOWN, y1 = projH/2 + UP.
static constexpr float CHAT_FBO_WIDTH_L = 469.0f;
static constexpr float CHAT_FBO_OFFSET_UP_L = 260.0f;
static constexpr float CHAT_FBO_OFFSET_UP_L = 240.0f;
static constexpr float CHAT_FBO_OFFSET_DOWN_L = 70.0f;
static constexpr float CHAT_FBO_WIDTH_P = 670.0f;
static constexpr float CHAT_FBO_OFFSET_UP_P = 360.0f;
static constexpr float CHAT_FBO_OFFSET_UP_P = 356.0f;
static constexpr float CHAT_FBO_OFFSET_DOWN_P = 70.0f;
std::unique_ptr<FrameBuffer> chatFrameBuffer_;

View File

@ -30,10 +30,18 @@ bool DialogueOverlay::init(Renderer& renderer, const std::string& zipFile) {
bodyRenderer = std::make_unique<TextRenderer>();
choiceRenderer = std::make_unique<TextRenderer>();
portraitNameRenderer = std::make_unique<TextRenderer>();
portraitBodyRenderer = std::make_unique<TextRenderer>();
portraitChoiceRenderer = std::make_unique<TextRenderer>();
return
nameRenderer->init(renderer, "resources/fonts/DroidSans.ttf", 28, zipFile) &&
bodyRenderer->init(renderer, "resources/fonts/DroidSans.ttf", 24, zipFile) &&
choiceRenderer->init(renderer, "resources/fonts/DroidSans.ttf", 22, zipFile);
choiceRenderer->init(renderer, "resources/fonts/DroidSans.ttf", 22, zipFile)&&
portraitNameRenderer->init(renderer, "resources/fonts/DroidSans.ttf", 40, zipFile) &&
portraitBodyRenderer->init(renderer, "resources/fonts/DroidSans.ttf", 36, zipFile) &&
portraitChoiceRenderer->init(renderer, "resources/fonts/DroidSans.ttf", 36, zipFile);
}
void DialogueOverlay::update(const PresentationModel& model, int deltaMs) {
@ -215,8 +223,10 @@ void DialogueOverlay::drawPortrait(Renderer& renderer, const PresentationModel&
const float H = Environment::projectionHeight;
// Panel: DialogChoice001.png scaled to full screen width, aspect ratio preserved.
const float texAspect = static_cast<float>(textboxChoicePortraitTexture->getWidth())
/ static_cast<float>(textboxChoicePortraitTexture->getHeight());
/*const float texAspect = static_cast<float>(textboxChoicePortraitTexture->getWidth())
/ static_cast<float>(textboxChoicePortraitTexture->getHeight());*/
const float texAspect = 4800.0f / 3568.0f;
const float panelW = W;
const float panelH = panelW / texAspect;
const float clipAtBottom = 18.f;
@ -228,11 +238,11 @@ void DialogueOverlay::drawPortrait(Renderer& renderer, const PresentationModel&
const float portraitY = panelTopY + 6.f - 40.f;
// Text sits inside the panel near the top.
const float leftPad = 60.f;
const float leftPad = 68.f;
const float rightPad = 60.f;
const float textMaxWidth = W - leftPad - rightPad;
const float nameY = panelTopY - 32.f - 50.f;
const float bodyY = nameY - 38.f;
const float bodyY = nameY - 48.f;
// --- Rebuild quads only when geometry changes ---
{
@ -282,25 +292,27 @@ void DialogueOverlay::drawPortrait(Renderer& renderer, const PresentationModel&
lastChoiceRects.clear();
if (!model.speaker.empty()) {
nameRenderer->drawText(model.speaker, leftPad, nameY, 1.0f, false, { 1.0f, 0.88f, 0.45f, 1.0f });
portraitNameRenderer->drawText(model.speaker, leftPad, nameY, 1.0f, false, { 1.0f, 0.88f, 0.45f, 1.0f });
}
const std::string wrappedBody = wrapTextToWidth(model.visibleText, *bodyRenderer, textMaxWidth, 1.0f);
bodyRenderer->drawText(wrappedBody, leftPad, bodyY, 1.0f, false, { 1.0f, 1.0f, 1.0f, 1.0f });
const std::string wrappedBody = wrapTextToWidth(model.visibleText, *portraitBodyRenderer, textMaxWidth, 1.0f);
portraitBodyRenderer->drawText(wrappedBody, leftPad, bodyY, 1.0f, false, { 1.0f, 1.0f, 1.0f, 1.0f });
// Hit rect for tap-to-advance.
lastDialogueAdvanceRect = { 0.f, 0.f, W, panelTopY };
// --- Choice mode: stack choices inside the panel ---
if (model.mode == PresentationMode::Choice) {
/*
const float choiceTexAspect = static_cast<float>(choiceMainTexture->getWidth())
/ static_cast<float>(choiceMainTexture->getHeight());
/ static_cast<float>(choiceMainTexture->getHeight());*/
const float choiceTexAspect = 3652.f / 484.f;
const float choiceW = W - leftPad - rightPad + 32;
const float choiceH = choiceW / choiceTexAspect;
const float choiceSpacing = -18.f;
const float totalChoicesH = (choiceH + choiceSpacing) * static_cast<float>(model.choices.size()) - choiceSpacing;
const float choiceStartY = panelTopY - 80.f - totalChoicesH; // below name row
const float choiceStartY = panelTopY - 90.f - totalChoicesH; // below name row
if (choiceQuads.size() < model.choices.size()) {
choiceQuads.resize(model.choices.size());
@ -339,8 +351,8 @@ void DialogueOverlay::drawPortrait(Renderer& renderer, const PresentationModel&
: std::array<float, 4>{ 1.0f, 0.93f, 0.65f, 1.0f };
const std::string wrappedChoice = wrapTextToWidth(model.choices[i].text, *choiceRenderer, rect.w - 20.0f, 1.0f);
choiceRenderer->drawText(
wrappedChoice, rect.x + 20.f, rect.y + choiceH * 0.35f+5.f, 1.4f, false,
portraitChoiceRenderer->drawText(
wrappedChoice, rect.x + 28.f, rect.y + choiceH * 0.35f+5.f, 1.0f, false,
isHighlighted ? std::array<float, 4>{1.0f, 1.0f, 1.0f, 1.0f} : color
);
}

View File

@ -43,6 +43,10 @@ private:
std::unique_ptr<TextRenderer> bodyRenderer;
std::unique_ptr<TextRenderer> choiceRenderer;
std::unique_ptr<TextRenderer> portraitNameRenderer;
std::unique_ptr<TextRenderer> portraitBodyRenderer;
std::unique_ptr<TextRenderer> portraitChoiceRenderer;
UiQuad portraitQuad;
UiQuad textboxQuad;
UiQuad textboxChoiceQuad;