## 招募弹窗(挂载于 RecruitPanel.tscn)。 ## 监听候选生成信号自动弹出,玩家勾选后点"确定"结算入宗。 extends Control ## 招募模式:开局必须选满 / 定期自由选择。 enum Mode { OPENING, PERIODIC } @onready var title_label: Label = %TitleLabel @onready var hint_label: Label = %HintLabel @onready var list_container: VBoxContainer = %ListContainer @onready var confirm_button: Button = %Button_Confirm ## 当前招募模式。 var _mode: Mode = Mode.PERIODIC ## 勾选框列表(与 _entry_disciples 按下标一一对应)。 var _check_buttons: Array[CheckButton] = [] ## 对应勾选框的候选弟子。 var _entry_disciples: Array[Disciple] = [] func _ready() -> void: # 订阅候选生成信号:开局与定期招募都会触发 DiscipleManager.applicants_generated.connect(_on_applicants_generated) visible = false ## 候选生成时弹出:按当前候选池重建列表。 ## @param is_opening: 是否开局招募 func _on_applicants_generated(is_opening: bool) -> void: _mode = Mode.OPENING if is_opening else Mode.PERIODIC _clear_entries() for d in DiscipleManager.applicants: _add_entry(d) title_label.text = "弟子入宗(%s)" % ("开局招募" if is_opening else "定期招募") _update_ui() visible = true ## 勾选任一候选后刷新提示与确定按钮可用性。 func _on_check_toggled(_pressed: bool, _d: Disciple) -> void: _update_ui() ## 全部接受:勾选所有候选。 func _on_button_accept_all_button_up() -> void: for c in _check_buttons: c.set_pressed_no_signal(true) _update_ui() ## 全部拒绝:取消所有勾选。 func _on_button_reject_all_button_up() -> void: for c in _check_buttons: c.set_pressed_no_signal(false) _update_ui() ## 确定:勾选的入宗、未勾选的拒绝,关闭弹窗并恢复时间。 func _on_button_confirm_button_up() -> void: var selected: Array[Disciple] = [] for i in _entry_disciples.size(): if _check_buttons[i].button_pressed: selected.append(_entry_disciples[i]) DiscipleManager.finish_recruitment(selected) _close() ## 刷新提示文本与确定按钮状态。 func _update_ui() -> void: if _mode == Mode.OPENING: var picked := 0 for c in _check_buttons: if c.button_pressed: picked += 1 hint_label.text = "开局招募:请选择 %d 名弟子入宗(已选 %d/%d)" % [ GameConfig.opening_pick_count, picked, _check_buttons.size(), ] confirm_button.disabled = picked < GameConfig.opening_pick_count else: hint_label.text = "定期招募:勾选入宗弟子,未勾选的将被拒绝(可全部拒绝)" confirm_button.disabled = false ## 关闭弹窗:清空条目并恢复时间推进。 func _close() -> void: _clear_entries() visible = false TimeSystem.set_paused(false) ## 清空候选条目。 func _clear_entries() -> void: for child in list_container.get_children(): child.queue_free() _check_buttons.clear() _entry_disciples.clear() ## 添加一名候选的行条目:信息文本 + 入宗勾选框。 ## @param d: 候选弟子 func _add_entry(d: Disciple) -> void: var row := HBoxContainer.new() var info := Label.new() info.text = "%s %d岁 | %s资质%s | %s灵根 | %s" % [ d.name, d.age, d.get_aptitude_name(), "·天灵根" if d.is_heavenly else "", d.get_roots_text(), d.get_realm_text(), ] info.size_flags_horizontal = Control.SIZE_EXPAND_FILL var check := CheckButton.new() check.text = "入宗" check.toggled.connect(_on_check_toggled.bind(d)) row.add_child(info) row.add_child(check) list_container.add_child(row) _check_buttons.append(check) _entry_disciples.append(d)