X-Git-Url: http://git.shiar.net/netris.git/blobdiff_plain/984fd4a002cd31854730b24ba70c447b165f4d15..68f83cbe5b56d04c74ad758cf5d73b2c11d2f775:/curses.c diff --git a/curses.c b/curses.c index 0e841ef..b60433e 100644 --- a/curses.c +++ b/curses.c @@ -536,11 +536,13 @@ void window_msg(int player, char *message) { //put a message over player's field if (!window[player].shown) return; if (message) { - char s[MAX_BOARD_WIDTH+1]; - memset(s, ' ', MAX_BOARD_WIDTH); - memcpy(&s[(window[player].size * Players[player].boardWidth / 2) - (strlen(message) / 2)], - message, strlen(message)); - s[window[player].size * Players[player].boardWidth] = 0; + const int fieldsize = Players[player].boardWidth * window[player].size; + const int centered = (fieldsize - strlen(message)) / 2; + char s[fieldsize + 1]; + + memset(s, ' ', fieldsize); + memcpy(&s[centered], message, strlen(message)); + s[fieldsize] = 0; #ifdef HAVE_NCURSES attrset(A_REVERSE); #else @@ -558,31 +560,63 @@ void window_msg(int player, char *message) } //restore field } +void window_msg_wide(int player, char *message) +{ + int i; + char *messagewide = malloc(strlen(message) * 2); // max += strlen - 1 + const int fieldsize = Players[player].boardWidth * window[player].size; + + const bool sep = strchr(message, ' ') != NULL; + // whitespace to pad at convenience + const bool pad = strlen(message) * 2 - sep <= fieldsize; + // (space to) put whitespace between all characters + bool odd = fieldsize & 1; + // odd number of characters (center off; try to change padding at sep) + if (!pad) odd ^= strlen(message) & 1; + // for odd strings, check for even fieldsize instead + + if (pad || (sep && odd && strlen(message) < fieldsize)) { + // generate padded message in messagewide + for (i = 0; ; message++) { + messagewide[i++] = *message; + if (message[1] == 0) { + messagewide[i] = 0; + break; + } + if (pad ? (*message != ' ' || odd) : (*message == ' ' && odd)) { + // add padding if wide; different padding at space if odd + messagewide[i++] = ' '; + odd = 0; + } + } + message = messagewide; + } + window_msg(player, message); +} + void window_msg_status(int player) { //put status (pause, readiness, game over) over player's field if (Players[player].alive > 0) if (Players[player].flags & SCF_paused) if (Game.started > 1) - window_msg(player, window[player].size > 1 ? "P A U S E D" : "PAUSED"); + window_msg_wide(player, MSG_PLAYER_PAUSE); else - window_msg(player, - window[player].size > 1 ? "N O T R E A D Y" : "NOT READY"); + window_msg_wide(player, MSG_PLAYER_JOIN); else if (Game.started > 1) window_msg(player, NULL); else - window_msg(player, window[player].size > 1 ? "R E A D Y" : "READY"); + window_msg_wide(player, MSG_PLAYER_START); else if (!Players[player].alive) - window_msg(player, - window[player].size > 1 ? "G A M E O V E R" : "GAME OVER"); + window_msg_wide(player, MSG_PLAYER_STOP); else - window_msg(player, window[player].size > 1 ? "E M P T Y" : "EMPTY"); + window_msg_wide(player, MSG_PLAYER_PART); } void status_tick(void) { //display timer - mvprintw(statusYPos, statusXPos, "timer %7.0f ", CurTimeval() / 1e6); + mvprintw(statusYPos, statusXPos, MSG_TIME, CurTimeval() / 1e6); } void ScheduleFullRedraw(void)