116 lines
3.4 KiB
GDScript3
116 lines
3.4 KiB
GDScript3
|
|
extends CanvasLayer
|
|||
|
|
|
|||
|
|
@onready var bg: ColorRect = $BG
|
|||
|
|
@onready var main_panel: PanelContainer = $MainPanel
|
|||
|
|
@onready var settings_panel: PanelContainer = $SettingsPanel
|
|||
|
|
|
|||
|
|
@onready var btn_resume: Button = $MainPanel/V/BtnResume
|
|||
|
|
@onready var btn_settings: Button = $MainPanel/V/BtnSettings
|
|||
|
|
@onready var btn_main: Button = $MainPanel/V/BtnMainMenu
|
|||
|
|
@onready var btn_quit: Button = $MainPanel/V/BtnQuit
|
|||
|
|
|
|||
|
|
@onready var sens_slider: HSlider = $SettingsPanel/V/SensRow/Slider
|
|||
|
|
@onready var sens_value: Label = $SettingsPanel/V/SensRow/Value
|
|||
|
|
@onready var vol_slider: HSlider = $SettingsPanel/V/VolRow/Slider
|
|||
|
|
@onready var vol_value: Label = $SettingsPanel/V/VolRow/Value
|
|||
|
|
@onready var btn_apply: Button = $SettingsPanel/V/Buttons/Apply
|
|||
|
|
@onready var btn_back: Button = $SettingsPanel/V/Buttons/Back
|
|||
|
|
|
|||
|
|
|
|||
|
|
func _ready() -> void:
|
|||
|
|
process_mode = Node.PROCESS_MODE_ALWAYS
|
|||
|
|
visible = false
|
|||
|
|
main_panel.visible = true
|
|||
|
|
settings_panel.visible = false
|
|||
|
|
layer = 100
|
|||
|
|
|
|||
|
|
btn_resume.pressed.connect(_resume)
|
|||
|
|
btn_settings.pressed.connect(_open_settings)
|
|||
|
|
btn_main.pressed.connect(_to_main_menu)
|
|||
|
|
btn_quit.pressed.connect(_quit)
|
|||
|
|
btn_apply.pressed.connect(_apply_settings)
|
|||
|
|
btn_back.pressed.connect(_close_settings)
|
|||
|
|
sens_slider.value_changed.connect(func(_v: float) -> void: _update_value_labels())
|
|||
|
|
vol_slider.value_changed.connect(func(_v: float) -> void: _update_value_labels())
|
|||
|
|
|
|||
|
|
|
|||
|
|
func _input(event: InputEvent) -> void:
|
|||
|
|
if event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE:
|
|||
|
|
if visible:
|
|||
|
|
if settings_panel.visible:
|
|||
|
|
_close_settings()
|
|||
|
|
else:
|
|||
|
|
_resume()
|
|||
|
|
get_viewport().set_input_as_handled()
|
|||
|
|
elif _can_pause():
|
|||
|
|
_open()
|
|||
|
|
get_viewport().set_input_as_handled()
|
|||
|
|
|
|||
|
|
|
|||
|
|
func _can_pause() -> bool:
|
|||
|
|
var scene: Node = get_tree().current_scene
|
|||
|
|
if scene == null:
|
|||
|
|
return false
|
|||
|
|
# Не паузим в главном меню
|
|||
|
|
if scene.name == "MainMenu":
|
|||
|
|
return false
|
|||
|
|
return true
|
|||
|
|
|
|||
|
|
|
|||
|
|
func _open() -> void:
|
|||
|
|
visible = true
|
|||
|
|
main_panel.visible = true
|
|||
|
|
settings_panel.visible = false
|
|||
|
|
get_tree().paused = true
|
|||
|
|
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
|||
|
|
btn_resume.grab_focus()
|
|||
|
|
|
|||
|
|
|
|||
|
|
func _resume() -> void:
|
|||
|
|
visible = false
|
|||
|
|
get_tree().paused = false
|
|||
|
|
# Восстановить захват мыши только для 3D-сцен (с FPV игроком)
|
|||
|
|
var scene: Node = get_tree().current_scene
|
|||
|
|
if scene != null and scene.has_node("PlayerFPV"):
|
|||
|
|
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
|||
|
|
|
|||
|
|
|
|||
|
|
func _open_settings() -> void:
|
|||
|
|
sens_slider.value = GameState.mouse_sensitivity * 1000.0
|
|||
|
|
vol_slider.value = GameState.master_volume * 100.0
|
|||
|
|
_update_value_labels()
|
|||
|
|
main_panel.visible = false
|
|||
|
|
settings_panel.visible = true
|
|||
|
|
btn_back.grab_focus()
|
|||
|
|
|
|||
|
|
|
|||
|
|
func _close_settings() -> void:
|
|||
|
|
settings_panel.visible = false
|
|||
|
|
main_panel.visible = true
|
|||
|
|
btn_resume.grab_focus()
|
|||
|
|
|
|||
|
|
|
|||
|
|
func _update_value_labels() -> void:
|
|||
|
|
sens_value.text = "%.4f" % (sens_slider.value / 1000.0)
|
|||
|
|
vol_value.text = "%d%%" % int(vol_slider.value)
|
|||
|
|
|
|||
|
|
|
|||
|
|
func _apply_settings() -> void:
|
|||
|
|
GameState.mouse_sensitivity = sens_slider.value / 1000.0
|
|||
|
|
GameState.master_volume = vol_slider.value / 100.0
|
|||
|
|
GameState._apply_audio_volume()
|
|||
|
|
GameState.save_settings()
|
|||
|
|
_close_settings()
|
|||
|
|
|
|||
|
|
|
|||
|
|
func _to_main_menu() -> void:
|
|||
|
|
GameState.save_game(get_tree().current_scene.scene_file_path if get_tree().current_scene else "")
|
|||
|
|
visible = false
|
|||
|
|
get_tree().paused = false
|
|||
|
|
SceneManager.go_main()
|
|||
|
|
|
|||
|
|
|
|||
|
|
func _quit() -> void:
|
|||
|
|
GameState.save_game(get_tree().current_scene.scene_file_path if get_tree().current_scene else "")
|
|||
|
|
get_tree().quit()
|