Server requests move out of Settings into a new MusicServerClient autoload with one function per endpoint. It sends requests through a swappable HttpTransport so tests can fake the server, and it frees its HTTPRequest nodes after use. Players now have a UUID that never changes. Their position in Settings.player_array is only used for the Alt+<number> keybinds. Previously the position doubled as the id, so removing a player made points and wins land on the wrong player, and could delete another player's point from a song. Also fixes: - format_time showed 59.6 seconds as "00:60" - searches containing regex characters such as "Q*bert" broke search - SongObject and PlayerObject were Nodes that were never freed; they are now RefCounted - search matching is split out of the UI code into find_matches()
91 lines
3.0 KiB
GDScript
91 lines
3.0 KiB
GDScript
extends Control
|
|
|
|
@onready
|
|
var character_panel: Panel = %CharacterPanel
|
|
|
|
@onready
|
|
var title_label: Label = %TitleLabel
|
|
|
|
@onready
|
|
var character_grid: GridContainer = %CharacterGridContainer
|
|
|
|
@onready
|
|
var close_timer: Timer = %CloseTimer
|
|
|
|
var can_select_character: bool = false
|
|
|
|
signal character_selected(file_name: String)
|
|
signal new_new_character_selected(file_name: String)
|
|
|
|
var character: PackedScene = preload("res://character.tscn")
|
|
|
|
func _ready() -> void:
|
|
close_timer.timeout.connect(_on_close_timeout)
|
|
|
|
func select_character(file_name: String) -> void:
|
|
print("select_character")
|
|
character_selected.emit(file_name)
|
|
|
|
func _on_close_timeout() -> void:
|
|
print("_on_close_timeout!")
|
|
Settings.character_select_open = false
|
|
close_timer.stop()
|
|
|
|
func load_characters() -> void:
|
|
print("load_characters")
|
|
var fetch_character_list: Callable = func fetch_character_list(list) -> void:
|
|
print("fetch_character_list")
|
|
Settings.delete_children(character_grid)
|
|
if typeof(list) == TYPE_ARRAY:
|
|
for character_name: String in list:
|
|
print("character_name ", character_name)
|
|
var character_box: Character = character.instantiate()
|
|
character_grid.add_child(character_box)
|
|
character_box.custom_minimum_size = Vector2(235, 145)
|
|
character_box.size = Vector2(235, 145)
|
|
character_box.set_character_name(character_name)
|
|
character_box.connect("new_character_selected", _on_character_selected)
|
|
MusicServerClient.fetch_character_list(fetch_character_list)
|
|
|
|
func show_grid(player_name: String) -> void:
|
|
print("show_grid")
|
|
title_label.text = "Select character for " + player_name
|
|
close_timer.stop()
|
|
self.visible = true
|
|
can_select_character = true
|
|
Settings.character_select_open = true
|
|
|
|
func _on_character_selected(texture: ImageTexture) -> void:
|
|
print("_on_character_selected")
|
|
self.visible = false
|
|
if can_select_character:
|
|
new_new_character_selected.emit(texture)
|
|
close_timer.start()
|
|
can_select_character = false
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if self.visible == true:
|
|
if event is InputEventMouseButton && event.is_pressed():
|
|
var evLocal: InputEvent = make_input_local(event)
|
|
if !Rect2(Vector2(0, 0), character_panel.size).has_point(evLocal.position):
|
|
self.visible = false
|
|
Settings.character_select_open = false
|
|
|
|
func load_characters_local() -> void:
|
|
var characters: DirAccess = DirAccess.open("res://characters/")
|
|
if characters:
|
|
characters.list_dir_begin()
|
|
var file_name: String = characters.get_next()
|
|
while file_name != "":
|
|
file_name = file_name.replace('.import', '') # <--- remove the .import
|
|
if file_name.ends_with(".png"):
|
|
var texture: Resource = load("res://characters/" + file_name)
|
|
var texture_btn: TextureButton = TextureButton.new()
|
|
character_grid.add_child(texture_btn)
|
|
texture_btn.custom_minimum_size = Vector2(80, 40)
|
|
texture_btn.ignore_texture_size = true
|
|
texture_btn.stretch_mode = TextureButton.STRETCH_KEEP_ASPECT
|
|
texture_btn.texture_normal = texture
|
|
texture_btn.pressed.connect(select_character.bind(file_name))
|
|
file_name = characters.get_next()
|