This commit is contained in:
MrTorex committed 2026-04-23 12:51:04 +03:00
1 parent ed410f46b1
commit f70a4da530
14 files changed
+263 -63

No files matched your search

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+228 -55
View File
@@ -2,6 +2,8 @@
return
init python:
renpy.music.register_channel("ambient", "sfx")
_game_menu_screen = None
_skipping = False
@@ -11,9 +13,16 @@ init python:
battery = 100
fragments = 0
sync_points = 0
thoughts_processed = False
journal = []
puzzle_parts = [False, False, False, False]
puzzle_complete = False
signal_sequence = [0, 1, 2]
player_input = []
signal_active = True
visited_locations = {"room": False, "corridor": False, "terminal": False}
game_started = False
@@ -36,13 +45,76 @@ screen journal():
frame:
align (0.5, 0.5)
xsize 700 ysize 500
background "#333333"
vbox:
text "МЫСЛИ" size 50
for entry in journal:
text "- [entry]" size 40
textbutton "ПОДУМАТЬ ОБ ЭТОМ" action [SetVariable("sync_points", sync_points + 1), Hide("journal")]
text "- [entry]" size 20
if fragments >= 3 and not thoughts_processed:
textbutton "ПОДУМАТЬ ОБ ЭТОМ":
action [Hide("journal"), Jump("deep_reflection")]
textbutton "ЗАКРЫТЬ" action Hide("journal")
screen corridor_puzzle_screen():
modal True
frame:
align (0.5, 0.5)
xsize 640 ysize 750
background "#333333"
vbox:
align (0.5, 0.5)
spacing 20
grid 2 2:
xalign 0.5
spacing 10
for i in range(4):
button:
action [
SetDict(puzzle_parts, i, True),
Function(renpy.restart_interaction)
]
xsize 300 ysize 300
background "#1a1a1a"
if puzzle_parts[i]:
add "puzzle_[i].png" align (0.5, 0.5)
else:
add "puzzle_unknown.png" align (0.5, 0.5)
textbutton "ЗАВЕРШИТЬ СБОРКУ":
action If(all(puzzle_parts), [Hide("corridor_puzzle_screen"), Return(True)], [Hide("corridor_puzzle_screen"), Return(False)])
xalign 0.5
xpadding 40
ypadding 20
background "#555555"
screen terminal_rhythm_screen():
modal True
frame:
align (0.5, 0.5)
xsize 600 ysize 300
background "#333333"
hbox:
align (0.5, 0.5)
spacing 20
for i in range(3):
button:
action [
Function(player_input.append, i),
Function(renpy.restart_interaction)
]
xsize 150 ysize 150
background ("#aaaaaa" if i in player_input else "#1a1a1a")
text "[i]" align (0.5, 0.5)
if len(player_input) >= 3:
timer 0.3 action Return(player_input == signal_sequence)
label start:
scene black
@@ -69,50 +141,53 @@ label start:
jump phase_1_intro
label phase_1_intro:
# Инициализация счетчика рутины
$ routine_tasks = 0
scene bg_room with dissolve
"Я просыпаюсь. Шум генератора — единственное, что доказывает, что я еще здесь."
"Семь лет назад я считал эту станцию своей крепостью. Теперь — это мой склеп, где я сам себе надсмотрщик."
"В воздухе пахнет озоном и застоявшейся пылью. Я чувствую каждый вдох, как попытку проглотить этот тяжелый, мертвый воздух."
"Я просыпаюсь. Шум генератора — единственное, что доказывает, что я еще здесь. Но сегодня этот звук другой. Он надтреснутый, хриплый, как дыхание умирающего."
"Индикатор на консоли мигает тусклым оранжевым. 100\%. Это последняя порция топлива. Последние искры жизни этой консервной банки."
"Семь лет назад я считал эту станцию своей крепостью. Теперь — это мой склеп, где я сам себе надсмотрщик, а генератор — мой метроном, отсчитывающий секунды до полной темноты."
"В воздухе пахнет озоном, гнилью и невыполненными обещаниями. Я чувствую каждый вдох, как попытку проглотить этот тяжелый, мертвый воздух, который скоро станет моим единственным спутником."
"Мои руки привычно тянутся к вещам, которые я переставляю изо дня в день. Это не привычка. Это попытка доказать самому себе, что я существую в этой физической реальности."
"Мне нужно закончить утренний ритуал. Только после этого я смогу сосредоточиться на всём остальном."
"Сегодня двадцатое апреля. И если верить датчикам, сегодня — последний день, когда станция сможет поддерживать жизнеобеспечение. К полуночи, если я не решусь на что-то, здесь станет холодно по-настоящему."
"Мои руки привычно тянутся к вещам, которые я переставляю изо дня в день. Это не привычка. Это попытка доказать самому себе, что я всё ещё существую в этой физической реальности, а не стал частью фонового шума оборудования."
"Мне нужно закончить утренний ритуал. Последний утренний ритуал. Только после этого я смогу сосредоточиться на том, чтобы принять решение, от которого я бежал три года."
label routine_loop:
if routine_tasks >= 3:
jump start_game_proper
"Комната кажется пустой, но в ней всё ещё остались вещи, которые требуют моего внимания."
"Комната кажется пустой, но в ней всё ещё остались вещи, которые требуют моего внимания. Вещи, которые я должен 'оживить' в последний раз."
menu:
"Налить остывший кофе" if not coffee_done:
$ coffee_done = True
$ routine_tasks += 1
"Чашка холодная, стенки покрыты коричневым налетом. Я смотрю на эту жидкость и вспоминаю, как раньше мы спорили о том, какой сорт кофе лучше."
"Теперь мне всё равно. Это просто топливо. Жидкая горечь, чтобы проснуться. Я делаю глоток, и холод металла чашки обжигает губы сильнее, чем сам напиток."
"Чашка холодная, стенки покрыты въевшимся коричневым налетом. Я смотрю на эту мутную жидкость и вспоминаю, как раньше мы спорили о том, какой сорт кофе лучше — с кислинкой или с горчинкой."
"Теперь мне всё равно. Это просто топливо. Жидкая горечь, чтобы хоть как-то почувствовать себя живым. Я делаю глоток, и холод металла чашки обжигает губы сильнее, чем сам напиток. Это вкус прощания."
jump routine_loop
"Подойти к окну и стереть иней" if not window_done:
$ window_done = True
$ routine_tasks += 1
"Стекло промерзло насквозь. Я провожу рукавом, оставляя длинную, неровную полосу."
"За окном — только серая, бескрайняя пелена. Ни горизонта, ни неба. Иногда мне кажется, что я нахожусь не на станции связи, а в какой-то космической пустоте, куда забыли подать свет."
"Я вглядываюсь в это 'ничто', надеясь увидеть хоть что-то, кроме собственного отражения, но вижу лишь уставшие глаза человека, который слишком долго ждал."
"Стекло промерзло насквозь. Я провожу рукавом, оставляя длинную, неровную полосу. Иней осыпается, как пепел."
"За окном — только серая, бескрайняя пелена. Ни горизонта, ни неба. Иногда мне кажется, что я нахожусь не на станции связи, а внутри собственного разума, куда забыли подать свет."
"Я вглядываюсь в это 'ничто', надеясь увидеть хоть что-то, кроме собственного бледного отражения. Но вижу лишь глаза человека, который три года назад решил, что ожидание лучше, чем риск."
jump routine_loop
"Проверить статус генератора" if not power_done:
$ power_done = True
$ routine_tasks += 1
"Я подхожу к главному щитку. Индикаторы мерцают, как нервные окончания. Семь лет эксплуатации — это не шутки."
"Генератор стонет под нагрузкой. Я касаюсь рычага, чувствуя его дрожь. Если я сейчас уйду — он просто сгорит. Если останусь — буду жечь энергию на поддержание пустоты."
"Каждый мой шаг здесь — это повторение того, от чего я пытаюсь сбежать, но я не могу позволить станции заглохнуть. Это моё единственное наследие."
"Я подхожу к главному щитку. Индикаторы мерцают, как нервные окончания, готовые вот-вот перегореть. Семь лет эксплуатации — это не шутки. Сегодня он сдастся."
"Генератор стонет под нагрузкой. Я касаюсь рычага, чувствуя его дрожь. Если я сейчас уйду — он просто сгорит. Если останусь — буду жечь последние крохи энергии на поддержание пустоты."
"Каждый мой шаг здесь — это повторение того, от чего я пытаюсь сбежать, но я не могу позволить станции заглохнуть раньше времени. Это моё единственное наследие, мой памятник трусости."
jump routine_loop
label start_game_proper:
"Ритуал завершен. Пустота внутри стала немного привычнее."
"Теперь, когда я 'дома', можно переходить к делам. Станция ждет. Что я буду делать дальше?"
"Ритуал завершен. Пустота внутри стала немного привычнее, но теперь она давит сильнее."
"Станция издает низкий, вибрирующий гул. Это звук умирающего сердца станции, и он резонирует где-то в моих ребрах."
"Каждый мой шаг отзывается эхом. Здесь слишком много тишины для места, которое когда-то было наполнено смехом и голосами."
"Что мне делать сегодня? Время утекает, как песок сквозь пальцы, и заряд батареи с каждой минутой становится всё ближе к нулю."
$ game_started = True
jump main_loop
@@ -121,94 +196,192 @@ label main_loop:
jump ending_silence
show screen game_ui
"Станция ждет. Что я буду делать?"
# play ambient "audio/ambient_low_hum.ogg" fadein 2.0 loop
"Станция ждет. Сегодня всё закончится. Что я буду делать, пока ещё есть свет?"
menu:
"Осмотреть комнату":
"Осмотреть рабочий стол (Комната)" if not visited_locations["room"]:
$ use_battery(5)
$ visited_locations["room"] = True
jump qte_date_input
"Пойти в коридор":
"Идти в коридор" if not visited_locations["corridor"]:
$ use_battery(5)
$ visited_locations["corridor"] = True
jump qte_corridor_puzzle
"Терминал":
"Подойти к терминалу" if not visited_locations["terminal"]:
$ use_battery(5)
$ visited_locations["terminal"] = True
jump qte_terminal_rhythm
"Идти в серверную" if fragments >= 3:
"Идти в серверную" if visited_locations["room"] and visited_locations["corridor"] and visited_locations["terminal"]:
jump phase_3_culmination
label qte_date_input:
"Нужно ввести дату. Мои руки дрожат."
$ date_input = renpy.input("Введите дату (ДД.ММ.ГГГГ):")
# scene bg_desk_close with fade
# play sound "audio/keyboard_clack.ogg"
"Рабочий стол. Слой пыли здесь настолько толстый, что кажется, будто никто не садился сюда вечность."
"Курсор на экране терминала мигает в ритме моего пульса. Сегодня двадцатое апреля, двадцать третьего года."
"Ровно три года с того дня, когда всё пошло прахом. Три года тишины, которую я сам на себя наложил."
"Чтобы получить доступ к архиву за тот день, система требует подтвердить текущую дату. Словно издевается, заставляя меня признать, сколько времени я потратил на это самобичевание."
$ date_input = renpy.input("Введите сегодняшнюю дату (ДД.ММ.ГГГГ):", length=10)
if date_input == "20.04.2023":
"Синхронизация успешна."
# play sound "audio/access_granted.ogg"
"Экран на мгновение вспыхивает ярким, почти болезненным белым цветом. Система приняла ввод."
"Я вхожу в архив. Передо мной всплывают логи трехлетней давности. Двадцатое апреля, двадцатый год."
"Я помню этот день по секундам. День, когда я должен был сказать одно слово, но вместо этого промолчал."
"Молчание стало моей клеткой. Я сам запер себя здесь, внутри этого 'сегодня', чтобы не сталкиваться с 'тем самым вчера'."
$ fragments += 1
$ journal.append("Я помню этот день. В этот день всё сломалось.")
$ journal.append("20.04.2020. Дата моего заточения. Спустя три года я наконец-то открыл архив, который так боялся увидеть.")
else:
"Ошибка доступа."
# play sound "audio/access_denied.ogg"
"На экране высветилось: 'ОШИБКА ДОСТУПА'."
"Даже простая проверка даты выбивает меня из колеи. Мои руки дрожат так сильно, что я путаю цифры."
"Я чувствую, как с каждой неудачной попыткой станция становится всё холоднее. Или это просто моё отчаяние?"
"Я отхожу от стола. В голове пульсирует лишь одна мысль: я всё ещё здесь. Всё ещё в этом 2020-м."
jump main_loop
label qte_corridor_puzzle:
"Коридор. Здесь разбитое зеркало."
# Тут будет код пазла (наложение изображений)
scene bg_corridor with fade
# play sound "audio/wind_echo.ogg"
"Коридор. Место, где время растянулось, как жевательная резинка."
"В конце — разбитое зеркало. Я смотрю в него, и мои глаза встречаются с глазами человека, который проиграл эту жизнь три года назад."
"Оно разбито на четыре неравных куска. Я вижу в этих осколках фрагменты того самого дня. Если я соберу их... если я заставлю себя посмотреть на них..."
call screen corridor_puzzle_screen
$ result = _return
if not result:
"Я смотрю на пустые места в зеркале. Я не могу... Руки не слушаются. В голове только шум и липкий страх."
"Я слишком слаб, чтобы видеть всё это целиком. Может быть, позже..."
jump main_loop
"Последний осколок встал на место. Изображение сложилось."
"Я вижу себя. Я вижу её. Она стоит у двери, её ладонь касается ручки. Она ждёт одного слова. Любого слова."
"А я? Я просто смотрю в пол. Я не могу поднять взгляд, потому что боюсь увидеть в её глазах подтверждение того, что я — ничтожество."
"Это зеркало — не отражение. Это приговор, который я сам себе вынес."
$ fragments += 1
$ journal.append("Отражение пугает. Я вижу в нём чужака.")
$ journal.append("Коридор. Я увидел правду в зеркале: я не 'ждал', я намеренно молчал, чтобы она ушла.")
"Больше здесь не на что смотреть. Я оставляю зеркало в покое, хотя оно всё ещё преследует меня своей правдой."
jump main_loop
label qte_terminal_rhythm:
"Сигнал уходит. Нужно поймать момент."
# Тут будет код ритм-игры
scene bg_terminal with fade
# play sound "audio/terminal_hum.ogg"
"Терминал. Моё единственное окно в мир, который меня забыл."
"Экран забит мусором — тысячи системных сообщений, ошибок и битых секторов. Где-то там, под слоем цифровой пыли, всё ещё лежат записи того дня."
"Сигнал нестабилен, поток данных рвется. Если я не выровняю частоту прямо сейчас, архив удалит себя автоматически как 'неактуальный'."
"Мне нужно поймать этот поток. Не для того, чтобы отправить сообщение... а для того, чтобы наконец увидеть, что она мне писала."
$ player_input = []
call screen terminal_rhythm_screen
if _return:
# play sound "audio/success_beep.ogg"
"Синхронизация завершена. Помехи исчезли, оставив на экране четкие строки."
"Я прокручиваю лог вниз. Вот оно. Сообщение, которое я никогда не открывал."
"Моё сердце пропускает удар. Я не отправляю ничего. Я просто читаю её последние слова, и это ранит сильнее, чем любая ошибка связи."
$ fragments += 1
$ journal.append("Я пытаюсь связаться, но это крик в пустоту.")
$ journal.append("Терминал: Я открыл её последнее сообщение. Теперь я знаю, что именно я потерял.")
else:
# play sound "audio/fail_buzz.ogg"
"Ошибка синхронизации. Архив свернулся, защищая себя от доступа."
"Я снова промахнулся. Руки дрожат, экран гаснет, и я остаюсь в тишине."
"Она осталась для меня неразгаданной. Снова. Всегда опаздываю — даже чтобы просто узнать правду."
"Я выхожу из системы. Терминал остывает, но теперь в комнате стало ещё холоднее от осознания того, что я (не) узнал."
jump main_loop
label deep_reflection:
"Я читаю свои записи. За каждой строчкой — трусость. За каждым 'потом' — страх."
"Я был таким слепым. Всё это время я думал, что храню память о ней, а на самом деле я просто бережно лелеял собственное бессилие."
"Хватит. Я всё понял."
$ sync_points = 3
$ thoughts_processed = True
"Я закрываю записи. Теперь я знаю, что должен сделать."
jump main_loop
label phase_3_culmination:
"Я стою перед дверью в серверную. Пути назад нет."
scene bg_door_to_server with dissolve
# play sound "audio/heavy_door_open.ogg"
"Серверная. Место, где родилась вся эта ложь."
"Я помню, как три года назад входил сюда, чтобы заглушить голос совести. Семь лет работы, три года молчания — всё это здесь."
"Светодиоды на стойках серверов мигают, словно конвульсии умирающего. Воздух здесь настолько сухой и горячий, что обжигает горло при каждом вдохе."
"На центральном терминале мерцает последний интерфейс. Если я нажму 'Ввод', пути назад не будет. Станция отключит жизнеобеспечение окончательно."
jump final_choice
label final_choice:
scene bg_server with fade
"Система готова. На экране пульсирует курсор."
"Теперь, когда я знаю всё, у меня есть выбор. Но какой из них — мой настоящий?"
scene bg_server_close with dissolve
# play music "audio/tension_finale.ogg" fadein 5.0
"Курсор пульсирует. Он ждет. Решение, от которого я бежал три года, теперь стоит передо мной во весь рост."
"Я чувствую, как холод металла терминала пробирает до костей, несмотря на жар в серверной."
menu:
# Концовка «Злость» - доступна всегда (гневный побег)
"Разбить экран (Гнев)":
jump ending_anger
# Концовка «Принятие» - доступна всегда (нейтральный инфантилизм)
"Остаться и ждать конца (Принятие)":
jump ending_acceptance
# Концовка «Переосмысление» - доступна только если собраны все фрагменты
"Признать ошибки и выйти (Переосмысление)" if fragments >= 3:
jump ending_reflection
# Концовка «Свет» - доступна только если собраны фрагменты И были «переосмысления» в журнале
"Отправить извинения и выйти (Свет)" if fragments >= 3 and sync_points >= 3:
"Отправить извинения (Свет)" if fragments >= 3 and sync_points >= 3:
jump ending_light
# --- Концовки ---
label ending_silence:
"Батарея села. Наконец-таки настала ТИШИНА."
scene black with fade
"Экран погас. Вместе с ним погас и последний источник света в этом склепе."
"Генератор сделал последний судорожный вдох и замолчал. В этой абсолютной темноте я наконец-то слышу то, чего так боялся."
"Ничего. Пустоту. Тишину, которая заполняет легкие вместо воздуха."
"Наконец-таки настала ТИШИНА."
jump quit_after_ending
label ending_anger:
"Я срываю красную панель. Тумблер падает вниз. Искры летят в лицо."
"Станция умирает, и я вместе с ней. Я зол на всё это время. Я зол на себя."
# play sound "audio/glass_shatter.ogg"
"Гнев — это единственное, что заставляет меня чувствовать себя живым. Я срываю красную панель, сдирая кожу на пальцах до крови."
"Тумблер падает вниз с хрустом ломающихся костей. Искры бьют в лицо, выжигая остатки рассудка."
"Станция умирает, и я тяну её за собой в небытие. Я зол на этот холод, на эти три года, на её молчание... я зол на себя, но мне проще сжечь этот мир, чем признать свою вину."
"Я зол."
jump quit_after_ending
label ending_acceptance:
"Я ничего не выбираю. Курсор просто мигает."
"Я буду ждать здесь, пока генератор не заглохнет. Это проще всего."
"Курсор мигает в ритме моего безразличия. Раз, два... Раз, два..."
"Зачем что-то менять? Зачем бороться с энтропией, если она всё равно победит?"
"Я откидываюсь на спинку кресла. Инфантильное желание просто закрыть глаза и ждать, пока тьма поглотит эту станцию, кажется единственно верным."
"Пусть всё закончится само собой. Я устал играть в героя. Я просто... буду ждать."
jump quit_after_ending
label ending_reflection:
"Я печатаю: 'Я был неправ. Это была глупая игра в мученика'."
"Я выключаю станцию. Впервые за три года я чувствую, что могу вдохнуть полной грудью."
"Я печатаю дрожащими пальцами: 'Я был неправ. Это была глупая, бесконечная игра в мученика, в которой не было победителей'."
"Я признаю это. Три года я строил стены из своего молчания, думая, что защищаюсь. Но я просто возвел свою собственную тюрьму."
"Я выключаю станцию. Впервые за долгое время я чувствую, что в воздухе стало меньше гари. Я должен двигаться дальше. Я не знаю, что там, во внешнем мире, но я больше не заперт внутри себя."
jump quit_after_ending
label ending_light:
"Я трачу последние искры энергии на то, чтобы отправить сообщение с извинениями."
"Я не знаю, прочтет ли он. Но я знаю, что я отпустил. Я выхожу в коридор, не оборачиваясь."
"Я направляю остатки энергии на передатчик. Каждый процент заряда — это вырванный из жизни кусок, который я отдаю за шанс сказать правду."
"Я пишу не для того, чтобы получить ответ. Я пишу, чтобы освободиться. 'Прости за тишину. Она была моей ошибкой'."
"Нажимаю 'Отправить'. Система оповещает о передаче пакета, и тут же питание отключается. Станция замирает."
"Я встаю и иду к выходу. Я не оглядываюсь. Мой долг перед прошлым оплачен, а будущее... будущее наконец-то принадлежит мне."
jump quit_after_ending
label quit_after_ending: