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

175 lines
4.9 KiB
GDScript
Raw Permalink 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
## 简单对话测试脚本
## 直接在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)