diff --git a/game/gui.rpy b/game/gui.rpy index 9148612..0154d27 100644 --- a/game/gui.rpy +++ b/game/gui.rpy @@ -26,17 +26,16 @@ define config.check_conflicting_properties = True ## Цвета текста в интерфейсе. ## Акцентный цвет используется в заголовках и подчёркнутых текстах. -define gui.accent_color = '#0099cc' +define gui.accent_color = '#858585' ## Цвет, используемый в текстовой кнопке, когда она не выбрана и не наведена. -define gui.idle_color = '#888888' +define gui.idle_color = '#b7b7b7' ## Small_color используется в маленьком тексте, который должен быть ярче/темнее, ## для того, чтобы выделяться. -define gui.idle_small_color = '#aaaaaa' - +define gui.idle_small_color = '#888888' ## Цвет, используемых в кнопках и панелях, когда они наведены. -define gui.hover_color = '#66c1e0' +define gui.hover_color = '#4a5255' ## Цвет, используемый текстовой кнопкой, когда она выбрана, но не наведена. ## Кнопка может быть выбрана, если это текущий экран или текущее значение @@ -59,25 +58,25 @@ define gui.interface_text_color = '#ffffff' ## Шрифты и их размеры ######################################################### ## Шрифт, используемый внутриигровым текстом. -define gui.text_font = "DejaVuSans.ttf" +define gui.text_font = "gui/fonts/NoteworthyBold.otf" ## Шрифт, используемый именами персонажей. -define gui.name_text_font = "DejaVuSans.ttf" +define gui.name_text_font = "gui/fonts/NoteworthyBold.otf" ## Шрифт, используемый текстом вне игры. -define gui.interface_text_font = "DejaVuSans.ttf" +define gui.interface_text_font = "gui/fonts/NoteworthyBold.otf" ## Размер нормального текста диалога. -define gui.text_size = 33 +define gui.text_size = 40 ## Размер имён персонажей. -define gui.name_text_size = 45 +define gui.name_text_size = 50 ## Размер текста в пользовательском интерфейсе. -define gui.interface_text_size = 33 +define gui.interface_text_size = 45 ## Размер заголовков в пользовательском интерфейсе. -define gui.label_text_size = 36 +define gui.label_text_size = 50 ## Размер текста на экране уведомлений. define gui.notify_text_size = 24 @@ -134,7 +133,7 @@ define gui.namebox_tile = False ## значения в пикселях слева и сверху от текстового окна или процентное ## отношение, например, 0.5 для центрирования. define gui.dialogue_xpos = 402 -define gui.dialogue_ypos = 75 +define gui.dialogue_ypos = 45 ## Максимальная ширина текста диалога в пикселях. define gui.dialogue_width = 1116 diff --git a/game/gui/fonts/NoteworthyBold.otf b/game/gui/fonts/NoteworthyBold.otf new file mode 100644 index 0000000..a400bb0 Binary files /dev/null and b/game/gui/fonts/NoteworthyBold.otf differ diff --git a/game/options.rpy b/game/options.rpy index da2e945..275206e 100644 --- a/game/options.rpy +++ b/game/options.rpy @@ -39,6 +39,12 @@ define gui.about = _p(""" define build.name = "Silence" +define config.has_autosave = False +define config.has_quicksave = False +define config.autosave_on_quit = False +define config.autosave_on_choice = False +define config.rollback_enabled = False +define config.quit_action = Quit(confirm=False) ## Звуки и музыка ############################################################## @@ -48,7 +54,7 @@ define build.name = "Silence" define config.has_sound = True define config.has_music = True -define config.has_voice = True +define config.has_voice = False ## Чтобы разрешить игроку тестировать громкость на звуковом или голосовом @@ -121,7 +127,7 @@ define config.window_hide_transition = Dissolve(.2) ## в то время как любая другая цифра — это количество символов, печатаемых в ## секунду. -default preferences.text_cps = 0 +default preferences.text_cps = 40 ## Стандартная задержка авточтения. Большие значения означают долгие ожидания, а diff --git a/game/screens.rpy b/game/screens.rpy index feac480..cbcc4c8 100644 --- a/game/screens.rpy +++ b/game/screens.rpy @@ -236,6 +236,7 @@ style choice_button_text is default: ## внеигровым меню. screen quick_menu(): + pass ## Гарантирует, что оно появляется поверх других экранов. zorder 100 @@ -261,7 +262,7 @@ screen quick_menu(): init python: config.overlay_screens.append("quick_menu") -default quick_menu = True +default quick_menu = False style quick_menu is hbox style quick_button is default @@ -1519,6 +1520,7 @@ style pref_vbox: ## использующей меньше кнопок, но больших по размеру, чтобы их было легче ## касаться. screen quick_menu(): + pass variant "touch" zorder 100 diff --git a/game/script.rpy b/game/script.rpy index 6e00bdd..90e5e34 100644 --- a/game/script.rpy +++ b/game/script.rpy @@ -1,22 +1,216 @@ -# Вы можете расположить сценарий своей игры в этом файле. - -# Определение персонажей игры. -define e = Character('Эйлин', color="#c8ffc8") - -# Вместо использования оператора image можете просто -# складывать все ваши файлы изображений в папку images. -# Например, сцену bg room можно вызвать файлом "bg room.png", -# а eileen happy — "eileen happy.webp", и тогда они появятся в игре. - -# Игра начинается здесь: -label start: - - scene bg room - - show eileen happy - - e "Вы создали новую игру Ren'Py." - - e "Добавьте сюжет, изображения и музыку и отправьте её в мир!" - +label main_menu: return + +init python: + _game_menu_screen = None + _skipping = False + + coffee_done = False + window_done = False + power_done = False + + battery = 100 + fragments = 0 + sync_points = 0 + journal = [] + + visited_locations = {"room": False, "corridor": False, "terminal": False} + game_started = False + + def use_battery(amount): + global battery + battery -= amount + if battery < 0: battery = 0 + +screen game_ui(): + if game_started: + frame: + align (0.02, 0.02) + vbox: + text "ЭНЕРГИЯ: [battery]%" size 40 + text "ФРАГМЕНТЫ: [fragments]/3" size 40 + textbutton "ЖУРНАЛ" action Show("journal") align (0.98, 0.98) + +screen journal(): + modal True + frame: + align (0.5, 0.5) + xsize 700 ysize 500 + vbox: + text "МЫСЛИ" size 50 + for entry in journal: + text "- [entry]" size 40 + textbutton "ПОДУМАТЬ ОБ ЭТОМ" action [SetVariable("sync_points", sync_points + 1), Hide("journal")] + textbutton "ЗАКРЫТЬ" action Hide("journal") + +label start: + scene black + + play sound "audio/typing.ogg" loop fadein 0.5 + + show text "{size=150}{cps=10}ТИШИНА{/cps}{/size}" with dissolve + pause 2.0 + hide text with dissolve + + show text "{size=120}{cps=10}20.04.2023{/cps}{/size}" with dissolve + pause 2.0 + hide text with dissolve + + stop sound fadeout 0.5 + + $ player_name = renpy.input("Как меня зовут?", length=12) + $ player_name = player_name.strip() + + if not player_name: + $ player_name = "Техник" + + "Приятно познакомиться, [player_name]." + + jump phase_1_intro + +label phase_1_intro: + # Инициализация счетчика рутины + $ routine_tasks = 0 + + scene bg_room with dissolve + "Я просыпаюсь. Шум генератора — единственное, что доказывает, что я еще здесь." + "Семь лет назад я считал эту станцию своей крепостью. Теперь — это мой склеп, где я сам себе надсмотрщик." + "В воздухе пахнет озоном и застоявшейся пылью. Я чувствую каждый вдох, как попытку проглотить этот тяжелый, мертвый воздух." + + "Мои руки привычно тянутся к вещам, которые я переставляю изо дня в день. Это не привычка. Это попытка доказать самому себе, что я существую в этой физической реальности." + "Мне нужно закончить утренний ритуал. Только после этого я смогу сосредоточиться на всём остальном." + + 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 + +label main_loop: + if battery <= 0: + jump ending_silence + + show screen game_ui + "Станция ждет. Что я буду делать?" + menu: + "Осмотреть комнату": + $ use_battery(5) + jump qte_date_input + "Пойти в коридор": + $ use_battery(5) + jump qte_corridor_puzzle + "Терминал": + $ use_battery(5) + jump qte_terminal_rhythm + "Идти в серверную" if fragments >= 3: + jump phase_3_culmination + +label qte_date_input: + "Нужно ввести дату. Мои руки дрожат." + $ date_input = renpy.input("Введите дату (ДД.ММ.ГГГГ):") + if date_input == "20.04.2023": + "Синхронизация успешна." + $ fragments += 1 + $ journal.append("Я помню этот день. В этот день всё сломалось.") + else: + "Ошибка доступа." + jump main_loop + +label qte_corridor_puzzle: + "Коридор. Здесь разбитое зеркало." + # Тут будет код пазла (наложение изображений) + $ fragments += 1 + $ journal.append("Отражение пугает. Я вижу в нём чужака.") + jump main_loop + +label qte_terminal_rhythm: + "Сигнал уходит. Нужно поймать момент." + # Тут будет код ритм-игры + $ fragments += 1 + $ journal.append("Я пытаюсь связаться, но это крик в пустоту.") + jump main_loop + +label phase_3_culmination: + "Я стою перед дверью в серверную. Пути назад нет." + jump final_choice + +label final_choice: + scene bg_server with fade + "Система готова. На экране пульсирует курсор." + "Теперь, когда я знаю всё, у меня есть выбор. Но какой из них — мой настоящий?" + + menu: + # Концовка «Злость» - доступна всегда (гневный побег) + "Разбить экран (Гнев)": + jump ending_anger + + # Концовка «Принятие» - доступна всегда (нейтральный инфантилизм) + "Остаться и ждать конца (Принятие)": + jump ending_acceptance + + # Концовка «Переосмысление» - доступна только если собраны все фрагменты + "Признать ошибки и выйти (Переосмысление)" if fragments >= 3: + jump ending_reflection + + # Концовка «Свет» - доступна только если собраны фрагменты И были «переосмысления» в журнале + "Отправить извинения и выйти (Свет)" if fragments >= 3 and sync_points >= 3: + jump ending_light + +# --- Концовки --- +label ending_silence: + "Батарея села. Наконец-таки настала ТИШИНА." + jump quit_after_ending + +label ending_anger: + "Я срываю красную панель. Тумблер падает вниз. Искры летят в лицо." + "Станция умирает, и я вместе с ней. Я зол на всё это время. Я зол на себя." + 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: + $ renpy.quit() + return \ No newline at end of file diff --git a/Диздок Тишина.docx b/Диздок Тишина.docx new file mode 100644 index 0000000..59a4c2d Binary files /dev/null and b/Диздок Тишина.docx differ