1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 static char sccsid[] = "@(#)check.c 5.3 (Berkeley) 06/18/88"; 20 #endif /* not lint */ 21 22 #include "back.h" 23 24 getmove () { 25 register int i, c; 26 27 c = 0; 28 for (;;) { 29 i = checkmove(c); 30 31 switch (i) { 32 case -1: 33 if (movokay(mvlim)) { 34 if (tflag) 35 curmove (20,0); 36 else 37 writec ('\n'); 38 for (i = 0; i < mvlim; i++) 39 if (h[i]) 40 wrhit(g[i]); 41 nexturn(); 42 if (*offopp == 15) 43 cturn *= -2; 44 if (tflag && pnum) 45 bflag = pnum; 46 return; 47 } 48 49 case -4: 50 case 0: 51 if (tflag) 52 refresh(); 53 if (i != 0 && i != -4) 54 break; 55 if (tflag) 56 curmove (20,0); 57 else 58 writec ('\n'); 59 writel (*Colorptr); 60 if (i == -4) 61 writel (" must make "); 62 else 63 writel (" can only make "); 64 writec (mvlim+'0'); 65 writel (" move"); 66 if (mvlim > 1) 67 writec ('s'); 68 writec ('.'); 69 writec ('\n'); 70 break; 71 72 case -3: 73 if (quit()) 74 return; 75 } 76 77 if (! tflag) 78 proll (); 79 else { 80 curmove (cturn == -1? 18: 19,39); 81 cline (); 82 c = -1; 83 } 84 } 85 } 86 87 movokay (mv) 88 register int mv; 89 90 { 91 register int i, m; 92 93 if (d0) 94 swap; 95 96 for (i = 0; i < mv; i++) { 97 98 if (p[i] == g[i]) { 99 moverr (i); 100 curmove (20,0); 101 writel ("Attempt to move to same location.\n"); 102 return (0); 103 } 104 105 if (cturn*(g[i]-p[i]) < 0) { 106 moverr (i); 107 curmove (20,0); 108 writel ("Backwards move.\n"); 109 return (0); 110 } 111 112 if (abs(board[bar]) && p[i] != bar) { 113 moverr (i); 114 curmove (20,0); 115 writel ("Men still on bar.\n"); 116 return (0); 117 } 118 119 if ( (m = makmove(i)) ) { 120 moverr (i); 121 switch (m) { 122 123 case 1: 124 writel ("Move not rolled.\n"); 125 break; 126 127 case 2: 128 writel ("Bad starting position.\n"); 129 break; 130 131 case 3: 132 writel ("Destination occupied.\n"); 133 break; 134 135 case 4: 136 writel ("Can't remove men yet.\n"); 137 } 138 return (0); 139 } 140 } 141 return (1); 142 } 143