diff options
author | Bardur Arantsson <bardur@scientician.net> | 2017-06-13 18:24:42 +0200 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2017-06-13 18:24:42 +0200 |
commit | 11041734794444255bcf4d5e9041bf3f13c14f2d (patch) | |
tree | 134a34e2ca58197b4cc688bba480906bfe22f5f7 /src | |
parent | dc8fa8a9232fa02be448db269d97a2e15e5e7cb5 (diff) |
Fix a potential infinite loop using random race modifier choice
Diffstat (limited to 'src')
-rw-r--r-- | src/birth.cc | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/birth.cc b/src/birth.cc index d880f443..77ff56f3 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -1537,11 +1537,19 @@ static bool_ player_birth_aux_ask() if (c == 'S') return (FALSE); if (c == '*') { - do - { - k = rand_int(max_racem); + // Which choices are legal? + std::vector<int> valid_choices(max_racem); + for (int i = 0; i < max_racem; i++) { + if ((BIT(racem[i]) & rmp_ptr->choice[racem[i] / 32])) + { + valid_choices.push_back(i); + } } - while (!(BIT(racem[k]) & rmp_ptr->choice[racem[k] / 32])); + + // Choose + assert(!valid_choices.empty()); + k = *uniform_element(valid_choices); + break; } else if (c == '?') |