]> git.cameronkatri.com Git - bsdgames-darwin.git/blob - backgammon/common_source/check.c
Fix merge conflicts
[bsdgames-darwin.git] / backgammon / common_source / check.c
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
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
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 }