extends Node #Enums enum ScalingMode {INTEGER, ASPECT, STRETCH} enum Filter {NONE, CRT, LCD, BILINEAR} enum RumbleMode {NONE, DEATHS, FULL} enum TransSpeed {SLOW, NORMAL, FAST, INSTANT} enum ScanlineType {NONE, LCD, CRT} enum Gore {NONE, NO_STAINS, FULL} enum Section {GAME, VIDEO, AUDIO, ALL} #Constants const TRANS_SPEEDS := [0.8, 0.4, 0.2, 0.0000001] #Game var rumble: int = RumbleMode.FULL var gore: int = Gore.FULL var scoreboard_name: String = "" var scoreboard_id: int = -1 #Video var fullscreen: bool = false setget _set_fullscreen var window_size: float = 2.0 setget _set_window_size var scaling_mode: int = ScalingMode.INTEGER setget _set_scaling_mode var transition_speed: int = TransSpeed.NORMAL setget _set_transition_speed var transition_speed_secs setget , _get_transition_speed_sex var border: int = 0 setget _set_border var scanlines: int = ScanlineType.NONE setget _set_scanlines #Audio var master_volume: float = 1.0 setget _set_master_volume var music_volume: float = 1.0 setget _set_music_volume var sound_volume: float = 1.0 setget _set_sound_volume var landing_sound: bool = true setget _set_landing_sound # last played file var last_file: int = 0 # default values var defaults = null func _ready() -> void: pause_mode = PAUSE_MODE_PROCESS # clone self into defaults before loading stored values if defaults == null: defaults = duplicate() load_options() func _unhandled_input(event: InputEvent) -> void: if Debug.entry == false: if event.is_action_pressed("fullscreen"): OS.window_fullscreen = not OS.window_fullscreen func load_options() -> void: var file = ConfigFile.new() file.load("user://options.pr") # game rumble = file.get_value("game", "rumble", defaults.rumble) gore = file.get_value("game", "gore", defaults.gore) scoreboard_name = file.get_value("game", "scoreboard_name", "") randomize() scoreboard_id = file.get_value("game", "scoreboard_id", randi()) # video _set_fullscreen(file.get_value("video", "fullscreen", defaults.fullscreen)) _set_window_size(file.get_value("video", "window_size", defaults.window_size)) _set_scaling_mode(file.get_value("video", "scaling_mode", defaults.scaling_mode)) _set_transition_speed(file.get_value("video", "transition_speed", defaults.transition_speed)) _set_border(file.get_value("video", "border", defaults.border)) _set_scanlines(file.get_value("video", "scanlines", defaults.scanlines)) # audio _set_master_volume(file.get_value("audio", "master_volume", 1.0)) _set_music_volume(file.get_value("audio", "music_volume", 1.0)) _set_sound_volume(file.get_value("audio", "sound_volume", 1.0)) _set_landing_sound(file.get_value("audio", "landing_sound", defaults.landing_sound)) # last played file last_file = file.get_value("save", "last_file", 0) func load_defaults(section: int = Section.ALL) -> void: match section: Section.GAME, Section.ALL: rumble = defaults.rumble gore = defaults.gore scoreboard_name = defaults.scoreboard_name scoreboard_id = randi() Section.VIDEO, Section.ALL: fullscreen = defaults.fullscreen window_size = defaults.window_size scaling_mode = defaults.scaling_mode transition_speed = defaults.transition_speed border = defaults.border scanlines = defaults.scanlines Section.AUDIO, Section.ALL: master_volume = defaults.master_volume music_volume = defaults.music_volume sound_volume = defaults.sound_volume landing_sound = defaults.landing_sound func save_options() -> void: var file = ConfigFile.new() #Game file.set_value("game", "rumble", rumble) file.set_value("game", "gore", gore) file.set_value("game", "scoreboard_name", scoreboard_name) file.set_value("game", "scoreboard_id", scoreboard_id) #Video file.set_value("video", "fullscreen", fullscreen) file.set_value("video", "window_size", window_size) file.set_value("video", "scaling_mode", scaling_mode) file.set_value("video", "transition_speed", transition_speed) file.set_value("video", "border", border) file.set_value("video", "scanlines", scanlines) #Audio file.set_value("audio", "master_volume", master_volume) file.set_value("audio", "music_volume", music_volume) file.set_value("audio", "sound_volume", sound_volume) file.set_value("audio", "landing_sound", landing_sound) # last played file file.set_value("save", "last_file", last_file) # save the options to file file.save("user://options.pr") # Setters # video setters func _set_fullscreen(value: bool) -> void: fullscreen = value if Engine.get_idle_frames() == 0: OS.window_fullscreen = fullscreen func _set_window_size(value: float) -> void: window_size = value OS.window_size = Game.RESOLUTION * window_size func _set_scaling_mode(value: int) -> void: scaling_mode = value SceneManager.scaling_mode = scaling_mode get_tree().emit_signal("screen_resized") # force screen size update func _set_transition_speed(value: int) -> void: transition_speed = value func _get_transition_speed_sex() -> float: return TRANS_SPEEDS[transition_speed] func _set_border(value: int) -> void: border = value Border.current_border = border func _set_scanlines(value: int) -> void: scanlines = value SceneManager.set_scanlines(scanlines) # audio setters func _set_master_volume(value: float) -> void: master_volume = value AudioServer.set_bus_volume_db(0, linear2db(value)) func _set_music_volume(value: float) -> void: music_volume = value var idx = AudioServer.get_bus_index("music") AudioServer.set_bus_volume_db(idx, linear2db(value)) func _set_sound_volume(value: float) -> void: sound_volume = value var idx = AudioServer.get_bus_index("sound") AudioServer.set_bus_volume_db(idx, linear2db(value)) idx = AudioServer.get_bus_index("shard") AudioServer.set_bus_volume_db(idx, linear2db(value)) func _set_landing_sound(value: bool) -> void: landing_sound = value Audio.ac_land.volume_db = -15.0 if landing_sound else -INF