hero-mark-2/objects/enemy/eel.gd

90 lines
2.7 KiB
GDScript

extends "res://objects/enemy/enemy.gd"
# distance between segments
const SEGMENT_LENGTH: float = 4.0
# number of segments
export var segments: int = 8
# speed eel travels
export var speed: float = 32.0
# how far eel travels along path for complete wave
export var wave_length: float = 0.0
# intensity in pixels of eel wave animation
export var wave_amplitude: float = 0.0
var _segments: Array
onready var head: PathFollow2D = $Head
onready var tail: PathFollow2D = $Tail
func _ready() -> void:
# get nodes
var first_segment: PathFollow2D = $Segment
var first_segment_shape: CollisionShape2D = $"%SegmentShape"
# initialize segments array
_segments = []
_segments.resize(segments)
# loop for number of segments needed
for i in segments:
# create and add new segment instance
var new_segment = first_segment.duplicate()
add_child(new_segment)
_segments[i] = new_segment
# add new shape to hitbox
var new_segment_shape = first_segment_shape.duplicate()
$Hitbox.add_child(new_segment_shape)
# link segment's remote transform to its collision shape
var new_shape_transform = new_segment.get_node("ShapeTransform")
new_shape_transform.remote_path = new_shape_transform.get_path_to(new_segment_shape)
# free template segment
first_segment.queue_free()
first_segment_shape.queue_free()
func _physics_process(delta: float) -> void:
# move along path
head.offset += speed * delta
# position segments accordingly
_offset_segments()
# waving animation
_wave_segments()
func _offset_segments() -> void:
# put tail at end
tail.offset = head.offset - SEGMENT_LENGTH * float(segments + 1)
# loop through segments
for i in _segments.size():
# set segment position based on index and length
_segments[i].offset = head.offset - SEGMENT_LENGTH * float(i + 1)
func _wave_segments() -> void:
# save the effort of looping if nothing will come of it
if wave_length == 0.0 and wave_amplitude == 0.0:
return
for child in get_children():
# only affect childent that are pathfollows
var segment = child as PathFollow2D
if segment:
# multiply by tau to use pixels as unit
segment.v_offset = sin(segment.offset * TAU / wave_length) * wave_amplitude
func die() -> void:
# instance death particles for every segment
for segment in _segments:
# instance particles for this segment
var death_particles = DeathParticles.instance()
# TODO: something is wrong here, particles to not show up in correct position
death_particles.global_transform = segment.global_transform
# tone them down a little per-segment
death_particles.amount /= 4
death_particles.initial_velocity /= 2.0
# emit
death_particles.emitting = true
# detach from self
get_parent().add_child(death_particles)
.die()