feat: add taskbook onboarding UI

This commit is contained in:
ANG-Server
2026-07-22 00:45:59 +08:00
parent bb91ccea21
commit 9a3248abd6
15 changed files with 598 additions and 2 deletions

View File

@@ -24,6 +24,8 @@ var _walletLabel: Label
var _avatarLabel: Label
var _avatarPanel: PanelContainer
var _walletRefreshTimer: Timer
var _taskShortcutButton: Button
var _taskRewardBadge: Label
var _currentUsername: String = "玩家"
var _walletBalance: int = 0
@@ -59,6 +61,11 @@ func _exit_tree() -> void:
var callback := Callable(self, "_on_auth_state_changed")
if authManager.is_connected("auth_state_changed", callback):
authManager.disconnect("auth_state_changed", callback)
var taskManager := get_node_or_null("/root/TaskManager")
if taskManager != null and taskManager.has_signal("board_changed"):
var taskCallback := Callable(self, "_on_task_board_changed")
if taskManager.is_connected("board_changed", taskCallback):
taskManager.disconnect("board_changed", taskCallback)
func _build_ui() -> void:
var rootRow := HBoxContainer.new()
@@ -92,7 +99,24 @@ func _build_shortcut_bar() -> PanelContainer:
margin.add_child(row)
row.add_child(_create_shortcut_button("map", "地图", _on_map_pressed))
row.add_child(_create_shortcut_button("task", "任务", _on_task_pressed))
_taskShortcutButton = _create_shortcut_button("task", "任务", _on_task_pressed)
_taskShortcutButton.tooltip_text = "打开任务书"
_taskRewardBadge = Label.new()
_taskRewardBadge.mouse_filter = Control.MOUSE_FILTER_IGNORE
_taskRewardBadge.visible = false
_taskRewardBadge.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
_taskRewardBadge.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
_taskRewardBadge.add_theme_color_override("font_color", Color.WHITE)
_taskRewardBadge.add_theme_font_size_override("font_size", 12)
_taskRewardBadge.add_theme_stylebox_override("normal", _create_pill_style(Color(0.92, 0.30, 0.24), 12))
_taskRewardBadge.set_anchors_preset(Control.PRESET_TOP_RIGHT)
_taskRewardBadge.offset_left = -20
_taskRewardBadge.offset_top = 1
_taskRewardBadge.offset_right = 4
_taskRewardBadge.offset_bottom = 25
_taskRewardBadge.z_index = 1
_taskShortcutButton.add_child(_taskRewardBadge)
row.add_child(_taskShortcutButton)
row.add_child(_create_shortcut_button("backpack", "背包", _on_backpack_pressed))
row.add_child(_create_shortcut_button("friends", "好友", _on_friends_pressed))
row.add_child(_create_shortcut_button("activity", "通知", _on_notifications_pressed))
@@ -240,6 +264,15 @@ func _subscribe_to_events() -> void:
var callback := Callable(self, "_on_auth_state_changed")
if not authManager.is_connected("auth_state_changed", callback):
authManager.connect("auth_state_changed", callback)
var taskManager := get_node_or_null("/root/TaskManager")
if taskManager != null and taskManager.has_signal("board_changed"):
var taskCallback := Callable(self, "_on_task_board_changed")
if not taskManager.is_connected("board_changed", taskCallback):
taskManager.connect("board_changed", taskCallback)
if taskManager.has_method("get_board"):
var boardVariant: Variant = taskManager.call("get_board")
if boardVariant is Dictionary:
_on_task_board_changed(boardVariant as Dictionary)
func _load_current_user() -> void:
var authManager := get_node_or_null("/root/AuthManager")
@@ -277,6 +310,45 @@ func _apply_auth_user_payload(data: Dictionary) -> void:
func _on_auth_logout(_data: Variant = null) -> void:
_set_username("玩家")
_reset_wallet()
_on_task_board_changed({})
func _on_task_board_changed(board: Dictionary) -> void:
if not is_instance_valid(_taskShortcutButton):
return
var claimableCount: int = _count_claimable_task_rewards(board)
if claimableCount > 0:
_taskShortcutButton.tooltip_text = "任务书:有 %d 项奖励可领取" % claimableCount
_taskShortcutButton.modulate = Color(1.0, 0.855, 0.470, 1.0)
if is_instance_valid(_taskRewardBadge):
_taskRewardBadge.text = str(mini(claimableCount, 9)) if claimableCount < 10 else "9+"
_taskRewardBadge.visible = true
return
_taskShortcutButton.tooltip_text = "打开任务书"
_taskShortcutButton.modulate = Color.WHITE
if is_instance_valid(_taskRewardBadge):
_taskRewardBadge.visible = false
func _count_claimable_task_rewards(board: Dictionary) -> int:
var claimableCount: int = 0
claimableCount += _count_claimable_tasks(board.get("newbie_tasks", []))
claimableCount += _count_claimable_tasks(board.get("weekly_tasks", []))
var weeklyBonusVariant: Variant = board.get("weekly_bonus", {})
if weeklyBonusVariant is Dictionary:
var weeklyBonus: Dictionary = weeklyBonusVariant as Dictionary
if bool(weeklyBonus.get("claimable", false)):
claimableCount += 1
return claimableCount
func _count_claimable_tasks(tasksVariant: Variant) -> int:
if not (tasksVariant is Array):
return 0
var claimableCount: int = 0
for taskVariant: Variant in tasksVariant as Array:
if taskVariant is Dictionary:
var task: Dictionary = taskVariant as Dictionary
if bool(task.get("claimable", false)):
claimableCount += 1
return claimableCount
func _on_appearance_avatar_changed(_data: Dictionary) -> void:
_apply_current_avatar()
@@ -386,7 +458,9 @@ func _on_notifications_pressed() -> void:
socialManager.call("toggle_notifications")
func _on_task_pressed() -> void:
_emit_status_message("任务入口稍后接入")
var eventSystem := _get_event_system()
if eventSystem != null:
eventSystem.call("emit_event", EventNames.HUD_TASK_BOOK_REQUESTED, {})
func _on_backpack_pressed() -> void:
var eventSystem := _get_event_system()