use bevy::prelude::*; use std::time::Duration; use crate::components::{ AttackPattern, Captured, Enemy, EnemyBullet, EnemyState, EnemyType, FormationTarget, OriginalFormationPosition, Player, TractorBeam, TractorBeamSprite, }; use crate::constants::{ BEAM_CORE_COLOR, BEAM_GLOW_COLOR, BEAM_GLOW_WIDTH, BEAM_PULSE_AMPLITUDE, BEAM_PULSE_FREQ, CAPTURE_DURATION, ENEMY_BULLET_SIZE, ENEMY_SIZE, ENEMY_SPEED, TRACTOR_BEAM_DURATION, TRACTOR_BEAM_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH, }; use crate::resources::{ AttackDiveTimer, CurrentStage, EnemySpawnTimer, FormationState, StageConfigurations, is_special_stage, }; const BOSS_BASE_CHANCE: f32 = 0.30; const BOSS_CHANCE_PER_STAGE: f32 = 0.05; const BOSS_CHANCE_BONUS_CAP: f32 = 0.50; const BOSS_CAPTURE_BEAM_PROBABILITY: f32 = 0.80; const ATTACKER_SPEED_MULTIPLIER: f32 = 1.5; const RETURN_SPEED_MULTIPLIER: f32 = 0.7; const SWOOP_HORIZONTAL_FACTOR: f32 = 0.5; const KAMIKAZE_NEAR_DISTANCE: f32 = 50.0; const RETURN_ARRIVAL_DISTANCE: f32 = 5.0; const ARRIVAL_THRESHOLD_FACTOR: f32 = 1.1; const BOSS_CAPTURE_BEAM_HOVER_Y_FACTOR: f32 = 0.25; // -WINDOW_HEIGHT * this const BOSS_DESCENT_SPEED_FACTOR: f32 = 0.8; pub fn spawn_enemies( mut commands: Commands, time: Res