1*87f25a4aStb /* $OpenBSD: table.c,v 1.9 2015/11/30 08:19:25 tb Exp $ */
2df930be7Sderaadt
3df930be7Sderaadt /*
4df930be7Sderaadt * Copyright (c) 1980, 1993
5df930be7Sderaadt * The Regents of the University of California. All rights reserved.
6df930be7Sderaadt *
7df930be7Sderaadt * Redistribution and use in source and binary forms, with or without
8df930be7Sderaadt * modification, are permitted provided that the following conditions
9df930be7Sderaadt * are met:
10df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright
11df930be7Sderaadt * notice, this list of conditions and the following disclaimer.
12df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright
13df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the
14df930be7Sderaadt * documentation and/or other materials provided with the distribution.
157a09557bSmillert * 3. Neither the name of the University nor the names of its contributors
16df930be7Sderaadt * may be used to endorse or promote products derived from this software
17df930be7Sderaadt * without specific prior written permission.
18df930be7Sderaadt *
19df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20df930be7Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21df930be7Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22df930be7Sderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23df930be7Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24df930be7Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25df930be7Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26df930be7Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27df930be7Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28df930be7Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29df930be7Sderaadt * SUCH DAMAGE.
30df930be7Sderaadt */
31df930be7Sderaadt
32d62ad8d8Spjanzen #include <ctype.h>
33df930be7Sderaadt #include "back.h"
34df930be7Sderaadt
357341125dSpjanzen const char *const help2[] = {
36df930be7Sderaadt " Enter moves as <s>-<f> or <s>/<r> where <s> is the starting",
37df930be7Sderaadt "position, <f> is the finishing position, and <r> is the roll.",
38df930be7Sderaadt "Remember, each die roll must be moved separately.",
39df930be7Sderaadt 0
40df930be7Sderaadt };
41df930be7Sderaadt
42df930be7Sderaadt struct state {
43df930be7Sderaadt char ch;
44df930be7Sderaadt int fcode;
45df930be7Sderaadt int newst;
46df930be7Sderaadt };
47df930be7Sderaadt
487341125dSpjanzen static const struct state atmata[] = {
49df930be7Sderaadt
5053da1682Spjanzen {'R', 1, 0}, {'?', 7, 0}, {'Q', 0, -3}, {'B', 8, 25},
5153da1682Spjanzen {'9', 2, 25}, {'8', 2, 25}, {'7', 2, 25}, {'6', 2, 25},
5253da1682Spjanzen {'5', 2, 25}, {'4', 2, 25}, {'3', 2, 25}, {'2', 2, 19},
5353da1682Spjanzen {'1', 2, 15}, {'0', 2, 25}, {'.', 0, 0}, {'9', 2, 25},
5453da1682Spjanzen {'8', 2, 25}, {'7', 2, 25}, {'6', 2, 25}, {'5', 2, 25},
55df930be7Sderaadt
5653da1682Spjanzen {'4', 2, 25}, {'3', 2, 25}, {'2', 2, 25}, {'1', 2, 25},
5753da1682Spjanzen {'0', 2, 25}, {'/', 0, 32}, {'-', 0, 39}, {'.', 0, 0},
5853da1682Spjanzen {'/', 5, 32}, {' ', 6, 3}, {',', 6, 3}, {'\n', 0, -1},
5953da1682Spjanzen {'6', 3, 28}, {'5', 3, 28}, {'4', 3, 28}, {'3', 3, 28},
6053da1682Spjanzen {'2', 3, 28}, {'1', 3, 28}, {'.', 0, 0}, {'H', 9, 61},
61df930be7Sderaadt
6253da1682Spjanzen {'9', 4, 61}, {'8', 4, 61}, {'7', 4, 61}, {'6', 4, 61},
6353da1682Spjanzen {'5', 4, 61}, {'4', 4, 61}, {'3', 4, 61}, {'2', 4, 53},
6453da1682Spjanzen {'1', 4, 51}, {'0', 4, 61}, {'.', 0, 0}, {'9', 4, 61},
6553da1682Spjanzen {'8', 4, 61}, {'7', 4, 61}, {'6', 4, 61}, {'5', 4, 61},
6653da1682Spjanzen {'4', 4, 61}, {'3', 4, 61}, {'2', 4, 61}, {'1', 4, 61},
67df930be7Sderaadt
6853da1682Spjanzen {'0', 4, 61}, {' ', 6, 3}, {',', 6, 3}, {'-', 5, 39},
6953da1682Spjanzen {'\n', 0, -1}, {'.', 0, 0}
70df930be7Sderaadt };
71df930be7Sderaadt
7253da1682Spjanzen int
checkmove(int ist)73*87f25a4aStb checkmove(int ist)
74df930be7Sderaadt {
75d62ad8d8Spjanzen int curr, curc;
7653da1682Spjanzen int j, n;
77d62ad8d8Spjanzen int c;
78df930be7Sderaadt
79df930be7Sderaadt domove:
80d62ad8d8Spjanzen getyx(stdscr, curr, curc);
81d62ad8d8Spjanzen if (ist == 0)
82d62ad8d8Spjanzen mvprintw(curr, 32, "Move: ");
83df930be7Sderaadt ist = mvl = ncin = 0;
84df930be7Sderaadt for (j = 0; j < 5; j++)
85df930be7Sderaadt p[j] = g[j] = -1;
86df930be7Sderaadt
87df930be7Sderaadt dochar:
88df930be7Sderaadt c = readc();
89df930be7Sderaadt
90df930be7Sderaadt if (c == 'S') {
91df930be7Sderaadt raflag = 0;
92df930be7Sderaadt save(1);
93d62ad8d8Spjanzen move(cturn == -1 ? 18 : 19, 39);
94df930be7Sderaadt ist = -1;
95df930be7Sderaadt goto domove;
96df930be7Sderaadt }
97d62ad8d8Spjanzen if ((c == KEY_BACKSPACE || c == 0177) && ncin > 0) {
98d62ad8d8Spjanzen getyx(stdscr, curr, curc);
99d62ad8d8Spjanzen move(curr, curc - 1);
100df930be7Sderaadt ncin--;
101df930be7Sderaadt n = rsetbrd();
102df930be7Sderaadt if (n == 0) {
103df930be7Sderaadt n = -1;
104df930be7Sderaadt refresh();
105df930be7Sderaadt }
106df930be7Sderaadt if ((ist = n) > 0)
107df930be7Sderaadt goto dochar;
108d62ad8d8Spjanzen getyx(stdscr, curr, curc);
109d62ad8d8Spjanzen move(curr, 39);
11042b6d459Spjanzen clrtoeol();
11142b6d459Spjanzen goto domove;
11242b6d459Spjanzen } else if (c == KEY_DL && ncin > 0) {
11342b6d459Spjanzen getyx(stdscr, curr, curc);
11442b6d459Spjanzen move(curr, 39);
11542b6d459Spjanzen clrtoeol();
116df930be7Sderaadt ist = -1;
11742b6d459Spjanzen refresh();
118df930be7Sderaadt goto domove;
119df930be7Sderaadt }
12042b6d459Spjanzen if (!isascii(c) || (ncin >= CIN_SIZE - 1)) {
121d62ad8d8Spjanzen beep();
122d62ad8d8Spjanzen goto domove;
123df930be7Sderaadt }
124df930be7Sderaadt n = dotable(c, ist);
125df930be7Sderaadt if (n >= 0) {
126df930be7Sderaadt cin[ncin++] = c;
127df930be7Sderaadt if (n > 2)
128d62ad8d8Spjanzen if (c != '\n')
129d62ad8d8Spjanzen addch(c);
130df930be7Sderaadt ist = n;
131df930be7Sderaadt if (n)
132df930be7Sderaadt goto dochar;
133df930be7Sderaadt else
134df930be7Sderaadt goto domove;
135df930be7Sderaadt }
136df930be7Sderaadt if (n == -1 && mvl >= mvlim)
137df930be7Sderaadt return(0);
138df930be7Sderaadt if (n == -1 && mvl < mvlim-1)
139df930be7Sderaadt return(-4);
140df930be7Sderaadt if (n == -6) {
141df930be7Sderaadt if (movokay(mvl + 1)) {
142d62ad8d8Spjanzen moveplayers();
143df930be7Sderaadt movback(mvl + 1);
144df930be7Sderaadt } else
145d62ad8d8Spjanzen move(cturn == -1 ? 18 : 19, ncin + 39);
146df930be7Sderaadt ist = n = rsetbrd();
147df930be7Sderaadt goto dochar;
148df930be7Sderaadt }
149df930be7Sderaadt if (n != -5)
150df930be7Sderaadt return(n);
151d62ad8d8Spjanzen beep();
152df930be7Sderaadt goto dochar;
153df930be7Sderaadt }
15453da1682Spjanzen
15553da1682Spjanzen int
dotable(char c,int i)156*87f25a4aStb dotable(char c, int i)
157df930be7Sderaadt {
15853da1682Spjanzen int a;
159df930be7Sderaadt int test;
160df930be7Sderaadt
161df930be7Sderaadt test = (c == 'R');
162df930be7Sderaadt
163df930be7Sderaadt while ((a = atmata[i].ch) != '.') {
164df930be7Sderaadt if (a == c || (test && a == '\n')) {
165df930be7Sderaadt switch (atmata[i].fcode) {
166df930be7Sderaadt case 1:
167df930be7Sderaadt wrboard();
168d62ad8d8Spjanzen move(cturn == -1 ? 18 : 19, 0);
169df930be7Sderaadt proll();
170d62ad8d8Spjanzen addstr("\t\t");
171df930be7Sderaadt break;
172df930be7Sderaadt
173df930be7Sderaadt case 2:
174df930be7Sderaadt if (p[mvl] == -1)
175df930be7Sderaadt p[mvl] = c - '0';
176df930be7Sderaadt else
177df930be7Sderaadt p[mvl] = p[mvl] * 10 + c - '0';
178df930be7Sderaadt break;
179df930be7Sderaadt
180df930be7Sderaadt case 3:
181df930be7Sderaadt if (g[mvl] != -1) {
182df930be7Sderaadt if (mvl < mvlim)
183df930be7Sderaadt mvl++;
184df930be7Sderaadt p[mvl] = p[mvl - 1];
185df930be7Sderaadt }
186df930be7Sderaadt g[mvl] = p[mvl] + cturn * (c - '0');
187df930be7Sderaadt if (g[mvl] < 0)
188df930be7Sderaadt g[mvl] = 0;
189df930be7Sderaadt if (g[mvl] > 25)
190df930be7Sderaadt g[mvl] = 25;
191df930be7Sderaadt break;
192df930be7Sderaadt
193df930be7Sderaadt case 4:
194df930be7Sderaadt if (g[mvl] == -1)
195df930be7Sderaadt g[mvl] = c - '0';
196df930be7Sderaadt else
197df930be7Sderaadt g[mvl] = g[mvl] * 10 + c - '0';
198df930be7Sderaadt break;
199df930be7Sderaadt
200df930be7Sderaadt case 5:
201df930be7Sderaadt if (mvl < mvlim)
202df930be7Sderaadt mvl++;
203df930be7Sderaadt p[mvl] = g[mvl - 1];
204df930be7Sderaadt break;
205df930be7Sderaadt
206df930be7Sderaadt case 6:
207df930be7Sderaadt if (mvl < mvlim)
208df930be7Sderaadt mvl++;
209df930be7Sderaadt break;
210df930be7Sderaadt
211df930be7Sderaadt case 7:
212d62ad8d8Spjanzen move(20, 0);
213df930be7Sderaadt text(help2);
214d62ad8d8Spjanzen move(cturn == -1 ? 18 : 19, 39);
215df930be7Sderaadt break;
216df930be7Sderaadt
217df930be7Sderaadt case 8:
218df930be7Sderaadt p[mvl] = bar;
219df930be7Sderaadt break;
220df930be7Sderaadt
221df930be7Sderaadt case 9:
222df930be7Sderaadt g[mvl] = home;
223df930be7Sderaadt }
224df930be7Sderaadt
225df930be7Sderaadt if (!test || a != '\n')
226df930be7Sderaadt return(atmata[i].newst);
227df930be7Sderaadt else
228df930be7Sderaadt return(-6);
229df930be7Sderaadt }
230df930be7Sderaadt i++;
231df930be7Sderaadt }
232df930be7Sderaadt return (-5);
233df930be7Sderaadt }
23453da1682Spjanzen
23553da1682Spjanzen int
rsetbrd(void)236*87f25a4aStb rsetbrd(void)
23753da1682Spjanzen {
23853da1682Spjanzen int i, j, n;
239df930be7Sderaadt
240df930be7Sderaadt n = 0;
241df930be7Sderaadt mvl = 0;
242df930be7Sderaadt for (i = 0; i < 4; i++)
243df930be7Sderaadt p[i] = g[i] = -1;
244df930be7Sderaadt for (j = 0; j < ncin; j++)
24534944f90Stedu if ((n = dotable(cin[j], n)) < 0)
24634944f90Stedu return (n);
247df930be7Sderaadt return(n);
248df930be7Sderaadt }
249