Gnome player selection

- provide full 3.4-style player selection, based on tty_player_selection
- generalize selection dialog so it can be used for all 4 prompts
This commit is contained in:
cohrs
2002-03-19 08:27:55 +00:00
parent 49d84cffdb
commit bdfcd6915e
3 changed files with 231 additions and 60 deletions
+207 -35
View File
@@ -115,47 +115,219 @@ void gnome_init_nhwindows(int* argc, char** argv)
void
gnome_player_selection()
{
int num_roles, availcount, i, nRole;
int n, i, sel;
const char** choices;
int* rolemap;
int* pickmap;
/* select a role */
for (num_roles = 0; roles[num_roles].name.m; ++num_roles) continue;
choices = (const char **)alloc(sizeof(char *) * (num_roles+1));
rolemap = (int*)alloc(sizeof(int) * (num_roles + 1));
for (;;) {
availcount = 0;
for (i = 0; i < num_roles; i++) {
if (ok_role(i, flags.initrace, flags.initgend, flags.initalign)) {
choices[availcount] = roles[i].name.m;
if (flags.initgend >= 0 && flags.female && roles[i].name.f)
choices[availcount] = roles[i].name.f;
rolemap[availcount] = i;
++availcount;
/* prevent an unnecessary prompt */
rigid_role_checks();
if (!flags.randomall && flags.initrole < 0) {
/* select a role */
for (n = 0; roles[n].name.m; n++) continue;
choices = (const char **)alloc(sizeof(char *) * (n+1));
pickmap = (int*)alloc(sizeof(int) * (n+1));
for (;;) {
for (n = 0, i = 0; roles[i].name.m; i++) {
if (ok_role(i, flags.initrace,
flags.initgend, flags.initalign)) {
if (flags.initgend >= 0 && flags.female && roles[i].name.f)
choices[n] = roles[i].name.f;
else
choices[n] = roles[i].name.m;
pickmap[n++] = i;
}
}
if (n > 0) break;
else if (flags.initalign >= 0) flags.initalign = -1; /* reset */
else if (flags.initgend >= 0) flags.initgend = -1;
else if (flags.initrace >= 0) flags.initrace = -1;
else panic("no available ROLE+race+gender+alignment combinations");
}
if (availcount > 0) break;
else if (flags.initalign >= 0) flags.initalign = -1; /* reset */
else if (flags.initgend >= 0) flags.initgend = -1;
else if (flags.initrace >= 0) flags.initrace = -1;
else panic("no available ROLE+race+gender+alignment combinations");
}
choices[availcount] = (const char *) 0;
nRole = ghack_player_sel_dialog(choices);
choices[n] = (const char *) 0;
if (n > 1)
sel = ghack_player_sel_dialog(choices,
_("Player selection"), _("Choose one of the following roles:"));
else sel = 0;
if (sel >= 0) sel = pickmap[sel];
else if (sel == ROLE_NONE) { /* Quit */
clearlocks();
gnome_exit_nhwindows(0);
}
free(choices);
free(pickmap);
} else if (flags.initrole < 0) sel = ROLE_RANDOM;
else sel = flags.initrole;
if (nRole == -1) { /* Quit */
clearlocks();
gnome_exit_nhwindows(0);
} else if (nRole == -2) { /* Random role */
nRole = rolemap[rn2(availcount)];
pline("This game you will be %s", an(choices[nRole]));
} else {
nRole = rolemap[nRole];
if (sel == ROLE_RANDOM) { /* Random role */
sel = pick_role(flags.initrace, flags.initgend,
flags.initalign, PICK_RANDOM);
if (sel < 0) sel = randrole();
}
flags.initrole = sel;
/* Select a race, if necessary */
/* force compatibility with role, try for compatibility with
* pre-selected gender/alignment */
if (flags.initrace < 0 || !validrace(flags.initrole, flags.initrace)) {
if (flags.initrace == ROLE_RANDOM || flags.randomall) {
flags.initrace = pick_race(flags.initrole, flags.initgend,
flags.initalign, PICK_RANDOM);
if (flags.initrace < 0) flags.initrace = randrace(flags.initrole);
} else {
/* Count the number of valid races */
n = 0; /* number valid */
for (i = 0; races[i].noun; i++) {
if (ok_race(flags.initrole, i, flags.initgend, flags.initalign))
n++;
}
if (n == 0) {
for (i = 0; races[i].noun; i++) {
if (validrace(flags.initrole, i)) n++;
}
}
choices = (const char **)alloc(sizeof(char *) * (n+1));
pickmap = (int*)alloc(sizeof(int) * (n + 1));
for (n = 0, i = 0; races[i].noun; i++) {
if (ok_race(flags.initrole, i, flags.initgend,
flags.initalign)) {
choices[n] = races[i].noun;
pickmap[n++] = i;
}
}
choices[n] = (const char *) 0;
/* Permit the user to pick, if there is more than one */
if (n > 1)
sel = ghack_player_sel_dialog(choices, _("Race selection"),
_("Choose one of the following races:"));
else sel = 0;
if (sel >= 0) sel = pickmap[sel];
else if (sel == ROLE_NONE) { /* Quit */
clearlocks();
gnome_exit_nhwindows(0);
}
flags.initrace = sel;
free(choices);
free(pickmap);
}
if (flags.initrace == ROLE_RANDOM) { /* Random role */
sel = pick_race(flags.initrole, flags.initgend,
flags.initalign, PICK_RANDOM);
if (sel < 0) sel = randrace(flags.initrole);
flags.initrace = sel;
}
}
/* Select a gender, if necessary */
/* force compatibility with role/race, try for compatibility with
* pre-selected alignment */
if (flags.initgend < 0 ||
!validgend(flags.initrole, flags.initrace, flags.initgend)) {
if (flags.initgend == ROLE_RANDOM || flags.randomall) {
flags.initgend = pick_gend(flags.initrole, flags.initrace,
flags.initalign, PICK_RANDOM);
if (flags.initgend < 0)
flags.initgend = randgend(flags.initrole, flags.initrace);
} else {
/* Count the number of valid genders */
n = 0; /* number valid */
for (i = 0; i < ROLE_GENDERS; i++) {
if (ok_gend(flags.initrole, flags.initrace, i, flags.initalign))
n++;
}
if (n == 0) {
for (i = 0; i < ROLE_GENDERS; i++) {
if (validgend(flags.initrole, flags.initrace, i)) n++;
}
}
choices = (const char **)alloc(sizeof(char *) * (n+1));
pickmap = (int*)alloc(sizeof(int) * (n + 1));
for (n = 0, i = 0; i < ROLE_GENDERS; i++) {
if (ok_gend(flags.initrole, flags.initrace, i,
flags.initalign)) {
choices[n] = genders[i].adj;
pickmap[n++] = i;
}
}
choices[n] = (const char *) 0;
/* Permit the user to pick, if there is more than one */
if (n > 1)
sel = ghack_player_sel_dialog(choices, _("Gender selection"),
_("Choose one of the following genders:"));
else sel = 0;
if (sel >= 0) sel = pickmap[sel];
else if (sel == ROLE_NONE) { /* Quit */
clearlocks();
gnome_exit_nhwindows(0);
}
flags.initgend = sel;
free(choices);
free(pickmap);
}
if (flags.initgend == ROLE_RANDOM) { /* Random gender */
sel = pick_gend(flags.initrole, flags.initrace,
flags.initalign, PICK_RANDOM);
if (sel < 0) sel = randgend(flags.initrole, flags.initrace);
flags.initgend = sel;
}
}
/* Select an alignment, if necessary */
/* force compatibility with role/race/gender */
if (flags.initalign < 0 ||
!validalign(flags.initrole, flags.initrace, flags.initalign)) {
if (flags.initalign == ROLE_RANDOM || flags.randomall) {
flags.initalign = pick_align(flags.initrole, flags.initrace,
flags.initgend, PICK_RANDOM);
if (flags.initalign < 0)
flags.initalign = randalign(flags.initrole, flags.initrace);
} else {
/* Count the number of valid alignments */
n = 0; /* number valid */
for (i = 0; i < ROLE_ALIGNS; i++) {
if (ok_align(flags.initrole, flags.initrace, flags.initgend, i))
n++;
}
if (n == 0) {
for (i = 0; i < ROLE_ALIGNS; i++)
if (validalign(flags.initrole, flags.initrace, i)) n++;
}
choices = (const char **)alloc(sizeof(char *) * (n+1));
pickmap = (int*)alloc(sizeof(int) * (n + 1));
for (n = 0, i = 0; i < ROLE_ALIGNS; i++) {
if (ok_align(flags.initrole,
flags.initrace, flags.initgend, i)) {
choices[n] = aligns[i].adj;
pickmap[n++] = i;
}
}
choices[n] = (const char *) 0;
/* Permit the user to pick, if there is more than one */
if (n > 1)
sel = ghack_player_sel_dialog(choices, _("Alignment selection"),
_("Choose one of the following alignments:"));
else sel = 0;
if (sel >= 0) sel = pickmap[sel];
else if (sel == ROLE_NONE) { /* Quit */
clearlocks();
gnome_exit_nhwindows(0);
}
flags.initalign = sel;
free(choices);
free(pickmap);
}
if (flags.initalign == ROLE_RANDOM) {
sel = pick_align(flags.initrole, flags.initrace,
flags.initgend, PICK_RANDOM);
if (sel < 0) sel = randalign(flags.initrole, flags.initrace);
flags.initalign = sel;
}
}
flags.initrole = nRole;
free(choices);
free(rolemap);
}