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