extends Control class_name CharacterProfile ## 角色档案界面 ## 显示角色的详细信息和个性化数据 # UI 元素 var container: VBoxContainer var character_name_label: Label var level_exp_label: Label var status_mood_label: Label var traits_label: Label var bio_label: Label var attributes_container: VBoxContainer var skills_container: VBoxContainer var achievements_container: VBoxContainer var close_button: Button # 角色数据 var character_data: Dictionary = {} # 信号 signal profile_closed() func _ready(): """初始化档案界面""" _create_ui() _setup_connections() ## 创建UI func _create_ui(): """创建档案界面的所有UI元素""" # 设置背景 var panel = Panel.new() panel.anchor_right = 1.0 panel.anchor_bottom = 1.0 add_child(panel) # 主容器 container = VBoxContainer.new() container.anchor_left = 0.1 container.anchor_right = 0.9 container.anchor_top = 0.1 container.anchor_bottom = 0.9 add_child(container) # 标题 var title = Label.new() title.text = "角色档案" title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER title.add_theme_font_size_override("font_size", 24) container.add_child(title) container.add_child(_create_spacer(10)) # 角色名称 character_name_label = Label.new() character_name_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER character_name_label.add_theme_font_size_override("font_size", 20) container.add_child(character_name_label) # 等级和经验 level_exp_label = Label.new() level_exp_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER container.add_child(level_exp_label) # 状态和心情 status_mood_label = Label.new() status_mood_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER container.add_child(status_mood_label) container.add_child(_create_spacer(10)) # 个性特征 var traits_title = Label.new() traits_title.text = "个性特征:" traits_title.add_theme_font_size_override("font_size", 16) container.add_child(traits_title) traits_label = Label.new() traits_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART container.add_child(traits_label) container.add_child(_create_spacer(5)) # 个人简介 var bio_title = Label.new() bio_title.text = "个人简介:" bio_title.add_theme_font_size_override("font_size", 16) container.add_child(bio_title) bio_label = Label.new() bio_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART container.add_child(bio_label) container.add_child(_create_spacer(10)) # 属性 var attributes_title = Label.new() attributes_title.text = "属性:" attributes_title.add_theme_font_size_override("font_size", 16) container.add_child(attributes_title) attributes_container = VBoxContainer.new() container.add_child(attributes_container) container.add_child(_create_spacer(5)) # 技能 var skills_title = Label.new() skills_title.text = "技能:" skills_title.add_theme_font_size_override("font_size", 16) container.add_child(skills_title) skills_container = VBoxContainer.new() container.add_child(skills_container) container.add_child(_create_spacer(5)) # 成就 var achievements_title = Label.new() achievements_title.text = "成就:" achievements_title.add_theme_font_size_override("font_size", 16) container.add_child(achievements_title) achievements_container = VBoxContainer.new() container.add_child(achievements_container) container.add_child(_create_spacer(10)) # 关闭按钮 close_button = Button.new() close_button.text = "关闭" close_button.custom_minimum_size = Vector2(100, 40) var button_center = CenterContainer.new() button_center.add_child(close_button) container.add_child(button_center) ## 创建间距 func _create_spacer(height: float) -> Control: """创建垂直间距""" var spacer = Control.new() spacer.custom_minimum_size = Vector2(0, height) return spacer ## 设置连接 func _setup_connections(): """设置信号连接""" close_button.pressed.connect(_on_close_pressed) ## 加载角色数据 func load_character_data(data: Dictionary): """ 加载并显示角色数据 @param data: 角色数据字典 """ character_data = data _update_display() ## 更新显示 func _update_display(): """更新所有显示内容""" if character_data.is_empty(): return # 角色名称 var name = character_data.get(CharacterData.FIELD_NAME, "Unknown") character_name_label.text = name # 等级和经验 var level = character_data.get(CharacterData.FIELD_LEVEL, 1) var exp = character_data.get(CharacterData.FIELD_EXPERIENCE, 0) var required_exp = CharacterData.get_required_experience(level) level_exp_label.text = "等级 %d (%d/%d 经验)" % [level, exp, required_exp] # 状态和心情 var status = character_data.get(CharacterData.FIELD_STATUS, "active") var mood = character_data.get(CharacterData.FIELD_MOOD, "neutral") var personalization = preload("res://scripts/CharacterPersonalization.gd") var mood_emoji = personalization.get_mood_emoji(mood) status_mood_label.text = "状态: %s | 心情: %s %s" % [status, mood, mood_emoji] # 个性特征 var personality = character_data.get(CharacterData.FIELD_PERSONALITY, {}) var traits = personality.get("traits", []) var activity = personality.get("favorite_activity", "exploring") if traits.size() > 0: traits_label.text = "、".join(traits) + " | 喜欢: " + activity else: traits_label.text = "喜欢: " + activity # 个人简介 var bio = personality.get("bio", "") if bio.is_empty(): bio_label.text = "这个角色还没有写个人简介。" else: bio_label.text = bio # 属性 _update_attributes() # 技能 _update_skills() # 成就 _update_achievements() ## 更新属性显示 func _update_attributes(): """更新属性显示""" # 清除现有内容 for child in attributes_container.get_children(): child.queue_free() var attributes = character_data.get(CharacterData.FIELD_ATTRIBUTES, {}) for attr_name in attributes: var value = attributes[attr_name] var attr_container = HBoxContainer.new() var name_label = Label.new() name_label.text = attr_name + ":" name_label.custom_minimum_size = Vector2(100, 0) attr_container.add_child(name_label) var progress_bar = ProgressBar.new() progress_bar.min_value = 1 progress_bar.max_value = 10 progress_bar.value = value progress_bar.custom_minimum_size = Vector2(200, 20) attr_container.add_child(progress_bar) var value_label = Label.new() value_label.text = str(value) + "/10" attr_container.add_child(value_label) attributes_container.add_child(attr_container) ## 更新技能显示 func _update_skills(): """更新技能显示""" # 清除现有内容 for child in skills_container.get_children(): child.queue_free() var skills = character_data.get(CharacterData.FIELD_SKILLS, {}) for skill_name in skills: var level = skills[skill_name] var skill_container = HBoxContainer.new() var name_label = Label.new() name_label.text = skill_name + ":" name_label.custom_minimum_size = Vector2(100, 0) skill_container.add_child(name_label) var progress_bar = ProgressBar.new() progress_bar.min_value = 1 progress_bar.max_value = 10 progress_bar.value = level progress_bar.custom_minimum_size = Vector2(200, 20) skill_container.add_child(progress_bar) var level_label = Label.new() level_label.text = "等级 " + str(level) skill_container.add_child(level_label) skills_container.add_child(skill_container) ## 更新成就显示 func _update_achievements(): """更新成就显示""" # 清除现有内容 for child in achievements_container.get_children(): child.queue_free() var achievements = character_data.get(CharacterData.FIELD_ACHIEVEMENTS, []) if achievements.is_empty(): var no_achievements = Label.new() no_achievements.text = "还没有获得任何成就。" achievements_container.add_child(no_achievements) return for achievement in achievements: var achievement_container = HBoxContainer.new() var icon_label = Label.new() icon_label.text = achievement.get("icon", "🏆") icon_label.add_theme_font_size_override("font_size", 20) achievement_container.add_child(icon_label) var info_container = VBoxContainer.new() var name_label = Label.new() name_label.text = achievement.get("name", "Unknown Achievement") name_label.add_theme_font_size_override("font_size", 14) info_container.add_child(name_label) var desc_label = Label.new() desc_label.text = achievement.get("description", "") desc_label.add_theme_font_size_override("font_size", 12) desc_label.add_theme_color_override("font_color", Color.GRAY) info_container.add_child(desc_label) achievement_container.add_child(info_container) achievements_container.add_child(achievement_container) ## 关闭按钮回调 func _on_close_pressed(): """关闭档案界面""" profile_closed.emit() queue_free()