Working on minor stuff, arts, settings, cutscenes

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

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',
];

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();

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)

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": {

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": ""
}
]
}
]
}

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": ""
}
]
}
]
}

View File

@ -1,4 +1,4 @@
precision mediump float;
precision highp float;
uniform sampler2D Texture;
uniform sampler2D uShadowMap;

View File

@ -1,4 +1,4 @@
precision mediump float;
precision highp float;
uniform sampler2D Texture;
uniform sampler2D uShadowMap;

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

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.

BIN
resources/w/gg/UniV_Grid_2K_Base_color.png (Stored with Git LFS)

Binary file not shown.

BIN
resources/w/gg/UniV_Grid_2K_Base_color001.png (Stored with Git LFS) Normal file

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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"
}
}
]
}
}

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,

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]
}
]
},

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

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;

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

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);

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;
}

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",