78 lines
3.0 KiB
GDScript
78 lines
3.0 KiB
GDScript
class_name Square
|
|
extends Node2D
|
|
|
|
# ============================================================================
|
|
# Square.gd - 广场场景控制器
|
|
# ============================================================================
|
|
# 负责广场玩家出生点和玩家相机边界配置,避免运行时看到地图外区域。
|
|
# ============================================================================
|
|
|
|
const CAMERA_ZOOM: Vector2 = Vector2(2.0, 2.0)
|
|
const CAMERA_LIMIT_LEFT: int = -1280
|
|
const CAMERA_LIMIT_TOP: int = -960
|
|
const CAMERA_LIMIT_RIGHT: int = 1280
|
|
const CAMERA_LIMIT_BOTTOM: int = 960
|
|
const WELCOME_DIALOG_SCENE: PackedScene = preload("res://scenes/ui/welcome_dialog.tscn")
|
|
const WELCOME_DIALOG_NAME: String = "WelcomeDialog"
|
|
|
|
@onready var player: PlayerController = $YSortWorld/Characters/Players/Player
|
|
@onready var playerCamera: Camera2D = $YSortWorld/Characters/Players/Player/Camera2D
|
|
@onready var overviewCamera: Camera2D = $Camera2D
|
|
|
|
func _ready() -> void:
|
|
_apply_spawn_point()
|
|
_configure_camera()
|
|
_discover_destination()
|
|
call_deferred("_show_registration_welcome")
|
|
_report_task_map_visit()
|
|
|
|
func _report_task_map_visit() -> void:
|
|
var taskManager := get_node_or_null("/root/TaskManager")
|
|
if taskManager != null and taskManager.has_method("report_activity"):
|
|
taskManager.call("report_activity", "map_visited", "square")
|
|
|
|
func _show_registration_welcome() -> void:
|
|
var auth_manager: Node = get_node_or_null("/root/AuthManager")
|
|
if auth_manager == null or not auth_manager.has_method("consume_registration_welcome"):
|
|
return
|
|
if not bool(auth_manager.call("consume_registration_welcome")):
|
|
return
|
|
var root: Window = get_tree().root
|
|
if root.has_node(WELCOME_DIALOG_NAME):
|
|
return
|
|
var dialog: CanvasLayer = WELCOME_DIALOG_SCENE.instantiate() as CanvasLayer
|
|
if dialog == null:
|
|
return
|
|
dialog.name = WELCOME_DIALOG_NAME
|
|
root.add_child(dialog)
|
|
|
|
func _discover_destination() -> void:
|
|
var destination_id := SceneManager.get_next_destination_id()
|
|
if destination_id.is_empty():
|
|
destination_id = "square_center"
|
|
var socialManager := get_node_or_null("/root/SocialManager")
|
|
if socialManager != null and socialManager.has_method("discover_destination"):
|
|
socialManager.call("discover_destination", destination_id)
|
|
|
|
func _apply_spawn_point() -> void:
|
|
if player.has_scene_position_override:
|
|
return
|
|
var spawnName: String = SceneManager.get_next_spawn_name()
|
|
var markerName: String = spawnName if not spawnName.is_empty() else "DefaultSpawn"
|
|
var marker := $Markers.get_node_or_null(markerName) as Marker2D
|
|
if marker == null:
|
|
marker = $Markers/DefaultSpawn
|
|
player.global_position = marker.global_position
|
|
|
|
func _configure_camera() -> void:
|
|
overviewCamera.enabled = false
|
|
playerCamera.enabled = true
|
|
playerCamera.make_current()
|
|
playerCamera.zoom = CAMERA_ZOOM
|
|
playerCamera.position_smoothing_enabled = true
|
|
playerCamera.limit_left = CAMERA_LIMIT_LEFT
|
|
playerCamera.limit_top = CAMERA_LIMIT_TOP
|
|
playerCamera.limit_right = CAMERA_LIMIT_RIGHT
|
|
playerCamera.limit_bottom = CAMERA_LIMIT_BOTTOM
|
|
playerCamera.limit_smoothed = true
|