class_name CharacterSelectionList extends Control signal selected(slot_idx: int) var item_scene := preload("res://ui/login/character_selection_item.tscn") var slot_offset := 0 @export var displayed_slots_count: int = 3: set = set_displayed_slots_count @export var selected_slot_index: int = -1: set = set_selected_slot_index @export var login_character_list: LoginCharacterList: set = set_login_character_list func _ready() -> void: if %CharacterList.get_child_count() != displayed_slots_count: set_displayed_slots_count(displayed_slots_count) func set_displayed_slots_count(value: int) -> void: displayed_slots_count = value for node in %CharacterList.get_children(): node.queue_free() for _idx in displayed_slots_count: var item = preload("res://ui/login/character_selection_item.tscn").instantiate() %CharacterList.add_child(item) draw() func set_selected_slot_index(value: int) -> void: if selected_slot_index == value: return var character_list := login_character_list.character_information var maximum_slot_count := login_character_list.slot_count %CharacterList.get_child(selected_slot_index - slot_offset).is_selected = false if value >= maximum_slot_count: selected_slot_index = 0 elif value < 0: selected_slot_index = maximum_slot_count - 1 else: selected_slot_index = value if selected_slot_index > slot_offset + (displayed_slots_count - 1): #slot_offset = selected_slot_index - (displayed_slots_count - 1) slot_offset = min(selected_slot_index, maximum_slot_count - displayed_slots_count) elif selected_slot_index < slot_offset: #slot_offset = selected_slot_index slot_offset = max(0, selected_slot_index - displayed_slots_count) draw() %CharacterList.get_child(selected_slot_index - slot_offset).is_selected = true if selected_slot_index < character_list.size(): %CharacterSelectionStatus.set_info(character_list[selected_slot_index]) else: $CharacterSelectionStatus.clear() selected.emit(selected_slot_index) func set_login_character_list(value: LoginCharacterList) -> void: login_character_list = value draw() func draw(): if not login_character_list: return var character_information: Array[CharacterInformation] = login_character_list.character_information for display_slot_idx in displayed_slots_count: var item: CharacterSelectionItem = %CharacterList.get_child(display_slot_idx) var slot_idx = slot_offset + display_slot_idx if slot_idx < character_information.size(): var info: CharacterInformation = character_information[slot_idx] item.initialize_with_info(info) else: item.clear() if item.selected.is_connected(_on_item_selected): item.selected.disconnect(_on_item_selected) item.selected.connect(_on_item_selected.bind(slot_idx)) func select(slot_idx: int): selected_slot_index = slot_idx func _on_item_selected(slot_idx: int): selected_slot_index = slot_idx func _on_button_left_pressed() -> void: selected_slot_index -= 1 func _on_button_right_pressed() -> void: selected_slot_index += 1