move apply damage onto cryp struct
This commit is contained in:
parent
9ea8361ba9
commit
c42bc386dd
85
src/combat.rs
Normal file → Executable file
85
src/combat.rs
Normal file → Executable file
@ -1,13 +1,13 @@
|
|||||||
use rand::prelude::*;
|
use rand::prelude::*;
|
||||||
use cryp::Cryp;
|
use cryp::Cryp;
|
||||||
|
|
||||||
struct Turn {
|
pub struct Turn {
|
||||||
dmg: Roll,
|
pub dmg: Roll,
|
||||||
def: Roll,
|
pub def: Roll,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Attribute {
|
pub enum Attribute {
|
||||||
Dmg,
|
Dmg,
|
||||||
Def,
|
Def,
|
||||||
}
|
}
|
||||||
@ -21,22 +21,23 @@ enum Attribute {
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
struct Roll {
|
pub struct Roll {
|
||||||
value: u64,
|
pub value: u64,
|
||||||
roll: u64,
|
pub roll: u64,
|
||||||
result: u64,
|
pub result: u64,
|
||||||
att: Attribute
|
pub att: Attribute
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Encounter {
|
struct Encounter {
|
||||||
mob: Cryp,
|
mob: Cryp,
|
||||||
success: bool,
|
success: bool,
|
||||||
|
player: Cryp,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn att_roll(value: u64, att: Attribute) -> Roll {
|
fn att_roll(value: u64, att: Attribute) -> Roll {
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
let roll: u64 = rng.gen();
|
let roll: u64 = rng.gen();
|
||||||
return Roll { att, value, roll, result: value ^ roll };
|
return Roll { att, value, roll, result: value & roll };
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_roll(r: &Roll) {
|
fn print_roll(r: &Roll) {
|
||||||
@ -58,58 +59,26 @@ fn cryp_turn(c: &Cryp) -> Turn {
|
|||||||
return Turn { dmg, def }
|
return Turn { dmg, def }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn assign_dmg(plr: &Cryp, opp: &Cryp, plr_t: &Turn, opp_t: &Turn) -> Cryp {
|
pub fn battle(mut a: Cryp, mut b: Cryp) -> (Cryp, Cryp) {
|
||||||
let final_dmg = opp_t.dmg.result.saturating_sub(plr_t.def.result);
|
|
||||||
let blocked = opp_t.dmg.result.saturating_sub(final_dmg);
|
|
||||||
let new_stam = plr.stam.saturating_sub(final_dmg);
|
|
||||||
|
|
||||||
println!("{:?} deals {:?} dmg to {:?} ({:?} blocked / {:?} hp remaining)"
|
|
||||||
,opp.name
|
|
||||||
,final_dmg
|
|
||||||
,plr.name
|
|
||||||
,blocked
|
|
||||||
,new_stam);
|
|
||||||
|
|
||||||
return Cryp {
|
|
||||||
dmg: plr.dmg,
|
|
||||||
def: plr.def,
|
|
||||||
stam: new_stam,
|
|
||||||
xp: plr.xp,
|
|
||||||
lvl: plr.lvl,
|
|
||||||
id: plr.id,
|
|
||||||
name: plr.name.clone()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
fn combat_phase(a: &Cryp, b: &Cryp) -> Vec<Cryp> {
|
|
||||||
let a_turn = cryp_turn(&a);
|
|
||||||
let b_turn = cryp_turn(&b);
|
|
||||||
return vec![
|
|
||||||
assign_dmg(&a, &b, &a_turn, &b_turn),
|
|
||||||
assign_dmg(&b, &a, &b_turn, &a_turn),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn battle(a: &Cryp, b: &Cryp) -> Vec<Cryp> {
|
|
||||||
let mut cryps = vec![
|
|
||||||
a.clone(),
|
|
||||||
b.clone()
|
|
||||||
];
|
|
||||||
|
|
||||||
// println!("battle:",);
|
// println!("battle:",);
|
||||||
// println!("{:?}", cryps[0]);
|
// println!("{:?}", cryps[0]);
|
||||||
// println!("{:?}", cryps[1]);
|
// println!("{:?}", cryps[1]);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let combat = combat_phase(&cryps[0], &cryps[1]);
|
let a_turn = cryp_turn(&a);
|
||||||
|
let b_turn = cryp_turn(&b);
|
||||||
|
|
||||||
|
a = a.assign_dmg(&b, &a_turn, &b_turn);
|
||||||
|
b = b.assign_dmg(&a, &b_turn, &a_turn);
|
||||||
// println!("{:?}", combat);
|
// println!("{:?}", combat);
|
||||||
if combat.iter().any(|c| c.stam == 0) {
|
|
||||||
return combat;
|
if vec![&a, &b].iter().any(|c| c.hp == 0) {
|
||||||
|
break (a, b);
|
||||||
}
|
}
|
||||||
cryps = combat;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pve(plr: &Cryp) -> Encounter {
|
fn pve(plr: Cryp) -> Encounter {
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
let mob_lvl: u8 = rng.gen_range(1, plr.lvl);
|
let mob_lvl: u8 = rng.gen_range(1, plr.lvl);
|
||||||
|
|
||||||
@ -118,25 +87,29 @@ fn pve(plr: &Cryp) -> Encounter {
|
|||||||
.level(mob_lvl)
|
.level(mob_lvl)
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
let battle = battle(plr, &mob);
|
// have to reassign here because battle takes ownership
|
||||||
let win = battle.iter().any(|c| c.id == plr.id && c.stam > 0);
|
let (plr, mob) = battle(plr, mob);
|
||||||
|
let win = vec![&plr, &mob].iter().any(|c| c.id == plr.id && c.hp > 0);
|
||||||
|
|
||||||
if win {
|
if win {
|
||||||
return Encounter {
|
return Encounter {
|
||||||
mob: mob,
|
mob: mob,
|
||||||
success: true,
|
success: true,
|
||||||
|
player: plr,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return Encounter {
|
return Encounter {
|
||||||
mob: mob,
|
mob: mob,
|
||||||
success: false,
|
success: false,
|
||||||
|
player: plr,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn levelling(mut c: Cryp) -> Cryp {
|
pub fn levelling(mut c: Cryp) -> Cryp {
|
||||||
loop {
|
loop {
|
||||||
let enc = pve(&c);
|
let enc = pve(c);
|
||||||
|
c = enc.player;
|
||||||
|
|
||||||
if !enc.success {
|
if !enc.success {
|
||||||
println!("{:?} has been KO'd", c.name);
|
println!("{:?} has been KO'd", c.name);
|
||||||
|
|||||||
22
src/cryp.rs
Normal file → Executable file
22
src/cryp.rs
Normal file → Executable file
@ -1,6 +1,8 @@
|
|||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
use rand::prelude::*;
|
use rand::prelude::*;
|
||||||
|
|
||||||
|
use combat::{Turn};
|
||||||
|
|
||||||
#[derive(Debug,Clone)]
|
#[derive(Debug,Clone)]
|
||||||
pub struct Cryp {
|
pub struct Cryp {
|
||||||
pub id: Uuid,
|
pub id: Uuid,
|
||||||
@ -9,6 +11,7 @@ pub struct Cryp {
|
|||||||
pub dmg: u64,
|
pub dmg: u64,
|
||||||
pub def: u64,
|
pub def: u64,
|
||||||
pub stam: u64,
|
pub stam: u64,
|
||||||
|
pub hp: u64,
|
||||||
pub xp: u64,
|
pub xp: u64,
|
||||||
pub lvl: u8,
|
pub lvl: u8,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
@ -27,6 +30,7 @@ impl Cryp {
|
|||||||
dmg: 0,
|
dmg: 0,
|
||||||
def: 0,
|
def: 0,
|
||||||
stam: 0,
|
stam: 0,
|
||||||
|
hp: 0,
|
||||||
lvl: 0,
|
lvl: 0,
|
||||||
xp: 0,
|
xp: 0,
|
||||||
name: String::new()
|
name: String::new()
|
||||||
@ -69,8 +73,26 @@ impl Cryp {
|
|||||||
self.dmg = rng.gen_range(1, max);
|
self.dmg = rng.gen_range(1, max);
|
||||||
self.def = rng.gen_range(1, max);
|
self.def = rng.gen_range(1, max);
|
||||||
self.stam = rng.gen_range(1, max);
|
self.stam = rng.gen_range(1, max);
|
||||||
|
self.hp = self.stam;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn assign_dmg(mut self, opp: &Cryp, plr_t: &Turn, opp_t: &Turn) -> Cryp {
|
||||||
|
let final_dmg = opp_t.dmg.result.saturating_sub(plr_t.def.result);
|
||||||
|
let blocked = opp_t.dmg.result.saturating_sub(final_dmg);
|
||||||
|
let hp = self.hp.saturating_sub(final_dmg);
|
||||||
|
|
||||||
|
println!("{:?} deals {:?} dmg to {:?} ({:?} blocked / {:?} hp remaining)"
|
||||||
|
,opp.name
|
||||||
|
,final_dmg
|
||||||
|
,self.name
|
||||||
|
,blocked
|
||||||
|
,hp);
|
||||||
|
|
||||||
|
self.hp = hp;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
40
src/lib.rs
Normal file → Executable file
40
src/lib.rs
Normal file → Executable file
@ -8,30 +8,30 @@ use combat::{battle, levelling};
|
|||||||
use cryp::Cryp;
|
use cryp::Cryp;
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
let a = Cryp::new()
|
// let a = Cryp::new()
|
||||||
.named("pronounced \"creeep\"".to_string())
|
// .named("pronounced \"creeep\"".to_string())
|
||||||
.level(8)
|
// .level(8)
|
||||||
.create();
|
// .create();
|
||||||
|
|
||||||
let b = Cryp::new()
|
// let b = Cryp::new()
|
||||||
.named("lemongrass tea".to_string())
|
// .named("lemongrass tea".to_string())
|
||||||
.level(8)
|
// .level(8)
|
||||||
.create();
|
// .create();
|
||||||
|
|
||||||
let battle = battle(&a, &b);
|
// let battle = battle(a, b);
|
||||||
|
// let b_vec = vec!(battle.0, battle.1);
|
||||||
|
// let draw = b_vec.iter().all(|c| c.hp == 0);
|
||||||
|
// if draw {
|
||||||
|
// println!("{:?} was a draw", battle);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
let draw = battle.iter().all(|c| c.stam == 0);
|
// let winner = match b_vec.iter().find(|c| c.hp > 0) {
|
||||||
if draw {
|
// Some(w) => w,
|
||||||
println!("{:?} was a draw", battle);
|
// None => panic!("no winner found {:?}", battle),
|
||||||
return;
|
// };
|
||||||
}
|
|
||||||
|
|
||||||
let winner = match battle.iter().find(|c| c.stam > 0) {
|
// println!("{:?} is the winner with {:?} hp remaining", winner.name, winner.hp);
|
||||||
Some(w) => w,
|
|
||||||
None => panic!("no winner found {:?}", battle),
|
|
||||||
};
|
|
||||||
|
|
||||||
println!("{:?} is the winner with {:?} hp remaining", winner.name, winner.stam);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user