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
This commit is contained in:
parent
eaff717054
commit
9e6d53867a
5 changed files with 182 additions and 6 deletions
140
tests/special_stage.rs
Normal file
140
tests/special_stage.rs
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
use bglga::constants::SPECIAL_STAGE_INTERVAL;
|
||||
use bglga::resources::is_special_stage;
|
||||
use bglga::resources::StageConfigurations;
|
||||
|
||||
// ── SPECIAL_STAGE_INTERVAL constant ──
|
||||
|
||||
#[test]
|
||||
fn special_stage_interval_is_three() {
|
||||
assert_eq!(SPECIAL_STAGE_INTERVAL, 3);
|
||||
}
|
||||
|
||||
// ── is_special_stage function ──
|
||||
|
||||
#[test]
|
||||
fn stage_zero_is_not_special() {
|
||||
assert!(!is_special_stage(0));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn stage_1_is_not_special() {
|
||||
assert!(!is_special_stage(1));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn stage_2_is_not_special() {
|
||||
assert!(!is_special_stage(2));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn stage_3_is_special() {
|
||||
assert!(is_special_stage(3));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn stage_4_is_not_special() {
|
||||
assert!(!is_special_stage(4));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn stage_5_is_not_special() {
|
||||
assert!(!is_special_stage(5));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn stage_6_is_special() {
|
||||
assert!(is_special_stage(6));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn stage_9_is_special() {
|
||||
assert!(is_special_stage(9));
|
||||
}
|
||||
|
||||
// ── for_stage returns special config for special stages ──
|
||||
|
||||
#[test]
|
||||
fn for_stage_returns_special_config_at_stage_3() {
|
||||
let configs = StageConfigurations::default();
|
||||
let config = configs.for_stage(3);
|
||||
// Special stages have no dive attacks
|
||||
assert!(
|
||||
config.attack_patterns.is_empty(),
|
||||
"Stage 3 (special) should have empty attack_patterns"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn for_stage_returns_special_config_at_stage_6() {
|
||||
let configs = StageConfigurations::default();
|
||||
let config = configs.for_stage(6);
|
||||
assert!(
|
||||
config.attack_patterns.is_empty(),
|
||||
"Stage 6 (special) should have empty attack_patterns"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn for_stage_returns_normal_config_at_stage_1() {
|
||||
let configs = StageConfigurations::default();
|
||||
let config = configs.for_stage(1);
|
||||
assert!(
|
||||
!config.attack_patterns.is_empty(),
|
||||
"Stage 1 (normal) should have attack patterns"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn for_stage_returns_normal_config_at_stage_2() {
|
||||
let configs = StageConfigurations::default();
|
||||
let config = configs.for_stage(2);
|
||||
assert!(
|
||||
!config.attack_patterns.is_empty(),
|
||||
"Stage 2 (normal) should have attack patterns"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn for_stage_returns_normal_config_at_stage_4() {
|
||||
let configs = StageConfigurations::default();
|
||||
let config = configs.for_stage(4);
|
||||
assert!(
|
||||
!config.attack_patterns.is_empty(),
|
||||
"Stage 4 (normal) should have attack patterns"
|
||||
);
|
||||
}
|
||||
|
||||
// ── Special stage config properties ──
|
||||
|
||||
#[test]
|
||||
fn special_stage_has_full_formation() {
|
||||
let configs = StageConfigurations::default();
|
||||
let config = configs.for_stage(3);
|
||||
assert_eq!(config.enemy_count, 32, "Special stage should have 32 enemies");
|
||||
assert_eq!(
|
||||
config.formation_layout.positions.len(),
|
||||
32,
|
||||
"Special stage formation should have 32 positions"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn special_stage_has_max_dive_interval() {
|
||||
let configs = StageConfigurations::default();
|
||||
let config = configs.for_stage(3);
|
||||
assert_eq!(
|
||||
config.attack_dive_interval,
|
||||
f32::MAX,
|
||||
"Special stage should have max dive interval"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn special_stage_has_base_speed() {
|
||||
let configs = StageConfigurations::default();
|
||||
let config = configs.for_stage(3);
|
||||
assert_eq!(
|
||||
config.enemy_speed_multiplier, 1.0,
|
||||
"Special stage should have 1.0x speed multiplier"
|
||||
);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue