Randoloot/scripts/game/enemy_mine.gd
2026-10-17 14:28:20 +02:00

56 lines
2.0 KiB
GDScript

extends Node2D
const ARM_TIME := 0.7
const LIFETIME := 60.0
const TRIGGER_RADIUS := 54.0
var player: CharacterBody2D
var drift := Vector2.ZERO
var _age := 0.0
var _triggered := false
func _ready() -> void:
add_to_group("enemy_mines")
z_index = 12
func _physics_process(delta: float) -> void:
_age += delta
position += drift * delta
drift = drift.move_toward(Vector2.ZERO, 100.0 * delta)
queue_redraw()
if _age >= LIFETIME:
queue_free()
return
if _triggered or _age < ARM_TIME or not is_instance_valid(player) or bool(player.get("_is_destroyed")):
return
if global_position.distance_to(player.global_position) <= TRIGGER_RADIUS:
_triggered = true
player.call("take_damage", float(player.get("max_hull")) * 0.05, false, DamageTypes.Type.KINETIC)
var explosion := Node2D.new()
explosion.set_script(preload("res://scripts/game/deployment_flash.gd"))
explosion.set("color", Color("ff4265"))
explosion.set("blast", true)
explosion.position = position
get_parent().add_child(explosion)
queue_free()
func _draw() -> void:
var armed := _age >= ARM_TIME
var pulse := 0.65 + 0.35 * sin(_age * 7.0)
var accent := Color("ff4265") if armed else Color("ffb45c")
var fade := clampf(LIFETIME - _age, 0.0, 1.0)
draw_circle(Vector2.ZERO, 30.0, Color(accent, 0.08 * pulse * fade))
var shell := PackedVector2Array()
for index in 16:
var radius := 24.0 if index % 2 == 0 else 13.0
shell.append(Vector2.from_angle(TAU * index / 16.0) * radius)
draw_colored_polygon(shell, Color("292236") * Color(1, 1, 1, fade))
var outline := shell.duplicate()
outline.append(shell[0])
draw_polyline(outline, Color(accent, 0.9 * fade), 1.5, true)
draw_circle(Vector2.ZERO, 10.0, Color("13101e") * Color(1, 1, 1, fade))
draw_arc(Vector2.ZERO, 11.0, 0.0, TAU, 32, Color(accent, fade), 2.0, true)
for index in 3:
var direction := Vector2.from_angle(-PI * 0.5 + TAU * index / 3.0)
draw_line(direction * 4.0, direction * 8.0, Color(accent, pulse * fade), 2.5, true)
draw_circle(Vector2.ZERO, 3.0, Color(accent, pulse * fade))