xref: /openbsd-src/games/backgammon/common_source/table.c (revision 87f25a4abf762f43d1a2045a585c035489c33d7d)
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