extends "res://scripts/ui/menu_modal.gd" var _volume: HSlider var _music: HSlider var _resolution: OptionButton var _language: OptionButton var _fullscreen: CheckButton var _error: Label func _ready() -> void: heading = "OPCJE" subtitle = "Dostosuj dźwięk, ekran i język swojej wyprawy." marker = "USTAWIENIA / KOMPUTER POKŁADOWY" preferred_size = Vector2(800,650) super._ready() var audio := _section("01 / DŹWIĘK") _volume = _slider(audio,"Głośność ogólna",GameSettings.volume) _music = _slider(audio,"Głośność muzyki",GameSettings.music_volume) var columns := HBoxContainer.new() columns.add_theme_constant_override("separation",16) body.add_child(columns) var display := _section("02 / OBRAZ",columns) label(display,tr("Rozdzielczość"),12,MUTED) _resolution = OptionButton.new() _resolution.custom_minimum_size.y = 42 display.add_child(_resolution) input_style(_resolution) for value in GameSettings.RESOLUTIONS: _resolution.add_item("%d × %d" % [value.x,value.y]) _resolution.select(maxi(0,GameSettings.RESOLUTIONS.find(GameSettings.resolution))) _fullscreen = CheckButton.new() _fullscreen.text = tr("Pełny ekran") _fullscreen.button_pressed = GameSettings.fullscreen _fullscreen.add_theme_font_override("font",ThemeDB.fallback_font) _fullscreen.add_theme_font_size_override("font_size",14) display.add_child(_fullscreen) var language := _section("03 / JĘZYK",columns) label(language,tr("Język interfejsu"),12,MUTED) _language = OptionButton.new() _language.custom_minimum_size.y = 42 language.add_child(_language) input_style(_language) for name in GameSettings.LANGUAGES: _language.add_item(name) _language.select(GameSettings.LOCALES.find(GameSettings.locale)) var note := label(language,tr("Ustawienia są zapamiętywane między uruchomieniami."),12,MUTED) note.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART for select in [_resolution,_language]: select.get_popup().add_theme_stylebox_override("panel",box(Color("102431"),Color("416471"),10)) select.get_popup().add_theme_font_override("font",ThemeDB.fallback_font) _error = label(body,"",12,Color("ef9e8b")) _error.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART button(footer,tr("Anuluj"),_close) button(footer,tr("Zastosuj"),_apply,true) func _section(caption: String, parent: Node = null) -> VBoxContainer: var card := PanelContainer.new() card.size_flags_horizontal = Control.SIZE_EXPAND_FILL card.add_theme_stylebox_override("panel",box(Color("0e202d"),Color("263e4a"),16)) (parent if parent != null else body).add_child(card) var column := VBoxContainer.new() column.add_theme_constant_override("separation",14) card.add_child(column) label(column,tr(caption),11,GOLD) return column func _slider(parent: Node, caption: String, value: float) -> HSlider: var row := HBoxContainer.new() row.add_theme_constant_override("separation",18) parent.add_child(row) var title := label(row,tr(caption),14) title.custom_minimum_size.x = 174 var slider := HSlider.new() slider.max_value = 100 slider.step = 1 slider.value = roundf(value*100) slider.size_flags_horizontal = Control.SIZE_EXPAND_FILL slider.custom_minimum_size = Vector2(120,28) row.add_child(slider) var percentage := label(row,"%d%%" % slider.value,16,GOLD) percentage.custom_minimum_size.x = 48 percentage.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT slider.value_changed.connect(func(amount: float) -> void: percentage.text = "%d%%" % amount) return slider func _apply() -> void: GameSettings.volume = _volume.value/100.0 GameSettings.music_volume = _music.value/100.0 GameSettings.resolution = GameSettings.RESOLUTIONS[_resolution.selected] GameSettings.fullscreen = _fullscreen.button_pressed GameSettings.locale = GameSettings.LOCALES[_language.selected] GameSettings.apply() if GameSettings.save_settings() != OK: _error.text = tr("Nie udało się zapisać ustawień.") return _close()