1 /*
2  * Copyright (c) 1980, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)one.c	8.1 (Berkeley) 05/31/93";
10 #endif /* not lint */
11 
12 #include "back.h"
13 
14 makmove (i)
15 register int	i;
16 
17 {
18 	register int	n, d;
19 	int		max;
20 
21 	d = d0;
22 	n = abs(g[i]-p[i]);
23 	max = (*offptr < 0? 7: last());
24 	if (board[p[i]]*cturn <= 0)
25 		return (checkd(d)+2);
26 	if (g[i] != home && board[g[i]]*cturn < -1)
27 		return (checkd(d)+3);
28 	if (i || D0 == D1)  {
29 		if (n == max? D1 < n: D1 != n)
30 			return (checkd(d)+1);
31 	} else  {
32 		if (n == max? D0 < n && D1 < n: D0 != n && D1 != n)
33 			return (checkd(d)+1);
34 		if (n == max? D0 < n: D0 != n)  {
35 			if (d0)
36 				return (checkd(d)+1);
37 			swap;
38 		}
39 	}
40 	if (g[i] == home && *offptr < 0)
41 		return (checkd(d)+4);
42 	h[i] = 0;
43 	board[p[i]] -= cturn;
44 	if (g[i] != home)  {
45 		if (board[g[i]] == -cturn)  {
46 			board[home] -= cturn;
47 			board[g[i]] = 0;
48 			h[i] = 1;
49 			if (abs(bar-g[i]) < 7)  {
50 				(*inopp)--;
51 				if (*offopp >= 0)
52 					*offopp -= 15;
53 			}
54 		}
55 		board[g[i]] += cturn;
56 		if (abs(home-g[i]) < 7 && abs(home-p[i]) > 6)  {
57 			(*inptr)++;
58 			if (*inptr+*offptr == 0)
59 				*offptr += 15;
60 		}
61 	} else {
62 		(*offptr)++;
63 		(*inptr)--;
64 	}
65 	return (0);
66 }
67 
68 moverr (i)
69 register int	i;
70 
71 {
72 	register int	j;
73 
74 	if (tflag)
75 		curmove (20,0);
76 	else
77 		writec ('\n');
78 	writel ("Error:  ");
79 	for (j = 0; j <= i; j++)  {
80 		wrint (p[j]);
81 		writec ('-');
82 		wrint (g[j]);
83 		if (j < i)
84 			writec (',');
85 	}
86 	writel ("... ");
87 	movback (i);
88 }
89 
90 
91 checkd (d)
92 register int	d;
93 
94 {
95 	if (d0 != d)
96 		swap;
97 	return (0);
98 }
99 
100 last ()  {
101 	register int	i;
102 
103 	for (i = home-6*cturn; i != home; i += cturn)
104 		if (board[i]*cturn > 0)
105 			return (abs(home-i));
106 }
107 
108 movback (i)
109 register int	i;
110 
111 {
112 	register int	j;
113 
114 	for (j = i-1; j >= 0; j--)
115 		backone(j);
116 }
117 
118 backone (i)
119 register int	i;
120 
121 {
122 	board[p[i]] += cturn;
123 	if (g[i] != home)  {
124 		board[g[i]] -= cturn;
125 		if (abs(g[i]-home) < 7 && abs(p[i]-home) > 6)  {
126 			(*inptr)--;
127 			if (*inptr+*offptr < 15 && *offptr >= 0)
128 				*offptr -= 15;
129 		}
130 	} else  {
131 		(*offptr)--;
132 		(*inptr)++;
133 	}
134 	if (h[i])  {
135 		board[home] += cturn;
136 		board[g[i]] = -cturn;
137 		if (abs(bar-g[i]) < 7)  {
138 			(*inopp)++;
139 			if (*inopp+*offopp == 0)
140 				*offopp += 15;
141 		}
142 	}
143 }
144