Files
whale-town-front-v2/scripts/test_npc_dialogue_ui.gd
xiangwang fc6c3c1bd3 feat: expand multiplayer, chat, and release support
- add network NPC synchronization and dialogue interactions
- add world bulletin publishing and display
- improve authentication, session refresh, and appearance sync
- synchronize player direction and movement animations
- improve input focus and progressive Web loading
- add macOS/Windows builds and deployment configuration
- include required fonts, shaders, and runtime assets
2026-09-08 21:37:43 +08:00

50 lines
2.9 KiB
GDScript

extends SceneTree
const CHAT_UI_SCENE: PackedScene = preload("res://scenes/ui/ChatUI.tscn")
func _initialize() -> void:
call_deferred("_run")
func _run() -> void:
var chatUi := CHAT_UI_SCENE.instantiate()
root.add_child(chatUi)
await process_frame
chatUi.call("start_npc_whisper", "npc_niulai", "牛来", "欢迎来到鲸鱼小镇!")
await process_frame
var panel := chatUi.get_node("ChatPanel") as PanelContainer
var worldTab := chatUi.get_node("ChatPanel/PanelMargin/ContentVBox/Tabs/PopularTab") as Control
var npcTabButton := chatUi.get_node("ChatPanel/PanelMargin/ContentVBox/Tabs/RecentTab/RecentTabButton") as Button
var friendsTab := chatUi.get_node("ChatPanel/PanelMargin/ContentVBox/Tabs/FriendsTab") as Control
var inputRow := chatUi.get_node("ChatPanel/PanelMargin/ContentVBox/InputRow") as Control
assert(panel.visible, "NPC interaction must open the dialogue panel")
assert(is_equal_approx(panel.anchor_left, 0.5) and is_equal_approx(panel.anchor_right, 0.5), "NPC dialogue must be horizontally centered")
assert((panel.get_theme_stylebox("panel") as StyleBoxFlat).border_width_left == 4, "NPC dialogue must use the framed dialogue style")
assert(not worldTab.visible and not friendsTab.visible, "Channel tabs must be hidden during an NPC dialogue")
assert(npcTabButton.text == "牛来", "The dialogue header must show the NPC name")
assert(inputRow.visible, "AI NPC dialogue must retain the message input")
var dialogueMessage := chatUi.find_child("ChatMessage", true, false) as Control
assert(dialogueMessage != null, "NPC greeting must render in the dialogue")
assert(not dialogueMessage.get_node("MessageRow/LeftAvatarPanel").visible, "NPC dialogue messages must not render chat bubbles or avatars")
root.size = Vector2i(640, 360)
await process_frame
var mobileRect := panel.get_rect()
var mobileCanvasSize: Vector2 = chatUi.size
assert(mobileRect.position.x >= 0.0 and mobileRect.end.x <= mobileCanvasSize.x, "NPC dialogue must fit the mobile canvas horizontally")
assert(mobileRect.position.y >= 0.0 and mobileRect.end.y <= mobileCanvasSize.y, "NPC dialogue must fit the mobile canvas vertically")
chatUi.call("hide_chat", true)
await process_frame
assert(is_equal_approx(panel.anchor_left, 0.024), "Closing an NPC dialogue must restore the normal chat layout")
assert(worldTab.visible and friendsTab.visible, "Closing an NPC dialogue must restore channel tabs")
chatUi.call("show_npc_dialogue", "虾小满", "码头今天风平浪静。")
await process_frame
assert(panel.visible, "Static NPC interaction must use the same dialogue panel")
assert(not inputRow.visible, "Static NPC dialogue must not show an unusable input")
assert(npcTabButton.text == "虾小满", "Static NPC dialogue must show its speaker")
assert(root.get_node_or_null("WorldChatBubbleLayer") == null, "NPC dialogue must not create a world bubble layer")
print("NPC_DIALOGUE_UI_OK")
quit()