check.c revision 1.7 1 /* $NetBSD: check.c,v 1.7 2012/10/13 18:44:15 dholland 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.7 2012/10/13 18:44:15 dholland Exp $");
38 #endif
39 #endif /* not lint */
40
41 #include "back.h"
42
43 void
44 getmove(void)
45 {
46 int i, c;
47 struct move *mm = &gm;
48
49 c = 0;
50 for (;;) {
51 i = checkmove(c);
52
53 switch (i) {
54 case -1:
55 if (movokay(mm->mvlim)) {
56 if (tflag)
57 curmove(20, 0);
58 else
59 writec('\n');
60 for (i = 0; i < mm->mvlim; i++)
61 if (mm->h[i])
62 wrhit(mm->g[i]);
63 nexturn();
64 if (*offopp == 15)
65 cturn *= -2;
66 if (tflag && pnum)
67 bflag = pnum;
68 return;
69 }
70 case -4:
71 case 0:
72 if (tflag)
73 refresh();
74 if (i != 0 && i != -4)
75 break;
76 if (tflag)
77 curmove(20, 0);
78 else
79 writec('\n');
80 writel(*Colorptr);
81 if (i == -4)
82 writel(" must make ");
83 else
84 writel(" can only make ");
85 writec(mm->mvlim + '0');
86 writel(" move");
87 if (mm->mvlim > 1)
88 writec('s');
89 writec('.');
90 writec('\n');
91 break;
92
93 case -3:
94 if (quit())
95 return;
96 }
97
98 if (!tflag)
99 proll();
100 else {
101 curmove(cturn == -1 ? 18 : 19, 39);
102 cline();
103 c = -1;
104 }
105 }
106 }
107
108 int
109 movokay(int mv)
110 {
111 int i, m;
112 struct move *mm = &gm;
113
114 if (mm->d0)
115 mswap(mm);
116
117 for (i = 0; i < mv; i++) {
118 if (mm->p[i] == mm->g[i]) {
119 moverr(i);
120 curmove(20, 0);
121 writel("Attempt to move to same location.\n");
122 return (0);
123 }
124 if (cturn * (mm->g[i] - mm->p[i]) < 0) {
125 moverr(i);
126 curmove(20, 0);
127 writel("Backwards move.\n");
128 return (0);
129 }
130 if (abs(board[bar]) && mm->p[i] != bar) {
131 moverr(i);
132 curmove(20, 0);
133 writel("Men still on bar.\n");
134 return (0);
135 }
136 if ((m = makmove(i))) {
137 moverr(i);
138 switch (m) {
139
140 case 1:
141 writel("Move not rolled.\n");
142 break;
143
144 case 2:
145 writel("Bad starting position.\n");
146 break;
147
148 case 3:
149 writel("Destination occupied.\n");
150 break;
151
152 case 4:
153 writel("Can't remove men yet.\n");
154 }
155 return (0);
156 }
157 }
158 return (1);
159 }
160