1 /*- 2 * Copyright (c) 1980, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)one.c 8.1 (Berkeley) 5/31/93 30 * $FreeBSD: src/games/backgammon/common_source/one.c,v 1.5 1999/11/30 03:48:27 billf Exp $ 31 * $DragonFly: src/games/backgammon/common_source/one.c,v 1.3 2006/08/08 16:36:11 pavalos Exp $ 32 */ 33 34 #include "back.h" 35 36 static int checkd(int); 37 static int last(void); 38 39 int 40 makmove(int i) 41 { 42 int n, d; 43 int max; 44 45 d = d0; 46 n = abs(g[i] - p[i]); 47 max = (*offptr < 0 ? 7 : last()); 48 if (board[p[i]] * cturn <= 0) 49 return (checkd(d) + 2); 50 if (g[i] != home && board[g[i]] * cturn < -1) 51 return (checkd(d) + 3); 52 if (i || D0 == D1) { 53 if (n == max ? D1 < n : D1 != n) 54 return (checkd(d) + 1); 55 } else { 56 if (n == max ? D0 < n && D1 < n : D0 != n && D1 != n) 57 return (checkd(d) + 1); 58 if (n == max ? D0 < n : D0 != n) { 59 if (d0) 60 return (checkd(d) + 1); 61 swap; 62 } 63 } 64 if (g[i] == home && *offptr < 0) 65 return (checkd(d) + 4); 66 h[i] = 0; 67 board[p[i]] -= cturn; 68 if (g[i] != home) { 69 if (board[g[i]] == -cturn) { 70 board[home] -= cturn; 71 board[g[i]] = 0; 72 h[i] = 1; 73 if (abs(bar - g[i]) < 7) { 74 (*inopp)--; 75 if (*offopp >= 0) 76 *offopp -= 15; 77 } 78 } 79 board[g[i]] += cturn; 80 if (abs(home - g[i]) < 7 && abs(home - p[i]) > 6) { 81 (*inptr)++; 82 if (*inptr + *offptr == 0) 83 *offptr += 15; 84 } 85 } else { 86 (*offptr)++; 87 (*inptr)--; 88 } 89 return (0); 90 } 91 92 void 93 moverr(int i) 94 { 95 int j; 96 97 if (tflag) 98 curmove(20, 0); 99 else 100 writec('\n'); 101 writel("Error: "); 102 for (j = 0; j <= i; j++) { 103 wrint(p[j]); 104 writec('-'); 105 wrint(g[j]); 106 if (j < i) 107 writec(','); 108 } 109 writel("... "); 110 movback(i); 111 } 112 113 static int 114 checkd(int d) 115 { 116 if (d0 != d) 117 swap; 118 return (0); 119 } 120 121 static int 122 last(void) 123 { 124 int i; 125 126 for (i = home - 6 * cturn; i != home; i += cturn) 127 if (board[i] * cturn > 0) 128 return (abs(home - i)); 129 return (-1); 130 } 131 132 void 133 movback(int i) 134 { 135 int j; 136 137 for (j = i - 1; j >= 0; j--) 138 backone(j); 139 } 140 141 void 142 backone(int i) 143 { 144 board[p[i]] += cturn; 145 if (g[i] != home) { 146 board[g[i]] -= cturn; 147 if (abs(g[i] - home) < 7 && abs(p[i] - home) > 6) { 148 (*inptr)--; 149 if (*inptr + *offptr < 15 && *offptr >= 0) 150 *offptr -= 15; 151 } 152 } else { 153 (*offptr)--; 154 (*inptr)++; 155 } 156 if (h[i]) { 157 board[home] += cturn; 158 board[g[i]] = -cturn; 159 if (abs(bar - g[i]) < 7) { 160 (*inopp)++; 161 if (*inopp + *offopp == 0) 162 *offopp += 15; 163 } 164 } 165 } 166