Upgrade grep(1). 1/2
[dragonfly.git] / games / backgammon / teachgammon / tutor.c
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  * @(#)tutor.c  8.1 (Berkeley) 5/31/93
30  * $FreeBSD: src/games/backgammon/teachgammon/tutor.c,v 1.5 1999/11/30 03:48:31 billf Exp $
31  * $DragonFly: src/games/backgammon/teachgammon/tutor.c,v 1.3 2006/08/08 16:36:11 pavalos Exp $
32  */
33
34 #include "back.h"
35 #include "tutor.h"
36
37 static void     clrest(void);
38 static int      brdeq(const int *, const int *);
39
40 static const char better[] = "That is a legal move, but there is a better one.\n";
41
42 void
43 tutor(void)
44 {
45         int i, j;
46
47         i = 0;
48         begscr = 18;
49         cturn = -1;
50         home = 0;
51         bar = 25;
52         inptr = &in[0];
53         inopp = &in[1];
54         offptr = &off[0];
55         offopp = &off[1];
56         Colorptr = &color[0];
57         colorptr = &color[2];
58         colen = 5;
59         wrboard();
60
61         while (1) {
62                 if (!brdeq(test[i].brd, board)) {
63                         if (tflag && curr == 23)
64                                 curmove(18, 0);
65                         writel(better);
66                         nexturn();
67                         movback(mvlim);
68                         if (tflag) {
69                                 refresh();
70                                 clrest();
71                         }
72                         if ((!tflag) || curr == 19) {
73                                 proll();
74                                 writec('\t');
75                         } else
76                                 curmove(curr > 19 ? curr - 2 : curr + 4, 25);
77                         getmove();
78                         if (cturn == 0)
79                                 leave();
80                         continue;
81                 }
82                 if (tflag)
83                         curmove(18, 0);
84                 text(*test[i].com);
85                 if (!tflag)
86                         writec('\n');
87                 if (i == maxmoves)
88                         break;
89                 D0 = test[i].roll1;
90                 D1 = test[i].roll2;
91                 d0 = 0;
92                 mvlim = 0;
93                 for (j = 0; j < 4; j++) {
94                         if (test[i].mp[j] == test[i].mg[j])
95                                 break;
96                         p[j] = test[i].mp[j];
97                         g[j] = test[i].mg[j];
98                         mvlim++;
99                 }
100                 if (mvlim)
101                         for (j = 0; j < mvlim; j++)
102                                 if (makmove(j))
103                                         writel("AARGH!!!\n");
104                 if (tflag)
105                         refresh();
106                 nexturn();
107                 D0 = test[i].new1;
108                 D1 = test[i].new2;
109                 d0 = 0;
110                 i++;
111                 mvlim = movallow();
112                 if (mvlim) {
113                         if (tflag)
114                                 clrest();
115                         proll();
116                         writec('\t');
117                         getmove();
118                         if (tflag)
119                                 refresh();
120                         if (cturn == 0)
121                                 leave();
122                 }
123         }
124         leave();
125 }
126
127 static void
128 clrest(void)
129 {
130         int r, c, j;
131
132         r = curr;
133         c = curc;
134         for (j = r + 1; j < 24; j++) {
135                 curmove(j, 0);
136                 cline();
137         }
138         curmove(r, c);
139 }
140
141 static int
142 brdeq(const int *b1, const int *b2)
143 {
144         const int *e;
145
146         e = b1 + 26;
147         while (b1 < e)
148                 if (*b1++ != *b2++)
149                         return (0);
150         return (1);
151 }