Instantly share code, notes, and snippets.
Created
November 10, 2018 23:48
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save profan/50e9086e0942bee7d7d8a5942098be8c to your computer and use it in GitHub Desktop.
options_menu.gd
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extends Control | |
onready var back_btn = get_node("buttons/center/options_containers/sound_options/back_btn") | |
onready var audio_player = get_node("audio_player") | |
# general | |
onready var reading_speed_slider = get_node("buttons/center/options_containers/general_options/reading_speed_slider") | |
# desktop only general | |
onready var resolution_title = get_node("buttons/center/options_containers/general_options/resolution_title") | |
onready var resolution_menu = get_node("buttons/center/options_containers/general_options/resolution_menu") | |
onready var window_mode_btn = get_node("buttons/center/options_containers/general_options/window_mode_btn") | |
# audio | |
onready var master_vol_slider = get_node("buttons/center/options_containers/sound_options/master_vol_slider") | |
onready var music_vol_slider = get_node("buttons/center/options_containers/sound_options/music_vol_slider") | |
onready var sfx_vol_slider = get_node("buttons/center/options_containers/sound_options/sfx_vol_slider") | |
onready var sfx_vol_btn = get_node("buttons/center/options_containers/sound_options/sfx_cont/sfx_vol_test") | |
# twoon | |
onready var buttons = get_node("buttons") | |
onready var lang_btn = get_node("lang_btn") | |
onready var tween = get_node("tween") | |
# extra bg to keep it readable | |
onready var options_bg = get_node("options_bg") | |
var from_scene_name | |
var resolution_options | |
func normalize(val, lower, upper): | |
return (val - lower) / (upper - lower) | |
func _tween_in(): | |
if _entered_from_game(): # HACK: ewwww | |
$background/background_mountain.visible = false | |
tween.interpolate_property(self, "modulate:a", 0.0, 1.0, 0.5, Tween.TRANS_QUAD, Tween.EASE_IN) | |
tween.start() | |
else: | |
lang_btn._on_enter_options() | |
tween.interpolate_property(options_bg, "modulate:a", 0.0, 1.0, 0.5, Tween.TRANS_QUAD, Tween.EASE_IN) | |
tween.interpolate_property(buttons, "modulate:a", 0.0, 1.0, 0.5, Tween.TRANS_QUAD, Tween.EASE_IN) | |
tween.interpolate_property(lang_btn, "modulate:a", 0.0, 1.0, 0.5, Tween.TRANS_QUAD, Tween.EASE_IN) | |
tween.start() | |
func _ready(): | |
# tween in | |
_tween_in() | |
# get values yes | |
reading_speed_slider.set_value(Game.reading_speed) | |
master_vol_slider.set_value(Game.master_vol) | |
music_vol_slider.set_value(Game.music_vol) | |
sfx_vol_slider.set_value(Game.sfx_vol) | |
# link up signals | |
back_btn.connect("pressed", self, "_back_btn_pressed") | |
reading_speed_slider.connect("value_changed", self, "_reading_speed_changed") | |
master_vol_slider.connect("value_changed", self, "_master_vol_changed") | |
music_vol_slider.connect("value_changed", self, "_music_vol_changed") | |
sfx_vol_slider.connect("value_changed", self, "_sfx_vol_changed") | |
sfx_vol_btn.connect("pressed", self, "_on_test_sfx") | |
if not Game.is_mobile(): # only populate on platforms where actually sensible | |
# populate res menu | |
resolution_options = _generate_resolution_options() | |
_populate_resolution_menu(resolution_options) | |
# set up initial res HACK FIXME | |
_update_resolution() | |
# link up res menu signals | |
var popup = resolution_menu.get_popup() | |
popup.connect("id_pressed", self, "_on_select_resolution") | |
# set window mode callback | |
window_mode_btn.connect("item_selected", self, "_on_set_window_mode") | |
if OS.window_fullscreen: | |
window_mode_btn.selected = 1 | |
else: | |
window_mode_btn.selected = 0 | |
_on_mode_changed() | |
else: # hide options on mobile | |
resolution_title.visible = false | |
resolution_menu.visible = false | |
window_mode_btn.visible = false | |
func _update_resolution(): | |
var base_res = Game.get_base_res() | |
var w_res = OS.window_size | |
var id = w_res.x / base_res.x | |
resolution_menu.text = "%dx%d (%dx)" % [w_res.x, w_res.y, id] | |
func _on_mode_changed(): | |
if window_mode_btn.selected == 0: | |
resolution_menu.visible = true | |
elif window_mode_btn.selected == 1: | |
resolution_menu.visible = false | |
func _on_set_window_mode(id): | |
if id == 0: # windowed | |
OS.window_fullscreen = false | |
OS.window_size = Game.get_base_res() * 2 | |
elif id == 1: # fullscreen | |
OS.window_fullscreen = true | |
_on_mode_changed() | |
_update_resolution() | |
func _on_select_resolution(id): | |
var o = resolution_options[id] | |
OS.window_size = o | |
resolution_menu.text = "%dx%d (%dx)" % [o.x, o.y, id] | |
func _populate_resolution_menu(opts): | |
var popup = resolution_menu.get_popup() | |
var mul = 1 | |
for o in opts: | |
popup.add_item("%dx%d (%dx)" % [o.x, o.y, mul + 1], mul - 1) | |
mul += 1 | |
func _generate_resolution_options(): | |
# member var | |
var res_ops = [] | |
var base_res = Game.get_base_res() | |
var max_res = OS.get_screen_size() | |
var cur_res = base_res | |
var cur_mul = 2 | |
while cur_res.x < max_res.x and cur_res.y < max_res.y: | |
cur_res = base_res * cur_mul | |
res_ops.push_back(cur_res) | |
cur_mul += 1 | |
return res_ops | |
func enter(): | |
if _entered_from_game(): | |
_update_resolution() | |
buttons.on_settings_enter() | |
visible = true | |
_tween_in() | |
func exit(): | |
if from_scene_name: | |
SceneSwitcher.goto_scene(from_scene_name) | |
else: | |
visible = false | |
# HELPER | |
func _entered_from_game(): | |
return not from_scene_name | |
func _back_btn_pressed(): | |
if _entered_from_game(): | |
tween.interpolate_property(self, "modulate:a", modulate.a, 0.0, 0.5, Tween.TRANS_QUAD, Tween.EASE_OUT) | |
if not tween.is_connected("tween_completed", self, "_on_back_btn_fade_end"): | |
tween.connect("tween_completed", self, "_on_back_btn_fade_end", [], CONNECT_ONESHOT) | |
else: | |
_disable_buttons() | |
tween.interpolate_property(options_bg, "modulate:a", options_bg.modulate.a, 0.0, 0.5, Tween.TRANS_QUAD, Tween.EASE_OUT) | |
tween.interpolate_property(buttons, "modulate:a", buttons.modulate.a, 0.0, 0.5, Tween.TRANS_QUAD, Tween.EASE_OUT) | |
tween.connect("tween_completed", self, "_on_back_btn_fade_end") | |
func _on_back_btn_fade_end(obj, key): | |
exit() | |
func _disable_buttons(): | |
reading_speed_slider.editable = false | |
resolution_menu.disabled = true | |
window_mode_btn.disabled = true | |
master_vol_slider.editable = false | |
music_vol_slider.editable = false | |
sfx_vol_btn.disabled = true | |
back_btn.disabled = true | |
func _reading_speed_changed(nv): | |
Game.reading_speed = nv | |
func _master_vol_changed(nv): | |
Game.master_vol = nv | |
func _music_vol_changed(nv): | |
Game.music_vol = nv | |
func _sfx_vol_changed(nv): | |
Game.sfx_vol = nv | |
func _on_test_sfx(): | |
if not audio_player.playing: | |
audio_player.play() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment