From d5df2cf8710ffa4b3e04ef249a132e55fbfb0e1e Mon Sep 17 00:00:00 2001 From: ntr Date: Sat, 11 Aug 2018 21:23:14 +1000 Subject: [PATCH] levelling up --- src/cryp.rs | 62 ++++++++++++++++++++++++++------------ src/lib.rs | 86 ++++++++++++++++++++++++++++------------------------- 2 files changed, 89 insertions(+), 59 deletions(-) diff --git a/src/cryp.rs b/src/cryp.rs index bd8f5aaa..516bf6b7 100644 --- a/src/cryp.rs +++ b/src/cryp.rs @@ -21,32 +21,56 @@ fn check_lvl(lvl: u8) -> u8 { } impl Cryp { - pub fn new(name: String, lvl: u8) -> Cryp { - let mut rng = thread_rng(); - let checked_lvl = check_lvl(lvl); - - let max = match checked_lvl == 64 { - true => u64::max_value(), - false => 2_u64.pow(checked_lvl.into()), - }; - - let dmg: u64 = rng.gen_range(1, max); - let def: u64 = rng.gen_range(1, max); - let stam: u64 = rng.gen_range(1, max); + pub fn new() -> Cryp { let id = Uuid::new_v4(); return Cryp { id, - dmg, - def, - stam, - lvl: checked_lvl, + dmg: 0, + def: 0, + stam: 0, + lvl: 0, xp: 0, - name: name.clone() + name: String::new() }; } - pub fn lvl(self) -> Cryp { - Cryp::new(self.name, self.lvl + 1) + pub fn named(mut self, name: String) -> Cryp { + self.name = name.clone(); + self + } + + pub fn level(mut self, lvl: u8) -> Cryp { + self.lvl = check_lvl(lvl); + self + } + + pub fn add_xp(mut self) -> Cryp { + self.xp = self.xp.saturating_add(1); + if self.xp.is_power_of_two() { + return self.level_up(); + } + self + } + + pub fn level_up(mut self) -> Cryp { + self.lvl = self.lvl.saturating_add(1); + self.finish() + } + + pub fn finish(mut self) -> Cryp { + let mut rng = thread_rng(); + let lvl_as_two_pwr = 2_u64.pow(self.lvl.into()); + let max = match self.lvl == 64 { + true => u64::max_value(), + false => lvl_as_two_pwr, + }; + + self.xp = lvl_as_two_pwr; + + self.dmg = rng.gen_range(1, max); + self.def = rng.gen_range(1, max); + self.stam = rng.gen_range(1, max); + self } } diff --git a/src/lib.rs b/src/lib.rs index 08333a7d..c8b05fc3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,7 +36,6 @@ struct Roll { struct Encounter { mob: Cryp, success: bool, - xp_gain: u64, } @@ -56,23 +55,19 @@ fn print_roll(r: &Roll) { } fn cryp_turn(c: &Cryp) -> Turn { - println!("{:?}'s turn:", c.name); + // println!("{:?}'s turn:", c.name); let dmg = att_roll(c.dmg, Attribute::Dmg); let def = att_roll(c.def, Attribute::Def); - print_roll(&dmg); - print_roll(&def); + // print_roll(&dmg); + // print_roll(&def); return Turn { dmg, def } } fn assign_dmg(plr: &Cryp, opp: &Cryp, plr_t: &Turn, opp_t: &Turn) -> Cryp { - let final_dmg = match opp_t.dmg.result.checked_sub(plr_t.def.result) { - Some(v) => v, - None => 0, - }; - - let blocked = opp_t.dmg.result.checked_sub(final_dmg).expect("damage weird"); + let final_dmg = opp_t.dmg.result.saturating_sub(plr_t.def.result); + let blocked = opp_t.dmg.result.saturating_sub(final_dmg); println!("{:?} deals {:?} dmg to {:?} ({:?} blocked)" ,opp.name @@ -83,10 +78,7 @@ fn assign_dmg(plr: &Cryp, opp: &Cryp, plr_t: &Turn, opp_t: &Turn) -> Cryp { return Cryp { dmg: plr.dmg, def: plr.def, - stam: match plr.stam.checked_sub(final_dmg) { - Some(v) => v, - None => 0, - }, + stam: plr.stam.saturating_sub(final_dmg), xp: plr.xp, lvl: plr.lvl, id: plr.id, @@ -109,12 +101,12 @@ fn battle(a: &Cryp, b: &Cryp) -> Vec { b.clone() ]; - println!("battle:",); - println!("{:?}", cryps[0]); - println!("{:?}", cryps[1]); + // println!("battle:",); + // println!("{:?}", cryps[0]); + // println!("{:?}", cryps[1]); loop { let combat = combat_phase(&cryps[0], &cryps[1]); - println!("{:?}", combat); + // println!("{:?}", combat); if combat.iter().any(|c| c.stam == 0) { return combat; } @@ -126,50 +118,57 @@ fn pve(plr: &Cryp) -> Encounter { let mut rng = thread_rng(); let mob_lvl: u8 = rng.gen_range(1, plr.lvl); - let mob = Cryp::new("bamboo basher".to_string(), mob_lvl); - let battle = battle(plr, &mob); + let mob = Cryp::new() + .named("bamboo basher".to_string()) + .level(mob_lvl) + .finish(); + let battle = battle(plr, &mob); let win = battle.iter().any(|c| c.id == plr.id && c.stam > 0); if win { return Encounter { - mob, + mob: mob, success: true, - xp_gain: 2, }; } return Encounter { - mob, + mob: mob, success: false, - xp_gain: 0, }; } -fn levelling(c: Cryp) -> Cryp { - let mut plr = c; +fn levelling(mut c: Cryp) -> Cryp { loop { - let enc = pve(&plr); - if plr.lvl == 64 { - println!("{:?} has reached max level", plr.name); - break plr; - } + let enc = pve(&c); if !enc.success { - println!("{:?} has been KO'd", plr.name); - break plr; + println!("{:?} has been KO'd", c.name); + continue; } - println!("{:?} is now level {:?}", plr.name, plr.lvl); - plr = plr.lvl(); - continue; + c = c.add_xp(); + println!("{:?} now has {:?} xp and is lvl {:?}", c.name, c.xp, c.lvl); + if c.lvl == 12 { + break c; + } + + continue; } } pub fn main() { - let a = Cryp::new("pronounced \"creeep\"".to_string(), 8); - let b = Cryp::new("lemongrass tea".to_string(), 8); + let a = Cryp::new() + .named("pronounced \"creeep\"".to_string()) + .level(8) + .finish(); + + let b = Cryp::new() + .named("lemongrass tea".to_string()) + .level(8) + .finish(); let battle = battle(&a, &b); @@ -200,7 +199,10 @@ mod tests { } #[test] fn create_cryp_test() { - let lvl_eight = Cryp::new("hatchling".to_string(), 2); + let lvl_eight = Cryp::new() + .named("hatchling".to_string()) + .level(2) + .finish(); assert!(lvl_eight.dmg <= 2_u64.pow(2)); assert!(lvl_eight.def <= 2_u64.pow(2)); assert!(lvl_eight.stam < 2_u64.pow(2)); @@ -210,7 +212,11 @@ mod tests { #[test] fn pve_test() { - let player = Cryp::new("ca phe sua da".to_string(), 2); + let player = Cryp::new() + .named("ca phe sua da".to_string()) + .level(2) + .finish(); + levelling(player); return; }