xref: /openbsd-src/games/backgammon/common_source/one.c (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1 /*	$OpenBSD: one.c,v 1.3 2001/06/23 23:50:03 pjanzen Exp $	*/
2 
3 /*
4  * Copyright (c) 1980, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *	This product includes software developed by the University of
18  *	California, Berkeley and its contributors.
19  * 4. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #ifndef lint
37 #if 0
38 static char sccsid[] = "@(#)one.c	8.1 (Berkeley) 5/31/93";
39 #else
40 static char rcsid[] = "$OpenBSD: one.c,v 1.3 2001/06/23 23:50:03 pjanzen Exp $";
41 #endif
42 #endif /* not lint */
43 
44 #include "back.h"
45 
46 int
47 makmove(i)
48 	int     i;
49 {
50 	int     n, d;
51 	int     max;
52 
53 	d = d0;
54 	n = abs(g[i] - p[i]);
55 	max = (*offptr < 0 ? 7 : last());
56 	if (board[p[i]] * cturn <= 0)
57 		return(checkd(d) + 2);
58 	if (g[i] != home && board[g[i]] * cturn < -1)
59 		return(checkd(d) + 3);
60 	if (i || D0 == D1) {
61 		if (n == max ? D1 < n : D1 != n)
62 			return(checkd(d) + 1);
63 	} else {
64 		if (n == max ? D0 < n && D1 < n : D0 != n && D1 != n)
65 			return(checkd(d) + 1);
66 		if (n == max ? D0 < n : D0 != n) {
67 			if (d0)
68 				return (checkd(d) + 1);
69 			swap;
70 		}
71 	}
72 	if (g[i] == home && *offptr < 0)
73 		return(checkd(d) + 4);
74 	h[i] = 0;
75 	board[p[i]] -= cturn;
76 	if (g[i] != home) {
77 		if (board[g[i]] == -cturn) {
78 			board[home] -= cturn;
79 			board[g[i]] = 0;
80 			h[i] = 1;
81 			if (abs(bar - g[i]) < 7) {
82 				(*inopp)--;
83 				if (*offopp >= 0)
84 					*offopp -= 15;
85 			}
86 		}
87 		board[g[i]] += cturn;
88 		if (abs(home - g[i]) < 7 && abs(home - p[i]) > 6) {
89 			(*inptr)++;
90 			if (*inptr + *offptr == 0)
91 				*offptr += 15;
92 		}
93 	} else {
94 		(*offptr)++;
95 		(*inptr)--;
96 	}
97 	return(0);
98 }
99 
100 void
101 moverr(i)
102 	int     i;
103 {
104 	int     j;
105 
106 	mvprintw(20, 0, "Error:  ");
107 	for (j = 0; j <= i; j++) {
108 		printw("%d-%d", p[j], g[j]);
109 		if (j < i)
110 			addch(',');
111 	}
112 	addstr("... ");
113 	movback(i);
114 }
115 
116 int
117 checkd(d)
118 	int     d;
119 {
120 	if (d0 != d)
121 		swap;
122 	return(0);
123 }
124 
125 int
126 last()
127 {
128 	int     i;
129 
130 	for (i = home - 6 * cturn; i != home; i += cturn)
131 		if (board[i] * cturn > 0)
132 			return(abs(home - i));
133 	return(-1);
134 }
135 
136 void
137 movback(i)
138 	int     i;
139 {
140 	int     j;
141 
142 	for (j = i - 1; j >= 0; j--)
143 		backone(j);
144 }
145 
146 void
147 backone(i)
148 	int     i;
149 {
150 	board[p[i]] += cturn;
151 	if (g[i] != home) {
152 		board[g[i]] -= cturn;
153 		if (abs(g[i] - home) < 7 && abs(p[i] - home) > 6) {
154 			(*inptr)--;
155 			if (*inptr + *offptr < 15 && *offptr >= 0)
156 				*offptr -= 15;
157 		}
158 	} else {
159 		(*offptr)--;
160 		(*inptr)++;
161 	}
162 	if (h[i]) {
163 		board[home] += cturn;
164 		board[g[i]] = -cturn;
165 		if (abs(bar - g[i]) < 7) {
166 			(*inopp)++;
167 			if (*inopp + *offopp == 0)
168 				*offopp += 15;
169 		}
170 	}
171 }
172