AppResidencia/seguir-la-linea/scripts/configuration.gd

211 lines
6.1 KiB
GDScript

extends Control
const OFFLINE_MODE := false # Cambiar a true para pruebas sin API
@onready var players_menu = $ScrollContainer/MarginContainer/VBoxContainer/PlayersMenu
@onready var container_verde = $ScrollContainer/MarginContainer/VBoxContainer/EasyContainer
@onready var container_naranja = $ScrollContainer/MarginContainer/VBoxContainer/MediumContainer
@onready var container_rojo = $ScrollContainer/MarginContainer/VBoxContainer/HardContainer
@onready var orden_de_formas_container = $ScrollContainer/MarginContainer/VBoxContainer/FlowContainer
@onready var hslider1 = $ScrollContainer/MarginContainer/VBoxContainer/size_slider
@onready var hslider2 = $ScrollContainer/MarginContainer/VBoxContainer/width_slider
@onready var login_window = $LogInWindow
@onready var email_input = $LogInWindow/VBoxContainer/EmailInput
@onready var password_input = $LogInWindow/VBoxContainer/PasswordInput
var all_players = []
var player_selected = -1
var shapes = [
{"name" : "circulo" , "level" : 1},
{"name" : "linea", "level" : 0},
{"name" : "corazon", "level" : 2},
]
var selected_shapes_name = []
func _ready():
RenderingServer.set_default_clear_color(Color.SKY_BLUE)
await get_tree().process_frame
var slider_style = StyleBoxFlat.new()
slider_style.content_margin_top = 8
slider_style.content_margin_bottom = 8
var grabber_style = StyleBoxFlat.new()
grabber_style.content_margin_left = 10
grabber_style.content_margin_right = 10
grabber_style.content_margin_top = 10
grabber_style.content_margin_bottom = 10
hslider1.add_theme_stylebox_override("slider", slider_style)
hslider1.add_theme_stylebox_override("grabber", grabber_style)
hslider2.add_theme_stylebox_override("slider", slider_style)
hslider2.add_theme_stylebox_override("grabber", grabber_style)
if GameData.id_user == -1 and not OFFLINE_MODE:
login_window.show()
$Blocker.visible = true
if not OFFLINE_MODE:
all_players = await GameData.get_residents_loaded()
else:
all_players = [] # o usar jugadores de prueba
_update_menu()
players_menu.get_popup().connect("id_pressed", Callable(self, "_on_player_selected"))
create_shapes_buttons()
func _on_log_in_button_pressed():
if OFFLINE_MODE:
GameData.id_user = 1
login_window.hide()
$Blocker.visible = false
return
var users = await GameData.get_users_loaded()
var username = email_input.text.strip_edges()
var password = password_input.text.strip_edges()
for user in users:
if user.email == username:
GameData.id_user = int(user.id)
login_window.hide()
$Blocker.visible = false
break
if GameData.id_user == -1:
email_input.clear()
password_input.clear()
var stylebox_email = email_input.get_theme_stylebox("normal") as StyleBoxFlat
var stylebox_password = password_input.get_theme_stylebox("normal") as StyleBoxFlat
if stylebox_email and stylebox_password:
stylebox_email.bg_color = Color(1, 0.8, 0.8)
stylebox_password.bg_color = Color(1, 0.8, 0.8)
func _update_menu():
var popup = players_menu.get_popup()
popup.clear()
for i in all_players.size():
popup.add_item(all_players[i].nombre, i)
func _on_player_selected(index: int):
if OFFLINE_MODE:
player_selected = 1
return
var player = all_players[index]
player_selected = player.id
func create_shapes_buttons():
for shape in shapes:
var button = Button.new()
button.text = shape.name
button.toggle_mode = true
button.pressed.connect(_on_shape_button_pressed.bind(button))
button.custom_minimum_size = Vector2(160, 80)
var style = StyleBoxFlat.new()
var container = null
match shape.level:
0:
style.bg_color = Color(0.3, 0.8, 0.3)
container = container_verde
1:
style.bg_color = Color(1, 0.6, 0.2)
container = container_naranja
2:
style.bg_color = Color(1, 0.3, 0.3)
container = container_rojo
button.add_theme_stylebox_override("normal", style)
if container:
container.add_child(button)
func _on_shape_button_pressed(button):
var name = button.text
if button.button_pressed:
selected_shapes_name.append(name)
var visual = Button.new()
visual.text = name
visual.name = name
visual.disabled = true
visual.custom_minimum_size = Vector2(160, 80)
var level = 0
for shape in shapes:
if shape.name == name:
level = shape.level
break
visual.add_theme_color_override("font_disabled_color", Color(1, 1, 1))
var style = StyleBoxFlat.new()
match level:
0:
style.bg_color = Color(0.3, 0.8, 0.3)
1:
style.bg_color = Color(1, 0.6, 0.2)
2:
style.bg_color = Color(1, 0.3, 0.3)
visual.add_theme_stylebox_override("disabled", style)
orden_de_formas_container.add_child(visual)
else:
selected_shapes_name.erase(name)
if orden_de_formas_container.has_node(name):
var node = orden_de_formas_container.get_node(name)
orden_de_formas_container.remove_child(node)
node.queue_free()
func _on_play_button_pressed():
var bg_color = $ScrollContainer/MarginContainer/VBoxContainer/bg_color_picker.color
var line_color = $ScrollContainer/MarginContainer/VBoxContainer/line_color_picker.color
var radius = $ScrollContainer/MarginContainer/VBoxContainer/size_slider.value
var width = $ScrollContainer/MarginContainer/VBoxContainer/width_slider.value
for child in $Warning/Panel.get_children():
child.queue_free()
var warning = Label.new()
warning.text = ""
warning.add_theme_color_override("font_color", "#324f5e")
if player_selected == -1:
warning.text = " - Debe seleccionar un jugador\n"
if selected_shapes_name.is_empty():
warning.text += " - Debe seleccionar una forma"
if warning.text != "":
$Warning/Panel.add_child(warning)
$Warning.popup_centered(Vector2(500, 200))
return
var game_scene = preload("res://scenes/game.tscn").instantiate()
game_scene.line_width = width
game_scene.shape_scale = radius
game_scene.line_color = line_color
game_scene.bg_color = bg_color
game_scene.shape_order = selected_shapes_name
var selected_shapes = []
for shape in shapes:
for shape_selected in selected_shapes_name:
if shape.name == shape_selected:
selected_shapes.append(shape)
for shape in selected_shapes:
GameData.start_game(player_selected, shape.level, shape.name)
ScreenManager.change_scene(game_scene, self)