diff --git a/src/entities/agent.rs b/src/entities/agent.rs index 9af4731..19b2dff 100644 --- a/src/entities/agent.rs +++ b/src/entities/agent.rs @@ -384,17 +384,50 @@ pub fn generate_agent_wave(wave_num: i32, heat: i32, entry_positions: &[(i32, i3 } let mut rng = rand::rng(); - let entry = entry_positions[rng.random_range(0..entry_positions.len())]; + + // At higher waves, agents can come from multiple entry points + let num_entries = if wave_num >= 8 { + entry_positions.len().min(3) + } else if wave_num >= 5 { + entry_positions.len().min(2) + } else { + 1 + }; let base_count = std::cmp::min(1 + wave_num, 6); let heat_bonus = heat / 30; let num_agents = std::cmp::min(base_count + heat_bonus, 10) as usize; for i in 0..num_agents { + // Pick from multiple entries at higher waves + let entry_idx = if num_entries > 1 { + rng.random_range(0..num_entries) + } else { + 0 + }; + let entry = entry_positions[entry_idx.min(entry_positions.len() - 1)]; let agent_type = pick_agent_type(wave_num, heat, i == 0); let hx = entry.0 + rng.random_range(-1..=1); let hy = entry.1 + rng.random_range(0..=1); - agents.push(Agent::new(hx, hy, agent_type, wave_num)); + let mut agent = Agent::new(hx, hy, agent_type, wave_num); + + // Speed scaling: agents get faster at higher waves + if wave_num >= 6 && rng.random_range(0.0..1.0) < 0.3 { + agent.speed = 2; + agent.moves_left = 2; + } + + // Elite agents at wave 5+ (10% chance per agent) + if wave_num >= 5 && rng.random_range(0.0..1.0) < 0.1 { + agent.entity.name = format!("Elite {}", agent.entity.name); + agent.entity.max_hp = (agent.entity.max_hp as f32 * 1.5) as i32; + agent.entity.hp = agent.entity.max_hp; + agent.entity.damage = (agent.entity.damage as f32 * 1.3) as i32; + agent.trap_resist = (agent.trap_resist + 0.2).min(0.8); + agent.gold_value = (agent.gold_value as f32 * 1.5) as i32; + } + + agents.push(agent); } agents @@ -536,4 +569,20 @@ mod tests { assert!(!agents[1].known_traps.contains(&(20, 20))); assert!(agents[1].known_traps.contains(&(30, 30))); } + + #[test] + fn wave_generation_scales_with_wave() { + let entries = vec![(0, 0), (79, 0)]; + let wave1 = generate_agent_wave(1, 10, &entries); + let wave5 = generate_agent_wave(5, 10, &entries); + assert!(wave5.len() >= wave1.len(), "Higher waves should have more agents"); + } + + #[test] + fn agent_hp_scales_with_wave() { + let wave1_agent = Agent::new(5, 5, "investigator", 1); + let wave5_agent = Agent::new(5, 5, "investigator", 5); + assert!(wave5_agent.entity.max_hp > wave1_agent.entity.max_hp, + "Higher wave agents should have more HP"); + } }