- Types on every parameter, return value and variable, and snake_case names (the player name limit is the constant MAX_NAME_LENGTH). - Spelling fixes: *_triggered, character_selected, separator, caught_errors. The server's catched_errors key stays as the server sends it. - Signals are connected with signal.connect() instead of by name. - Code is ordered signals, constants, exported vars, vars, @onready vars, functions, with @onready on one line and two blank lines between functions. - Every script starts with a ## description. Template comments, old LOC notes and commented-out code are gone, apart from the local play code. - Lines are at most 100 characters, apart from the local play path. - The screenshot tour turns off the blinking text cursor so pictures match.
49 lines
2.1 KiB
GDScript
49 lines
2.1 KiB
GDScript
class_name CharacterCard
|
|
extends Control
|
|
## One character in the character select popup: its picture and name. Clicking it picks
|
|
## the character.
|
|
|
|
## Emitted with the character's picture when the card is clicked.
|
|
|
|
signal new_character_selected(img_texture: ImageTexture)
|
|
|
|
@onready var panel: Panel = $Panel
|
|
@onready var character_image: TextureRect = %CharacterTextureRect
|
|
@onready var character_name_label: Label = %CharacterName
|
|
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if visible && Settings.character_select_open:
|
|
if event is InputEventMouseButton && event.is_pressed() \
|
|
&& event.get_button_index() == MOUSE_BUTTON_LEFT:
|
|
var local_event: InputEvent = make_input_local(event)
|
|
if Rect2(Vector2(0, 0), panel.size).has_point(local_event.position):
|
|
GameLog.debug(character_name_label.text)
|
|
new_character_selected.emit(character_image.texture)
|
|
|
|
|
|
## Shows [param character_name] and fetches its picture from the server.
|
|
func set_character_name(character_name: String) -> void:
|
|
panel.size = Vector2(240, 145)
|
|
character_name_label.text = character_name.split(".")[0]
|
|
character_name_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
|
var image_fetched: Callable = func image_fetched(image: PackedByteArray) -> void:
|
|
var img: Image = Image.new()
|
|
var err: Error = img.load_png_from_buffer(image)
|
|
if err != OK:
|
|
GameLog.debug("Character image is not a PNG, trying JPG: ", error_string(err))
|
|
var err2: Error = img.load_jpg_from_buffer(image)
|
|
if err2 != OK:
|
|
GameLog.warning("Could not load the image for ", character_name, ": ",
|
|
error_string(err2))
|
|
var new_image: ImageTexture = ImageTexture.new()
|
|
new_image.set_image(img)
|
|
character_image.custom_minimum_size = Vector2(200, 100)
|
|
character_image.size = Vector2(200, 100)
|
|
character_image.size_flags_horizontal = Control.SIZE_SHRINK_CENTER
|
|
character_image.size_flags_vertical = Control.SIZE_SHRINK_CENTER
|
|
character_image.expand_mode = TextureRect.EXPAND_FIT_WIDTH_PROPORTIONAL
|
|
character_image.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
|
|
character_image.texture = new_image
|
|
MusicServerClient.fetch_character_image(character_name, image_fetched)
|