]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - mille/move.c
tetris: Use arc4random_uniform instead of modulo for better randomness
[bsdgames-darwin.git] / mille / move.c
index a9fe2130bb721ec1655df28e4f4bf0baa95546ba..1528aa38173be1a2217071f8c45ca14bde31c0c4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: move.c,v 1.8 1999/03/29 05:12:39 mrg Exp $     */
+/*     $NetBSD: move.c,v 1.19 2019/02/03 03:19:25 mrg Exp $    */
 
 /*
  * Copyright (c) 1983, 1993
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
 #if 0
 static char sccsid[] = "@(#)move.c     8.1 (Berkeley) 5/31/93";
 #else
-__RCSID("$NetBSD: move.c,v 1.8 1999/03/29 05:12:39 mrg Exp $");
+__RCSID("$NetBSD: move.c,v 1.19 2019/02/03 03:19:25 mrg Exp $");
 #endif
 #endif /* not lint */
 
 #include <termios.h>
 
+#ifdef DEBUG
+#include <sys/param.h>
+#endif
+
 #include       "mille.h"
 #ifndef        unctrl
 #include       "unctrl.h"
@@ -56,18 +56,26 @@ __RCSID("$NetBSD: move.c,v 1.8 1999/03/29 05:12:39 mrg Exp $");
 #undef CTRL
 #define        CTRL(c)         (c - 'A' + 1)
 
-char   *Movenames[] = {
-               "M_DISCARD", "M_DRAW", "M_PLAY", "M_ORDER"
-       };
+static void check_go(void);
+static int playcard(PLAY *);
+static void getmove(void);
+static int haspicked(const PLAY *);
 
 void
-domove()
+domove(void)
 {
        PLAY    *pp;
        int     i, j;
        bool    goodplay;
 
        pp = &Player[Play];
+       for (i = 0, j = 0; i < HAND_SZ; i++)
+               if (pp->hand[i] != -1)
+                       j++;
+       if (!j) {
+               nextplay();
+               return;
+       }
        if (Play == PLAYER)
                getmove();
        else
@@ -83,7 +91,7 @@ domove()
                                else
                                        error("no card there");
                        else {
-                               if (issafety(pp->hand[Card_no])) {
+                               if (is_safety(pp->hand[Card_no])) {
                                        error("discard a safety?");
                                        goodplay = FALSE;
                                        break;
@@ -116,7 +124,7 @@ domove()
 acc:
                        if (Play == COMP) {
                                account(*Topcard);
-                               if (issafety(*Topcard))
+                               if (is_safety(*Topcard))
                                        pp->safety[*Topcard-S_CONV] = S_IN_HAND;
                        }
                        if (pp->hand[1] == C_INIT && Topcard > Deck) {
@@ -164,8 +172,8 @@ acc:
  *     Check and see if either side can go.  If they cannot,
  * the game is over
  */
-void
-check_go()
+static void
+check_go(void)
 {
        CARD    card;
        PLAY    *pp, *op;
@@ -175,11 +183,11 @@ check_go()
                op = (pp == &Player[COMP] ? &Player[PLAYER] : &Player[COMP]);
                for (i = 0; i < HAND_SZ; i++) {
                        card = pp->hand[i];
-                       if (issafety(card) || canplay(pp, op, card)) {
+                       if (is_safety(card) || canplay(pp, op, card)) {
 #ifdef DEBUG
                                if (Debug) {
                                        fprintf(outf, "CHECK_GO: can play %s (%d), ", C_name[card], card);
-                                       fprintf(outf, "issafety(card) = %d, ", issafety(card));
+                                       fprintf(outf, "is_safety(card) = %d, ", is_safety(card));
                                        fprintf(outf, "canplay(pp, op, card) = %d\n", canplay(pp, op, card));
                                }
 #endif
@@ -195,9 +203,8 @@ check_go()
        Finished = TRUE;
 }
 
-int
-playcard(pp)
-       PLAY    *pp;
+static int
+playcard(PLAY *pp)
 {
        int     v;
        CARD    card;
@@ -225,12 +232,15 @@ mustpick:
          case C_200:
                if (pp->nummiles[C_200] == 2)
                        return error("only two 200's per hand");
+               /* FALLTHROUGH */
          case C_100:   case C_75:
                if (pp->speed == C_LIMIT)
                        return error("limit of 50");
+               /* FALLTHROUGH */
          case C_50:
                if (pp->mileage + Value[card] > End)
                        return error("puts you over %d", End);
+               /* FALLTHROUGH */
          case C_25:
                if (!pp->can_go)
                        return error("cannot move now");
@@ -252,7 +262,7 @@ mustpick:
 
          case C_GO:
                if (pp->battle != C_INIT && pp->battle != C_STOP
-                   && !isrepair(pp->battle))
+                   && !is_repair(pp->battle))
                        return error("cannot play \"Go\" on a \"%s\"",
                            C_name[pp->battle]);
                pp->battle = C_GO;
@@ -294,7 +304,7 @@ protected:
          case C_DRIVE_SAFE:    case C_RIGHT_WAY:
                if (pp->battle == opposite(card)
                    || (card == C_RIGHT_WAY && pp->speed == C_LIMIT)) {
-                       if (!(card == C_RIGHT_WAY && !isrepair(pp->battle))) {
+                       if (!(card == C_RIGHT_WAY && !is_repair(pp->battle))) {
                                pp->battle = C_GO;
                                pp->can_go = TRUE;
                        }
@@ -327,7 +337,7 @@ protected:
                                pp->can_go = TRUE;
                                pp->battle = C_INIT;
                        }
-                       if (!pp->can_go && isrepair(pp->battle))
+                       if (!pp->can_go && is_repair(pp->battle))
                                pp->can_go = TRUE;
                }
                Next = -1;
@@ -345,8 +355,8 @@ protected:
        return TRUE;
 }
 
-void
-getmove()
+static void
+getmove(void)
 {
        char    c;
 #ifdef EXTRAP
@@ -364,9 +374,9 @@ getmove()
                refresh();
                while ((c = readch()) == killchar() || c == erasechar())
                        continue;
-               if (islower(c))
-                       c = toupper(c);
-               if (isprint(c) && !isspace(c)) {
+               if (islower((unsigned char)c))
+                       c = toupper((unsigned char)c);
+               if (isprint((unsigned char)c) && !isspace((unsigned char)c)) {
                        addch(c);
                        refresh();
                }
@@ -434,10 +444,12 @@ getmove()
                  case 'Z':             /* Debug code */
                        if (!Debug && outf == NULL) {
                                char    buf[MAXPATHLEN];
+                               char    *sp;
 
                                prompt(FILEPROMPT);
                                leaveok(Board, FALSE);
                                refresh();
+over:
                                sp = buf;
                                while ((*sp = readch()) != '\n') {
                                        if (*sp == killchar())
@@ -460,7 +472,7 @@ getmove()
                                leaveok(Board, TRUE);
                                if ((outf = fopen(buf, "w")) == NULL)
                                        warn("%s", buf);
-                               setbuf(outf, (char *)NULL);
+                               setbuf(outf, NULL);
                        }
                        Debug = !Debug;
                        break;
@@ -477,9 +489,8 @@ ret:
 /*
  * return whether or not the player has picked
  */
-int
-haspicked(pp)
-       PLAY    *pp;
+static int
+haspicked(const PLAY *pp)
 {
        int     card;
 
@@ -498,8 +509,7 @@ haspicked(pp)
 }
 
 void
-account(card)
-       CARD    card; 
+account(CARD card)
 {
        CARD    oppos;
 
@@ -524,10 +534,9 @@ account(card)
 }
 
 void
-prompt(promptno)
-       int     promptno;
+prompt(int promptno)
 {
-       static char     *names[] = {
+       static const char       *const names[] = {
                                ">>:Move:",
                                "Really?",
                                "Another hand?",
@@ -556,8 +565,7 @@ prompt(promptno)
 }
 
 void
-sort(hand)
-       CARD    *hand;
+sort(CARD *hand)
 {
        CARD    *cp, *tp;
        CARD    temp;