allow.c revision 1.3 1 /* $NetBSD: allow.c,v 1.3 1995/03/21 15:05:24 cgd 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[] = "@(#)allow.c 8.1 (Berkeley) 5/31/93";
39 #else
40 static char rcsid[] = "$NetBSD: allow.c,v 1.3 1995/03/21 15:05:24 cgd Exp $";
41 #endif
42 #endif /* not lint */
43
44 #include "back.h"
45
46 movallow () {
47
48 register int i, m, iold;
49 int r;
50
51 if (d0)
52 swap;
53 m = (D0 == D1? 4: 2);
54 for (i = 0; i < 4; i++)
55 p[i] = bar;
56 i = iold = 0;
57 while (i < m) {
58 if (*offptr == 15)
59 break;
60 h[i] = 0;
61 if (board[bar]) {
62 if (i == 1 || m == 4)
63 g[i] = bar+cturn*D1;
64 else
65 g[i] = bar+cturn*D0;
66 if (r = makmove(i)) {
67 if (d0 || m == 4)
68 break;
69 swap;
70 movback (i);
71 if (i > iold)
72 iold = i;
73 for (i = 0; i < 4; i++)
74 p[i] = bar;
75 i = 0;
76 } else
77 i++;
78 continue;
79 }
80 if ((p[i] += cturn) == home) {
81 if (i > iold)
82 iold = i;
83 if (m == 2 && i) {
84 movback(i);
85 p[i--] = bar;
86 if (p[i] != bar)
87 continue;
88 else
89 break;
90 }
91 if (d0 || m == 4)
92 break;
93 swap;
94 movback (i);
95 for (i = 0; i < 4; i++)
96 p[i] = bar;
97 i = 0;
98 continue;
99 }
100 if (i == 1 || m == 4)
101 g[i] = p[i]+cturn*D1;
102 else
103 g[i] = p[i]+cturn*D0;
104 if (g[i]*cturn > home) {
105 if (*offptr >= 0)
106 g[i] = home;
107 else
108 continue;
109 }
110 if (board[p[i]]*cturn > 0 && (r = makmove(i)) == 0)
111 i++;
112 }
113 movback (i);
114 return (iold > i? iold: i);
115 }
116