WI-1: injectable RNG - request_rng() single construction point (StdRng::from_os_rng), thread rng through create_character and run_adventure, seeded determinism test (PSP1, issue #1)
This commit is contained in:
parent
64e081aeb7
commit
61fef27917
2 changed files with 44 additions and 7 deletions
|
|
@ -126,10 +126,15 @@ pub fn training_cost(stat: i64) -> i32 {
|
|||
(5.0_f64 * 1.3_f64.powi(scaled)) as i32
|
||||
}
|
||||
|
||||
pub fn create_character(user_id: u32, name: String, race: Race, class: Class) -> Character {
|
||||
let mut rng = rand::rng();
|
||||
pub fn create_character(
|
||||
rng: &mut impl rand::Rng,
|
||||
user_id: u32,
|
||||
name: String,
|
||||
race: Race,
|
||||
class: Class,
|
||||
) -> Character {
|
||||
let class_str = class.as_str().to_string();
|
||||
let stats = roll_stats(&mut rng, &race);
|
||||
let stats = roll_stats(rng, &race);
|
||||
let max_hp = calc_max_hp(&class, &stats);
|
||||
let max_energy = calc_max_energy(&class);
|
||||
let max_nerve = calc_max_nerve(&class);
|
||||
|
|
@ -412,4 +417,28 @@ mod tests {
|
|||
assert!(dwarf.strength > human.strength);
|
||||
assert!(dwarf.intelligence < human.intelligence);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn create_character_is_deterministic_under_seeded_rng() {
|
||||
use rand::SeedableRng;
|
||||
let first = create_character(
|
||||
&mut rand::rngs::StdRng::seed_from_u64(42),
|
||||
7,
|
||||
"Twin".into(),
|
||||
Race::Human,
|
||||
Class::Warrior,
|
||||
);
|
||||
let second = create_character(
|
||||
&mut rand::rngs::StdRng::seed_from_u64(42),
|
||||
7,
|
||||
"Twin".into(),
|
||||
Race::Human,
|
||||
Class::Warrior,
|
||||
);
|
||||
assert_eq!(format!("{:?}", first.stats), format!("{:?}", second.stats));
|
||||
assert_eq!(first.hp, second.hp);
|
||||
assert_eq!(first.max_hp, second.max_hp);
|
||||
assert_eq!(first.energy, second.energy);
|
||||
assert_eq!(first.nerve, second.nerve);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue