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()