beta feedback - add more wc options
- splash_screen (boolean for whether to display splash screen at startup) - player_selection:dialog|prompts Also moves the font and window manipulation stuff in defaults.nh further down the file, so that a tty users doesn't have to wade through it all to find the character adjustment samples.
This commit is contained in:
@@ -36,6 +36,7 @@ void logDebug(const char *fmt, ...) { }
|
||||
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];
|
||||
@@ -66,7 +67,8 @@ struct window_procs mswin_procs = {
|
||||
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,
|
||||
@@ -219,7 +221,7 @@ void mswin_init_nhwindows(int* argc, char** argv)
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -234,8 +236,9 @@ void mswin_player_selection(void)
|
||||
|
||||
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);
|
||||
@@ -273,14 +276,358 @@ void mswin_player_selection(void)
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user