extends Node class_name DialogueSystem ## 对话系统 ## 管理角色之间的对话交互 # 对话状态 var is_in_dialogue: bool = false var current_target_id: String = "" var dialogue_history: Array[Dictionary] = [] # 增强功能组件 var history_manager: DialogueHistoryManager var emoji_manager: EmojiManager var group_manager: GroupDialogueManager var dialogue_filter: DialogueFilter # 社交系统引用 var social_manager: SocialManager # 信号 signal dialogue_started(character_id: String) signal dialogue_ended() signal message_received(sender: String, message: String) signal bubble_requested(character_id: String, message: String, duration: float) signal message_filtered(original: String, filtered: String, reason: String) signal message_blocked(message: String, reason: String) func _ready(): """初始化对话系统""" # 初始化增强功能组件 history_manager = DialogueHistoryManager.new() add_child(history_manager) emoji_manager = EmojiManager.new() add_child(emoji_manager) group_manager = GroupDialogueManager.new() add_child(group_manager) dialogue_filter = DialogueFilter.new() add_child(dialogue_filter) # 连接信号 dialogue_filter.message_filtered.connect(_on_message_filtered) dialogue_filter.message_blocked.connect(_on_message_blocked) group_manager.group_message_received.connect(_on_group_message_received) print("DialogueSystem initialized with enhanced features") ## 设置社交管理器引用 func set_social_manager(sm: SocialManager) -> void: """ 设置社交管理器引用 @param sm: 社交管理器实例 """ social_manager = sm ## 开始对话 func start_dialogue(target_character_id: String) -> void: """ 开始与指定角色的对话 @param target_character_id: 目标角色 ID """ if is_in_dialogue: print("Already in dialogue, ending current dialogue first") end_dialogue() is_in_dialogue = true current_target_id = target_character_id dialogue_history.clear() dialogue_started.emit(target_character_id) print("Dialogue started with: ", target_character_id) ## 发送消息 func send_message(message: String) -> bool: """ 发送对话消息 @param message: 消息内容 @return: 是否成功发送 """ if not is_in_dialogue: push_warning("Not in dialogue, cannot send message") return false # 使用对话过滤器验证和过滤消息 var filter_result = dialogue_filter.filter_message("player", message) if not filter_result.allowed: message_blocked.emit(message, filter_result.reason) return false var filtered_message = filter_result.filtered_message # 转换表情符号 var final_message = EmojiManager.convert_text_to_emoji(filtered_message) # 记录到历史 var message_data = { "sender": "player", "receiver": current_target_id, "message": final_message, "timestamp": Time.get_unix_time_from_system() } dialogue_history.append(message_data) # 保存到历史管理器 history_manager.add_message_to_history(current_target_id, "player", final_message) # 记录社交互动 if social_manager: social_manager.record_social_interaction(current_target_id, "chat", {"message_length": final_message.length()}) # 发射信号 message_received.emit("player", final_message) print("Message sent: ", final_message) return true ## 接收消息 func receive_message(sender_id: String, message: String) -> void: """ 接收来自其他角色的消息 @param sender_id: 发送者 ID @param message: 消息内容 """ # 转换表情符号 var final_message = EmojiManager.convert_text_to_emoji(message) # 记录到历史 var message_data = { "sender": sender_id, "receiver": "player", "message": final_message, "timestamp": Time.get_unix_time_from_system() } dialogue_history.append(message_data) # 保存到历史管理器 history_manager.add_message_to_history(sender_id, sender_id, final_message) # 发射信号 message_received.emit(sender_id, final_message) print("Message received from ", sender_id, ": ", final_message) ## 结束对话 func end_dialogue() -> void: """结束当前对话""" if not is_in_dialogue: return is_in_dialogue = false var ended_with = current_target_id current_target_id = "" dialogue_ended.emit() print("Dialogue ended with: ", ended_with) ## 显示对话气泡 func show_bubble(character_id: String, message: String, duration: float = 3.0) -> void: """ 在角色上方显示对话气泡 @param character_id: 角色 ID @param message: 消息内容 @param duration: 显示时长(秒) """ bubble_requested.emit(character_id, message, duration) print("Bubble requested for ", character_id, ": ", message) ## 获取对话历史 func get_dialogue_history() -> Array[Dictionary]: """ 获取当前对话的历史记录 @return: 消息历史数组 """ return dialogue_history ## 检查是否在对话中 func is_dialogue_active() -> bool: """ 检查是否正在进行对话 @return: 是否在对话中 """ return is_in_dialogue ## 获取当前对话目标 func get_current_target() -> String: """ 获取当前对话的目标角色 ID @return: 目标角色 ID,如果不在对话中则返回空字符串 """ return current_target_id ## 获取对话历史(增强版) func get_enhanced_dialogue_history(character_id: String, limit: int = 50) -> Array[Dictionary]: """ 获取增强的对话历史记录 @param character_id: 角色ID @param limit: 限制返回的消息数量 @return: 消息历史数组 """ return history_manager.get_character_history(character_id, limit) ## 搜索对话历史 func search_dialogue_history(query: String, character_id: String = "") -> Array[Dictionary]: """ 搜索对话历史 @param query: 搜索关键词 @param character_id: 指定角色ID(空字符串表示搜索所有角色) @return: 匹配的消息数组 """ return history_manager.search_messages(query, character_id) ## 获取最近对话 func get_recent_conversations(limit: int = 10) -> Array[Dictionary]: """ 获取最近的对话记录 @param limit: 限制返回的对话数量 @return: 最近对话的摘要数组 """ return history_manager.get_recent_conversations(limit) ## 创建群组对话 func create_group_dialogue(group_name: String) -> String: """ 创建群组对话 @param group_name: 群组名称 @return: 群组ID,失败返回空字符串 """ return group_manager.create_group(group_name, "player") ## 加入群组对话 func join_group_dialogue(group_id: String) -> bool: """ 加入群组对话 @param group_id: 群组ID @return: 是否成功加入 """ return group_manager.join_group(group_id, "player") ## 发送群组消息 func send_group_message(group_id: String, message: String) -> bool: """ 发送群组消息 @param group_id: 群组ID @param message: 消息内容 @return: 是否成功发送 """ # 使用对话过滤器验证和过滤消息 var filter_result = dialogue_filter.filter_message("player", message) if not filter_result.allowed: message_blocked.emit(message, filter_result.reason) return false var filtered_message = filter_result.filtered_message # 转换表情符号 var final_message = EmojiManager.convert_text_to_emoji(filtered_message) # 发送群组消息 return group_manager.send_group_message(group_id, "player", final_message) ## 获取表情符号建议 func get_emoji_suggestions(partial_code: String) -> Array[Dictionary]: """ 获取表情符号建议 @param partial_code: 部分表情符号代码 @return: 建议数组 """ return EmojiManager.get_emoji_suggestions(partial_code) ## 获取表情符号选择器数据 func get_emoji_picker_data() -> Dictionary: """ 获取表情符号选择器数据 @return: 表情符号数据 """ return emoji_manager.create_emoji_picker_data() ## 使用表情符号 func use_emoji(emoji: String) -> void: """ 记录表情符号使用(添加到最近使用) @param emoji: 表情符号 """ emoji_manager.add_to_recent(emoji) ## 获取过滤器配置 func get_filter_config() -> Dictionary: """ 获取对话过滤器配置 @return: 配置字典 """ return dialogue_filter.get_filter_config() ## 设置过滤器配置 func set_filter_config(config: Dictionary) -> void: """ 设置对话过滤器配置 @param config: 配置字典 """ dialogue_filter.set_filter_config(config) ## 获取过滤统计 func get_filter_statistics() -> Dictionary: """ 获取过滤统计信息 @return: 统计信息字典 """ return dialogue_filter.get_filter_statistics() ## 获取群组列表 func get_player_groups() -> Array[Dictionary]: """ 获取玩家参与的群组列表 @return: 群组信息数组 """ return group_manager.get_player_groups() ## 获取群组信息 func get_group_info(group_id: String) -> Dictionary: """ 获取群组信息 @param group_id: 群组ID @return: 群组信息字典 """ return group_manager.get_group_info(group_id) ## 离开群组 func leave_group(group_id: String) -> bool: """ 离开群组 @param group_id: 群组ID @return: 是否成功离开 """ return group_manager.leave_group(group_id, "player") ## 设置当前群组 func set_current_group(group_id: String) -> bool: """ 设置当前活跃的群组 @param group_id: 群组ID @return: 是否成功设置 """ return group_manager.set_current_group(group_id) ## 消息过滤信号处理 func _on_message_filtered(_user_id: String, original: String, filtered: String, reason: String): """处理消息过滤信号""" message_filtered.emit(original, filtered, reason) ## 消息阻止信号处理 func _on_message_blocked(_user_id: String, message: String, reason: String): """处理消息阻止信号""" message_blocked.emit(message, reason) ## 群组消息接收信号处理 func _on_group_message_received(group_id: String, sender_id: String, message: String): """处理群组消息接收信号""" print("Group message received in ", group_id, " from ", sender_id, ": ", message)