Every 3rd stage (3, 6, 9, ...) is now a special stage with no enemy dive attacks and no enemy shooting. Enemies still spawn in the default grid formation (32 enemies) but remain in formation without attacking. Changes: - Add SPECIAL_STAGE_INTERVAL constant and is_special_stage() function - Add special_stage config to StageConfigurations with empty attack_patterns - Modify for_stage() to route special stages to special config - Guard enemy_shoot system to skip shooting during special stages - Show '*' suffix in window title for special stages Refs: GAL-39
65 lines
2.2 KiB
Rust
65 lines
2.2 KiB
Rust
use bevy::math::Vec2;
|
|
use bevy::prelude::*;
|
|
|
|
// Window
|
|
pub const WINDOW_WIDTH: f32 = 600.0;
|
|
pub const WINDOW_HEIGHT: f32 = 800.0;
|
|
|
|
// Player
|
|
pub const PLAYER_SPEED: f32 = 300.0;
|
|
pub const PLAYER_SIZE: Vec2 = Vec2::new(30.0, 30.0);
|
|
pub const STARTING_LIVES: u32 = 3;
|
|
pub const PLAYER_RESPAWN_DELAY: f32 = 2.0;
|
|
pub const PLAYER_INVINCIBILITY_DURATION: f32 = 2.0;
|
|
|
|
// Enemies
|
|
pub const ENEMY_SPEED: f32 = 100.0;
|
|
pub const ENEMY_SIZE: Vec2 = Vec2::new(40.0, 40.0);
|
|
pub const ENEMY_SHOOT_INTERVAL: f32 = 1.5;
|
|
|
|
// Bullets
|
|
pub const BULLET_SPEED: f32 = 500.0;
|
|
pub const BULLET_SIZE: Vec2 = Vec2::new(5.0, 15.0);
|
|
pub const ENEMY_BULLET_SIZE: Vec2 = Vec2::new(8.0, 8.0);
|
|
pub const ENEMY_BULLET_SPEED: f32 = 300.0;
|
|
|
|
// Formation
|
|
const FORMATION_ROWS: usize = 4;
|
|
pub const FORMATION_COLS: usize = 8;
|
|
pub const FORMATION_ENEMY_COUNT: usize = FORMATION_ROWS * FORMATION_COLS;
|
|
pub const FORMATION_X_SPACING: f32 = 60.0;
|
|
pub const FORMATION_Y_SPACING: f32 = 50.0;
|
|
pub const FORMATION_BASE_Y: f32 = WINDOW_HEIGHT / 2.0 - 150.0;
|
|
|
|
// Collision thresholds (mean of half-widths)
|
|
pub const BULLET_ENEMY_COLLISION_THRESHOLD: f32 = (BULLET_SIZE.x + ENEMY_SIZE.x) * 0.5;
|
|
pub const PLAYER_ENEMY_COLLISION_THRESHOLD: f32 = (PLAYER_SIZE.x + ENEMY_SIZE.x) * 0.5;
|
|
pub const ENEMY_BULLET_PLAYER_COLLISION_THRESHOLD: f32 =
|
|
(ENEMY_BULLET_SIZE.x + PLAYER_SIZE.x) * 0.5;
|
|
|
|
// Tractor beam
|
|
pub const TRACTOR_BEAM_WIDTH: f32 = 20.0;
|
|
pub const TRACTOR_BEAM_DURATION: f32 = 3.0;
|
|
pub const CAPTURE_DURATION: f32 = 10.0;
|
|
pub const BEAM_GLOW_WIDTH: f32 = 40.0;
|
|
pub const BEAM_GLOW_COLOR: Color = Color::srgba(0.3, 0.0, 0.5, 0.25);
|
|
pub const BEAM_CORE_COLOR: Color = Color::srgba(0.7, 0.2, 1.0, 0.7);
|
|
pub const BEAM_PULSE_FREQ: f32 = 3.0;
|
|
pub const BEAM_PULSE_AMPLITUDE: f32 = 0.15;
|
|
|
|
// Special stages
|
|
pub const SPECIAL_STAGE_INTERVAL: u32 = 3;
|
|
|
|
// Starfield
|
|
pub const STAR_COUNT: usize = 150;
|
|
pub const STAR_MIN_SIZE: f32 = 1.0;
|
|
pub const STAR_MAX_SIZE: f32 = 3.0;
|
|
pub const STAR_MIN_SPEED: f32 = 20.0;
|
|
pub const STAR_MAX_SPEED: f32 = 100.0;
|
|
pub const STAR_Z_DEPTH: f32 = -10.0;
|
|
|
|
// Explosion
|
|
pub const EXPLOSION_DURATION: f32 = 0.4;
|
|
pub const EXPLOSION_BASE_SIZE: Vec2 = Vec2::new(15.0, 15.0);
|
|
pub const EXPLOSION_MAX_SIZE: Vec2 = Vec2::new(50.0, 50.0);
|
|
pub const EXPLOSION_COLOR: Color = Color::srgba(1.0, 0.6, 0.1, 1.0);
|