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