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