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