1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  */
17 
18 #ifndef lint
19 static char sccsid[] = "@(#)check.c	5.3 (Berkeley) 06/18/88";
20 #endif /* not lint */
21 
22 #include "back.h"
23 
24 getmove ()  {
25 	register int	i, c;
26 
27 	c = 0;
28 	for (;;)  {
29 		i = checkmove(c);
30 
31 		switch (i)  {
32 		case -1:
33 			if (movokay(mvlim))  {
34 				if (tflag)
35 					curmove (20,0);
36 				else
37 					writec ('\n');
38 				for (i = 0; i < mvlim; i++)
39 					if (h[i])
40 						wrhit(g[i]);
41 				nexturn();
42 				if (*offopp == 15)
43 					cturn *= -2;
44 				if (tflag && pnum)
45 					bflag = pnum;
46 				return;
47 			}
48 
49 		case -4:
50 		case 0:
51 			if (tflag)
52 				refresh();
53 			if (i != 0 && i != -4)
54 				break;
55 			if (tflag)
56 				curmove (20,0);
57 			else
58 				writec ('\n');
59 			writel (*Colorptr);
60 			if (i == -4)
61 				writel (" must make ");
62 			else
63 				writel (" can only make ");
64 			writec (mvlim+'0');
65 			writel (" move");
66 			if (mvlim > 1)
67 				writec ('s');
68 			writec ('.');
69 			writec ('\n');
70 			break;
71 
72 		case -3:
73 			if (quit())
74 				return;
75 		}
76 
77 		if (! tflag)
78 			proll ();
79 		else  {
80 			curmove (cturn == -1? 18: 19,39);
81 			cline ();
82 			c = -1;
83 		}
84 	}
85 }
86 
87 movokay (mv)
88 register int	mv;
89 
90 {
91 	register int	i, m;
92 
93 	if (d0)
94 		swap;
95 
96 	for (i = 0; i < mv; i++)  {
97 
98 		if (p[i] == g[i])  {
99 			moverr (i);
100 			curmove (20,0);
101 			writel ("Attempt to move to same location.\n");
102 			return (0);
103 		}
104 
105 		if (cturn*(g[i]-p[i]) < 0)  {
106 			moverr (i);
107 			curmove (20,0);
108 			writel ("Backwards move.\n");
109 			return (0);
110 		}
111 
112 		if (abs(board[bar]) && p[i] != bar)  {
113 			moverr (i);
114 			curmove (20,0);
115 			writel ("Men still on bar.\n");
116 			return (0);
117 		}
118 
119 		if ( (m = makmove(i)) )  {
120 			moverr (i);
121 			switch (m)  {
122 
123 			case 1:
124 				writel ("Move not rolled.\n");
125 				break;
126 
127 			case 2:
128 				writel ("Bad starting position.\n");
129 				break;
130 
131 			case 3:
132 				writel ("Destination occupied.\n");
133 				break;
134 
135 			case 4:
136 				writel ("Can't remove men yet.\n");
137 			}
138 			return (0);
139 		}
140 	}
141 	return (1);
142 }
143