amethyst / rustrogueliketutorial

Roguelike Tutorial in Rust - using RLTK
MIT License
903 stars 156 forks source link

RandomTable.roll() returning None fairly freqently. #205

Open ThePhantomLemon opened 1 year ago

ThePhantomLemon commented 1 year ago

To see the problem in action, get to a random map from chapter 45 on-wards. The message "WARNING: We don't know how to spawn [None]!" should show up a number of times in the log.

Currently, whenever you roll 0, or exactly the sum of a number of item weights, nothing is spawned. For example, if the first few items are weighted at [1,3,2,3,1...], then roll() would return "None" if the rng hits 0,1,4,6,9 or 10. I'm assuming this is unintended behavior, but you can see pretty clearly why this happens in the code:

while roll > 0 {
  if roll < self.entries[index].weight {
    return self.entries[index].name.clone();
 }

  roll -= self.entries[index].weight;
  index += 1;
}

There are two easy fixes that I can see. Both effectively just looping more:

while roll >= 0 { ...

or

while index < self.entries.len() { ..
Adrijan127 commented 1 year ago

I think not subtracting one from the roll and using: if roll <= self.entries[index].weight { return self.entries[index].name.clone() } instead of if roll < self.entries[index].weight { return self.entries[index].name.clone() } should result in the intended behavior.