extends Control const FONT := preload("res://assets/fonts/font2.ttf") var player: CharacterBody2D var targets: Array[Node2D] = [] func _ready() -> void: mouse_filter = Control.MOUSE_FILTER_IGNORE func _process(_delta: float) -> void: if not is_instance_valid(player): return targets.clear() for group in ["enemies", "exploration_pois"]: for target in get_tree().get_nodes_in_group(group): if player.get_parent().is_ancestor_of(target) and is_target_in_range(target): targets.append(target) queue_redraw() func get_scan_range() -> float: var transform := get_viewport().get_canvas_transform() var half_screen := get_viewport_rect().size * 0.5 var visible_radius := Vector2(half_screen.x / transform.x.length(), half_screen.y / transform.y.length()).length() return maxf(float(player.get("base_scanner_range")), visible_radius + 150.0) + float(player.get("scanner_range")) - float(player.get("base_scanner_range")) func is_target_in_range(target: Node2D) -> bool: return player.global_position.distance_to(target.global_position) <= get_scan_range() func _draw() -> void: if not is_instance_valid(player) or bool(player.get("_is_destroyed")) or bool(player.get("is_docked")): return var bounds := Rect2(Vector2(344, 70), Vector2(maxf(100, size.x - 680), maxf(100, size.y - 230))) var origin := get_viewport().get_canvas_transform() * player.global_position var anchor := Vector2(clampf(origin.x, bounds.position.x, bounds.end.x), clampf(origin.y, bounds.position.y, bounds.end.y)) for target in targets: if not is_instance_valid(target) or target.is_queued_for_deletion(): continue var color := Color("ff7777") var caption := "WRÓG" if target.is_in_group("enemies"): if float(target.get("hull")) <= 0: continue else: match str(target.get("kind")): "asteroid": color = Color("a6c8e0") caption = "AST" "wreck": color = Color("ffd166") caption = "WRAK" "ruin": color = Color("d2a4ff") caption = "?" var screen := get_viewport().get_canvas_transform() * target.global_position if get_viewport_rect().has_point(screen): continue var direction := (screen - anchor).normalized() var point := screen if not bounds.has_point(screen): var dx := (bounds.end.x - anchor.x) if direction.x > 0 else (anchor.x - bounds.position.x) var dy := (bounds.end.y - anchor.y) if direction.y > 0 else (anchor.y - bounds.position.y) var distance := minf(dx / maxf(absf(direction.x), 0.001), dy / maxf(absf(direction.y), 0.001)) point = anchor + direction * distance var side := Vector2(-direction.y, direction.x) draw_colored_polygon(PackedVector2Array([point + direction * 10, point - direction * 6 + side * 6, point - direction * 6 - side * 6]), color) draw_string(FONT, point + Vector2(-18, 25), caption, HORIZONTAL_ALIGNMENT_LEFT, -1, 11, color)