static void mswin_main_loop(void);
static BOOL initMapTiles(void);
static void mswin_color_from_string(char *colorstring, HBRUSH* brushptr, COLORREF *colorptr);
+static void prompt_for_player_selection(void);
#define TOTAL_BRUSHES 10
HBRUSH brush_table[TOTAL_BRUSHES];
WC_INVERSE|WC_SCROLL_MARGIN|WC_MAP_MODE|
WC_FONT_MESSAGE|WC_FONT_STATUS|WC_FONT_MENU|WC_FONT_TEXT|
WC_FONTSIZ_MESSAGE|WC_FONTSIZ_STATUS|WC_FONTSIZ_MENU|WC_FONTSIZ_TEXT|
- WC_TILE_WIDTH|WC_TILE_HEIGHT|WC_TILE_FILE|WC_VARY_MSGCOUNT|WC_WINDOWCOLORS,
+ WC_TILE_WIDTH|WC_TILE_HEIGHT|WC_TILE_FILE|WC_VARY_MSGCOUNT|
+ WC_WINDOWCOLORS|WC_PLAYER_SELECTION|WC_SPLASH_SCREEN,
mswin_init_nhwindows,
mswin_player_selection,
mswin_askname,
mswin_color_from_string(iflags.wc_backgrnd_status, &status_bg_brush, &status_bg_color);
mswin_color_from_string(iflags.wc_backgrnd_text, &text_bg_brush, &text_bg_color);
- mswin_display_splash_window();
+ if (iflags.wc_splash_screen) mswin_display_splash_window();
iflags.window_inited = TRUE;
}
logDebug("mswin_player_selection()\n");
- /* pick player type randomly (use pre-selected role/race/gender/alignment) */
- if( flags.randomall ) {
+ if (iflags.wc_player_selection == VIA_DIALOG) {
+ /* pick player type randomly (use pre-selected role/race/gender/alignment) */
+ if( flags.randomall ) {
if (flags.initrole < 0) {
flags.initrole = pick_role(flags.initrace, flags.initgend,
flags.initalign, PICK_RANDOM);
flags.initalign = randalign(flags.initrole, flags.initrace);
}
}
- } else {
+ } else {
/* select a role */
if( mswin_player_selection_window( &nRole ) == IDCANCEL ) {
bail(0);
}
+ }
+ } else { /* iflags.wc_player_selection == VIA_PROMPTS */
+ prompt_for_player_selection();
}
}
+void prompt_for_player_selection(void)
+{
+ int i, k, n;
+ char pick4u = 'n', thisch, lastch = 0;
+ char pbuf[QBUFSZ], plbuf[QBUFSZ];
+ winid win;
+ anything any;
+ menu_item *selected = 0;
+ DWORD box_result;
+
+ logDebug("prompt_for_player_selection()\n");
+
+ /* prevent an unnecessary prompt */
+ rigid_role_checks();
+
+ /* Should we randomly pick for the player? */
+ if (!flags.randomall &&
+ (flags.initrole == ROLE_NONE || flags.initrace == ROLE_NONE ||
+ flags.initgend == ROLE_NONE || flags.initalign == ROLE_NONE)) {
+ /* int echoline; */
+ char *prompt = build_plselection_prompt(pbuf, QBUFSZ, flags.initrole,
+ flags.initrace, flags.initgend, flags.initalign);
+
+ /* tty_putstr(BASE_WINDOW, 0, ""); */
+ /* echoline = wins[BASE_WINDOW]->cury; */
+ box_result = MessageBox(NULL, prompt, TEXT("NetHack for Windows"),
+ MB_YESNOCANCEL | MB_DEFBUTTON1);
+ pick4u = (box_result == IDYES) ? 'y' : (box_result == IDNO) ? 'n' : '\033';
+ /* tty_putstr(BASE_WINDOW, 0, prompt); */
+ do {
+ /* pick4u = lowc(readchar()); */
+ if (index(quitchars, pick4u)) pick4u = 'y';
+ } while(!index(ynqchars, pick4u));
+ if ((int)strlen(prompt) + 1 < CO) {
+ /* Echo choice and move back down line */
+ /* tty_putsym(BASE_WINDOW, (int)strlen(prompt)+1, echoline, pick4u); */
+ /* tty_putstr(BASE_WINDOW, 0, ""); */
+ } else
+ /* Otherwise it's hard to tell where to echo, and things are
+ * wrapping a bit messily anyway, so (try to) make sure the next
+ * question shows up well and doesn't get wrapped at the
+ * bottom of the window.
+ */
+ /* tty_clear_nhwindow(BASE_WINDOW) */ ;
+
+ if (pick4u != 'y' && pick4u != 'n') {
+give_up: /* Quit */
+ if (selected) free((genericptr_t) selected);
+ bail((char *)0);
+ /*NOTREACHED*/
+ return;
+ }
+ }
+
+ (void) root_plselection_prompt(plbuf, QBUFSZ - 1,
+ flags.initrole, flags.initrace, flags.initgend, flags.initalign);
+
+ /* Select a role, if necessary */
+ /* we'll try to be compatible with pre-selected race/gender/alignment,
+ * but may not succeed */
+ if (flags.initrole < 0) {
+ char rolenamebuf[QBUFSZ];
+ /* Process the choice */
+ if (pick4u == 'y' || flags.initrole == ROLE_RANDOM || flags.randomall) {
+ /* Pick a random role */
+ flags.initrole = pick_role(flags.initrace, flags.initgend,
+ flags.initalign, PICK_RANDOM);
+ if (flags.initrole < 0) {
+ /* tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); */
+ flags.initrole = randrole();
+ }
+ } else {
+ /* tty_clear_nhwindow(BASE_WINDOW); */
+ /* tty_putstr(BASE_WINDOW, 0, "Choosing Character's Role"); */
+ /* Prompt for a role */
+ win = create_nhwindow(NHW_MENU);
+ start_menu(win);
+ any.a_void = 0; /* zero out all bits */
+ for (i = 0; roles[i].name.m; i++) {
+ if (ok_role(i, flags.initrace, flags.initgend,
+ flags.initalign)) {
+ any.a_int = i+1; /* must be non-zero */
+ thisch = lowc(roles[i].name.m[0]);
+ if (thisch == lastch) thisch = highc(thisch);
+ if (flags.initgend != ROLE_NONE && flags.initgend != ROLE_RANDOM) {
+ if (flags.initgend == 1 && roles[i].name.f)
+ Strcpy(rolenamebuf, roles[i].name.f);
+ else
+ Strcpy(rolenamebuf, roles[i].name.m);
+ } else {
+ if (roles[i].name.f) {
+ Strcpy(rolenamebuf, roles[i].name.m);
+ Strcat(rolenamebuf, "/");
+ Strcat(rolenamebuf, roles[i].name.f);
+ } else
+ Strcpy(rolenamebuf, roles[i].name.m);
+ }
+ add_menu(win, NO_GLYPH, &any, thisch,
+ 0, ATR_NONE, an(rolenamebuf), MENU_UNSELECTED);
+ lastch = thisch;
+ }
+ }
+ any.a_int = pick_role(flags.initrace, flags.initgend,
+ flags.initalign, PICK_RANDOM)+1;
+ if (any.a_int == 0) /* must be non-zero */
+ any.a_int = randrole()+1;
+ add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE,
+ "Random", MENU_UNSELECTED);
+ any.a_int = i+1; /* must be non-zero */
+ add_menu(win, NO_GLYPH, &any , 'q', 0, ATR_NONE,
+ "Quit", MENU_UNSELECTED);
+ Sprintf(pbuf, "Pick a role for your %s", plbuf);
+ end_menu(win, pbuf);
+ n = select_menu(win, PICK_ONE, &selected);
+ destroy_nhwindow(win);
+
+ /* Process the choice */
+ if (n != 1 || selected[0].item.a_int == any.a_int)
+ goto give_up; /* Selected quit */
+
+ flags.initrole = selected[0].item.a_int - 1;
+ free((genericptr_t) selected), selected = 0;
+ }
+ (void) root_plselection_prompt(plbuf, QBUFSZ - 1,
+ flags.initrole, flags.initrace, flags.initgend, flags.initalign);
+ }
+
+ /* 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)) {
+ /* pre-selected race not valid */
+ if (pick4u == 'y' || flags.initrace == ROLE_RANDOM || flags.randomall) {
+ flags.initrace = pick_race(flags.initrole, flags.initgend,
+ flags.initalign, PICK_RANDOM);
+ if (flags.initrace < 0) {
+ /* tty_putstr(BASE_WINDOW, 0, "Incompatible race!"); */
+ flags.initrace = randrace(flags.initrole);
+ }
+ } else { /* pick4u == 'n' */
+ /* Count the number of valid races */
+ n = 0; /* number valid */
+ k = 0; /* valid race */
+ for (i = 0; races[i].noun; i++) {
+ if (ok_race(flags.initrole, i, flags.initgend,
+ flags.initalign)) {
+ n++;
+ k = i;
+ }
+ }
+ if (n == 0) {
+ for (i = 0; races[i].noun; i++) {
+ if (validrace(flags.initrole, i)) {
+ n++;
+ k = i;
+ }
+ }
+ }
+
+ /* Permit the user to pick, if there is more than one */
+ if (n > 1) {
+ /* tty_clear_nhwindow(BASE_WINDOW); */
+ /* tty_putstr(BASE_WINDOW, 0, "Choosing Race"); */
+ win = create_nhwindow(NHW_MENU);
+ start_menu(win);
+ any.a_void = 0; /* zero out all bits */
+ for (i = 0; races[i].noun; i++)
+ if (ok_race(flags.initrole, i, flags.initgend,
+ flags.initalign)) {
+ any.a_int = i+1; /* must be non-zero */
+ add_menu(win, NO_GLYPH, &any, races[i].noun[0],
+ 0, ATR_NONE, races[i].noun, MENU_UNSELECTED);
+ }
+ any.a_int = pick_race(flags.initrole, flags.initgend,
+ flags.initalign, PICK_RANDOM)+1;
+ if (any.a_int == 0) /* must be non-zero */
+ any.a_int = randrace(flags.initrole)+1;
+ add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE,
+ "Random", MENU_UNSELECTED);
+ any.a_int = i+1; /* must be non-zero */
+ add_menu(win, NO_GLYPH, &any , 'q', 0, ATR_NONE,
+ "Quit", MENU_UNSELECTED);
+ Sprintf(pbuf, "Pick the race of your %s", plbuf);
+ end_menu(win, pbuf);
+ n = select_menu(win, PICK_ONE, &selected);
+ destroy_nhwindow(win);
+ if (n != 1 || selected[0].item.a_int == any.a_int)
+ goto give_up; /* Selected quit */
+
+ k = selected[0].item.a_int - 1;
+ free((genericptr_t) selected), selected = 0;
+ }
+ flags.initrace = k;
+ }
+ (void) root_plselection_prompt(plbuf, QBUFSZ - 1,
+ flags.initrole, flags.initrace, flags.initgend, flags.initalign);
+ }
+
+ /* 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)) {
+ /* pre-selected gender not valid */
+ if (pick4u == 'y' || flags.initgend == ROLE_RANDOM || flags.randomall) {
+ flags.initgend = pick_gend(flags.initrole, flags.initrace,
+ flags.initalign, PICK_RANDOM);
+ if (flags.initgend < 0) {
+ /* tty_putstr(BASE_WINDOW, 0, "Incompatible gender!"); */
+ flags.initgend = randgend(flags.initrole, flags.initrace);
+ }
+ } else { /* pick4u == 'n' */
+ /* Count the number of valid genders */
+ n = 0; /* number valid */
+ k = 0; /* valid gender */
+ for (i = 0; i < ROLE_GENDERS; i++) {
+ if (ok_gend(flags.initrole, flags.initrace, i,
+ flags.initalign)) {
+ n++;
+ k = i;
+ }
+ }
+ if (n == 0) {
+ for (i = 0; i < ROLE_GENDERS; i++) {
+ if (validgend(flags.initrole, flags.initrace, i)) {
+ n++;
+ k = i;
+ }
+ }
+ }
+
+ /* Permit the user to pick, if there is more than one */
+ if (n > 1) {
+ /* tty_clear_nhwindow(BASE_WINDOW); */
+ /* tty_putstr(BASE_WINDOW, 0, "Choosing Gender"); */
+ win = create_nhwindow(NHW_MENU);
+ start_menu(win);
+ any.a_void = 0; /* zero out all bits */
+ for (i = 0; i < ROLE_GENDERS; i++)
+ if (ok_gend(flags.initrole, flags.initrace, i,
+ flags.initalign)) {
+ any.a_int = i+1;
+ add_menu(win, NO_GLYPH, &any, genders[i].adj[0],
+ 0, ATR_NONE, genders[i].adj, MENU_UNSELECTED);
+ }
+ any.a_int = pick_gend(flags.initrole, flags.initrace,
+ flags.initalign, PICK_RANDOM)+1;
+ if (any.a_int == 0) /* must be non-zero */
+ any.a_int = randgend(flags.initrole, flags.initrace)+1;
+ add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE,
+ "Random", MENU_UNSELECTED);
+ any.a_int = i+1; /* must be non-zero */
+ add_menu(win, NO_GLYPH, &any , 'q', 0, ATR_NONE,
+ "Quit", MENU_UNSELECTED);
+ Sprintf(pbuf, "Pick the gender of your %s", plbuf);
+ end_menu(win, pbuf);
+ n = select_menu(win, PICK_ONE, &selected);
+ destroy_nhwindow(win);
+ if (n != 1 || selected[0].item.a_int == any.a_int)
+ goto give_up; /* Selected quit */
+
+ k = selected[0].item.a_int - 1;
+ free((genericptr_t) selected), selected = 0;
+ }
+ flags.initgend = k;
+ }
+ (void) root_plselection_prompt(plbuf, QBUFSZ - 1,
+ flags.initrole, flags.initrace, flags.initgend, flags.initalign);
+ }
+
+ /* Select an alignment, if necessary */
+ /* force compatibility with role/race/gender */
+ if (flags.initalign < 0 || !validalign(flags.initrole, flags.initrace,
+ flags.initalign)) {
+ /* pre-selected alignment not valid */
+ if (pick4u == 'y' || flags.initalign == ROLE_RANDOM || flags.randomall) {
+ flags.initalign = pick_align(flags.initrole, flags.initrace,
+ flags.initgend, PICK_RANDOM);
+ if (flags.initalign < 0) {
+ /* tty_putstr(BASE_WINDOW, 0, "Incompatible alignment!"); */
+ flags.initalign = randalign(flags.initrole, flags.initrace);
+ }
+ } else { /* pick4u == 'n' */
+ /* Count the number of valid alignments */
+ n = 0; /* number valid */
+ k = 0; /* valid alignment */
+ for (i = 0; i < ROLE_ALIGNS; i++) {
+ if (ok_align(flags.initrole, flags.initrace, flags.initgend,
+ i)) {
+ n++;
+ k = i;
+ }
+ }
+ if (n == 0) {
+ for (i = 0; i < ROLE_ALIGNS; i++) {
+ if (validalign(flags.initrole, flags.initrace, i)) {
+ n++;
+ k = i;
+ }
+ }
+ }
+
+ /* Permit the user to pick, if there is more than one */
+ if (n > 1) {
+ /* tty_clear_nhwindow(BASE_WINDOW); */
+ /* tty_putstr(BASE_WINDOW, 0, "Choosing Alignment"); */
+ win = create_nhwindow(NHW_MENU);
+ start_menu(win);
+ any.a_void = 0; /* zero out all bits */
+ for (i = 0; i < ROLE_ALIGNS; i++)
+ if (ok_align(flags.initrole, flags.initrace,
+ flags.initgend, i)) {
+ any.a_int = i+1;
+ add_menu(win, NO_GLYPH, &any, aligns[i].adj[0],
+ 0, ATR_NONE, aligns[i].adj, MENU_UNSELECTED);
+ }
+ any.a_int = pick_align(flags.initrole, flags.initrace,
+ flags.initgend, PICK_RANDOM)+1;
+ if (any.a_int == 0) /* must be non-zero */
+ any.a_int = randalign(flags.initrole, flags.initrace)+1;
+ add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE,
+ "Random", MENU_UNSELECTED);
+ any.a_int = i+1; /* must be non-zero */
+ add_menu(win, NO_GLYPH, &any , 'q', 0, ATR_NONE,
+ "Quit", MENU_UNSELECTED);
+ Sprintf(pbuf, "Pick the alignment of your %s", plbuf);
+ end_menu(win, pbuf);
+ n = select_menu(win, PICK_ONE, &selected);
+ destroy_nhwindow(win);
+ if (n != 1 || selected[0].item.a_int == any.a_int)
+ goto give_up; /* Selected quit */
+
+ k = selected[0].item.a_int - 1;
+ free((genericptr_t) selected), selected = 0;
+ }
+ flags.initalign = k;
+ }
+ }
+ /* Success! */
+ /* tty_display_nhwindow(BASE_WINDOW, FALSE); */
+}
/* Ask the user for a player name. */
void mswin_askname(void)