forked from xiangwang25/whale-town-front-v2
feat: add taskbook onboarding UI
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user