Compare commits
No commits in common. "c6b60ea0028d9f52e111712918955ef8d9d849a5" and "eeea6d2d59f997954788ab760587d89ad44680fb" have entirely different histories.
c6b60ea002
...
eeea6d2d59
|
|
@ -6,7 +6,6 @@ extends Area2D
|
||||||
@onready var shape: CollisionShape2D = $CollisionShape2D
|
@onready var shape: CollisionShape2D = $CollisionShape2D
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
scale = Vector2(0.7, 0.7)
|
|
||||||
if sprite.sprite_frames.has_animation(beam_type):
|
if sprite.sprite_frames.has_animation(beam_type):
|
||||||
sprite.play(beam_type)
|
sprite.play(beam_type)
|
||||||
shape.disabled = beam_type != "middle"
|
shape.disabled = beam_type != "middle"
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,8 @@ const PRIMARY_TICK_DMG := 40
|
||||||
const SPLASH_TICK_DMG := 3
|
const SPLASH_TICK_DMG := 3
|
||||||
const TICK_INTERVAL := 0.5
|
const TICK_INTERVAL := 0.5
|
||||||
const SWEEP_RATE := 22.0
|
const SWEEP_RATE := 22.0
|
||||||
const FADE_IN := 0.3
|
|
||||||
const FADE_OUT := 0.5
|
|
||||||
|
|
||||||
@export var segment_size := 8.0
|
@export var segment_size := 16.0
|
||||||
@export var start_offset := 24.0
|
@export var start_offset := 24.0
|
||||||
|
|
||||||
@onready var perk_effects = get_node("/root/Game/PerkEffects")
|
@onready var perk_effects = get_node("/root/Game/PerkEffects")
|
||||||
|
|
@ -20,9 +18,9 @@ var mid_segs: Array = []
|
||||||
var tick_timer := 0.0
|
var tick_timer := 0.0
|
||||||
var elapsed := 0.0
|
var elapsed := 0.0
|
||||||
var done := false
|
var done := false
|
||||||
var current_angle := 0.0
|
var current_angle := 0.0
|
||||||
var sweep_dest_angle := 0.0
|
var sweep_to := 0.0
|
||||||
var sweeping := false
|
var sweeping := false
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
target = get_highest_hp_enemy()
|
target = get_highest_hp_enemy()
|
||||||
|
|
@ -38,26 +36,13 @@ func _process(delta: float) -> void:
|
||||||
elapsed += delta
|
elapsed += delta
|
||||||
tick_timer += delta
|
tick_timer += delta
|
||||||
|
|
||||||
if (not is_instance_valid(target) or target.is_dying) and perk_effects.laser_retarget_enabled:
|
if sweeping:
|
||||||
var new_target := get_highest_hp_enemy()
|
current_angle = lerp_angle(current_angle, sweep_to, 1.0 - exp(-SWEEP_RATE * delta))
|
||||||
if new_target != null:
|
if abs(angle_difference(current_angle, sweep_to)) < 0.005:
|
||||||
target = new_target
|
current_angle = sweep_to
|
||||||
sweep_dest_angle = global_position.direction_to(target.global_position).angle()
|
sweeping = false
|
||||||
sweeping = true
|
|
||||||
|
|
||||||
if is_instance_valid(target) and not target.is_dying:
|
|
||||||
var live_angle := global_position.direction_to(target.global_position).angle()
|
|
||||||
if sweeping:
|
|
||||||
current_angle = lerp_angle(current_angle, sweep_dest_angle, 1.0 - exp(-SWEEP_RATE * delta))
|
|
||||||
if abs(angle_difference(current_angle, sweep_dest_angle)) < 0.01:
|
|
||||||
sweeping = false
|
|
||||||
current_angle = live_angle
|
|
||||||
else:
|
|
||||||
current_angle = live_angle
|
|
||||||
rebuild_segments()
|
rebuild_segments()
|
||||||
|
|
||||||
_update_alpha()
|
|
||||||
|
|
||||||
if tick_timer >= TICK_INTERVAL:
|
if tick_timer >= TICK_INTERVAL:
|
||||||
tick_timer -= TICK_INTERVAL
|
tick_timer -= TICK_INTERVAL
|
||||||
do_damage_tick()
|
do_damage_tick()
|
||||||
|
|
@ -66,20 +51,18 @@ func _process(delta: float) -> void:
|
||||||
cleanup()
|
cleanup()
|
||||||
|
|
||||||
func rebuild_segments() -> void:
|
func rebuild_segments() -> void:
|
||||||
if not is_instance_valid(target):
|
|
||||||
return
|
|
||||||
var dir := Vector2.from_angle(current_angle)
|
var dir := Vector2.from_angle(current_angle)
|
||||||
var beam_start := global_position + dir * start_offset
|
var beam_start := global_position + dir * start_offset
|
||||||
var dest_dist := global_position.distance_to(target.global_position)
|
var dest_dist := global_position.distance_to(target.global_position)
|
||||||
var beam_dist := dest_dist - start_offset
|
var beam_dist := dest_dist - start_offset
|
||||||
var n_mid: int = max(0, ceili(beam_dist / segment_size) - 1)
|
var n_mid := int(max(0.0, beam_dist - segment_size) / segment_size)
|
||||||
|
|
||||||
var positions: Array = [beam_start]
|
var positions: Array = [beam_start]
|
||||||
var types: Array = ["start"]
|
var types: Array = ["start"]
|
||||||
for i in range(n_mid):
|
for i in range(n_mid):
|
||||||
positions.append(beam_start + dir * (segment_size * float(i + 1)))
|
positions.append(beam_start + dir * (segment_size * float(i + 1)))
|
||||||
types.append("middle")
|
types.append("middle")
|
||||||
positions.append(beam_start + dir * beam_dist)
|
positions.append(beam_start + dir * (segment_size * float(n_mid + 1)))
|
||||||
types.append("end")
|
types.append("end")
|
||||||
|
|
||||||
while all_segs.size() < positions.size():
|
while all_segs.size() < positions.size():
|
||||||
|
|
@ -116,11 +99,16 @@ func rebuild_segments() -> void:
|
||||||
seg.sprite.frame_progress = ref_progress
|
seg.sprite.frame_progress = ref_progress
|
||||||
|
|
||||||
func retarget(new_target: Node2D) -> void:
|
func retarget(new_target: Node2D) -> void:
|
||||||
target = new_target
|
target = new_target
|
||||||
sweep_dest_angle = global_position.direction_to(target.global_position).angle()
|
sweep_to = global_position.direction_to(new_target.global_position).angle()
|
||||||
sweeping = true
|
sweeping = true
|
||||||
|
|
||||||
func do_damage_tick() -> void:
|
func do_damage_tick() -> void:
|
||||||
|
if (not is_instance_valid(target) or target.is_dying) and perk_effects.laser_retarget_enabled:
|
||||||
|
var new_target = get_highest_hp_enemy()
|
||||||
|
if new_target != null:
|
||||||
|
retarget(new_target)
|
||||||
|
|
||||||
if is_instance_valid(target) and not target.is_dying:
|
if is_instance_valid(target) and not target.is_dying:
|
||||||
target.take_damage(PRIMARY_TICK_DMG)
|
target.take_damage(PRIMARY_TICK_DMG)
|
||||||
|
|
||||||
|
|
@ -134,14 +122,6 @@ func do_damage_tick() -> void:
|
||||||
body.take_damage(SPLASH_TICK_DMG)
|
body.take_damage(SPLASH_TICK_DMG)
|
||||||
hit.append(body)
|
hit.append(body)
|
||||||
|
|
||||||
func _update_alpha() -> void:
|
|
||||||
var alpha := clampf(elapsed / FADE_IN, 0.0, 1.0)
|
|
||||||
if elapsed > BEAM_DURATION - FADE_OUT:
|
|
||||||
alpha = minf(alpha, clampf((BEAM_DURATION - elapsed) / FADE_OUT, 0.0, 1.0))
|
|
||||||
for seg in all_segs:
|
|
||||||
if is_instance_valid(seg):
|
|
||||||
seg.modulate.a = alpha
|
|
||||||
|
|
||||||
func cleanup() -> void:
|
func cleanup() -> void:
|
||||||
for seg in all_segs:
|
for seg in all_segs:
|
||||||
if is_instance_valid(seg):
|
if is_instance_valid(seg):
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ extends Area2D
|
||||||
@onready var explosion_collision: CollisionShape2D = $ExplosionCollision
|
@onready var explosion_collision: CollisionShape2D = $ExplosionCollision
|
||||||
|
|
||||||
var _is_pulling := true
|
var _is_pulling := true
|
||||||
|
var _damaged_enemies: Array[Node] = []
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
tornado_area.disabled = false
|
tornado_area.disabled = false
|
||||||
|
|
@ -30,14 +31,15 @@ func _physics_process(delta: float) -> void:
|
||||||
|
|
||||||
func _explode() -> void:
|
func _explode() -> void:
|
||||||
_is_pulling = false
|
_is_pulling = false
|
||||||
var targets = get_overlapping_bodies().filter(func(b): return b.is_in_group("enemies") and not b.is_dying)
|
|
||||||
tornado_area.disabled = true
|
tornado_area.disabled = true
|
||||||
explosion_collision.disabled = false
|
explosion_collision.disabled = false
|
||||||
if animated_sprite_2d.sprite_frames.has_animation("explosion"):
|
if animated_sprite_2d.sprite_frames.has_animation("explosion"):
|
||||||
animated_sprite_2d.play("explosion")
|
animated_sprite_2d.play("explosion")
|
||||||
for body in targets:
|
await get_tree().physics_frame
|
||||||
if is_instance_valid(body):
|
for body in get_overlapping_bodies():
|
||||||
|
if body.is_in_group("enemies") and not _damaged_enemies.has(body):
|
||||||
body.take_damage(explosion_damage)
|
body.take_damage(explosion_damage)
|
||||||
|
_damaged_enemies.append(body)
|
||||||
if animated_sprite_2d.sprite_frames.has_animation("explosion"):
|
if animated_sprite_2d.sprite_frames.has_animation("explosion"):
|
||||||
await animated_sprite_2d.animation_finished
|
await animated_sprite_2d.animation_finished
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue