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

363 lines
9.7 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)