mnml/server/src/mob.rs
2019-01-13 18:13:15 +11:00

147 lines
3.5 KiB
Rust

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<Cryp> {
iter::repeat_with(||
generate_mob(mob_lvl)
.set_account(Uuid::nil())
.learn(Skill::Attack))
.take(team_size)
.collect::<Vec<Cryp>>()
}
fn zone_3v2_attack(player_lvl: u8) -> Vec<Cryp> {
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<Cryp> {
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<Cryp> {
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<Cryp> {
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<Cryp>) -> 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;
}