Working on minor stuff, arts, settings, cutscenes

This commit is contained in:
Vladislav Khorev committed 2026-07-04 17:33:01 +03:00
1 parent 5516d02e2c
commit f7e63f933b
31 files changed
+237 -1881

No files matched your search

+2
View File
@@ -9,5 +9,7 @@ export const AVAILABLE_IMAGES: string[] = [
'resources/w/cutscenes/cutscene3/cs2_foreground.png',
'resources/black.png',
'resources/w/cutscenes/cutscene_exit_darklands/img.png',
'resources/w/cutscenes/cutscene_exit_darklands/img2.png',
'resources/w/cutscenes/cutscene3/img.png',
'resources/w/white.png',
];
-22
View File
@@ -18,22 +18,10 @@
border: none;
}
#fs-button {
position: absolute;
top: 10px; left: 10px;
padding: 10px;
z-index: 10;
background: rgba(255,255,255,0.3);
color: white; border: 1px solid white;
cursor: pointer;
font-family: sans-serif;
border-radius: 5px;
}
#status { color: white; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
</style>
</head>
<body>
<button id="fs-button">Fullscreen</button>
<div id="status">Downloading...</div>
<canvas id="canvas" oncontextmenu="event.preventDefault()" tabindex="-1"></canvas>
@@ -56,16 +44,6 @@
document.body.appendChild(s);
}
document.getElementById('fs-button').addEventListener('click', function() {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen().catch(function(e) {
console.error('Fullscreen error: ' + e.message);
});
} else {
document.exitFullscreen();
}
});
document.addEventListener('DOMContentLoaded', function() {
prepareModuleEnvironment();
loadGameScript();
-8
View File
@@ -5,10 +5,6 @@ project(witcher001 LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Build option (Windows-only): when ON, the game launches in fullscreen.
# When OFF (default), it launches in a 1280x720 window like before.
option(FULLSCREEN "Launch the game in fullscreen mode" OFF)
include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/ThirdParty.cmake)
# ===========================================
@@ -124,10 +120,6 @@ target_compile_definitions(witcher001 PRIVATE
# SHOW_PATH
)
if(FULLSCREEN)
target_compile_definitions(witcher001 PRIVATE FULLSCREEN)
endif()
# Линкуем с SDL2main, если он вообще установлен
target_link_libraries(witcher001 PRIVATE SDL2main_external_lib)
+7 -7
View File
@@ -2,7 +2,7 @@
"npcs": [
{
"id": "npc_teacher01",
"name": "Аида Дженибекова",
"name": "Aida Dzhenibekovna",
"animationIdlePath": "resources/w/new_anims/teacher_stand_idle001_small.anim",
"animationWalkPath": "resources/w/new_anims/teacher_walk001_small.anim",
"meshTextures": {
@@ -22,7 +22,7 @@
},
{
"id": "npc_02_woman",
"name": "Айпери",
"name": "Aiperi",
"animationIdlePath": "resources/w/girlfriend/girlfriend_idle003_small.anim",
"animationWalkPath": "resources/w/girlfriend/girlfriend_walk003_small.anim",
"meshTextures": {
@@ -43,7 +43,7 @@
},
{
"id": "npc_04_ghost",
"name": "Призрак",
"name": "Ghost",
"animationIdlePath": "resources/w/ghost/ghost_idle004_small.anim",
"animationWalkPath": "resources/w/ghost/ghost_idle004_small.anim",
"meshTextures": {
@@ -64,7 +64,7 @@
},
{
"id": "ghost_01x",
"name": "Тень",
"name": "Shadow",
"meshTextures": {
"Shadow_NPC_Rigged": "resources/w/shadow/Shadow_BaseColor.png"
},
@@ -90,7 +90,7 @@
},
{
"id": "ghost_02x",
"name": "Тень",
"name": "Shadow",
"meshTextures": {
"Shadow_NPC_Rigged": "resources/w/shadow/Shadow_BaseColor.png"
},
@@ -116,7 +116,7 @@
},
{
"id": "ghost_03x",
"name": "Тень",
"name": "Shadow",
"meshTextures": {
"Shadow_NPC_Rigged": "resources/w/shadow/Shadow_BaseColor.png"
},
@@ -142,7 +142,7 @@
},
{
"id": "npc_02_woman",
"name": "Алтынай",
"name": "Altynai",
"animationIdlePath": "resources/w/girl/girl_idle001_small.anim",
"animationWalkPath": "resources/w/girl/girl_walk010_small.anim",
"meshTextures": {
-889
View File
@@ -1,889 +0,0 @@
{
"cutscenes": [
{
"id": "lection_cutscene001",
"skippable": true,
"durationMs": 37000,
"fadeOutMs": 500,
"fadeInMs": 500,
"endFadeOutMs": 0,
"endFadeInMs": 2000,
"onFadeInCallback": "on_lection_cutscene_fadein_callback",
"imageSegments": [
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 37052,
"fadeInMs": 0,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 6133,
"fadeInMs": 0,
"fadeOutMs": 2000,
"easing": "Linear",
"from": {
"centerX": 0.51,
"centerY": 0.5,
"scale": 1.2
},
"to": {
"centerX": 0.58,
"centerY": 0.5,
"scale": 1.15
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_aida1_x.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 6150,
"fadeInMs": 0,
"fadeOutMs": 2000,
"easing": "Linear",
"from": {
"centerX": 0.52,
"centerY": 0.5,
"scale": 1.2
},
"to": {
"centerX": 0.575,
"centerY": 0.5,
"scale": 1.15
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_heads_x.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 6167,
"fadeInMs": 0,
"fadeOutMs": 2000,
"easing": "Linear",
"from": {
"centerX": 0.56,
"centerY": 0.36,
"scale": 1.3
},
"to": {
"centerX": 0.5,
"centerY": 0.37,
"scale": 1.4
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 6000,
"endMs": 15100,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.56,
"centerY": 0.5,
"scale": 1.2
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1.1
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_aida3_x.png",
"width": 1280,
"height": 720,
"startMs": 6050,
"endMs": 15166,
"fadeInMs": 1100,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.52,
"centerY": 0.5,
"scale": 1.2
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1.1
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_heads_x.png",
"width": 1280,
"height": 720,
"startMs": 6066,
"endMs": 15083,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.3,
"scale": 1.3
},
"to": {
"centerX": 0.58,
"centerY": 0.3,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 14436,
"endMs": 21470,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.59,
"centerY": 0.5,
"scale": 1.3
},
"to": {
"centerX": 0.49,
"centerY": 0.5,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_aida2_x.png",
"width": 1280,
"height": 720,
"startMs": 15348,
"endMs": 21481,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.53,
"centerY": 0.5,
"scale": 1.3
},
"to": {
"centerX": 0.49,
"centerY": 0.5,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_heads_x.png",
"width": 1280,
"height": 720,
"startMs": 15388,
"endMs": 21587,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.45,
"centerY": 0.2,
"scale": 1.3
},
"to": {
"centerX": 0.6,
"centerY": 0.2,
"scale": 1.26
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 26588,
"endMs": 32621,
"fadeInMs": 500,
"fadeOutMs": 500,
"easing": "Linear",
"from": {
"centerX": 0.64,
"centerY": 0.7,
"scale": 2
},
"to": {
"centerX": 0.5,
"centerY": 0.7,
"scale": 2
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_aida3_x.png",
"width": 1280,
"height": 720,
"startMs": 26637,
"endMs": 32621,
"fadeInMs": 500,
"fadeOutMs": 500,
"easing": "Linear",
"from": {
"centerX": 0.63,
"centerY": 0.7,
"scale": 2
},
"to": {
"centerX": 0.51,
"centerY": 0.7,
"scale": 2
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 20744,
"endMs": 26861,
"fadeInMs": 1000,
"fadeOutMs": 700,
"easing": "EaseOutSine",
"from": {
"centerX": 0.25,
"centerY": 0.8,
"scale": 2.3
},
"to": {
"centerX": 0.3,
"centerY": 0.8,
"scale": 2.3
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 32546,
"endMs": 36229,
"fadeInMs": 500,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.45,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_aida2_x.png",
"width": 1280,
"height": 720,
"startMs": 32542,
"endMs": 35675,
"fadeInMs": 500,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.43,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_heads_x.png",
"width": 1280,
"height": 720,
"startMs": 32497,
"endMs": 35580,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.35,
"scale": 1.2
},
"to": {
"centerX": 0.5,
"centerY": 0.4,
"scale": 1.2
}
}
],
"lines": [
{
"speaker": "Аида Дженибековна",
"text": "Опаздывающие, заходите скорее и занимайте свои места! Лекция начинается!",
"durationMs": 4000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "В эпизоде \"Семетей\" трилогии \"Манас\", изменники Канчоро и Кыяз захватывают власть над кыргызами.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Чтобы спасти раненого богатыря Семетея, фея Кёкмончок с помощью заклинания уводит его в иной мир.",
"durationMs": 3201,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Этот мир описан в эпосе Манас как Кайып или Аль-Гайб, но некоторые ученые называют его миром теней.",
"durationMs": 3202,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "В этом мире обитают феи, духи и джинны. Простым смертным в этот мир дорога закрыта.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Время там течет по другому - за один день в теневом мире могут пройти годы жизни обычного мира.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Обычно, мир теней никак не пересекается с нашим миром живых людей.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Но в критические моменты для народа, обитатели теневого мира могут приходить в наш мир.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Совсем недавно закончилась пандемия, а сегодня мир захлестнули кровавые войны.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "В такие кризисные моменты истории, грань между мирами становится особенно тонкой.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "На сегодня лекция завершена. Все свободны! Задания на этот модуль вы получите индивидуально!",
"durationMs": 4000,
"waitForConfirm": false,
"luaCallback": ""
}
]
},
{
"id": "computer_cutscene001",
"skippable": true,
"durationMs": 12000,
"fadeOutMs": 500,
"fadeInMs": 500,
"endFadeOutMs": 0,
"endFadeInMs": 500,
"onFadeInCallback": "on_sleep_cutscene",
"imageSegments": [
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 13000,
"fadeInMs": 0,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_background.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 11984,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_books.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 11550,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.46,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.58,
"centerY": 0.5,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_chair.png",
"width": 1280,
"height": 720,
"startMs": 17,
"endMs": 10767,
"fadeInMs": 0,
"fadeOutMs": 300,
"easing": "Linear",
"from": {
"centerX": 0.47,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.57,
"centerY": 0.5,
"scale": 1.3
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_gg001.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 3083,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.47,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1.15
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_gg002.png",
"width": 1280,
"height": 720,
"startMs": 1850,
"endMs": 4883,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1.15
},
"to": {
"centerX": 0.53,
"centerY": 0.5,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_gg003.png",
"width": 1280,
"height": 720,
"startMs": 3950,
"endMs": 7083,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.49,
"centerY": 0.5,
"scale": 1.05
},
"to": {
"centerX": 0.55,
"centerY": 0.5,
"scale": 1.1
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_gg004.png",
"width": 1280,
"height": 720,
"startMs": 6050,
"endMs": 10100,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.47,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.53,
"centerY": 0.5,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_foreground.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 10100,
"fadeInMs": 0,
"fadeOutMs": 3000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
}
],
"lines": [
{
"speaker": "",
"text": "Я сел за компьютер и начал писать эссе по книге",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Книга была очень скучной. Как будто кто-то наложил на книгу чары сна.",
"durationMs": 4000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Неудивительно что я стал понемногу засыпать...",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
}
]
},
{
"id": "darklands_exit001",
"skippable": true,
"durationMs": 12500,
"fadeOutMs": 0,
"fadeInMs": 500,
"endFadeOutMs": 0,
"endFadeInMs": 500,
"onFadeInCallback": "on_darklands_over",
"imageSegments": [
{
"path": "resources/w/cutscenes/cutscene_exit_darklands/img.png",
"width": 1280,
"height": 720,
"startMs": 1016,
"endMs": 10549,
"fadeInMs": 0,
"fadeOutMs": 0,
"easing": "EaseInOutQuad",
"from": {
"centerX": 0.85,
"centerY": 0.35,
"scale": 3
},
"to": {
"centerX": 0.6,
"centerY": 0.5,
"scale": 1.3
}
},
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 9400,
"endMs": 12500,
"fadeInMs": 1000,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/white.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 2033,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
}
],
"lines": [
{
"speaker": "",
"text": "Мгновенно как я упал без сил, что-то сверкнуло.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Я очнулся и понял, что я по-прежнему в универе.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Все тело болело, как будто я всю ночь таскал мешки с цементом.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "А еще мне сильно хотелось спать...",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
}
]
},
{
"id": "sleep_cutscene001",
"skippable": true,
"durationMs": 9000,
"fadeOutMs": 500,
"fadeInMs": 500,
"endFadeOutMs": 0,
"endFadeInMs": 500,
"onFadeInCallback": "on_sleep_cutscene",
"imageSegments": [
{
"path": "resources/w/cutscenes/cutscene_sleep/img.png",
"width": 1280,
"height": 720,
"startMs": 933,
"endMs": 8033,
"fadeInMs": 0,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.75,
"centerY": 0.5,
"scale": 3
}
},
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 2117,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 4967,
"endMs": 9000,
"fadeInMs": 1000,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
}
],
"lines": [
{
"speaker": "",
"text": "Я лег спать и уснул.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Долгожданный сон полностью восстановил мои силы.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Я проснулся на следующий день уже после обеда.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
}
]
},
{
"id": "game_complete_cutscene001",
"skippable": true,
"durationMs": 12000,
"fadeOutMs": 0,
"fadeInMs": 500,
"endFadeOutMs": 0,
"endFadeInMs": 0,
"onFadeInCallback": "",
"imageSegments": [
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 13500,
"fadeInMs": 0,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
}
],
"lines": [
{
"speaker": "",
"text": "Все призраки исчезли, вокруг стало тихо.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Кажется, у меня получилось изгнать призрака.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Теперь надо добавить этот пункт к себе в резюме.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "В тот момент я еще не знал, что мои приключения еще только начинаются...",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
}
]
}
]
}
-929
View File
@@ -1,929 +0,0 @@
{
"cutscenes": [
{
"id": "lection_cutscene001",
"skippable": true,
"durationMs": 37000,
"fadeOutMs": 500,
"fadeInMs": 500,
"endFadeOutMs": 0,
"endFadeInMs": 2000,
"onFadeInCallback": "on_lection_cutscene_fadein_callback",
"imageSegments": [
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 37052,
"fadeInMs": 0,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 6133,
"fadeInMs": 0,
"fadeOutMs": 2000,
"easing": "Linear",
"from": {
"centerX": 0.51,
"centerY": 0.5,
"scale": 1.2
},
"to": {
"centerX": 0.58,
"centerY": 0.5,
"scale": 1.15
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_aida1_x.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 6150,
"fadeInMs": 0,
"fadeOutMs": 2000,
"easing": "Linear",
"from": {
"centerX": 0.52,
"centerY": 0.5,
"scale": 1.2
},
"to": {
"centerX": 0.575,
"centerY": 0.5,
"scale": 1.15
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_heads_x.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 6167,
"fadeInMs": 0,
"fadeOutMs": 2000,
"easing": "Linear",
"from": {
"centerX": 0.56,
"centerY": 0.36,
"scale": 1.3
},
"to": {
"centerX": 0.5,
"centerY": 0.37,
"scale": 1.4
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 6000,
"endMs": 15100,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.56,
"centerY": 0.5,
"scale": 1.2
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1.1
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_aida3_x.png",
"width": 1280,
"height": 720,
"startMs": 6050,
"endMs": 15166,
"fadeInMs": 1100,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.52,
"centerY": 0.5,
"scale": 1.2
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1.1
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_heads_x.png",
"width": 1280,
"height": 720,
"startMs": 6066,
"endMs": 15083,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.3,
"scale": 1.3
},
"to": {
"centerX": 0.58,
"centerY": 0.3,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 14436,
"endMs": 21470,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.59,
"centerY": 0.5,
"scale": 1.3
},
"to": {
"centerX": 0.49,
"centerY": 0.5,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_aida2_x.png",
"width": 1280,
"height": 720,
"startMs": 15348,
"endMs": 21481,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.53,
"centerY": 0.5,
"scale": 1.3
},
"to": {
"centerX": 0.49,
"centerY": 0.5,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_heads_x.png",
"width": 1280,
"height": 720,
"startMs": 15388,
"endMs": 21587,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.45,
"centerY": 0.2,
"scale": 1.3
},
"to": {
"centerX": 0.6,
"centerY": 0.2,
"scale": 1.26
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 26588,
"endMs": 32621,
"fadeInMs": 500,
"fadeOutMs": 500,
"easing": "Linear",
"from": {
"centerX": 0.64,
"centerY": 0.7,
"scale": 2
},
"to": {
"centerX": 0.5,
"centerY": 0.7,
"scale": 2
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_aida3_x.png",
"width": 1280,
"height": 720,
"startMs": 26637,
"endMs": 32621,
"fadeInMs": 500,
"fadeOutMs": 500,
"easing": "Linear",
"from": {
"centerX": 0.63,
"centerY": 0.7,
"scale": 2
},
"to": {
"centerX": 0.51,
"centerY": 0.7,
"scale": 2
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 20744,
"endMs": 26861,
"fadeInMs": 1000,
"fadeOutMs": 700,
"easing": "EaseOutSine",
"from": {
"centerX": 0.25,
"centerY": 0.8,
"scale": 2.3
},
"to": {
"centerX": 0.3,
"centerY": 0.8,
"scale": 2.3
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_wall_x.png",
"width": 1280,
"height": 720,
"startMs": 32546,
"endMs": 36229,
"fadeInMs": 500,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.45,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_aida2_x.png",
"width": 1280,
"height": 720,
"startMs": 32542,
"endMs": 35675,
"fadeInMs": 500,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.43,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/cutscenes/cutscene1/cutscene1_heads_x.png",
"width": 1280,
"height": 720,
"startMs": 32497,
"endMs": 35580,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.35,
"scale": 1.2
},
"to": {
"centerX": 0.5,
"centerY": 0.4,
"scale": 1.2
}
}
],
"lines": [
{
"speaker": "Аида Дженибековна",
"text": "Опаздывающие, заходите скорее и занимайте свои места! Лекция начинается!",
"durationMs": 4000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "В эпизоде \"Семетей\" трилогии \"Манас\", изменники Канчоро и Кыяз захватывают власть над кыргызами.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Чтобы спасти раненого богатыря Семетея, фея Кёкмончок с помощью заклинания уводит его в иной мир.",
"durationMs": 3201,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Этот мир описан в эпосе Манас как Кайып или Аль-Гайб, но некоторые ученые называют его миром теней.",
"durationMs": 3202,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "В этом мире обитают феи, духи и джинны. Простым смертным в этот мир дорога закрыта.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Время там течет по другому - за один день в теневом мире могут пройти годы жизни обычного мира.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Обычно, мир теней никак не пересекается с нашим миром живых людей.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Но в критические моменты для народа, обитатели теневого мира могут приходить в наш мир.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "Совсем недавно закончилась пандемия, а сегодня мир захлестнули кровавые войны.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "В такие кризисные моменты истории, грань между мирами становится особенно тонкой.",
"durationMs": 3200,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "Аида Дженибековна",
"text": "На сегодня лекция завершена. Все свободны! Задания на этот модуль вы получите индивидуально!",
"durationMs": 4000,
"waitForConfirm": false,
"luaCallback": ""
}
]
},
{
"id": "computer_cutscene001",
"skippable": true,
"durationMs": 12000,
"fadeOutMs": 500,
"fadeInMs": 500,
"endFadeOutMs": 0,
"endFadeInMs": 500,
"onFadeInCallback": "on_sleep_cutscene",
"imageSegments": [
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 13000,
"fadeInMs": 0,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_background.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 11984,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_books.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 11550,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.46,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.58,
"centerY": 0.5,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_chair.png",
"width": 1280,
"height": 720,
"startMs": 17,
"endMs": 10767,
"fadeInMs": 0,
"fadeOutMs": 300,
"easing": "Linear",
"from": {
"centerX": 0.47,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.57,
"centerY": 0.5,
"scale": 1.3
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_gg001.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 3083,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.47,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1.15
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_gg002.png",
"width": 1280,
"height": 720,
"startMs": 1850,
"endMs": 4883,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1.15
},
"to": {
"centerX": 0.53,
"centerY": 0.5,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_gg003.png",
"width": 1280,
"height": 720,
"startMs": 3950,
"endMs": 7083,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.49,
"centerY": 0.5,
"scale": 1.05
},
"to": {
"centerX": 0.55,
"centerY": 0.5,
"scale": 1.1
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_gg004.png",
"width": 1280,
"height": 720,
"startMs": 6050,
"endMs": 10100,
"fadeInMs": 1000,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.47,
"centerY": 0.5,
"scale": 1.1
},
"to": {
"centerX": 0.53,
"centerY": 0.5,
"scale": 1.2
}
},
{
"path": "resources/w/cutscenes/cutscene2/cs2_foreground.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 10100,
"fadeInMs": 0,
"fadeOutMs": 3000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
}
],
"lines": [
{
"speaker": "",
"text": "Я сел за компьютер и начал писать эссе по книге",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Книга была очень скучной. Как будто кто-то наложил на книгу чары сна.",
"durationMs": 4000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Неудивительно что я стал понемногу засыпать...",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
}
]
},
{
"id": "darklands_exit001",
"skippable": true,
"durationMs": 12500,
"fadeOutMs": 0,
"fadeInMs": 500,
"endFadeOutMs": 0,
"endFadeInMs": 500,
"onFadeInCallback": "on_darklands_over",
"imageSegments": [
{
"path": "resources/w/cutscenes/cutscene_exit_darklands/img.png",
"width": 1280,
"height": 720,
"startMs": 999,
"endMs": 10115,
"fadeInMs": 0,
"fadeOutMs": 0,
"easing": "EaseInOutQuad",
"from": {
"centerX": 0.85,
"centerY": 0.35,
"scale": 3
},
"to": {
"centerX": 0.6,
"centerY": 0.5,
"scale": 1.3
}
},
{
"path": "resources/w/cutscenes/cutscene_exit_darklands/img2.png",
"width": 1280,
"height": 720,
"startMs": 3000,
"endMs": 10567,
"fadeInMs": 2000,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.85,
"centerY": 0.44,
"scale": 2.4
},
"to": {
"centerX": 0.68,
"centerY": 0.53,
"scale": 1.5
}
},
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 9400,
"endMs": 12500,
"fadeInMs": 1000,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/white.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 2033,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
}
],
"lines": [
{
"speaker": "",
"text": "Мгновенно как я упал без сил, что-то сверкнуло.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Я очнулся и понял, что я по-прежнему в универе.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Все тело болело, как будто я всю ночь таскал мешки с цементом.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "А еще мне сильно хотелось спать...",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
}
]
},
{
"id": "sleep_cutscene001",
"skippable": true,
"durationMs": 9000,
"fadeOutMs": 500,
"fadeInMs": 500,
"endFadeOutMs": 0,
"endFadeInMs": 500,
"onFadeInCallback": "on_sleep_cutscene",
"imageSegments": [
{
"path": "resources/w/cutscenes/cutscene_sleep/img.png",
"width": 1280,
"height": 720,
"startMs": 933,
"endMs": 8033,
"fadeInMs": 0,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.55,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.75,
"centerY": 0.5,
"scale": 3
}
},
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 2117,
"fadeInMs": 0,
"fadeOutMs": 1000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 4967,
"endMs": 9000,
"fadeInMs": 1000,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
}
],
"lines": [
{
"speaker": "",
"text": "Я лег спать и уснул.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Долгожданный сон полностью восстановил мои силы.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Я проснулся на следующий день уже после обеда.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
}
]
},
{
"id": "game_complete_cutscene001",
"skippable": true,
"durationMs": 12000,
"fadeOutMs": 0,
"fadeInMs": 500,
"endFadeOutMs": 0,
"endFadeInMs": 0,
"onFadeInCallback": "",
"imageSegments": [
{
"path": "resources/black.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 13500,
"fadeInMs": 0,
"fadeOutMs": 0,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
},
"to": {
"centerX": 0.5,
"centerY": 0.5,
"scale": 1
}
},
{
"path": "resources/w/cutscenes/cutscene3/img.png",
"width": 1280,
"height": 720,
"startMs": 0,
"endMs": 11117,
"fadeInMs": 2000,
"fadeOutMs": 2000,
"easing": "Linear",
"from": {
"centerX": 0.5,
"centerY": 0.53,
"scale": 2.3
},
"to": {
"centerX": 0.5,
"centerY": 0.65,
"scale": 1.3
}
}
],
"lines": [
{
"speaker": "",
"text": "Все призраки исчезли, вокруг стало тихо.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Кажется, у меня получилось изгнать призрака.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "Теперь надо добавить этот пункт к себе в резюме.",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
},
{
"speaker": "",
"text": "В тот момент я еще не знал, что мои приключения еще только начинаются...",
"durationMs": 3000,
"waitForConfirm": false,
"luaCallback": ""
}
]
}
]
}
@@ -1,4 +1,4 @@
precision mediump float;
precision highp float;
uniform sampler2D Texture;
uniform sampler2D uShadowMap;
+1 -1
View File
@@ -1,4 +1,4 @@
precision mediump float;
precision highp float;
uniform sampler2D Texture;
uniform sampler2D uShadowMap;
+1
View File
@@ -107,6 +107,7 @@ function alik_door_open_callback()
game_api.fade_object("Room_Cover_LivingRoom_W_S_2_001", 0, 0.5, function()
game_api.deactivate_interactive_object("Room_Cover_LivingRoom_W_S_2_001")
game_api.set_npc_enabled(0, true)
game_api.npc_rotate_to(0, 90)
end)
if (bathroom_door_opened) then
+2
View File
@@ -391,6 +391,7 @@ function on_hall_door_click()
end)
game_api.set_npc_enabled(0, true)
game_api.set_npc_enabled(6, true)
game_api.npc_rotate_to(6, 180)
end
else
if (game_api.is_night()) then
@@ -556,6 +557,7 @@ game_api.set_cutscene_callback("lection_cutscene001", function()
game_api.setIntValue("lection_is_over", 1)
game_api.set_npc_enabled(1, true)
game_api.npc_rotate_to(1, 180)
game_api.npc_walk_to(0, 0.758123, 0, 6.50063, on_teacher_arrived_intermediate)
game_api.npc_walk_to(6, 5.28998, 0, -5.525, on_student_arrived)
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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+42
View File
@@ -0,0 +1,42 @@
{
"root": {
"type": "FrameLayout",
"width": "match_parent",
"height": "match_parent",
"children": [
{
"type": "StaticImage",
"name": "creditsBkg",
"width": "match_parent",
"height": "match_parent",
"texture": "resources/w/ui/img/main/bkg.png"
},
{
"type": "StaticImage",
"name": "creditsImage",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"width": 800,
"height": 500,
"texture": "resources/w/ui/img/main/about.png"
},
{
"type": "Button",
"name": "skipButton",
"horizontal_gravity": "right",
"vertical_gravity": "top",
"x": -23,
"y": -35,
"width": 200,
"height": 200,
"clickZoneWidth": 176,
"clickZoneHeight": 176,
"textures": {
"normal": "resources/w/ui/img/RedClose001_State=Default001.png",
"hover": "resources/w/ui/img/RedClose001_State=Selected001.png",
"pressed": "resources/w/ui/img/RedClose001_State=Tap001.png"
}
}
]
}
}
+31 -3
View File
@@ -7,9 +7,36 @@
{
"type": "StaticImage",
"name": "mainMenuBkg",
"width": "match_parent",
"width": 2186,
"height": 1536,
"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",
"width": 450,
"height": "match_parent",
"texture": "resources/w/ui/img/main/bkg.png"
"texture": "resources/w/ui/img/main/under_letters001.png"
},
{
"type": "StaticImage",
"name": "mainMenuLogo",
"horizontal_gravity": "center",
"vertical_gravity": "center",
"width": 350,
"height": 175,
"y": 235,
"texture": "resources/w/ui/img/main/letters002.png"
},
{
"type": "LinearLayout",
@@ -17,6 +44,7 @@
"horizontal_align": "center",
"vertical_align": "center",
"spacing": 24,
"y": 120,
"width": "match_parent",
"height": "match_parent",
"children": [
@@ -76,7 +104,7 @@
"y": 10,
"width": 160,
"height": 36,
"text": "v. 0.6",
"text": "v. 0.7",
"fontSize": 24,
"textCentered": false,
"topAligned": true,
+10
View File
@@ -100,6 +100,16 @@
"fontSize": 32,
"textCentered": true,
"color": [0.2, 0.9, 0.2, 1.0]
},
{
"type": "TextButton",
"name": "fullScreenToggleButton",
"width": 500,
"height": 60,
"text": "Full Screen: OFF",
"fontSize": 32,
"textCentered": true,
"color": [0.2, 0.9, 0.2, 1.0]
}
]
},
+33 -1
View File
@@ -8,9 +8,14 @@
#else
#include <GL/gl.h>
#endif
#ifdef EMSCRIPTEN
#include <emscripten/html5.h>
#endif
namespace ZL {
int Environment::windowHeaderHeight = 0;
int Environment::width = CONST_DEFAULT_WIDTH;
@@ -20,6 +25,12 @@ float Environment::zoom = DEFAULT_ZOOM;
SDL_Window* Environment::window = nullptr;
#ifdef EMSCRIPTEN
bool Environment::isFullscreen = false;
#else
bool Environment::isFullscreen = true;
#endif
bool Environment::showMouse = false;
bool Environment::exitGameLoop = false;
@@ -55,4 +66,25 @@ void Environment::computeProjectionDimensions()
}
}
void Environment::setFullscreen(bool enable) {
#ifdef EMSCRIPTEN
if (enable) {
EmscriptenFullscreenStrategy strategy{};
strategy.scaleMode = EMSCRIPTEN_FULLSCREEN_SCALE_STRETCH;
strategy.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_STDDEF;
strategy.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT;
emscripten_request_fullscreen_strategy("#canvas", EM_TRUE, &strategy);
} else {
emscripten_exit_fullscreen();
}
// isFullscreen is updated by onFullscreenChanged once the browser confirms —
// the request above is deferred/async and can fail silently (e.g. denied).
#else
if (window) {
SDL_SetWindowFullscreen(window, enable ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
}
isFullscreen = enable;
#endif
}
} // namespace ZL
+3
View File
@@ -30,6 +30,9 @@ public:
static SDL_Window* window;
static bool isFullscreen;
static void setFullscreen(bool enable);
static bool showMouse;
static bool exitGameLoop;
+31 -1
View File
@@ -15,7 +15,6 @@
#include <android/log.h>
#endif
#ifdef EMSCRIPTEN
#include <emscripten.h>
#endif
@@ -1508,12 +1507,24 @@ namespace ZL
currentLocation()->state.isNight = gameState.isNight;
currentLocation()->scriptEngine.callTriggerNightEnterCallback();
}
audioPlayer->crossFadeMusicAsync("audio/bishkek night.ogg");
} else {
gameState.isDarklands = !gameState.isDarklands;
// Change HUD
menuManager.setDarklandsMode(gameState.isDarklands);
if (gameState.isDarklands)
{
audioPlayer->crossFadeMusicAsync("audio/bishkek fight calm.ogg");
}
else
{
audioPlayer->crossFadeMusicAsync("audio/bishkek night.ogg");
}
if (currentLocation()) {
currentLocation()->state.isDarklands = gameState.isDarklands;
if (gameState.isDarklands)
@@ -1622,6 +1633,25 @@ namespace ZL
} catch (const std::exception& e) {
std::cerr << "[save] Failed to parse save file " << path << ": " << e.what() << std::endl;
}
if (gameState.isDarklands)
{
audioPlayer->crossFadeMusicAsync("audio/bishkek fight calm.ogg");
}
else if (gameState.isNight)
{
audioPlayer->crossFadeMusicAsync("audio/bishkek night.ogg");
}
else
{
if (gameState.currentLocationName == "location_dorm") {
audioPlayer->crossFadeMusicAsync("audio/obshaga.ogg");
}
else
{
audioPlayer->crossFadeMusicAsync("audio/bishkek univer day.ogg");
}
}
}
} // namespace ZL
+2 -1
View File
@@ -93,7 +93,8 @@ namespace ZL
interactiveObjects = GameObjectLoader::loadAndCreateInteractiveObjects(params.interactiveObjectsJsonPath, renderer, CONST_ZIP_FILE);
//auto playerTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/w/gg/IMG_20260413_182354_992.png", CONST_ZIP_FILE));
auto playerTexture = renderer.textureManager.LoadFromPng("resources/w/gg/UniV_Grid_2K_Base_color.png", CONST_ZIP_FILE);
//auto playerTexture = renderer.textureManager.LoadFromPng("resources/w/gg/UniV_Grid_2K_Base_color.png", CONST_ZIP_FILE);
auto playerTexture = renderer.textureManager.LoadFromPng("resources/w/gg/UniV_Grid_2K_Base_color001.png", CONST_ZIP_FILE);
auto sparkTexture = renderer.textureManager.LoadFromPng("resources/w/spark.png", CONST_ZIP_FILE);
+22
View File
@@ -360,9 +360,17 @@ namespace ZL {
? std::array<float, 4>{ 0.2f, 0.9f, 0.2f, 1.0f }
: std::array<float, 4>{ 0.9f, 0.2f, 0.2f, 1.0f });
};
auto refreshFullscreenToggle = [this]() {
const bool on = Environment::isFullscreen;
uiManager.setTextButtonText("fullScreenToggleButton", on ? "Full Screen: ON" : "Full Screen: OFF");
uiManager.setTextButtonColor("fullScreenToggleButton", on
? std::array<float, 4>{ 0.2f, 0.9f, 0.2f, 1.0f }
: std::array<float, 4>{ 0.9f, 0.2f, 0.2f, 1.0f });
};
refreshMusicToggle();
refreshSoundToggle();
refreshFullscreenToggle();
uiManager.setTextButtonCallback("musicToggleButton", [this](const std::string&) {
audioPlayer_.setMusicEnabled(!audioPlayer_.isMusicEnabled());
@@ -380,6 +388,10 @@ namespace ZL {
? std::array<float, 4>{ 0.2f, 0.9f, 0.2f, 1.0f }
: std::array<float, 4>{ 0.9f, 0.2f, 0.2f, 1.0f });
});
uiManager.setTextButtonCallback("fullScreenToggleButton", [this, refreshFullscreenToggle](const std::string&) {
Environment::setFullscreen(!Environment::isFullscreen);
refreshFullscreenToggle();
});
}
void MenuManager::showLoadGameScreen()
@@ -1783,6 +1795,7 @@ namespace ZL {
root["soundVolume"] = audioPlayer_.getSoundVolume();
root["musicEnabled"] = audioPlayer_.isMusicEnabled();
root["soundEnabled"] = audioPlayer_.isSoundEnabled();
root["fullscreen"] = Environment::isFullscreen;
std::ofstream file("settings.json");
if (file.is_open()) {
@@ -1793,6 +1806,10 @@ namespace ZL {
}
void MenuManager::loadSettings() {
// Note: on desktop, main() already reads settings.json and creates the window
// directly in the right fullscreen state (see WIN32 main() in main.cpp) to avoid
// a windowed -> fullscreen flash. The block below just keeps Environment::isFullscreen
// in sync in case this is ever called from a path that didn't pre-apply it.
const std::string content = ZL::readTextFile("settings.json");
if (content.empty()) return;
try {
@@ -1805,6 +1822,11 @@ namespace ZL {
audioPlayer_.setMusicEnabled(root["musicEnabled"].get<bool>());
if (root.contains("soundEnabled"))
audioPlayer_.setSoundEnabled(root["soundEnabled"].get<bool>());
if (root.contains("fullscreen")) {
#ifndef EMSCRIPTEN
Environment::setFullscreen(root["fullscreen"].get<bool>());
#endif
}
} catch (const std::exception& e) {
std::cerr << "[settings] Failed to parse settings.json: " << e.what() << std::endl;
}
+24 -5
View File
@@ -1,5 +1,6 @@
#include "Game.h"
#include "Environment.h"
#include "utils/Utils.h"
#include <iostream>
#ifdef __ANDROID__
#include <android/log.h>
@@ -85,6 +86,8 @@ EM_BOOL onWindowResized(int /*eventType*/, const EmscriptenUiEvent* e, void* /*u
}
EM_BOOL onFullscreenChanged(int /*eventType*/, const EmscriptenFullscreenChangeEvent* e, void* /*userData*/) {
ZL::Environment::isFullscreen = e->isFullscreen;
// Вместо window.innerWidth, попробуйте запросить размер целевого элемента
// так как после перехода в FS именно он растягивается на весь экран.
double clientW, clientH;
@@ -245,11 +248,27 @@ int main(int argc, char *argv[]) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
#ifdef FULLSCREEN
const Uint32 windowFlags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_FULLSCREEN_DESKTOP;
#else
const Uint32 windowFlags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_RESIZABLE;
#endif
// Read the persisted fullscreen preference (if any) before creating the
// 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");
if (!settingsContent.empty()) {
try {
const nlohmann::json settingsRoot = nlohmann::json::parse(settingsContent);
if (settingsRoot.contains("fullscreen")) {
ZL::Environment::isFullscreen = settingsRoot["fullscreen"].get<bool>();
}
} catch (const std::exception& e) {
std::cerr << "[settings] Failed to parse settings.json: " << e.what() << std::endl;
}
}
}
Uint32 windowFlags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_RESIZABLE;
if (ZL::Environment::isFullscreen) {
windowFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
}
ZL::Environment::window = SDL_CreateWindow(
"Shadow Over Bishkek",