45 lines
1.8 KiB
GDScript
45 lines
1.8 KiB
GDScript
extends Node2D
|
|
|
|
const VFX := preload("res://scripts/game/extension_vfx.gd")
|
|
var arriving := true
|
|
var ship_texture: Texture2D
|
|
var ship_rotation := 0.0
|
|
var _age := 0.0
|
|
var _shards: Array[Dictionary] = []
|
|
|
|
func _ready() -> void:
|
|
z_index = 27
|
|
var rng := RandomNumberGenerator.new()
|
|
rng.randomize()
|
|
for index in 28:
|
|
_shards.append({"angle": rng.randf_range(0, TAU), "distance": rng.randf_range(25, 85), "size": rng.randf_range(1, 3)})
|
|
|
|
func _process(delta: float) -> void:
|
|
_age += delta
|
|
queue_redraw()
|
|
if _age >= 1.0:
|
|
queue_free()
|
|
|
|
func _draw() -> void:
|
|
var progress := clampf(_age, 0, 1)
|
|
var fade := pow(1.0 - progress, 2)
|
|
var radius := 28.0 + (70.0 * (1.0 - progress) if arriving else progress * 70.0)
|
|
draw_texture_rect(VFX.radial_texture(), Rect2(-90, -90, 180, 180), false, Color(0.42, 0.35, 1.0, fade * 0.65))
|
|
for ring in 3:
|
|
var r := radius + float(ring) * 6.0
|
|
var color := Color(0.45 + float(ring) * 0.15, 0.55 + float(ring) * 0.1, 1.0, fade * 0.6)
|
|
for segment in 4:
|
|
var start := float(segment) * TAU / 4.0 + progress * (2.0 if ring % 2 == 0 else -2.0)
|
|
draw_arc(Vector2.ZERO, r, start, start + 1.05, 24, color, 1.5, true)
|
|
for shard in _shards:
|
|
var angle := float(shard["angle"]) + progress * 1.2
|
|
var distance := float(shard["distance"]) * (1.0 - progress if arriving else progress)
|
|
var point := Vector2.RIGHT.rotated(angle) * distance
|
|
draw_line(point, point + Vector2.RIGHT.rotated(angle + 0.7) * 6.0, Color(0.7, 0.85, 1.0, fade), float(shard["size"]), true)
|
|
if ship_texture != null:
|
|
draw_set_transform(Vector2.ZERO, ship_rotation, Vector2.ONE * (1.0 + progress * 0.6))
|
|
var dimensions := ship_texture.get_size()
|
|
dimensions *= 64.0 / maxf(dimensions.x, dimensions.y)
|
|
draw_texture_rect(ship_texture, Rect2(-dimensions * 0.5, dimensions), false, Color(0.5, 0.7, 1.0, fade * 0.45))
|
|
draw_set_transform(Vector2.ZERO)
|