diff --git a/scripts/enemies/anchor.gd b/scripts/enemies/anchor.gd index bf12dc1..5b23b34 100644 --- a/scripts/enemies/anchor.gd +++ b/scripts/enemies/anchor.gd @@ -99,14 +99,15 @@ func _do_anchored(delta: float) -> void: _shot_timer = SHOT_COOLDOWN func _fire_at_player() -> void: - # Fire at player's current position (not homing - player can dodge) + # Fire homing projectile toward player var dir := (_player.global_position - global_position).normalized() var proj = ENEMY_PROJECTILE.instantiate() proj.position = (get_parent() as Node2D).to_local(global_position) proj.direction = dir - proj.speed = 180.0 # faster since not homing + proj.speed = 140.0 proj.damage = 1.0 proj.max_range = 720.0 - proj.homing = false + proj.homing = true + proj.homing_target = _player AudioManager.play("enemy_shoot") get_parent().call_deferred("add_child", proj) \ No newline at end of file diff --git a/scripts/enemies/repeater.gd b/scripts/enemies/repeater.gd index 503dbf5..443635c 100644 --- a/scripts/enemies/repeater.gd +++ b/scripts/enemies/repeater.gd @@ -27,33 +27,6 @@ func _ready() -> void: speed = 0.0 contact_damage = 0.5 super._ready() - _fire_angle = randf() * TAU - _snap_to_wall() - -# --------------------------------------------------------------------------- -# Snap to the nearest wall face at spawn -# --------------------------------------------------------------------------- -func _snap_to_wall() -> void: - var room_center: Vector2 = (get_parent() as Node2D).global_position - var lp: Vector2 = global_position - room_center - - var d_left: float = lp.x - (-INNER_HALF_X) - var d_right: float = INNER_HALF_X - lp.x - var d_up: float = lp.y - (-INNER_HALF_Y) - var d_down: float = INNER_HALF_Y - lp.y - var md: float = minf(minf(d_left, d_right), minf(d_up, d_down)) - - var wall_pos: Vector2 - if md == d_left: - wall_pos = room_center + Vector2(-INNER_HALF_X, lp.y) - elif md == d_right: - wall_pos = room_center + Vector2( INNER_HALF_X, lp.y) - elif md == d_up: - wall_pos = room_center + Vector2(lp.x, -INNER_HALF_Y) - else: - wall_pos = room_center + Vector2(lp.x, INNER_HALF_Y) - - global_position = wall_pos func _physics_process(delta: float) -> void: _tick_spawn_delay(delta) @@ -69,7 +42,7 @@ func _physics_process(delta: float) -> void: move_and_slide() # --------------------------------------------------------------------------- -# Stationary burst loop — fire 3, pause, rotate 20° CW, repeat +# Stationary burst loop — fire 3 at player position, pause, repeat # --------------------------------------------------------------------------- func _do_fire(delta: float) -> void: _shot_timer -= delta @@ -81,15 +54,18 @@ func _do_fire(delta: float) -> void: _shot_count += 1 _shot_timer = SHOT_INTERVAL else: - _fire_angle += ROTATE_STEP _shot_count = 0 _shot_timer = BURST_PAUSE func _fire_projectile() -> void: + if _player == null: + return AudioManager.play("enemy_shoot") + # Fire at player's current position (not homing - player can dodge) + var dir := (_player.global_position - global_position).normalized() var proj = ENEMY_PROJECTILE.instantiate() proj.position = (get_parent() as Node2D).to_local(global_position) - proj.direction = Vector2.from_angle(_fire_angle) + proj.direction = dir proj.speed = 280.0 proj.damage = 1.0 proj.max_range = 520.0