1/*	$NetBSD: one.c,v 1.6 2005/07/01 01:12:39 jmc 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. Neither the name of the University nor the names of its contributors
16 *    may be used to endorse or promote products derived from this software
17 *    without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32#include <sys/cdefs.h>
33#ifndef lint
34#if 0
35static char sccsid[] = "@(#)one.c	8.1 (Berkeley) 5/31/93";
36#else
37__RCSID("$NetBSD: one.c,v 1.6 2005/07/01 01:12:39 jmc Exp $");
38#endif
39#endif /* not lint */
40
41#include "back.h"
42
43static int checkd(int);
44static int last(void);
45
46int
47makmove(int i)
48{
49	int     n, d;
50	int     max;
51
52	d = d0;
53	n = abs(g[i] - p[i]);
54	max = (*offptr < 0 ? 7 : last());
55	if (board[p[i]] * cturn <= 0)
56		return (checkd(d) + 2);
57	if (g[i] != home && board[g[i]] * cturn < -1)
58		return (checkd(d) + 3);
59	if (i || D0 == D1) {
60		if (n == max ? D1 < n : D1 != n)
61			return (checkd(d) + 1);
62	} else {
63		if (n == max ? D0 < n && D1 < n : D0 != n && D1 != n)
64			return (checkd(d) + 1);
65		if (n == max ? D0 < n : D0 != n) {
66			if (d0)
67				return (checkd(d) + 1);
68			swap;
69		}
70	}
71	if (g[i] == home && *offptr < 0)
72		return (checkd(d) + 4);
73	h[i] = 0;
74	board[p[i]] -= cturn;
75	if (g[i] != home) {
76		if (board[g[i]] == -cturn) {
77			board[home] -= cturn;
78			board[g[i]] = 0;
79			h[i] = 1;
80			if (abs(bar - g[i]) < 7) {
81				(*inopp)--;
82				if (*offopp >= 0)
83					*offopp -= 15;
84			}
85		}
86		board[g[i]] += cturn;
87		if (abs(home - g[i]) < 7 && abs(home - p[i]) > 6) {
88			(*inptr)++;
89			if (*inptr + *offptr == 0)
90				*offptr += 15;
91		}
92	} else {
93		(*offptr)++;
94		(*inptr)--;
95	}
96	return (0);
97}
98
99void
100moverr(int i)
101{
102	int     j;
103
104	if (tflag)
105		curmove(20, 0);
106	else
107		writec('\n');
108	writel("Error:  ");
109	for (j = 0; j <= i; j++) {
110		wrint(p[j]);
111		writec('-');
112		wrint(g[j]);
113		if (j < i)
114			writec(',');
115	}
116	writel("... ");
117	movback(i);
118}
119
120
121static int
122checkd(int d)
123{
124	if (d0 != d)
125		swap;
126	return (0);
127}
128
129static int
130last(void)
131{
132	int     i;
133
134	for (i = home - 6 * cturn; i != home; i += cturn)
135		if (board[i] * cturn > 0)
136			return (abs(home - i));
137	return (-1);
138}
139
140void
141movback(int i)
142{
143	int     j;
144
145	for (j = i - 1; j >= 0; j--)
146		backone(j);
147}
148
149void
150backone(int i)
151{
152	board[p[i]] += cturn;
153	if (g[i] != home) {
154		board[g[i]] -= cturn;
155		if (abs(g[i] - home) < 7 && abs(p[i] - home) > 6) {
156			(*inptr)--;
157			if (*inptr + *offptr < 15 && *offptr >= 0)
158				*offptr -= 15;
159		}
160	} else {
161		(*offptr)--;
162		(*inptr)++;
163	}
164	if (h[i]) {
165		board[home] += cturn;
166		board[g[i]] = -cturn;
167		if (abs(bar - g[i]) < 7) {
168			(*inopp)++;
169			if (*inopp + *offopp == 0)
170				*offopp += 15;
171		}
172	}
173}
174