59 lines
2.2 KiB
GDScript
59 lines
2.2 KiB
GDScript
extends Node2D
|
|
|
|
const ARM_TIME := 0.7
|
|
const LIFETIME := 60.0
|
|
const TRIGGER_RADIUS := 54.0
|
|
const DAMAGE_FRACTION := 0.5
|
|
const MINE_TEXTURE := preload("res://assets/other/enemy_mine.png")
|
|
var player: CharacterBody2D
|
|
var drift := Vector2.ZERO
|
|
var _age := 0.0
|
|
var _triggered := false
|
|
var _sprite: Sprite2D
|
|
|
|
func _ready() -> void:
|
|
add_to_group("enemy_mines")
|
|
z_index = 12
|
|
_sprite = Sprite2D.new()
|
|
_sprite.name = "MineArtwork"
|
|
_sprite.texture = MINE_TEXTURE
|
|
_sprite.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS
|
|
_sprite.scale = Vector2.ONE * 72.0 / maxf(MINE_TEXTURE.get_width(), MINE_TEXTURE.get_height())
|
|
add_child(_sprite)
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
_age += delta
|
|
position += drift * delta
|
|
drift = drift.move_toward(Vector2.ZERO, 100.0 * delta)
|
|
if is_instance_valid(_sprite):
|
|
_sprite.rotation = _age * 0.16
|
|
_sprite.modulate = Color.WHITE if _age >= ARM_TIME else Color(0.65, 0.65, 0.7)
|
|
_sprite.modulate.a = clampf(LIFETIME - _age, 0.0, 1.0)
|
|
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")) * DAMAGE_FRACTION, 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)
|
|
# The artwork carries the hull; soft warning rings remain visible on dark space.
|
|
draw_circle(Vector2.ZERO, 33.0, Color(accent, 0.07 * pulse * fade))
|
|
draw_circle(Vector2.ZERO, 25.0, Color(accent, 0.1 * pulse * fade))
|
|
var progress := clampf(_age / ARM_TIME, 0.0, 1.0)
|
|
draw_arc(Vector2.ZERO, 31.0, -PI * 0.5, -PI * 0.5 + TAU * progress, 64, Color(accent, (0.22 + 0.28 * pulse) * fade), 1.0, true)
|