1 /* @(#)check.c 8.1 (Berkeley) 5/31/93 */ 2 /* $NetBSD: check.c,v 1.9 2019/02/18 19:35:44 christos Exp $ */ 3 4 /* 5 * Copyright (c) 1980, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 */ 32 33 #include "back.h" 34 35 void 36 getmove(struct move *mm) 37 { 38 int i, c; 39 40 c = 0; 41 for (;;) { 42 i = checkmove(mm, c); 43 44 switch (i) { 45 case -1: 46 if (movokay(mm, mm->mvlim)) { 47 if (tflag) 48 curmove(20, 0); 49 else 50 writec('\n'); 51 for (i = 0; i < mm->mvlim; i++) 52 if (mm->h[i]) 53 wrhit(mm->g[i]); 54 nexturn(); 55 if (*offopp == 15) 56 cturn *= -2; 57 if (tflag && pnum) 58 bflag = pnum; 59 return; 60 } 61 /*FALLTHROUGH*/ 62 case -4: 63 case 0: 64 if (tflag) 65 refresh(); 66 if (i != 0 && i != -4) 67 break; 68 if (tflag) 69 curmove(20, 0); 70 else 71 writec('\n'); 72 writel(*Colorptr); 73 if (i == -4) 74 writel(" must make "); 75 else 76 writel(" can only make "); 77 writec(mm->mvlim + '0'); 78 writel(" move"); 79 if (mm->mvlim > 1) 80 writec('s'); 81 writec('.'); 82 writec('\n'); 83 break; 84 85 case -3: 86 if (quit(mm)) 87 return; 88 } 89 90 if (!tflag) 91 proll(mm); 92 else { 93 curmove(cturn == -1 ? 18 : 19, 39); 94 cline(); 95 c = -1; 96 } 97 } 98 } 99 100 int 101 movokay(struct move *mm, int mv) 102 { 103 int i, m; 104 105 if (mm->d0) 106 mswap(mm); 107 108 for (i = 0; i < mv; i++) { 109 if (mm->p[i] == mm->g[i]) { 110 moverr(mm, i); 111 curmove(20, 0); 112 writel("Attempt to move to same location.\n"); 113 return (0); 114 } 115 if (cturn * (mm->g[i] - mm->p[i]) < 0) { 116 moverr(mm, i); 117 curmove(20, 0); 118 writel("Backwards move.\n"); 119 return (0); 120 } 121 if (abs(board[bar]) && mm->p[i] != bar) { 122 moverr(mm, i); 123 curmove(20, 0); 124 writel("Men still on bar.\n"); 125 return (0); 126 } 127 if ((m = makmove(mm, i))) { 128 moverr(mm, i); 129 switch (m) { 130 131 case 1: 132 writel("Move not rolled.\n"); 133 break; 134 135 case 2: 136 writel("Bad starting position.\n"); 137 break; 138 139 case 3: 140 writel("Destination occupied.\n"); 141 break; 142 143 case 4: 144 writel("Can't remove men yet.\n"); 145 } 146 return (0); 147 } 148 } 149 return (1); 150 } 151