use rand::prelude::*; use cryp::Cryp; use battle::Battle; use skill::Skill; struct Encounter { mob: Cryp, success: bool, player: Cryp, } pub fn battle(a: &Cryp, b: &Cryp) -> Battle { let mut battle = Battle::new(a, b); loop { battle.next(); if battle.finished() { break battle } } } fn pve(plr: Cryp) -> Encounter { let mut rng = thread_rng(); let mob_lvl: u8 = rng.gen_range(1, plr.lvl); let mob = Cryp::new() .named("bamboo basher".to_string()) .level(mob_lvl) .create(); let outcome = battle(&plr, &mob); let success = match outcome.winner() { Some(c) => c.id == plr.id, None => false, }; return Encounter { mob: mob, success, player: plr, }; } pub fn levelling(mut c: Cryp) -> Cryp { loop { let enc = pve(c); c = enc.player; if !enc.success { println!("{:?} has been KO'd", c.name); break c; } println!("{:?} rekt {:?}", c.name, enc.mob.name); c = c.add_xp(); println!("{:?} now has {:?} xp and is lvl {:?}", c.name, c.xp, c.lvl); // LEVEL CAP if c.lvl == 12 { break c; } continue; } } pub fn test_battle() { let mut a = Cryp::new() .named("pronounced \"creeep\"".to_string()) .level(8) .learn(Skill::Stoney) .create(); let b = Cryp::new() .named("lemongrass tea".to_string()) .level(8) .create(); let outcome = battle(&a, &b); match outcome.winner() { Some(w) => println!("{:?} is the winner with {:?} hp remaining", w.name, w.hp), None => println!("{:?} was a draw", outcome), }; return } #[cfg(test)] mod tests { use super::*; #[test] fn pve_test() { let player = Cryp::new() .named("ca phe sua da".to_string()) .level(2) .create(); levelling(player); return; } #[test] fn battle_test() { test_battle(); return; } }