table.c revision 1.1 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.1 cgd static char sccsid[] = "@(#)table.c 5.4 (Berkeley) 6/1/90";
36 1.1 cgd #endif /* not lint */
37 1.1 cgd
38 1.1 cgd #include "back.h"
39 1.1 cgd
40 1.1 cgd char *help2[] = {
41 1.1 cgd " Enter moves as <s>-<f> or <s>/<r> where <s> is the starting",
42 1.1 cgd "position, <f> is the finishing position, and <r> is the roll.",
43 1.1 cgd "Remember, each die roll must be moved separately.",
44 1.1 cgd 0
45 1.1 cgd };
46 1.1 cgd
47 1.1 cgd struct state {
48 1.1 cgd char ch;
49 1.1 cgd int fcode;
50 1.1 cgd int newst;
51 1.1 cgd };
52 1.1 cgd
53 1.1 cgd struct state atmata[] = {
54 1.1 cgd
55 1.1 cgd 'R', 1, 0, '?', 7, 0, 'Q', 0, -3, 'B', 8, 25,
56 1.1 cgd '9', 2, 25, '8', 2, 25, '7', 2, 25, '6', 2, 25,
57 1.1 cgd '5', 2, 25, '4', 2, 25, '3', 2, 25, '2', 2, 19,
58 1.1 cgd '1', 2, 15, '0', 2, 25, '.', 0, 0, '9', 2, 25,
59 1.1 cgd '8', 2, 25, '7', 2, 25, '6', 2, 25, '5', 2, 25,
60 1.1 cgd
61 1.1 cgd '4', 2, 25, '3', 2, 25, '2', 2, 25, '1', 2, 25,
62 1.1 cgd '0', 2, 25, '/', 0, 32, '-', 0, 39, '.', 0, 0,
63 1.1 cgd '/', 5, 32, ' ', 6, 3, ',', 6, 3, '\n', 0, -1,
64 1.1 cgd '6', 3, 28, '5', 3, 28, '4', 3, 28, '3', 3, 28,
65 1.1 cgd '2', 3, 28, '1', 3, 28, '.', 0, 0, 'H', 9, 61,
66 1.1 cgd
67 1.1 cgd '9', 4, 61, '8', 4, 61, '7', 4, 61, '6', 4, 61,
68 1.1 cgd '5', 4, 61, '4', 4, 61, '3', 4, 61, '2', 4, 53,
69 1.1 cgd '1', 4, 51, '0', 4, 61, '.', 0, 0, '9', 4, 61,
70 1.1 cgd '8', 4, 61, '7', 4, 61, '6', 4, 61, '5', 4, 61,
71 1.1 cgd '4', 4, 61, '3', 4, 61, '2', 4, 61, '1', 4, 61,
72 1.1 cgd
73 1.1 cgd '0', 4, 61, ' ', 6, 3, ',', 6, 3, '-', 5, 39,
74 1.1 cgd '\n', 0, -1, '.', 0, 0
75 1.1 cgd };
76 1.1 cgd
77 1.1 cgd checkmove (ist)
78 1.1 cgd
79 1.1 cgd int ist;
80 1.1 cgd
81 1.1 cgd {
82 1.1 cgd register int j, n;
83 1.1 cgd register char c;
84 1.1 cgd char a;
85 1.1 cgd
86 1.1 cgd domove:
87 1.1 cgd if (ist == 0) {
88 1.1 cgd if (tflag)
89 1.1 cgd curmove (curr,32);
90 1.1 cgd else
91 1.1 cgd writel ("\t\t");
92 1.1 cgd writel ("Move: ");
93 1.1 cgd }
94 1.1 cgd ist = mvl = ncin = 0;
95 1.1 cgd for (j = 0; j < 5; j++)
96 1.1 cgd p[j] = g[j] = -1;
97 1.1 cgd
98 1.1 cgd dochar:
99 1.1 cgd c = readc();
100 1.1 cgd
101 1.1 cgd if (c == 'S') {
102 1.1 cgd raflag = 0;
103 1.1 cgd save (1);
104 1.1 cgd if (tflag) {
105 1.1 cgd curmove (cturn == -1? 18: 19,39);
106 1.1 cgd ist = -1;
107 1.1 cgd goto domove;
108 1.1 cgd } else {
109 1.1 cgd proll ();
110 1.1 cgd ist = 0;
111 1.1 cgd goto domove;
112 1.1 cgd }
113 1.1 cgd }
114 1.1 cgd
115 1.1 cgd if (c == tty.sg_erase && ncin > 0) {
116 1.1 cgd if (tflag)
117 1.1 cgd curmove (curr,curc-1);
118 1.1 cgd else {
119 1.1 cgd if (tty.sg_erase == '\010')
120 1.1 cgd writel ("\010 \010");
121 1.1 cgd else
122 1.1 cgd writec (cin[ncin-1]);
123 1.1 cgd }
124 1.1 cgd ncin--;
125 1.1 cgd n = rsetbrd();
126 1.1 cgd if (n == 0) {
127 1.1 cgd n = -1;
128 1.1 cgd if (tflag)
129 1.1 cgd refresh();
130 1.1 cgd }
131 1.1 cgd if ((ist = n) > 0)
132 1.1 cgd goto dochar;
133 1.1 cgd goto domove;
134 1.1 cgd }
135 1.1 cgd
136 1.1 cgd if (c == tty.sg_kill && ncin > 0) {
137 1.1 cgd if (tflag) {
138 1.1 cgd refresh();
139 1.1 cgd curmove (curr,39);
140 1.1 cgd ist = -1;
141 1.1 cgd goto domove;
142 1.1 cgd } else if (tty.sg_erase == '\010') {
143 1.1 cgd for (j = 0; j < ncin; j++)
144 1.1 cgd writel ("\010 \010");
145 1.1 cgd ist = -1;
146 1.1 cgd goto domove;
147 1.1 cgd } else {
148 1.1 cgd writec ('\\');
149 1.1 cgd writec ('\n');
150 1.1 cgd proll ();
151 1.1 cgd ist = 0;
152 1.1 cgd goto domove;
153 1.1 cgd }
154 1.1 cgd }
155 1.1 cgd
156 1.1 cgd n = dotable(c,ist);
157 1.1 cgd if (n >= 0) {
158 1.1 cgd cin[ncin++] = c;
159 1.1 cgd if (n > 2)
160 1.1 cgd if ((! tflag) || c != '\n')
161 1.1 cgd writec (c);
162 1.1 cgd ist = n;
163 1.1 cgd if (n)
164 1.1 cgd goto dochar;
165 1.1 cgd else
166 1.1 cgd goto domove;
167 1.1 cgd }
168 1.1 cgd
169 1.1 cgd if (n == -1 && mvl >= mvlim)
170 1.1 cgd return(0);
171 1.1 cgd if (n == -1 && mvl < mvlim-1)
172 1.1 cgd return(-4);
173 1.1 cgd
174 1.1 cgd if (n == -6) {
175 1.1 cgd if (! tflag) {
176 1.1 cgd if (movokay(mvl+1)) {
177 1.1 cgd wrboard();
178 1.1 cgd movback (mvl+1);
179 1.1 cgd }
180 1.1 cgd proll ();
181 1.1 cgd writel ("\t\tMove: ");
182 1.1 cgd for (j = 0; j < ncin;)
183 1.1 cgd writec (cin[j++]);
184 1.1 cgd } else {
185 1.1 cgd if (movokay(mvl+1)) {
186 1.1 cgd refresh();
187 1.1 cgd movback (mvl+1);
188 1.1 cgd } else
189 1.1 cgd curmove (cturn == -1? 18:19,ncin+39);
190 1.1 cgd }
191 1.1 cgd ist = n = rsetbrd();
192 1.1 cgd goto dochar;
193 1.1 cgd }
194 1.1 cgd
195 1.1 cgd if (n != -5)
196 1.1 cgd return(n);
197 1.1 cgd writec ('\007');
198 1.1 cgd goto dochar;
199 1.1 cgd }
200 1.1 cgd
201 1.1 cgd dotable (c,i)
203 1.1 cgd char c;
204 1.1 cgd register int i;
205 1.1 cgd
206 1.1 cgd {
207 1.1 cgd register int a, j;
208 1.1 cgd int test;
209 1.1 cgd
210 1.1 cgd test = (c == 'R');
211 1.1 cgd
212 1.1 cgd while ( (a = atmata[i].ch) != '.') {
213 1.1 cgd if (a == c || (test && a == '\n')) {
214 1.1 cgd switch (atmata[i].fcode) {
215 1.1 cgd
216 1.1 cgd case 1:
217 1.1 cgd wrboard();
218 1.1 cgd if (tflag) {
219 1.1 cgd curmove (cturn == -1? 18: 19,0);
220 1.1 cgd proll ();
221 1.1 cgd writel ("\t\t");
222 1.1 cgd } else
223 1.1 cgd proll ();
224 1.1 cgd break;
225 1.1 cgd
226 1.1 cgd case 2:
227 1.1 cgd if (p[mvl] == -1)
228 1.1 cgd p[mvl] = c-'0';
229 1.1 cgd else
230 1.1 cgd p[mvl] = p[mvl]*10+c-'0';
231 1.1 cgd break;
232 1.1 cgd
233 1.1 cgd case 3:
234 1.1 cgd if (g[mvl] != -1) {
235 1.1 cgd if (mvl < mvlim)
236 1.1 cgd mvl++;
237 1.1 cgd p[mvl] = p[mvl-1];
238 1.1 cgd }
239 1.1 cgd g[mvl] = p[mvl]+cturn*(c-'0');
240 1.1 cgd if (g[mvl] < 0)
241 1.1 cgd g[mvl] = 0;
242 1.1 cgd if (g[mvl] > 25)
243 1.1 cgd g[mvl] = 25;
244 1.1 cgd break;
245 1.1 cgd
246 1.1 cgd case 4:
247 1.1 cgd if (g[mvl] == -1)
248 1.1 cgd g[mvl] = c-'0';
249 1.1 cgd else
250 1.1 cgd g[mvl] = g[mvl]*10+c-'0';
251 1.1 cgd break;
252 1.1 cgd
253 1.1 cgd case 5:
254 1.1 cgd if (mvl < mvlim)
255 1.1 cgd mvl++;
256 1.1 cgd p[mvl] = g[mvl-1];
257 1.1 cgd break;
258 1.1 cgd
259 1.1 cgd case 6:
260 1.1 cgd if (mvl < mvlim)
261 1.1 cgd mvl++;
262 1.1 cgd break;
263 1.1 cgd
264 1.1 cgd case 7:
265 1.1 cgd if (tflag)
266 1.1 cgd curmove (20,0);
267 1.1 cgd else
268 1.1 cgd writec ('\n');
269 1.1 cgd text (help2);
270 1.1 cgd if (tflag) {
271 1.1 cgd curmove (cturn == -1? 18: 19,39);
272 1.1 cgd } else {
273 1.1 cgd writec ('\n');
274 1.1 cgd proll();
275 1.1 cgd writel ("\t\tMove: ");
276 1.1 cgd }
277 1.1 cgd break;
278 1.1 cgd
279 1.1 cgd case 8:
280 1.1 cgd p[mvl] = bar;
281 1.1 cgd break;
282 1.1 cgd
283 1.1 cgd case 9:
284 1.1 cgd g[mvl] = home;
285 1.1 cgd }
286 1.1 cgd
287 1.1 cgd if (! test || a != '\n')
288 1.1 cgd return (atmata[i].newst);
289 1.1 cgd else
290 1.1 cgd return (-6);
291 1.1 cgd }
292 1.1 cgd
293 1.1 cgd i++;
294 1.1 cgd }
295 1.1 cgd
296 1.1 cgd return (-5);
297 1.1 cgd }
298 1.1 cgd
299 1.1 cgd rsetbrd () {
301 1.1 cgd register int i, j, n;
302 1.1 cgd
303 1.1 cgd n = 0;
304 1.1 cgd mvl = 0;
305 1.1 cgd for (i = 0; i < 4; i++)
306 1.1 cgd p[i] = g[i] = -1;
307 1.1 cgd for (j = 0; j < ncin; j++)
308 1.1 cgd n = dotable (cin[j],n);
309 return (n);
310 }
311