1 /*	$OpenBSD: one.c,v 1.5 2009/10/27 23:59:23 deraadt 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 "back.h"
33 
34 int
35 makmove(i)
36 	int     i;
37 {
38 	int     n, d;
39 	int     max;
40 
41 	d = d0;
42 	n = abs(g[i] - p[i]);
43 	max = (*offptr < 0 ? 7 : last());
44 	if (board[p[i]] * cturn <= 0)
45 		return(checkd(d) + 2);
46 	if (g[i] != home && board[g[i]] * cturn < -1)
47 		return(checkd(d) + 3);
48 	if (i || D0 == D1) {
49 		if (n == max ? D1 < n : D1 != n)
50 			return(checkd(d) + 1);
51 	} else {
52 		if (n == max ? D0 < n && D1 < n : D0 != n && D1 != n)
53 			return(checkd(d) + 1);
54 		if (n == max ? D0 < n : D0 != n) {
55 			if (d0)
56 				return (checkd(d) + 1);
57 			swap;
58 		}
59 	}
60 	if (g[i] == home && *offptr < 0)
61 		return(checkd(d) + 4);
62 	h[i] = 0;
63 	board[p[i]] -= cturn;
64 	if (g[i] != home) {
65 		if (board[g[i]] == -cturn) {
66 			board[home] -= cturn;
67 			board[g[i]] = 0;
68 			h[i] = 1;
69 			if (abs(bar - g[i]) < 7) {
70 				(*inopp)--;
71 				if (*offopp >= 0)
72 					*offopp -= 15;
73 			}
74 		}
75 		board[g[i]] += cturn;
76 		if (abs(home - g[i]) < 7 && abs(home - p[i]) > 6) {
77 			(*inptr)++;
78 			if (*inptr + *offptr == 0)
79 				*offptr += 15;
80 		}
81 	} else {
82 		(*offptr)++;
83 		(*inptr)--;
84 	}
85 	return(0);
86 }
87 
88 void
89 moverr(i)
90 	int     i;
91 {
92 	int     j;
93 
94 	mvprintw(20, 0, "Error:  ");
95 	for (j = 0; j <= i; j++) {
96 		printw("%d-%d", p[j], g[j]);
97 		if (j < i)
98 			addch(',');
99 	}
100 	addstr("... ");
101 	movback(i);
102 }
103 
104 int
105 checkd(d)
106 	int     d;
107 {
108 	if (d0 != d)
109 		swap;
110 	return(0);
111 }
112 
113 int
114 last()
115 {
116 	int     i;
117 
118 	for (i = home - 6 * cturn; i != home; i += cturn)
119 		if (board[i] * cturn > 0)
120 			return(abs(home - i));
121 	return(-1);
122 }
123 
124 void
125 movback(i)
126 	int     i;
127 {
128 	int     j;
129 
130 	for (j = i - 1; j >= 0; j--)
131 		backone(j);
132 }
133 
134 void
135 backone(i)
136 	int     i;
137 {
138 	board[p[i]] += cturn;
139 	if (g[i] != home) {
140 		board[g[i]] -= cturn;
141 		if (abs(g[i] - home) < 7 && abs(p[i] - home) > 6) {
142 			(*inptr)--;
143 			if (*inptr + *offptr < 15 && *offptr >= 0)
144 				*offptr -= 15;
145 		}
146 	} else {
147 		(*offptr)--;
148 		(*inptr)++;
149 	}
150 	if (h[i]) {
151 		board[home] += cturn;
152 		board[g[i]] = -cturn;
153 		if (abs(bar - g[i]) < 7) {
154 			(*inopp)++;
155 			if (*inopp + *offopp == 0)
156 				*offopp += 15;
157 		}
158 	}
159 }
160