1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)check.c	5.4 (Berkeley) 06/01/90";
10 #endif /* not lint */
11 
12 #include "back.h"
13 
14 getmove ()  {
15 	register int	i, c;
16 
17 	c = 0;
18 	for (;;)  {
19 		i = checkmove(c);
20 
21 		switch (i)  {
22 		case -1:
23 			if (movokay(mvlim))  {
24 				if (tflag)
25 					curmove (20,0);
26 				else
27 					writec ('\n');
28 				for (i = 0; i < mvlim; i++)
29 					if (h[i])
30 						wrhit(g[i]);
31 				nexturn();
32 				if (*offopp == 15)
33 					cturn *= -2;
34 				if (tflag && pnum)
35 					bflag = pnum;
36 				return;
37 			}
38 
39 		case -4:
40 		case 0:
41 			if (tflag)
42 				refresh();
43 			if (i != 0 && i != -4)
44 				break;
45 			if (tflag)
46 				curmove (20,0);
47 			else
48 				writec ('\n');
49 			writel (*Colorptr);
50 			if (i == -4)
51 				writel (" must make ");
52 			else
53 				writel (" can only make ");
54 			writec (mvlim+'0');
55 			writel (" move");
56 			if (mvlim > 1)
57 				writec ('s');
58 			writec ('.');
59 			writec ('\n');
60 			break;
61 
62 		case -3:
63 			if (quit())
64 				return;
65 		}
66 
67 		if (! tflag)
68 			proll ();
69 		else  {
70 			curmove (cturn == -1? 18: 19,39);
71 			cline ();
72 			c = -1;
73 		}
74 	}
75 }
76 
77 movokay (mv)
78 register int	mv;
79 
80 {
81 	register int	i, m;
82 
83 	if (d0)
84 		swap;
85 
86 	for (i = 0; i < mv; i++)  {
87 
88 		if (p[i] == g[i])  {
89 			moverr (i);
90 			curmove (20,0);
91 			writel ("Attempt to move to same location.\n");
92 			return (0);
93 		}
94 
95 		if (cturn*(g[i]-p[i]) < 0)  {
96 			moverr (i);
97 			curmove (20,0);
98 			writel ("Backwards move.\n");
99 			return (0);
100 		}
101 
102 		if (abs(board[bar]) && p[i] != bar)  {
103 			moverr (i);
104 			curmove (20,0);
105 			writel ("Men still on bar.\n");
106 			return (0);
107 		}
108 
109 		if ( (m = makmove(i)) )  {
110 			moverr (i);
111 			switch (m)  {
112 
113 			case 1:
114 				writel ("Move not rolled.\n");
115 				break;
116 
117 			case 2:
118 				writel ("Bad starting position.\n");
119 				break;
120 
121 			case 3:
122 				writel ("Destination occupied.\n");
123 				break;
124 
125 			case 4:
126 				writel ("Can't remove men yet.\n");
127 			}
128 			return (0);
129 		}
130 	}
131 	return (1);
132 }
133