random_table.rs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. use rltk::RandomNumberGenerator;
  2. pub struct RandomEntry {
  3. name : String,
  4. weight : i32
  5. }
  6. impl RandomEntry {
  7. pub fn new<S:ToString>(name: S, weight: i32) -> RandomEntry {
  8. RandomEntry{ name: name.to_string(), weight }
  9. }
  10. }
  11. #[derive(Default)]
  12. pub struct RandomTable {
  13. entries : Vec<RandomEntry>,
  14. total_weight : i32
  15. }
  16. impl RandomTable {
  17. pub fn new() -> RandomTable {
  18. RandomTable{ entries: Vec::new(), total_weight: 0 }
  19. }
  20. pub fn add<S:ToString>(mut self, name : S, weight: i32) -> RandomTable {
  21. self.total_weight += weight;
  22. self.entries.push(RandomEntry::new(name.to_string(), weight));
  23. self
  24. }
  25. pub fn roll(&self, rng : &mut RandomNumberGenerator) -> String {
  26. if self.total_weight == 0 { return "None".to_string(); }
  27. let mut roll = rng.roll_dice(1, self.total_weight)-1;
  28. let mut index : usize = 0;
  29. while roll > 0 {
  30. if roll < self.entries[index].weight {
  31. return self.entries[index].name.clone();
  32. }
  33. roll -= self.entries[index].weight;
  34. index += 1;
  35. }
  36. "None".to_string()
  37. }
  38. }