1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 static char sccsid[] = "@(#)allow.c 5.1 (Berkeley) 05/29/85"; 9 #endif not lint 10 11 #include "back.h" 12 13 movallow () { 14 15 register int i, m, iold; 16 int r; 17 18 if (d0) 19 swap; 20 m = (D0 == D1? 4: 2); 21 for (i = 0; i < 4; i++) 22 p[i] = bar; 23 i = iold = 0; 24 while (i < m) { 25 if (*offptr == 15) 26 break; 27 h[i] = 0; 28 if (board[bar]) { 29 if (i == 1 || m == 4) 30 g[i] = bar+cturn*D1; 31 else 32 g[i] = bar+cturn*D0; 33 if (r = makmove(i)) { 34 if (d0 || m == 4) 35 break; 36 swap; 37 movback (i); 38 if (i > iold) 39 iold = i; 40 for (i = 0; i < 4; i++) 41 p[i] = bar; 42 i = 0; 43 } else 44 i++; 45 continue; 46 } 47 if ((p[i] += cturn) == home) { 48 if (i > iold) 49 iold = i; 50 if (m == 2 && i) { 51 movback(i); 52 p[i--] = bar; 53 if (p[i] != bar) 54 continue; 55 else 56 break; 57 } 58 if (d0 || m == 4) 59 break; 60 swap; 61 movback (i); 62 for (i = 0; i < 4; i++) 63 p[i] = bar; 64 i = 0; 65 continue; 66 } 67 if (i == 1 || m == 4) 68 g[i] = p[i]+cturn*D1; 69 else 70 g[i] = p[i]+cturn*D0; 71 if (g[i]*cturn > home) { 72 if (*offptr >= 0) 73 g[i] = home; 74 else 75 continue; 76 } 77 if (board[p[i]]*cturn > 0 && (r = makmove(i)) == 0) 78 i++; 79 } 80 movback (i); 81 return (iold > i? iold: i); 82 } 83