From 98b74a7ae2ae57bd848d40a8f1713e9aad3cea8a Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Wed, 6 May 2026 21:59:35 +0200 Subject: [PATCH 1/6] game: award 300 points for Boss kills (3x Grunt) Boss enemies now award 300 points instead of the same 100 as Grunts. The scoring match in check_bullet_collisions already routed by EnemyType; only the BOSS_POINTS constant was wrong. Refs: GAL-27 --- src/bullet.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bullet.rs b/src/bullet.rs index 5481fb0..2de568a 100644 --- a/src/bullet.rs +++ b/src/bullet.rs @@ -11,7 +11,7 @@ use crate::resources::{PlayerLives, PlayerRespawnTimer, Score}; use crate::systems::spawn_explosion; const GRUNT_POINTS: u32 = 100; -const BOSS_POINTS: u32 = 100; // TODO(GAL-27): differentiate Boss from Grunt scoring +const BOSS_POINTS: u32 = 300; pub fn move_bullets( mut query: Query<(Entity, &mut Transform), With>, From eaff7170543df9844640b583cf2032697ea49db2 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Wed, 6 May 2026 22:02:13 +0200 Subject: [PATCH 2/6] chore(todo): update GAL-27 status and progress --- TODO.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index 0c10e47..bcd0611 100644 --- a/TODO.md +++ b/TODO.md @@ -31,10 +31,11 @@ * [x] GAL-24: Enemies are despawned when they fly off-screen after an attack. * [ ] **GAL-25: Enemy Variety** * [x] GAL-26: `EnemyType` enum (`Grunt`, `Boss`). - * [ ] GAL-27: Different behaviors, points, and colors based on type. + * [x] **GAL-27: Different behaviors, points, and colors based on type.** * [x] Colors differ (Grunt red, Boss purple) — `enemy.rs:80-83` * [x] Behaviors differ (Boss has `CaptureBeam`, distinct SwoopDive) — `enemy.rs:254-318` - * [ ] Points: Boss currently awards same 100 points as Grunt — see `bullet.rs:48-51` (`// Same points as Grunt for now`). Boss should award more. + * [x] Points: Boss awards 300 points (3x Grunt) — `bullet.rs:13-14` + * Completed on branch GAL-27, commit 98b74a7 **3. Advanced Galaga Mechanics** From 9e6d53867a94dd49fb81c8e8ad344214e1f3ce18 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Wed, 6 May 2026 23:31:12 +0200 Subject: [PATCH 3/6] feat(game): add special stage type every 3rd level 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 --- src/constants.rs | 3 + src/enemy.rs | 5 ++ src/resources.rs | 31 +++++++-- src/systems.rs | 9 ++- tests/special_stage.rs | 140 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 182 insertions(+), 6 deletions(-) create mode 100644 tests/special_stage.rs diff --git a/src/constants.rs b/src/constants.rs index 61828df..42db1da 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -47,6 +47,9 @@ 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; diff --git a/src/enemy.rs b/src/enemy.rs index 2d7bee2..20f59c8 100644 --- a/src/enemy.rs +++ b/src/enemy.rs @@ -12,6 +12,7 @@ use crate::constants::{ }; use crate::resources::{ AttackDiveTimer, CurrentStage, EnemySpawnTimer, FormationState, StageConfigurations, + is_special_stage, }; const BOSS_BASE_CHANCE: f32 = 0.30; @@ -341,7 +342,11 @@ pub fn enemy_shoot( mut commands: Commands, time: Res