pad overlay messages automatically
authorMischa POSLAWSKY <netris@shiar.org>
Sat, 10 Mar 2007 20:06:16 +0000 (21:06 +0100)
committerMischa POSLAWSKY <netris@shiar.org>
Sat, 10 Mar 2007 20:06:16 +0000 (21:06 +0100)
Much easier to maintain, and won't break for non-standard field sizes.

curses.c

index 0e841ef2066bf2e9e4079cdce1adde389aae8df3..57bfee76b3ecb375ae17b332a6c4829d64885767 100644 (file)
--- a/curses.c
+++ b/curses.c
@@ -558,25 +558,57 @@ 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, "PAUSED");
                        else
-                               window_msg(player,
-                                       window[player].size > 1 ? "N O T  R E A D Y" : "NOT  READY");
+                               window_msg_wide(player, "NOT READY");
                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, "READY");
        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, "GAME OVER");
        else
-               window_msg(player, window[player].size > 1 ? "E M P T Y" : "EMPTY");
+               window_msg_wide(player, "EMPTY");
 }