WTS/game/scripts/gui/preferences.rpy

477 lines
16 KiB
Plaintext

#
# Preferences screen
#
# The preferences screen allows the player to configure the game to better suit
# themselves.
#
# https://www.renpy.org/doc/html/screen_special.html#preferences
init offset = -1
screen preferences(page="general"):
tag menu
use game_menu(_("Preferences"), scroll="viewport"):
style_prefix gui.theme("pref")
vbox:
spacing gui.pref_spacing
null # Tab margin
if page == "general":
use preferences_general
elif page == "visuals":
use preferences_visuals
elif page == "sound":
use preferences_sound
elif page == "accessibility":
use preferences_accessibility
hbox:
style_prefix gui.theme("tab")
pos (25 + 15, 100)
yanchor 0.5
textbutton "General":
selected (page == "general")
action Show("preferences", config.intra_transition, "general")
textbutton "Visuals":
selected (page == "visuals")
action Show("preferences", config.intra_transition, "visuals")
textbutton "Sound":
selected (page == "sound")
action Show("preferences", config.intra_transition, "sound")
textbutton "Accessibility":
selected (page == "accessibility")
action Show("preferences", config.intra_transition, "accessibility")
screen preferences_general():
hbox:
box_wrap True
vbox:
style_prefix gui.theme("check")
label _("Interface")
textbutton _("Animations") action settings.Toggle("animations")
textbutton _("Tutorials") action settings.Toggle("tutorials")
if not renpy.mobile:
textbutton _("Tooltips") action settings.Toggle("tooltip")
textbutton _("System Cursor") action Preference("system cursor", "toggle")
textbutton _("Automatic Updates") action settings.Toggle("updates")
textbutton _("Autosave") action ToggleField(store, "_autosave")
default trans = config.intra_transition
vbox:
style_prefix gui.theme("radio")
label "Theme"
textbutton "Auto" action [
settings.Set("theme", "auto"),
Function(renpy.transition, trans),
Function(renpy.restart_interaction)
]
textbutton "Day" action [
settings.Set("theme", "light"),
Function(renpy.transition, trans),
Function(renpy.restart_interaction)
]
textbutton "Night" action [
settings.Set("theme", "dark"),
Function(renpy.transition, trans),
Function(renpy.restart_interaction)
]
vbox:
style_prefix gui.theme("check")
label _("Skipping")
textbutton _("Skip Unseen Text") action Preference("skip", "toggle")
textbutton _("Until dialog menu") action InvertSelected(Preference("after choices", "toggle"))
vbox:
style_prefix gui.theme("radio")
label _("Language")
textbutton "English" action Language(None)
textbutton "中文" action Language("chinese")
hbox:
box_wrap True
vbox:
style_prefix gui.theme("slider")
spacing gui.pref_spacing / 2
label _("Text Speed")
bar value Preference("text speed")
label _("Auto-Forward Time")
bar value Preference("auto-forward time")
hbox:
box_wrap True
vbox:
style_prefix gui.theme("check")
screen preferences_visuals():
vbox:
hbox:
box_wrap True
if renpy.variant("pc") or renpy.variant("web"):
vbox:
style_prefix gui.theme("radio")
label _("Display")
textbutton _("Fullscreen") action Preference("display", "fullscreen")
textbutton _("Windowed") action Preference("display", "any window")
textbutton _("V-Sync") action [ InvertSelected(ToggleField(_preferences, "gl_tearing")), _DisplayReset() ] style gui.theme("check_button")
# Probably redundant now that we have aspect ratio preservation.
# if not preferences.fullscreen:
# textbutton _("Reset window"):
# action Preference("display", "window")
# sensitive (renpy.get_physical_size() != (config.screen_width, config.screen_height))
vbox:
style_prefix gui.theme("radio")
default fps_msg = "Framerate preference may take effect after restarting the game"
label "Framerate"
textbutton (f"{int(renpy.get_refresh_rate())} fps") action [Preference("gl framerate", None), Notify(fps_msg)]
if renpy.get_refresh_rate() > 60:
textbutton "60 fps" action [Preference("gl framerate", 60), Notify(fps_msg)]
textbutton "30 fps" action [Preference("gl framerate", 30), Notify(fps_msg)]
if not renpy.mobile:
vbox:
style_prefix gui.theme("radio")
label _("Renderer")
default renderer_used = renpy.get_renderer_info()["renderer"]
textbutton _("OpenGL"):
selected renderer_used == "gl2"
action Confirm("Changing renderer requires a full restart, do it now?\nUnsaved progress will be lost.", Function(set_renderer, "gl2"))
textbutton _("DirectX"):
sensitive renpy.windows
selected renderer_used == "angle2"
action Confirm("Changing renderer requires a full restart, do it now?\nUnsaved progress will be lost.", Function(set_renderer, "angle2"))
vbox:
style_prefix gui.theme("check")
label "Advanced"
textbutton _("Transitions") action Preference("transitions", "toggle")
textbutton _("Videos") action InvertSelected(Preference("video sprites", "toggle"))
textbutton _("Power-saving") action Preference("gl powersave", "toggle")
textbutton _("multithreading") action settings.Toggle("multithreading") tooltip "Improves performance by executing tasks asynchronously. (Requires restart)"
#if not renpy.mobile:
#textbutton _("Preserve Aspect Ratio") action [settings.Toggle("preserve_aspect_ratio"), _DisplayReset()]
vbox:
style_prefix gui.theme("slider")
label _("Image cache ([persistent.custom_settings['image_cache_size']]MB)")
hbox:
bar value DictValue(persistent.custom_settings, "image_cache_size", range=1792, max_is_zero=False, style="slider", offset=256, step=128, force_step=True, action=Notify("Restart the game to apply image cache size changes.")) tooltip "Improves performance at a cost of higher memory usage."
text get_gpu_info() yalign 1.0 size 10
screen preferences_sound():
hbox:
box_wrap True
vbox:
style_prefix gui.theme("slider")
spacing gui.pref_spacing / 2
if config.has_music:
label _("Music Volume")
hbox:
bar value Preference("music volume")
if config.has_sound:
label _("Sound Volume")
hbox:
bar value Preference("sound volume")
if config.sample_sound:
textbutton _("Test") action Play("sound", config.sample_sound)
label _("Weather Volume")
hbox:
bar value Preference("weather volume")
if config.sample_sound:
textbutton _("Test") action Play("weather", config.sample_sound)
if config.has_voice:
label _("Voice Volume")
hbox:
bar value Preference("voice volume")
if config.sample_voice:
textbutton _("Test") action Play("voice", config.sample_voice)
if config.has_music or config.has_sound or config.has_voice:
null height gui.pref_spacing
textbutton _("Mute All"):
action Preference("all mute", "toggle")
style gui.theme("check_button")
textbutton _("Mute when minimized"):
action Preference("audio when minimized", "toggle")
selected (not _preferences.audio_when_minimized)
style gui.theme("check_button")
screen preferences_accessibility():
vbox:
text "Disclaimer" size 18 xalign 0.5
hbox:
xmaximum 731
text "These menu options are intended to improve accessibility and may not work well in all cases where text might overflow. When changing font, text size or spacing try to keep it close to the default size." size 14
hbox:
box_wrap True
vbox:
style_prefix gui.theme("radio")
label _("Text Font")
textbutton _("Default"):
action Preference("font transform", None)
textbutton _("DejaVu Sans"):
action Preference("font transform", "dejavusans")
textbutton _("Opendyslexic"):
action Preference("font transform", "opendyslexic")
vbox:
label _("Text Scaling")
hbox:
style_prefix gui.theme("radio")
textbutton "V. small" action Preference("font size", 0.7)
textbutton "Small" action Preference("font size", 0.9)
textbutton "Normal" action Preference("font size", 1.0)
textbutton "Large" action Preference("font size", 1.2)
textbutton "V. Large" action Preference("font size", 1.4)
label _("Vertical Text Spacing")
hbox:
style_prefix gui.theme("radio")
textbutton "V. small" action Preference("font line spacing", 0.7)
textbutton "Small" action Preference("font line spacing", 0.9)
textbutton "Normal" action Preference("font line spacing", 1.0)
textbutton "Large" action Preference("font line spacing", 1.2)
textbutton "V. Large" action Preference("font line spacing", 1.4)
if not renpy.mobile:
hbox:
vbox:
style_prefix gui.theme("check")
label _("Text-to-speech")
textbutton _("Text-to-speech"):
action Preference("self voicing", "toggle")
vbox:
style_prefix gui.theme("slider")
label _("Text-to-speech Accentuation")
bar value Preference("self voicing volume drop")
vbox:
label _("Advanced")
textbutton "Delete persistent data ({color=#f00}!{/color})":
style gui.theme("pref_button")
action Confirm(gui.CONFIRM_DELETE_PERSISTENT, Function(delete_persistent))
textbutton "Delete save files ({color=#f00}!{/color})":
style gui.theme("pref_button")
action Confirm(gui.CONFIRM_DELETE_SAVES, Function(delete_saves))
if renpy.android:
label _("Android Crash Defender")
hbox:
style_prefix gui.theme("radio")
textbutton "Aggressive" action [settings.Set("crashdefendersetting", 3), Function(crashdefender.set_mode, 3)]
textbutton "Balanced" action [settings.Set("crashdefendersetting", 2), Function(crashdefender.set_mode, 2)]
textbutton "Relaxed" action [settings.Set("crashdefendersetting", 1), Function(crashdefender.set_mode, 1)]
textbutton "Off" action [settings.Set("crashdefendersetting", 0), Function(crashdefender.set_mode, 0)]
define gui.CONFIRM_DELETE_PERSISTENT = """{color=#7a0000}Warning!{/color}
{size=-4}You are about to reset all persistent data, including
achievements, seen text, and preferences.{/size}\n
Are you sure?"""
define gui.CONFIRM_DELETE_SAVES = """{color=#7a0000}Warning!{/color}
{size=-4}You are about to delete all save files, including
auto saves, quick saves, and manual saves.{/size}\n
Are you sure?"""
define gui.SAVE_INCOMPATIBLE_WARNING = """{color=#7a0000}Warning!{/color}
{size=-4}The save file you are attempting to load is not compatible
with the current game version. While you can try loading it,
doing so may result in unexpected crashes and bugs.
Proceed anyway?"""
init python:
def delete_persistent():
renpy.loadsave.location.unlink_persistent()
renpy.persistent.should_save_persistent = False
renpy.quit(relaunch=True)
def delete_saves():
for fn in renpy.list_saved_games(fast=True):
renpy.unlink_save(fn)
def set_renderer(s):
preferences.renderer = s if s in ("gl2", "angle2") else "auto"
renpy.quit(relaunch=True)
style mute_all_button is check_button
style mute_all_button_text is check_button_text
# Preference
style pref_label is gui_label:
top_margin gui.pref_spacing
bottom_margin 2
style pref_label_text is gui_label_text:
yalign 1.0
style dark_pref_label_text is dark_label_text
style light_pref_label_text is light_label_text
style pref_button is gui_button:
padding (18, 4, 4, 4)
style pref_button_text is gui_button_text
style pref_vbox is vbox:
xminimum (245 - 30 - 60) / 2
style pref_hbox:
spacing 30
box_wrap_spacing 2 * gui.pref_spacing
# Radio button
style radio_label is pref_label
style radio_label_text is pref_label_text
style dark_radio_label_text is dark_pref_label_text
style light_radio_label_text is light_pref_label_text
style radio_vbox is pref_vbox:
spacing gui.pref_button_spacing
style radio_button is gui_button:
background None
padding (18, 4, 4, 4)
style dark_radio_button is dark_gui_button:
take radio_button
foreground "dark_radio_false"
selected_foreground "dark_radio_true"
insensitive_foreground "dark_radio_none"
style light_radio_button is light_gui_button:
take radio_button
foreground "light_radio_false"
selected_foreground "light_radio_true"
insensitive_foreground "light_radio_none"
style radio_button_text is gui_button_text:
first_indent 6
# Check button
style check_label is pref_label
style check_label_text is pref_label_text
style dark_check_label_text is dark_pref_label_text
style light_check_label_text is light_pref_label_text
style check_vbox is pref_vbox:
spacing gui.pref_button_spacing
style check_button is gui_button:
background None
padding (18, 4, 4, 4)
style dark_check_button is dark_gui_button:
take check_button
foreground "dark_check_false"
selected_foreground "dark_check_true"
insensitive_foreground "dark_check_none"
style light_check_button is light_gui_button:
take check_button
foreground "light_check_false"
selected_foreground "light_check_true"
insensitive_foreground "light_check_none"
style check_button_text is gui_button_text:
first_indent 6
# Slider
style slider_label is pref_label
style slider_label_text is pref_label_text
style dark_slider_label_text is dark_pref_label_text
style light_slider_label_text is light_pref_label_text
style slider_slider is gui_slider:
xsize 320
style dark_slider_slider is dark_slider
style light_slider_slider is light_slider
style slider_button is gui_button:
background None
yalign 0.5
left_margin 9
style slider_button_text is gui_button_text
style slider_vbox is pref_vbox:
xsize 320
screen _self_voicing():
zorder 1500
if _preferences.self_voicing == "clipboard":
$ message = _("Clipboard voicing enabled. Press 'shift+C' to disable.")
elif _preferences.self_voicing == "debug":
$ message = _("Text-to-speech would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable.")
else:
$ message = _("Text-to-speech enabled. Press 'shift+v' to disable.")
text message:
alt ""
xpos 10
ypos 35
color "#fff"
outlines [ (1, "#0008", 0, 0)]