Files
whale-town/scripts/CharacterProfile.gd
2025-12-05 19:00:14 +08:00

313 lines
8.7 KiB
GDScript

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()