Compare commits

..

No commits in common. "c6b60ea0028d9f52e111712918955ef8d9d849a5" and "eeea6d2d59f997954788ab760587d89ad44680fb" have entirely different histories.

3 changed files with 24 additions and 43 deletions

View File

@ -6,7 +6,6 @@ extends Area2D
@onready var shape: CollisionShape2D = $CollisionShape2D
func _ready() -> void:
scale = Vector2(0.7, 0.7)
if sprite.sprite_frames.has_animation(beam_type):
sprite.play(beam_type)
shape.disabled = beam_type != "middle"

View File

@ -5,10 +5,8 @@ const PRIMARY_TICK_DMG := 40
const SPLASH_TICK_DMG := 3
const TICK_INTERVAL := 0.5
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
@onready var perk_effects = get_node("/root/Game/PerkEffects")
@ -20,9 +18,9 @@ var mid_segs: Array = []
var tick_timer := 0.0
var elapsed := 0.0
var done := false
var current_angle := 0.0
var sweep_dest_angle := 0.0
var sweeping := false
var current_angle := 0.0
var sweep_to := 0.0
var sweeping := false
func _ready() -> void:
target = get_highest_hp_enemy()
@ -38,26 +36,13 @@ func _process(delta: float) -> void:
elapsed += delta
tick_timer += delta
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:
target = new_target
sweep_dest_angle = global_position.direction_to(target.global_position).angle()
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
if sweeping:
current_angle = lerp_angle(current_angle, sweep_to, 1.0 - exp(-SWEEP_RATE * delta))
if abs(angle_difference(current_angle, sweep_to)) < 0.005:
current_angle = sweep_to
sweeping = false
rebuild_segments()
_update_alpha()
if tick_timer >= TICK_INTERVAL:
tick_timer -= TICK_INTERVAL
do_damage_tick()
@ -66,20 +51,18 @@ func _process(delta: float) -> void:
cleanup()
func rebuild_segments() -> void:
if not is_instance_valid(target):
return
var dir := Vector2.from_angle(current_angle)
var beam_start := global_position + dir * start_offset
var dest_dist := global_position.distance_to(target.global_position)
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 types: Array = ["start"]
for i in range(n_mid):
positions.append(beam_start + dir * (segment_size * float(i + 1)))
types.append("middle")
positions.append(beam_start + dir * beam_dist)
positions.append(beam_start + dir * (segment_size * float(n_mid + 1)))
types.append("end")
while all_segs.size() < positions.size():
@ -116,11 +99,16 @@ func rebuild_segments() -> void:
seg.sprite.frame_progress = ref_progress
func retarget(new_target: Node2D) -> void:
target = new_target
sweep_dest_angle = global_position.direction_to(target.global_position).angle()
sweeping = true
target = new_target
sweep_to = global_position.direction_to(new_target.global_position).angle()
sweeping = true
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:
target.take_damage(PRIMARY_TICK_DMG)
@ -134,14 +122,6 @@ func do_damage_tick() -> void:
body.take_damage(SPLASH_TICK_DMG)
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:
for seg in all_segs:
if is_instance_valid(seg):

View File

@ -9,6 +9,7 @@ extends Area2D
@onready var explosion_collision: CollisionShape2D = $ExplosionCollision
var _is_pulling := true
var _damaged_enemies: Array[Node] = []
func _ready() -> void:
tornado_area.disabled = false
@ -30,14 +31,15 @@ func _physics_process(delta: float) -> void:
func _explode() -> void:
_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
explosion_collision.disabled = false
if animated_sprite_2d.sprite_frames.has_animation("explosion"):
animated_sprite_2d.play("explosion")
for body in targets:
if is_instance_valid(body):
await get_tree().physics_frame
for body in get_overlapping_bodies():
if body.is_in_group("enemies") and not _damaged_enemies.has(body):
body.take_damage(explosion_damage)
_damaged_enemies.append(body)
if animated_sprite_2d.sprite_frames.has_animation("explosion"):
await animated_sprite_2d.animation_finished
else: