175 lines
4.9 KiB
GDScript
175 lines
4.9 KiB
GDScript
extends Node
|
||
## 简单对话测试脚本
|
||
## 直接在Main场景中使用,无需复杂的类型声明
|
||
|
||
# 测试NPC数据
|
||
var test_npcs = []
|
||
var spawned_npcs = {}
|
||
|
||
# 引用
|
||
var world_manager = null
|
||
var dialogue_system = null
|
||
|
||
## 初始化测试
|
||
func setup_test(world_mgr, dialogue_sys):
|
||
"""设置测试环境"""
|
||
world_manager = world_mgr
|
||
dialogue_system = dialogue_sys
|
||
print("Simple dialogue test setup complete")
|
||
|
||
## 生成测试NPC
|
||
func spawn_test_npcs(player_position: Vector2 = Vector2(640, 360)):
|
||
"""生成测试NPC"""
|
||
if not world_manager:
|
||
print("WorldManager not available")
|
||
return
|
||
|
||
# 检查WorldManager是否已正确设置
|
||
if not world_manager.character_container:
|
||
print("WorldManager character container not set, waiting...")
|
||
# 延迟一秒后重试
|
||
await get_tree().create_timer(1.0).timeout
|
||
if not world_manager.character_container:
|
||
print("Error: WorldManager character container still not set")
|
||
return
|
||
|
||
# 清除已存在的NPC
|
||
clear_test_npcs()
|
||
|
||
# 创建测试NPC数据
|
||
var npc_data = [
|
||
{
|
||
"id": "test_npc_1",
|
||
"name": "测试小助手",
|
||
"responses": ["你好!我是测试小助手!", "有什么可以帮助你的吗?", "今天天气真不错呢!"]
|
||
},
|
||
{
|
||
"id": "test_npc_2",
|
||
"name": "友好机器人",
|
||
"responses": ["哔哔!我是友好的机器人!", "正在运行对话测试程序...", "系统状态:一切正常!"]
|
||
},
|
||
{
|
||
"id": "test_npc_3",
|
||
"name": "聊天达人",
|
||
"responses": ["嗨!想聊什么呢?", "我最喜欢和大家聊天了!", "你知道吗,聊天是最好的交流方式!"]
|
||
}
|
||
]
|
||
|
||
# 生成NPC
|
||
for i in range(npc_data.size()):
|
||
var npc = npc_data[i]
|
||
|
||
# 计算位置
|
||
var angle = (2.0 * PI * i) / npc_data.size()
|
||
var offset = Vector2(cos(angle), sin(angle)) * 200.0
|
||
var npc_position = player_position + offset
|
||
|
||
# 创建角色数据
|
||
var character_data = CharacterData.create(npc["name"], "system", npc_position)
|
||
character_data[CharacterData.FIELD_ID] = npc["id"]
|
||
|
||
# 生成角色
|
||
var character = world_manager.spawn_character(character_data, false)
|
||
if character:
|
||
spawned_npcs[npc["id"]] = {
|
||
"character": character,
|
||
"responses": npc["responses"],
|
||
"response_index": 0
|
||
}
|
||
print("Test NPC spawned: ", npc["name"], " at ", npc_position)
|
||
|
||
print("Generated ", spawned_npcs.size(), " test NPCs")
|
||
show_help()
|
||
|
||
## 清除测试NPC
|
||
func clear_test_npcs():
|
||
"""清除所有测试NPC"""
|
||
for npc_id in spawned_npcs.keys():
|
||
if world_manager:
|
||
world_manager.remove_character(npc_id)
|
||
|
||
spawned_npcs.clear()
|
||
print("Test NPCs cleared")
|
||
|
||
## 开始对话
|
||
func start_dialogue_with_npc(npc_id: String):
|
||
"""开始与NPC对话"""
|
||
if not dialogue_system or not spawned_npcs.has(npc_id):
|
||
print("Cannot start dialogue with: ", npc_id)
|
||
return
|
||
|
||
dialogue_system.start_dialogue(npc_id)
|
||
|
||
# 发送欢迎消息
|
||
send_npc_response(npc_id)
|
||
|
||
## 发送NPC响应
|
||
func send_npc_response(npc_id: String):
|
||
"""发送NPC响应"""
|
||
if not spawned_npcs.has(npc_id):
|
||
return
|
||
|
||
var npc_data = spawned_npcs[npc_id]
|
||
var responses = npc_data["responses"]
|
||
var index = npc_data["response_index"]
|
||
|
||
var message = responses[index]
|
||
npc_data["response_index"] = (index + 1) % responses.size()
|
||
|
||
# 延迟发送
|
||
await get_tree().create_timer(1.0).timeout
|
||
|
||
if dialogue_system:
|
||
dialogue_system.receive_message(npc_id, message)
|
||
dialogue_system.show_bubble(npc_id, message, 3.0)
|
||
|
||
## 获取附近NPC
|
||
func get_nearby_npcs(position: Vector2, radius: float = 100.0):
|
||
"""获取附近的NPC"""
|
||
var nearby = []
|
||
|
||
for npc_id in spawned_npcs.keys():
|
||
var npc_data = spawned_npcs[npc_id]
|
||
var character = npc_data["character"]
|
||
if character and character.global_position.distance_to(position) <= radius:
|
||
nearby.append({
|
||
"id": npc_id,
|
||
"name": character.name,
|
||
"distance": character.global_position.distance_to(position)
|
||
})
|
||
|
||
return nearby
|
||
|
||
## 显示帮助
|
||
func show_help():
|
||
"""显示测试帮助"""
|
||
print("=== 对话系统测试帮助 ===")
|
||
print("1. 已生成 ", spawned_npcs.size(), " 个测试NPC")
|
||
print("2. 走近NPC按E键开始对话")
|
||
print("3. 在对话框中输入消息测试")
|
||
print("4. NPC会自动回复")
|
||
print("5. 支持表情符号::smile: :happy: :laugh:")
|
||
print("========================")
|
||
|
||
## 测试表情符号
|
||
func test_emoji():
|
||
"""测试表情符号转换"""
|
||
print("=== 表情符号测试 ===")
|
||
var test_messages = [
|
||
":smile: 你好!",
|
||
"今天心情很好 :happy:",
|
||
":laugh: 哈哈哈"
|
||
]
|
||
|
||
for msg in test_messages:
|
||
var converted = EmojiManager.convert_text_to_emoji(msg)
|
||
print("原文: ", msg, " -> 转换: ", converted)
|
||
|
||
## 处理玩家消息
|
||
func handle_player_message(sender: String, _message: String):
|
||
"""处理玩家发送的消息,让NPC自动回复"""
|
||
if sender == "player" and dialogue_system and dialogue_system.is_dialogue_active():
|
||
var target_id = dialogue_system.get_current_target()
|
||
if spawned_npcs.has(target_id):
|
||
send_npc_response(target_id)
|