check.c revision 1.5 1 /* $NetBSD: check.c,v 1.5 2003/08/07 09:36:57 agc Exp $ */
2
3 /*
4 * Copyright (c) 1980, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32 #include <sys/cdefs.h>
33 #ifndef lint
34 #if 0
35 static char sccsid[] = "@(#)check.c 8.1 (Berkeley) 5/31/93";
36 #else
37 __RCSID("$NetBSD: check.c,v 1.5 2003/08/07 09:36:57 agc Exp $");
38 #endif
39 #endif /* not lint */
40
41 #include "back.h"
42
43 void
44 getmove()
45 {
46 int i, c;
47
48 c = 0;
49 for (;;) {
50 i = checkmove(c);
51
52 switch (i) {
53 case -1:
54 if (movokay(mvlim)) {
55 if (tflag)
56 curmove(20, 0);
57 else
58 writec('\n');
59 for (i = 0; i < mvlim; i++)
60 if (h[i])
61 wrhit(g[i]);
62 nexturn();
63 if (*offopp == 15)
64 cturn *= -2;
65 if (tflag && pnum)
66 bflag = pnum;
67 return;
68 }
69 case -4:
70 case 0:
71 if (tflag)
72 refresh();
73 if (i != 0 && i != -4)
74 break;
75 if (tflag)
76 curmove(20, 0);
77 else
78 writec('\n');
79 writel(*Colorptr);
80 if (i == -4)
81 writel(" must make ");
82 else
83 writel(" can only make ");
84 writec(mvlim + '0');
85 writel(" move");
86 if (mvlim > 1)
87 writec('s');
88 writec('.');
89 writec('\n');
90 break;
91
92 case -3:
93 if (quit())
94 return;
95 }
96
97 if (!tflag)
98 proll();
99 else {
100 curmove(cturn == -1 ? 18 : 19, 39);
101 cline();
102 c = -1;
103 }
104 }
105 }
106
107 int
108 movokay(mv)
109 int mv;
110 {
111 int i, m;
112
113 if (d0)
114 swap;
115
116 for (i = 0; i < mv; i++) {
117 if (p[i] == g[i]) {
118 moverr(i);
119 curmove(20, 0);
120 writel("Attempt to move to same location.\n");
121 return (0);
122 }
123 if (cturn * (g[i] - p[i]) < 0) {
124 moverr(i);
125 curmove(20, 0);
126 writel("Backwards move.\n");
127 return (0);
128 }
129 if (abs(board[bar]) && p[i] != bar) {
130 moverr(i);
131 curmove(20, 0);
132 writel("Men still on bar.\n");
133 return (0);
134 }
135 if ((m = makmove(i))) {
136 moverr(i);
137 switch (m) {
138
139 case 1:
140 writel("Move not rolled.\n");
141 break;
142
143 case 2:
144 writel("Bad starting position.\n");
145 break;
146
147 case 3:
148 writel("Destination occupied.\n");
149 break;
150
151 case 4:
152 writel("Can't remove men yet.\n");
153 }
154 return (0);
155 }
156 }
157 return (1);
158 }
159