363 lines
9.7 KiB
GDScript
363 lines
9.7 KiB
GDScript
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)
|