59 lines
2.4 KiB
GDScript
59 lines
2.4 KiB
GDScript
extends Control
|
|
|
|
const FONT := preload("res://assets/fonts/font2.ttf")
|
|
var player: CharacterBody2D
|
|
var remaining := 8.0
|
|
var targets: Array[Node2D] = []
|
|
|
|
func _ready() -> void:
|
|
mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
for group in ["enemies", "exploration_pois"]:
|
|
for target in get_tree().get_nodes_in_group(group):
|
|
if player.get_parent().is_ancestor_of(target):
|
|
targets.append(target)
|
|
|
|
func _process(delta: float) -> void:
|
|
remaining -= delta
|
|
if remaining <= 0 or not is_instance_valid(player) or bool(player.get("_is_destroyed")):
|
|
get_parent().queue_free()
|
|
return
|
|
queue_redraw()
|
|
|
|
func _draw() -> void:
|
|
if not is_instance_valid(player):
|
|
return
|
|
var bounds := Rect2(Vector2(45, 100), Vector2(maxf(100, size.x - 390), maxf(100, size.y - 210)))
|
|
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
|
|
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)
|
|
draw_string(FONT, Vector2(32, 82), "SKANER %.1f s · czerwony: wrogowie · błękitny: asteroidy · złoty: wraki · fioletowy: antyczne planety" % maxf(0, remaining), HORIZONTAL_ALIGNMENT_LEFT, -1, 13, Color("c9e8ff"))
|