创建新工程

This commit is contained in:
moyin
2025-12-05 19:00:14 +08:00
commit ff4fa5fffd
227 changed files with 32804 additions and 0 deletions

362
scripts/DialogueSystem.gd Normal file
View File

@@ -0,0 +1,362 @@
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)