use uuid::Uuid; use rand::prelude::*; use rand::distributions::Alphanumeric; use std::iter; use cryp::{Cryp}; use game::{Team, GameMode}; use skill::{Skill}; fn generate_mob(lvl: u8) -> Cryp { let mut rng = thread_rng(); let name: String = iter::repeat(()) .map(|()| rng.sample(Alphanumeric)) .take(8) .collect(); // rng panics on min == max // let mob_lvl: u8 = match lvl { // 1 => 1, // _ => rng.gen_range(lvl.saturating_sub(2), lvl) // }; let mob = Cryp::new() .named(&name) .level(lvl) .create(); return mob; } fn quick_game(mob_lvl: u8, team_size: usize) -> Vec { iter::repeat_with(|| generate_mob(mob_lvl) .set_account(Uuid::nil()) .learn(Skill::Attack)) .take(team_size) .collect::>() } fn zone_3v2_attack(player_lvl: u8) -> Vec { let x = Cryp::new() .named(&"hench".to_string()) .level(player_lvl) .learn(Skill::Attack) .create(); let y = Cryp::new() .named(&"bench".to_string()) .level(player_lvl) .learn(Skill::Attack) .create(); return vec![x, y]; } fn zone_2v2_caster(player_lvl: u8) -> Vec { let x = Cryp::new() .named(&"robe".to_string()) .level(player_lvl) .learn(Skill::Blast) .create(); let y = Cryp::new() .named(&"wizard hat".to_string()) .level(player_lvl) .learn(Skill::Blast) .create(); return vec![x, y]; } fn zone_3v3_melee_miniboss(player_lvl: u8) -> Vec { let x = Cryp::new() .named(&"jungle juice".to_string()) .level(player_lvl) .learn(Skill::Attack) .create(); let y = Cryp::new() .named(&"bamboo basher".to_string()) .level(player_lvl) .learn(Skill::Attack) .learn(Skill::Stun) .create(); let z = Cryp::new() .named(&"lemongrass tea".to_string()) .level(player_lvl) .learn(Skill::Attack) .create(); return vec![x, y, z]; } fn zone_3v3_healer_boss(player_lvl: u8) -> Vec { let x = Cryp::new() .named(&"coinage".to_string()) .level(player_lvl) .learn(Skill::Attack) .learn(Skill::Parry) .learn(Skill::Block) .create(); let y = Cryp::new() .named(&"wololo".to_string()) .level(player_lvl + 1) // big strong // .learn(Skill::Blast) .learn(Skill::Heal) .learn(Skill::Triage) .create(); let z = Cryp::new() .named(&"quarry".to_string()) .level(player_lvl) .learn(Skill::Attack) .learn(Skill::Parry) .learn(Skill::Stun) .create(); return vec![x, y, z]; } pub fn generate_mob_team(mode: GameMode, cryps: &Vec) -> Team { let mut mob_team = Team::new(Uuid::nil()); let cryp_lvl = cryps.iter().max_by_key(|c| c.lvl).unwrap().lvl; let team_size = cryps.len(); let mobs = match mode { GameMode::Normal => quick_game(cryp_lvl, team_size), GameMode::Zone3v2Attack => zone_3v2_attack(cryp_lvl), GameMode::Zone2v2Caster => zone_2v2_caster(cryp_lvl), GameMode::Zone3v3MeleeMiniboss => zone_3v3_melee_miniboss(cryp_lvl), GameMode::Zone3v3HealerBoss => zone_3v3_healer_boss(cryp_lvl), _ => panic!("{:?} not handled for pve mobs", mode), }; mob_team.set_cryps(mobs); return mob_team; }