summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/birth.cc16
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 == '?')