|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.