1
0
mirror of https://git.zap.org.au/git/trader.git synced 2024-07-21 16:14:14 -04:00

Add convenience functions left(), center() and right()

This commit is contained in:
John Zaitseff 2011-08-15 21:04:07 +10:00
parent a6c362d2e8
commit 665605d144
5 changed files with 231 additions and 215 deletions

View File

@ -111,11 +111,10 @@ void init_game (void)
// Try to load an old game, if possible
if (game_num != 0) {
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int lines, width;
int width;
lines = mkchstr(chbuf, BUFSIZE, attr_status_window, 0, 0, 1,
WIN_COLS - 7, &width, 1,
"Loading game %d... ", game_num);
mkchstr(chbuf, BUFSIZE, attr_status_window, 0, 0, 1, WIN_COLS - 7,
&width, 1, "Loading game %d... ", game_num);
newtxwin(5, width + 5, 6, WCENTER, true, attr_status_window);
centerch(curwin, 2, 0, chbuf, 1, &width);
wrefresh(curwin);
@ -144,13 +143,13 @@ void init_game (void)
// Try to load the game, if possible
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int lines, width;
int width;
game_num = choice;
lines = mkchstr(chbuf, BUFSIZE, attr_status_window,
0, 0, 1, WIN_COLS - 7, &width, 1,
"Loading game %d... ", game_num);
mkchstr(chbuf, BUFSIZE, attr_status_window, 0, 0, 1,
WIN_COLS - 7, &width, 1,
"Loading game %d... ", game_num);
newtxwin(5, width + 5, 9, WCENTER, true, attr_status_window);
centerch(curwin, 2, 0, chbuf, 1, &width);
wrefresh(curwin);
@ -249,10 +248,8 @@ static int ask_number_players (void)
chbuf = xmalloc(BUFSIZE * sizeof(chtype));
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0,
sizeof(widthbuf) / sizeof(widthbuf[0]), WIN_COLS - 7,
widthbuf, sizeof(widthbuf) / sizeof(widthbuf[0]),
"Enter number of players [^{1^}-^{%d^}] "
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0, 2, WIN_COLS
- 7, widthbuf, 2, "Enter number of players [^{1^}-^{%d^}] "
"or ^{<C>^} to continue a game: ", MAX_PLAYERS);
assert(lines == 1 || lines == 2);
maxwidth = ((lines == 1) ? widthbuf[0] : MAX(widthbuf[0], widthbuf[1])) + 5;
@ -314,10 +311,8 @@ int ask_game_number (void)
chbuf = xmalloc(BUFSIZE * sizeof(chtype));
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0,
sizeof(widthbuf) / sizeof(widthbuf[0]), WIN_COLS - 7,
widthbuf, sizeof(widthbuf) / sizeof(widthbuf[0]),
"Enter game number [^{1^}-^{9^}] "
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0, 2, WIN_COLS
- 7, widthbuf, 2, "Enter game number [^{1^}-^{9^}] "
"or ^{<CTRL><C>^} to cancel: ");
assert(lines == 1 || lines == 2);
maxwidth = ((lines == 1) ? widthbuf[0] : MAX(widthbuf[0], widthbuf[1])) + 5;
@ -365,11 +360,15 @@ int ask_game_number (void)
void ask_player_names (void)
{
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int width;
if (number_players == 1) {
// Ask for the player's name
newtxwin(5, WIN_COLS - 4, 9, WCENTER, true, attr_normal_window);
mvwaddstr(curwin, 2, 2, "Please enter your name: ");
left(curwin, 2, 2, attr_normal, 0, 0, "Please enter your name: ");
int x = getcurx(curwin);
int w = getmaxx(curwin) - x - 2;
@ -385,16 +384,13 @@ void ask_player_names (void)
}
}
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int lines, width;
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0,
1, WIN_COLS - YESNO_COLS - 6, &width, 1,
"Do you need any instructions? [^{Y^}/^{N^}] ");
mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0, 1,
WIN_COLS - YESNO_COLS - 6, &width, 1,
"Do you need any instructions? [^{Y^}/^{N^}] ");
newtxwin(5, width + YESNO_COLS + 4, 6, WCENTER, true,
attr_normal_window);
leftch(curwin, 2, 2, chbuf, lines, &width);
free(chbuf);
leftch(curwin, 2, 2, chbuf, 1, &width);
if (answer_yesno(curwin)) {
show_help();
}
@ -402,23 +398,18 @@ void ask_player_names (void)
} else {
// Ask for all of the player names
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int lines, width;
bool entered[MAX_PLAYERS];
bool done, modified;
int cur, len, i;
newtxwin(number_players + 5, WIN_COLS - 4, 9, WCENTER,
true, attr_normal_window);
lines = mkchstr(chbuf, BUFSIZE, attr_title, 0, 0, 1, WIN_COLS - 8,
&width, 1, " Enter Player Names ");
centerch(curwin, 1, 0, chbuf, lines, &width);
center(curwin, 1, 0, attr_title, 0, 0, " Enter Player Names ");
for (i = 0; i < number_players; i++) {
player[i].name = NULL;
entered[i] = false;
mvwprintw(curwin, i + 3, 2, "Player %d:", i + 1);
left(curwin, i + 3, 2, attr_normal, 0, 0, "Player %d:", i + 1);
}
int x = getcurx(curwin) + 1;
@ -494,21 +485,21 @@ void ask_player_names (void)
}
}
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0,
1, WIN_COLS - YESNO_COLS - 6, &width, 1,
"Does any player need instructions? [^{Y^}/^{N^}] ");
mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0, 1,
WIN_COLS - YESNO_COLS - 6, &width, 1,
"Does any player need instructions? [^{Y^}/^{N^}] ");
newtxwin(5, width + YESNO_COLS + 4, 6, WCENTER, true,
attr_normal_window);
leftch(curwin, 2, 2, chbuf, lines, &width);
leftch(curwin, 2, 2, chbuf, 1, &width);
if (answer_yesno(curwin)) {
show_help();
}
free(chbuf);
}
deltxwin(); // "Need instructions?" window
deltxwin(); // "Enter player names" window
free(chbuf);
}
@ -589,8 +580,6 @@ void end_game (void)
void show_map (bool closewin)
{
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int lines, width;
int x, y;
@ -603,16 +592,11 @@ void show_map (bool closewin)
mvwhline(curwin, 1, 2, ' ' | attr_mapwin_title, getmaxx(curwin) - 4);
// Display current player and turn number
lines = mkchstr(chbuf, BUFSIZE, attr_mapwin_title, attr_mapwin_highlight,
0, 1, WIN_COLS - 4, &width, 1, " Player: ^{%s^} ",
player[current_player].name);
leftch(curwin, 1, 2, chbuf, lines, &width);
lines = mkchstr(chbuf, BUFSIZE, attr_mapwin_title, attr_mapwin_highlight,
attr_mapwin_blink, 1, WIN_COLS / 2, &width, 1,
(turn_number != max_turn) ? " Turn: ^{%d^} " :
" ^[*** Last Turn ***^] ", turn_number);
rightch(curwin, 1, WIN_COLS - 2, chbuf, lines, &width);
left(curwin, 1, 2, attr_mapwin_title, attr_mapwin_highlight, 0,
" Player: ^{%s^} ", player[current_player].name);
right(curwin, 1, getmaxx(curwin) - 2, attr_mapwin_title,
attr_mapwin_highlight, attr_mapwin_blink, (turn_number != max_turn) ?
" Turn: ^{%d^} " : " ^[*** Last Turn ***^] ", turn_number);
wattrset(curwin, attr_map_window);
@ -657,8 +641,6 @@ void show_map (bool closewin)
deltxwin(); // Galaxy map window
txrefresh();
}
free(chbuf);
}
@ -667,8 +649,6 @@ void show_map (bool closewin)
void show_status (int num)
{
chtype *chbuf;
int lines, width;
double val;
int i, line;
@ -677,24 +657,14 @@ void show_status (int num)
newtxwin(MAX_COMPANIES + 15, WIN_COLS, 1, WCENTER, true,
attr_normal_window);
chbuf = xmalloc(BUFSIZE * sizeof(chtype));
lines = mkchstr(chbuf, BUFSIZE, attr_title, 0, 0, 1, WIN_COLS - 4,
&width, 1, " Stock Portfolio ");
centerch(curwin, 1, 0, chbuf, lines, &width);
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_highlight, 0, 1,
WIN_COLS - 4, &width, 1, "Player: ^{%s^}",
center(curwin, 1, 0, attr_title, 0, 0, " Stock Portfolio ");
center(curwin, 2, 0, attr_normal, attr_highlight, 0, "Player: ^{%s^}",
player[num].name);
centerch(curwin, 2, 0, chbuf, lines, &width);
val = total_value(num);
if (val == 0.0) {
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_highlight,
attr_blink, 1, WIN_COLS - 4, &width, 1,
center(curwin, 11, 0, attr_normal, attr_highlight, attr_blink,
"^[* * * B A N K R U P T * * *^]");
centerch(curwin, 11, 0, chbuf, lines, &width);
} else {
char *buf = xmalloc(BUFSIZE);
@ -708,10 +678,8 @@ void show_status (int num)
}
if (none) {
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_highlight, 0,
1, WIN_COLS - 4, &width, 1,
center(curwin, 8, 0, attr_normal, attr_highlight, 0,
"No companies on the map");
centerch(curwin, 8, 0, chbuf, lines, &width);
} else {
// Handle the locale's currency symbol
snprintf(buf, BUFSIZE, "share (%s)", lconvinfo.currency_symbol);
@ -761,7 +729,6 @@ void show_status (int num)
wait_for_key(curwin, getmaxy(curwin) - 2, attr_waitforkey);
deltxwin();
txrefresh();
free(chbuf);
}

View File

@ -157,45 +157,17 @@ static const char *help_text[] = {
void show_help (void)
{
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int lines, width;
int curpage = 0;
int numpages;
bool done = false;
chtype *ch_title; // Title string
chtype *ch_contfirst; // "Continue", first page
chtype *ch_contnext; // "Continue", following pages
int w_title, ln_title;
int w_contfirst, ln_contfirst;
int w_contnext, ln_contnext;
// Count how many pages appear in the help text
for (numpages = 0; help_text[numpages] != NULL; numpages++)
;
if (numpages == 0) {
free(chbuf);
if (numpages == 0)
return;
}
// Prepare fixed-text strings
ln_title = mkchstr(chbuf, BUFSIZE, attr_title, 0, 0, 1, WIN_COLS - 4,
&w_title, 1, " How to Play ");
ch_title = chstrdup(chbuf, BUFSIZE);
ln_contfirst = mkchstr(chbuf, BUFSIZE, attr_waitforkey, 0, 0, 1,
WIN_COLS - 4, &w_contfirst, 1,
"[ Press <SPACE> to continue ] ");
ch_contfirst = chstrdup(chbuf, BUFSIZE);
ln_contnext = mkchstr(chbuf, BUFSIZE, attr_waitforkey, 0, 0, 1,
WIN_COLS - 4, &w_contnext, 1,
"[ Press <SPACE> to continue or "
"<BACKSPACE> for the previous page ] ");
ch_contnext = chstrdup(chbuf, BUFSIZE);
newtxwin(WIN_LINES - 1, WIN_COLS, 1, WCENTER, false, 0);
@ -205,12 +177,10 @@ void show_help (void)
werase(curwin);
wbkgd(curwin, attr_normal_window);
box(curwin, 0, 0);
centerch(curwin, 1, 0, ch_title, ln_title, &w_title);
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_highlight, 0, 1,
WIN_COLS - 4, &width, 1, "Page %d of %d",
curpage + 1, numpages);
centerch(curwin, 2, 0, chbuf, lines, &width);
center(curwin, 1, 0, attr_title, 0, 0, " How to Play ");
center(curwin, 2, 0, attr_normal, attr_highlight, 0,
"Page %d of %d", curpage + 1, numpages);
wmove(curwin, 4, 2);
// Process the help text string
@ -355,14 +325,10 @@ void show_help (void)
s++;
}
if (curpage == 0) {
centerch(curwin, getmaxy(curwin) - 2, 0, ch_contfirst,
ln_contfirst, &w_contfirst);
} else {
centerch(curwin, getmaxy(curwin) - 2, 0, ch_contnext,
ln_contnext, &w_contnext);
}
center(curwin, getmaxy(curwin) - 2, 0, attr_waitforkey, 0, 0,
(curpage == 0) ? "[ Press <SPACE> to continue ] " :
"[ Press <SPACE> to continue or <BACKSPACE> "
"for the previous page ] ");
wrefresh(curwin);
int key = gettxchar(curwin);
@ -399,9 +365,4 @@ void show_help (void)
deltxwin();
txrefresh();
free(ch_title);
free(ch_contfirst);
free(ch_contnext);
free(chbuf);
}

View File

@ -402,25 +402,12 @@ void end_screen (void)
void init_title (void)
{
chtype *chbuf;
int width;
int lines;
bkgd(attr_root_window);
attrset(attr_root_window);
clear();
move(0, 0);
for (int i = 0; i < COLS; i++) {
addch(attr_game_title | ' ');
}
chbuf = xmalloc(BUFSIZE * sizeof(chtype));
lines = mkchstr(chbuf, BUFSIZE, attr_game_title, 0, 0, 1, COLS,
&width, 1, _("Star Traders"));
centerch(stdscr, 0, 0, chbuf, lines, &width);
attrset(attr_root_window);
free(chbuf);
mvwhline(stdscr, 0, 0, ' ' | attr_game_title, COLS);
center(stdscr, 0, 0, attr_game_title, 0, 0, _("Star Traders"));
}
@ -620,14 +607,7 @@ int txdlgbox (int maxlines, int ncols, int begin_y, int begin_x,
true, bkgd_attr);
if (usetitle) {
chtype *titlebuf = xmalloc(BUFSIZE * sizeof(chtype));
int titlewidth;
int titlelines;
titlelines = mkchstr(titlebuf, BUFSIZE, title_attr, 0, 0, 1,
ncols - 4, &titlewidth, 1, boxtitle);
centerch(curwin, 1, 0, titlebuf, titlelines, &titlewidth);
free(titlebuf);
center(curwin, 1, 0, title_attr, 0, 0, boxtitle);
}
centerch(curwin, usetitle ? 3 : 2, 0, chbuf, lines, widthbuf);
@ -654,8 +634,7 @@ int mkchstr (chtype *restrict chbuf, int chbufsize, chtype attr_norm,
va_start(args, format);
lines = vmkchstr(chbuf, chbufsize, attr_norm, attr_alt1, attr_alt2,
maxlines, maxwidth, widthbuf, widthbufsize, format,
args);
maxlines, maxwidth, widthbuf, widthbufsize, format, args);
va_end(args);
return lines;
}
@ -1308,6 +1287,84 @@ int rightch (WINDOW *win, int y, int x, const chtype *restrict chstr,
}
/***********************************************************************/
// left: Print strings left-aligned
int left (WINDOW *win, int y, int x, chtype attr_norm, chtype attr_alt1,
chtype attr_alt2, const char *restrict format, ...)
{
va_list args;
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int widthbuf[MAX_DLG_LINES];
int lines;
int ret;
va_start(args, format);
lines = vmkchstr(chbuf, BUFSIZE, attr_norm, attr_alt1, attr_alt2,
MAX_DLG_LINES, getmaxx(win) - x - 2, widthbuf,
MAX_DLG_LINES, format, args);
ret = leftch(win, y, x, chbuf, lines, widthbuf);
assert(ret == OK);
va_end(args);
free(chbuf);
return ret;
}
/***********************************************************************/
// center: Print strings centred in window
int center (WINDOW *win, int y, int offset, chtype attr_norm, chtype attr_alt1,
chtype attr_alt2, const char *restrict format, ...)
{
va_list args;
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int widthbuf[MAX_DLG_LINES];
int lines;
int ret;
va_start(args, format);
lines = vmkchstr(chbuf, BUFSIZE, attr_norm, attr_alt1, attr_alt2,
MAX_DLG_LINES, getmaxx(win) - 4, widthbuf,
MAX_DLG_LINES, format, args);
ret = centerch(win, y, offset, chbuf, lines, widthbuf);
assert(ret == OK);
va_end(args);
free(chbuf);
return ret;
}
/***********************************************************************/
// right: Print strings right-aligned
int right (WINDOW *win, int y, int x, chtype attr_norm, chtype attr_alt1,
chtype attr_alt2, const char *restrict format, ...)
{
va_list args;
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int widthbuf[MAX_DLG_LINES];
int lines;
int ret;
va_start(args, format);
lines = vmkchstr(chbuf, BUFSIZE, attr_norm, attr_alt1, attr_alt2,
MAX_DLG_LINES, x - 2, widthbuf, MAX_DLG_LINES,
format, args);
ret = rightch(win, y, x, chbuf, lines, widthbuf);
assert(ret == OK);
va_end(args);
free(chbuf);
return ret;
}
/***********************************************************************/
// old_attrpr: Print a string with a particular character rendition
@ -2435,9 +2492,6 @@ bool answer_yesno (WINDOW *win)
void wait_for_key (WINDOW *win, int y, chtype attr)
{
chtype *chbuf;
int width;
int lines;
int key;
bool done;
@ -2446,10 +2500,7 @@ void wait_for_key (WINDOW *win, int y, chtype attr)
meta(win, true);
wtimeout(win, -1);
chbuf = xmalloc(BUFSIZE * sizeof(chtype));
lines = mkchstr(chbuf, BUFSIZE, attr, 0, 0, 1, getmaxx(win) - 4,
&width, 1, _("[ Press <SPACE> to continue ] "));
centerch(win, y, 0, chbuf, lines, &width);
center(curwin, y, 0, attr, 0, 0, _("[ Press <SPACE> to continue ] "));
wrefresh(win);
done = false;
@ -2470,8 +2521,6 @@ void wait_for_key (WINDOW *win, int y, chtype attr)
done = true;
}
}
free(chbuf);
}

View File

@ -411,7 +411,7 @@ extern chtype *chstrdup (const chtype *restrict chstr, int chstrsize);
chstr - chtype string as returned from mkchstr()
lines - Number of lines in chstr as returned from mkchstr()
widthbuf - Widths of each line as returned from mkchstr()
Returns: int - Error code OK
Returns: int - Always returns OK
This function takes the strings in the chtype array chstr and prints
them left-aligned in the window win. Note that wrefresh() is NOT
@ -460,6 +460,69 @@ extern int rightch (WINDOW *win, int y, int x, const chtype *restrict chstr,
int lines, const int *restrict widthbuf);
/*
Function: left - Print strings left-aligned
Parameters: win - Window to use (should be curwin)
y - Line on which to print first string
x - Starting column number for each line
attr_norm - Normal character rendition to use
attr_alt1 - First alternate character rendition to use
attr_alt2 - Second alternate character rendition to use
format - Format string as described for mkchstr()
... - Arguments for the format string
Returns: int - Always returns OK
This shortcut function prepares a chtype string using mkchstr(), then
prints the string using leftch(). At most MAX_DLG_LINES are printed,
with the maximum width being that of the window win - x - 2 (the "2" is
for the right-hand border).
*/
extern int left (WINDOW *win, int y, int x, chtype attr_norm, chtype attr_alt1,
chtype attr_alt2, const char *restrict format, ...);
/*
Function: center - Print strings centred in window
Parameters: win - Window to use (should be curwin)
y - Line on which to print first string
offset - Column offset to add to position for each line
attr_norm - Normal character rendition to use
attr_alt1 - First alternate character rendition to use
attr_alt2 - Second alternate character rendition to use
format - Format string as described for mkchstr()
... - Arguments for the format string
Returns: int - Always returns OK
This shortcut function prepares a chtype string using mkchstr(), then
prints the string using centerch(). At most MAX_DLG_LINES are printed,
with the maximum width being that of the window win - 4 (for borders).
*/
extern int center (WINDOW *win, int y, int offset, chtype attr_norm,
chtype attr_alt1, chtype attr_alt2,
const char *restrict format, ...);
/*
Function: right - Print strings right-aligned
Parameters: win - Window to use (should be curwin)
y - Line on which to print first string
x - Ending column number for each line
attr_norm - Normal character rendition to use
attr_alt1 - First alternate character rendition to use
attr_alt2 - Second alternate character rendition to use
format - Format string as described for mkchstr()
... - Arguments for the format string
Returns: int - Always returns OK
This shortcut function prepares a chtype string using mkchstr(), then
prints the string using rightch(). At most MAX_DLG_LINES are printed,
with the maximum width being that of x - 2 (the "2" is for the
left-hand border).
*/
extern int right (WINDOW *win, int y, int x, chtype attr_norm, chtype attr_alt1,
chtype attr_alt2, const char *restrict format, ...);
/*
Function: old_attrpr - Print a string with a particular character rendition
Parameters: win - Window to use (should be curwin)

View File

@ -208,8 +208,6 @@ void select_moves (void)
selection_t get_move (void)
{
selection_t selection = SEL_NONE;
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int lines, width;
if (quit_selected || abort_game) {
@ -233,31 +231,19 @@ selection_t get_move (void)
werase(curwin);
box(curwin, 0, 0);
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0,
1, getmaxx(curwin) / 2 - 4, &width, 1,
"^{<1>^} Display stock portfolio");
leftch(curwin, 2, 2, chbuf, lines, &width);
left(curwin, 2, 2, attr_normal, attr_keycode, 0,
"^{<1>^} Display stock portfolio");
left(curwin, 3, 2, attr_normal, attr_keycode, 0,
"^{<2>^} Declare bankruptcy");
left(curwin, 2, getmaxx(curwin) / 2, attr_normal, attr_keycode, 0,
"^{<3>^} Save and end the game");
left(curwin, 3, getmaxx(curwin) / 2, attr_normal, attr_keycode, 0,
"^{<CTRL><C>^} Quit the game");
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0,
1, getmaxx(curwin) / 2 - 4, &width, 1,
"^{<2>^} Declare bankruptcy");
leftch(curwin, 3, 2, chbuf, lines, &width);
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0,
1, getmaxx(curwin) / 2 - 4, &width, 1,
"^{<3>^} Save and end the game");
leftch(curwin, 2, getmaxx(curwin) / 2, chbuf, lines, &width);
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0,
1, getmaxx(curwin) / 2 - 4, &width, 1,
"^{<CTRL><C>^} Quit the game");
leftch(curwin, 3, getmaxx(curwin) / 2, chbuf, lines, &width);
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, attr_choice,
1, getmaxx(curwin) / 2 - 4, &width, 1,
"Select move [^[%c^]-^[%c^]/^{1^}-^{3^}/^{<CTRL><C>^}]: ",
MOVE_TO_KEY(0), MOVE_TO_KEY(NUMBER_MOVES - 1));
rightch(curwin, 1, getmaxx(curwin) / 2, chbuf, lines, &width);
right(curwin, 1, getmaxx(curwin) / 2, attr_normal, attr_keycode,
attr_choice, "Select move "
"[^[%c^]-^[%c^]/^{1^}-^{3^}/^{<CTRL><C>^}]: ",
MOVE_TO_KEY(0), MOVE_TO_KEY(NUMBER_MOVES - 1));
curs_set(CURS_ON);
wrefresh(curwin);
@ -270,10 +256,8 @@ selection_t get_move (void)
selection = KEY_TO_MOVE(key);
curs_set(CURS_OFF);
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_choice, 0,
1, getmaxx(curwin) / 2 - 4, &width, 1,
"Move ^{%c^}", key);
leftch(curwin, 1, getmaxx(curwin) / 2, chbuf, lines, &width);
left(curwin, 1, getmaxx(curwin) / 2, attr_normal, attr_choice,
0, "Move ^{%c^}", key);
} else {
switch (key) {
case '1':
@ -286,22 +270,18 @@ selection_t get_move (void)
selection = SEL_BANKRUPT;
curs_set(CURS_OFF);
lines = mkchstr(chbuf, BUFSIZE, attr_normal,
attr_normal | A_BOLD, 0, 1,
getmaxx(curwin) / 2 - 4, &width, 1,
"^{<2>^} (Declare bankruptcy)");
leftch(curwin, 1, getmaxx(curwin) / 2, chbuf, lines, &width);
left(curwin, 1, getmaxx(curwin) / 2, attr_normal,
attr_normal | A_BOLD, 0,
"^{<2>^} (Declare bankruptcy)");
break;
case '3':
selection = SEL_SAVE;
curs_set(CURS_OFF);
lines = mkchstr(chbuf, BUFSIZE, attr_normal,
attr_normal | A_BOLD, 0, 1,
getmaxx(curwin) / 2 - 4, &width, 1,
"^{<3>^} (Save and end the game)");
leftch(curwin, 1, getmaxx(curwin) / 2, chbuf, lines, &width);
left(curwin, 1, getmaxx(curwin) / 2, attr_normal,
attr_normal | A_BOLD, 0,
"^{<3>^} (Save and end the game)");
break;
case KEY_ESC:
@ -313,11 +293,9 @@ selection_t get_move (void)
selection = SEL_QUIT;
curs_set(CURS_OFF);
lines = mkchstr(chbuf, BUFSIZE, attr_normal,
attr_normal | A_BOLD, 0, 1,
getmaxx(curwin) / 2 - 4, &width, 1,
"^{<CTRL><C>^} (Quit the game)");
leftch(curwin, 1, getmaxx(curwin) / 2, chbuf, lines, &width);
left(curwin, 1, getmaxx(curwin) / 2, attr_normal,
attr_normal | A_BOLD, 0,
"^{<CTRL><C>^} (Quit the game)");
break;
default:
@ -331,10 +309,8 @@ selection_t get_move (void)
mvwhline(curwin, 3, 2, ' ' | attr_normal, getmaxx(curwin) - 4);
// Ask the player to confirm their choice
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0,
1, getmaxx(curwin) / 2 - 4, &width, 1,
"Are you sure? [^{Y^}/^{N^}] ");
rightch(curwin, 2, getmaxx(curwin) / 2, chbuf, lines, &width);
right(curwin, 2, getmaxx(curwin) / 2, attr_normal, attr_keycode, 0,
"Are you sure? [^{Y^}/^{N^}] ");
wrefresh(curwin);
if (! answer_yesno(curwin)) {
@ -343,13 +319,15 @@ selection_t get_move (void)
// Save the game if required
if (selection == SEL_SAVE) {
chtype *chbuf = xmalloc(BUFSIZE * sizeof(chtype));
int width;
bool saved = false;
if (game_loaded) {
// Save the game to the same game number
lines = mkchstr(chbuf, BUFSIZE, attr_status_window, 0, 0, 1,
WIN_COLS - 7, &width, 1,
"Saving game %d... ", game_num);
mkchstr(chbuf, BUFSIZE, attr_status_window, 0, 0, 1, WIN_COLS
- 7, &width, 1, "Saving game %d... ", game_num);
newtxwin(5, width + 5, 7, WCENTER, true, attr_status_window);
centerch(curwin, 2, 0, chbuf, 1, &width);
wrefresh(curwin);
@ -366,13 +344,10 @@ selection_t get_move (void)
int key;
bool done;
int widthbuf[2];
int maxwidth;
int lines, maxwidth;
lines = mkchstr(chbuf, BUFSIZE, attr_normal, attr_keycode, 0,
sizeof(widthbuf) / sizeof(widthbuf[0]),
WIN_COLS - 7, widthbuf,
sizeof(widthbuf) / sizeof(widthbuf[0]),
2, WIN_COLS - 7, widthbuf, 2,
"Enter game number [^{1^}-^{9^}] "
"or ^{<CTRL><C>^} to cancel: ");
assert(lines == 1 || lines == 2);
@ -417,9 +392,9 @@ selection_t get_move (void)
// Try to save the game, if possible
game_num = key - '0';
lines = mkchstr(chbuf, BUFSIZE, attr_status_window,
0, 0, 1, WIN_COLS - 7, &width, 1,
"Saving game %d... ", game_num);
mkchstr(chbuf, BUFSIZE, attr_status_window, 0, 0, 1,
WIN_COLS - 7, &width, 1,
"Saving game %d... ", game_num);
newtxwin(5, width + 5, 7, WCENTER, true, attr_status_window);
centerch(curwin, 2, 0, chbuf, 1, &width);
wrefresh(curwin);
@ -443,10 +418,11 @@ selection_t get_move (void)
selection = SEL_NONE;
}
free(chbuf);
}
}
free(chbuf);
return selection;
}