diff --git a/src/game.c b/src/game.c index 263f380..0d62160 100644 --- a/src/game.c +++ b/src/game.c @@ -219,14 +219,8 @@ void init_game (void) newtxwin(5, 44, 6, WCENTER(44), true, ATTR_NORMAL_WINDOW); - mvwaddstr(curwin, 2, 2, "Do you need any instructions? "); - waddstr(curwin, "["); - attrpr(curwin, ATTR_KEYCODE, "Y"); - waddstr(curwin, "/"); - attrpr(curwin, ATTR_KEYCODE, "N"); - waddstr(curwin, "] "); - - if (answer_yesno(curwin)) { + mvwaddstr(curwin, 2, 2, "Do you need any instructions?"); + if (answer_yesno(curwin, ATTR_KEYCODE)) { show_help(); } @@ -319,14 +313,8 @@ void init_game (void) newtxwin(5, 50, 6, WCENTER(50), true, ATTR_NORMAL_WINDOW); - mvwaddstr(curwin, 2, 2, "Does any player need instructions? "); - waddstr(curwin, "["); - attrpr(curwin, ATTR_KEYCODE, "Y"); - waddstr(curwin, "/"); - attrpr(curwin, ATTR_KEYCODE, "N"); - waddstr(curwin, "] "); - - if (answer_yesno(curwin)) { + mvwaddstr(curwin, 2, 2, "Does any player need instructions?"); + if (answer_yesno(curwin, ATTR_KEYCODE)) { show_help(); } diff --git a/src/intf.c b/src/intf.c index d9b246a..1fa1874 100644 --- a/src/intf.c +++ b/src/intf.c @@ -422,18 +422,8 @@ int center3 (WINDOW *win, int y, chtype attr1, chtype attr3, chtype attr2, } -/************************************************************************ -* Input routines * -************************************************************************/ - -/*----------------------------------------------------------------------- - Function: gettxchar - Read a keyboard character - Arguments: win - Window to use - Returns: int - Keyboard character - - This function reads a single character from the keyboard. The key is - NOT echoed to the screen and the cursor visibility is NOT affected. -*/ +/***********************************************************************/ +// gettxchar: Read a character from the keyboard int gettxchar (WINDOW *win) { @@ -1448,42 +1438,43 @@ int gettxlong (WINDOW *win, long *result, long min, long max, long emptyval, } -/*----------------------------------------------------------------------- - Function: answer_yesno - Read a Yes/No answer and return true/false - Arguments: win - Window to use - Returns: bool - true if Yes ("Y") was selected, else false +/***********************************************************************/ +// answer_yesno: Wait for a Yes/No answer - This function waits for either "Y" or "N" to be pressed on the - keyboard. If "Y" was pressed, "Yes." is printed and true is returned. - If "N" was pressed, "No." is printed and false is returned. Note that - the cursor becomes invisible after this function. -*/ - -bool answer_yesno (WINDOW *win) +bool answer_yesno (WINDOW *win, chtype attr_keys) { - int key, oldattr; - bool ok; + int key; + bool done; + + chtype oldattr = getattrs(win); + chtype oldbkgd = getbkgd(win); keypad(win, true); meta(win, true); wtimeout(win, -1); - oldattr = getbkgd(win) & ~A_CHARTEXT; - wbkgdset(win, A_NORMAL | (oldattr & A_COLOR)); - wattron(win, A_BOLD); + waddstr(curwin, " ["); + attrpr(curwin, attr_keys, "Y"); + waddstr(curwin, "/"); + attrpr(curwin, attr_keys, "N"); + waddstr(curwin, "] "); + curs_set(CURS_ON); - do { + done = false; + while (! done) { key = toupper(wgetch(win)); - ok = ((key == 'Y') || (key == 'N')); - if (! ok) { + if (key == 'Y' || key == 'N') { + done = true; + } else { beep(); } - } while (! ok); + } curs_set(CURS_OFF); + wattron(win, A_BOLD); if (key == 'Y') { waddstr(win, "Yes"); @@ -1491,24 +1482,18 @@ bool answer_yesno (WINDOW *win) waddstr(win, "No"); } + wbkgdset(win, oldbkgd); wattrset(win, oldattr); - wbkgdset(win, oldattr); + wrefresh(win); return (key == 'Y'); } -/*----------------------------------------------------------------------- - Function: wait_for_key - Print a message and wait for any key - Arguments: win - Window to use - y - Line on which to print message - attr - Window attributes to use for message - Returns: (nothing) +/***********************************************************************/ +// wait_for_key: Print a message and wait for any key - This function prints a message, then waits for any key to be pressed. -*/ - -void wait_for_key (WINDOW *win, int y, int attr) +void wait_for_key (WINDOW *win, int y, chtype attr) { keypad(win, true); meta(win, true); diff --git a/src/intf.h b/src/intf.h index 9ffc4b0..86e0038 100644 --- a/src/intf.h +++ b/src/intf.h @@ -384,9 +384,22 @@ extern int center3 (WINDOW *win, int y, chtype attr1, chtype attr3, __attribute__((format (printf, 8, 9))); -// Input routines +/* + Function: gettxchar - Read a character from the keyboard + Parameters: win - Window to use (should be curwin) + Returns: int - The keyboard character + This function reads a single character from the keyboard. The key is + NOT echoed to the terminal display, nor is the cursor visibility + affected. + + This implementation does not handle multibyte characters correctly: + each part of the multibyte character most likely appears as a separate + keyboard press. +*/ extern int gettxchar (WINDOW *win); + + extern int gettxline (WINDOW *win, char *buf, int bufsize, bool multifield, int maxlen, const char *emptyval, const char *defaultval, const char *allowed, bool stripspc, int y, int x, @@ -400,8 +413,41 @@ extern int gettxlong (WINDOW *win, long *result, long min, long max, long emptyval, long defaultval, int y, int x, int fieldsize, int attr); -extern bool answer_yesno (WINDOW *win); -extern void wait_for_key (WINDOW *win, int y, int attr); + +/* + Function: answer_yesno - Wait for a Yes/No answer + Parameters: win - Window to use (should be curwin) + attr_keys - Window rendition to use for key choices + Returns: bool - True if Yes was selected, false if No + + This function prompts the user by printing " [Y/N] " using appropriate + character renditions ("Y" and "N" in attr_keys, the rest in the current + rendition), then waits for the user to press either "Y" (for Yes) or + "N" (for No) on the keyboard, then prints the answer using A_BOLD. + True is returned if "Y" was selected, false if "N". Note that the + cursor becomes invisible after calling this function. +*/ +extern bool answer_yesno (WINDOW *win, chtype attr_keys); + + +/* + Function: wait_for_key - Print a message and wait for any key + Parameters: win - Window to use (should be curwin) + y - Line on which to print message + attr - Character rendition to use for message + Returns: (nothing) + + This function displays the message "Press to continue" in the + centre of line y in window win, then waits for any key to be pressed. + + The reason the user is not asked "Press any key to continue" is + historical: many, many people used to ask "where is the key?" :-) + + The current implementation does not handle multibyte characters + correctly: only the first byte of the character is consumed, with + further bytes left in the keyboard queue. +*/ +extern void wait_for_key (WINDOW *win, int y, chtype attr); #endif /* included_INTF_H */ diff --git a/src/move.c b/src/move.c index bc4e5c2..618d82a 100644 --- a/src/move.c +++ b/src/move.c @@ -274,14 +274,8 @@ selection_t get_move (void) wrefresh(curwin); // Ask the player to confirm their choice - mvwaddstr(curwin, 2, 22, "Are you sure? "); - waddstr(curwin, "["); - attrpr(curwin, ATTR_KEYCODE, "Y"); - waddstr(curwin, "/"); - attrpr(curwin, ATTR_KEYCODE, "N"); - waddstr(curwin, "] "); - - if (! answer_yesno(curwin)) { + mvwaddstr(curwin, 2, 22, "Are you sure?"); + if (! answer_yesno(curwin, ATTR_KEYCODE)) { selection = SEL_NONE; }