table.c revision 1.2 1 1.1 cgd /*
2 1.1 cgd * Copyright (c) 1980 Regents of the University of California.
3 1.1 cgd * All rights reserved.
4 1.1 cgd *
5 1.1 cgd * Redistribution and use in source and binary forms, with or without
6 1.1 cgd * modification, are permitted provided that the following conditions
7 1.1 cgd * are met:
8 1.1 cgd * 1. Redistributions of source code must retain the above copyright
9 1.1 cgd * notice, this list of conditions and the following disclaimer.
10 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright
11 1.1 cgd * notice, this list of conditions and the following disclaimer in the
12 1.1 cgd * documentation and/or other materials provided with the distribution.
13 1.1 cgd * 3. All advertising materials mentioning features or use of this software
14 1.1 cgd * must display the following acknowledgement:
15 1.1 cgd * This product includes software developed by the University of
16 1.1 cgd * California, Berkeley and its contributors.
17 1.1 cgd * 4. Neither the name of the University nor the names of its contributors
18 1.1 cgd * may be used to endorse or promote products derived from this software
19 1.1 cgd * without specific prior written permission.
20 1.1 cgd *
21 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 1.1 cgd * SUCH DAMAGE.
32 1.1 cgd */
33 1.1 cgd
34 1.1 cgd #ifndef lint
35 1.2 mycroft /*static char sccsid[] = "from: @(#)table.c 5.4 (Berkeley) 6/1/90";*/
36 1.2 mycroft static char rcsid[] = "$Id: table.c,v 1.2 1993/08/01 18:56:35 mycroft Exp $";
37 1.1 cgd #endif /* not lint */
38 1.1 cgd
39 1.1 cgd #include "back.h"
40 1.1 cgd
41 1.1 cgd char *help2[] = {
42 1.1 cgd " Enter moves as <s>-<f> or <s>/<r> where <s> is the starting",
43 1.1 cgd "position, <f> is the finishing position, and <r> is the roll.",
44 1.1 cgd "Remember, each die roll must be moved separately.",
45 1.1 cgd 0
46 1.1 cgd };
47 1.1 cgd
48 1.1 cgd struct state {
49 1.1 cgd char ch;
50 1.1 cgd int fcode;
51 1.1 cgd int newst;
52 1.1 cgd };
53 1.1 cgd
54 1.1 cgd struct state atmata[] = {
55 1.1 cgd
56 1.1 cgd 'R', 1, 0, '?', 7, 0, 'Q', 0, -3, 'B', 8, 25,
57 1.1 cgd '9', 2, 25, '8', 2, 25, '7', 2, 25, '6', 2, 25,
58 1.1 cgd '5', 2, 25, '4', 2, 25, '3', 2, 25, '2', 2, 19,
59 1.1 cgd '1', 2, 15, '0', 2, 25, '.', 0, 0, '9', 2, 25,
60 1.1 cgd '8', 2, 25, '7', 2, 25, '6', 2, 25, '5', 2, 25,
61 1.1 cgd
62 1.1 cgd '4', 2, 25, '3', 2, 25, '2', 2, 25, '1', 2, 25,
63 1.1 cgd '0', 2, 25, '/', 0, 32, '-', 0, 39, '.', 0, 0,
64 1.1 cgd '/', 5, 32, ' ', 6, 3, ',', 6, 3, '\n', 0, -1,
65 1.1 cgd '6', 3, 28, '5', 3, 28, '4', 3, 28, '3', 3, 28,
66 1.1 cgd '2', 3, 28, '1', 3, 28, '.', 0, 0, 'H', 9, 61,
67 1.1 cgd
68 1.1 cgd '9', 4, 61, '8', 4, 61, '7', 4, 61, '6', 4, 61,
69 1.1 cgd '5', 4, 61, '4', 4, 61, '3', 4, 61, '2', 4, 53,
70 1.1 cgd '1', 4, 51, '0', 4, 61, '.', 0, 0, '9', 4, 61,
71 1.1 cgd '8', 4, 61, '7', 4, 61, '6', 4, 61, '5', 4, 61,
72 1.1 cgd '4', 4, 61, '3', 4, 61, '2', 4, 61, '1', 4, 61,
73 1.1 cgd
74 1.1 cgd '0', 4, 61, ' ', 6, 3, ',', 6, 3, '-', 5, 39,
75 1.1 cgd '\n', 0, -1, '.', 0, 0
76 1.1 cgd };
77 1.1 cgd
78 1.1 cgd checkmove (ist)
79 1.1 cgd
80 1.1 cgd int ist;
81 1.1 cgd
82 1.1 cgd {
83 1.1 cgd register int j, n;
84 1.1 cgd register char c;
85 1.1 cgd char a;
86 1.1 cgd
87 1.1 cgd domove:
88 1.1 cgd if (ist == 0) {
89 1.1 cgd if (tflag)
90 1.1 cgd curmove (curr,32);
91 1.1 cgd else
92 1.1 cgd writel ("\t\t");
93 1.1 cgd writel ("Move: ");
94 1.1 cgd }
95 1.1 cgd ist = mvl = ncin = 0;
96 1.1 cgd for (j = 0; j < 5; j++)
97 1.1 cgd p[j] = g[j] = -1;
98 1.1 cgd
99 1.1 cgd dochar:
100 1.1 cgd c = readc();
101 1.1 cgd
102 1.1 cgd if (c == 'S') {
103 1.1 cgd raflag = 0;
104 1.1 cgd save (1);
105 1.1 cgd if (tflag) {
106 1.1 cgd curmove (cturn == -1? 18: 19,39);
107 1.1 cgd ist = -1;
108 1.1 cgd goto domove;
109 1.1 cgd } else {
110 1.1 cgd proll ();
111 1.1 cgd ist = 0;
112 1.1 cgd goto domove;
113 1.1 cgd }
114 1.1 cgd }
115 1.1 cgd
116 1.1 cgd if (c == tty.sg_erase && ncin > 0) {
117 1.1 cgd if (tflag)
118 1.1 cgd curmove (curr,curc-1);
119 1.1 cgd else {
120 1.1 cgd if (tty.sg_erase == '\010')
121 1.1 cgd writel ("\010 \010");
122 1.1 cgd else
123 1.1 cgd writec (cin[ncin-1]);
124 1.1 cgd }
125 1.1 cgd ncin--;
126 1.1 cgd n = rsetbrd();
127 1.1 cgd if (n == 0) {
128 1.1 cgd n = -1;
129 1.1 cgd if (tflag)
130 1.1 cgd refresh();
131 1.1 cgd }
132 1.1 cgd if ((ist = n) > 0)
133 1.1 cgd goto dochar;
134 1.1 cgd goto domove;
135 1.1 cgd }
136 1.1 cgd
137 1.1 cgd if (c == tty.sg_kill && ncin > 0) {
138 1.1 cgd if (tflag) {
139 1.1 cgd refresh();
140 1.1 cgd curmove (curr,39);
141 1.1 cgd ist = -1;
142 1.1 cgd goto domove;
143 1.1 cgd } else if (tty.sg_erase == '\010') {
144 1.1 cgd for (j = 0; j < ncin; j++)
145 1.1 cgd writel ("\010 \010");
146 1.1 cgd ist = -1;
147 1.1 cgd goto domove;
148 1.1 cgd } else {
149 1.1 cgd writec ('\\');
150 1.1 cgd writec ('\n');
151 1.1 cgd proll ();
152 1.1 cgd ist = 0;
153 1.1 cgd goto domove;
154 1.1 cgd }
155 1.1 cgd }
156 1.1 cgd
157 1.1 cgd n = dotable(c,ist);
158 1.1 cgd if (n >= 0) {
159 1.1 cgd cin[ncin++] = c;
160 1.1 cgd if (n > 2)
161 1.1 cgd if ((! tflag) || c != '\n')
162 1.1 cgd writec (c);
163 1.1 cgd ist = n;
164 1.1 cgd if (n)
165 1.1 cgd goto dochar;
166 1.1 cgd else
167 1.1 cgd goto domove;
168 1.1 cgd }
169 1.1 cgd
170 1.1 cgd if (n == -1 && mvl >= mvlim)
171 1.1 cgd return(0);
172 1.1 cgd if (n == -1 && mvl < mvlim-1)
173 1.1 cgd return(-4);
174 1.1 cgd
175 1.1 cgd if (n == -6) {
176 1.1 cgd if (! tflag) {
177 1.1 cgd if (movokay(mvl+1)) {
178 1.1 cgd wrboard();
179 1.1 cgd movback (mvl+1);
180 1.1 cgd }
181 1.1 cgd proll ();
182 1.1 cgd writel ("\t\tMove: ");
183 1.1 cgd for (j = 0; j < ncin;)
184 1.1 cgd writec (cin[j++]);
185 1.1 cgd } else {
186 1.1 cgd if (movokay(mvl+1)) {
187 1.1 cgd refresh();
188 1.1 cgd movback (mvl+1);
189 1.1 cgd } else
190 1.1 cgd curmove (cturn == -1? 18:19,ncin+39);
191 1.1 cgd }
192 1.1 cgd ist = n = rsetbrd();
193 1.1 cgd goto dochar;
194 1.1 cgd }
195 1.1 cgd
196 1.1 cgd if (n != -5)
197 1.1 cgd return(n);
198 1.1 cgd writec ('\007');
199 1.1 cgd goto dochar;
200 1.1 cgd }
201 1.1 cgd
202 1.1 cgd dotable (c,i)
204 1.1 cgd char c;
205 1.1 cgd register int i;
206 1.1 cgd
207 1.1 cgd {
208 1.1 cgd register int a, j;
209 1.1 cgd int test;
210 1.1 cgd
211 1.1 cgd test = (c == 'R');
212 1.1 cgd
213 1.1 cgd while ( (a = atmata[i].ch) != '.') {
214 1.1 cgd if (a == c || (test && a == '\n')) {
215 1.1 cgd switch (atmata[i].fcode) {
216 1.1 cgd
217 1.1 cgd case 1:
218 1.1 cgd wrboard();
219 1.1 cgd if (tflag) {
220 1.1 cgd curmove (cturn == -1? 18: 19,0);
221 1.1 cgd proll ();
222 1.1 cgd writel ("\t\t");
223 1.1 cgd } else
224 1.1 cgd proll ();
225 1.1 cgd break;
226 1.1 cgd
227 1.1 cgd case 2:
228 1.1 cgd if (p[mvl] == -1)
229 1.1 cgd p[mvl] = c-'0';
230 1.1 cgd else
231 1.1 cgd p[mvl] = p[mvl]*10+c-'0';
232 1.1 cgd break;
233 1.1 cgd
234 1.1 cgd case 3:
235 1.1 cgd if (g[mvl] != -1) {
236 1.1 cgd if (mvl < mvlim)
237 1.1 cgd mvl++;
238 1.1 cgd p[mvl] = p[mvl-1];
239 1.1 cgd }
240 1.1 cgd g[mvl] = p[mvl]+cturn*(c-'0');
241 1.1 cgd if (g[mvl] < 0)
242 1.1 cgd g[mvl] = 0;
243 1.1 cgd if (g[mvl] > 25)
244 1.1 cgd g[mvl] = 25;
245 1.1 cgd break;
246 1.1 cgd
247 1.1 cgd case 4:
248 1.1 cgd if (g[mvl] == -1)
249 1.1 cgd g[mvl] = c-'0';
250 1.1 cgd else
251 1.1 cgd g[mvl] = g[mvl]*10+c-'0';
252 1.1 cgd break;
253 1.1 cgd
254 1.1 cgd case 5:
255 1.1 cgd if (mvl < mvlim)
256 1.1 cgd mvl++;
257 1.1 cgd p[mvl] = g[mvl-1];
258 1.1 cgd break;
259 1.1 cgd
260 1.1 cgd case 6:
261 1.1 cgd if (mvl < mvlim)
262 1.1 cgd mvl++;
263 1.1 cgd break;
264 1.1 cgd
265 1.1 cgd case 7:
266 1.1 cgd if (tflag)
267 1.1 cgd curmove (20,0);
268 1.1 cgd else
269 1.1 cgd writec ('\n');
270 1.1 cgd text (help2);
271 1.1 cgd if (tflag) {
272 1.1 cgd curmove (cturn == -1? 18: 19,39);
273 1.1 cgd } else {
274 1.1 cgd writec ('\n');
275 1.1 cgd proll();
276 1.1 cgd writel ("\t\tMove: ");
277 1.1 cgd }
278 1.1 cgd break;
279 1.1 cgd
280 1.1 cgd case 8:
281 1.1 cgd p[mvl] = bar;
282 1.1 cgd break;
283 1.1 cgd
284 1.1 cgd case 9:
285 1.1 cgd g[mvl] = home;
286 1.1 cgd }
287 1.1 cgd
288 1.1 cgd if (! test || a != '\n')
289 1.1 cgd return (atmata[i].newst);
290 1.1 cgd else
291 1.1 cgd return (-6);
292 1.1 cgd }
293 1.1 cgd
294 1.1 cgd i++;
295 1.1 cgd }
296 1.1 cgd
297 1.1 cgd return (-5);
298 1.1 cgd }
299 1.1 cgd
300 1.1 cgd rsetbrd () {
302 1.1 cgd register int i, j, n;
303 1.1 cgd
304 1.1 cgd n = 0;
305 1.1 cgd mvl = 0;
306 1.1 cgd for (i = 0; i < 4; i++)
307 1.1 cgd p[i] = g[i] = -1;
308 1.1 cgd for (j = 0; j < ncin; j++)
309 1.1 cgd n = dotable (cin[j],n);
310 return (n);
311 }
312