1 /*	@(#)tutor.c	8.1 (Berkeley) 5/31/93				*/
2 /*	$NetBSD: tutor.c,v 1.11 2012/10/13 19:19:39 dholland 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 #include "tutor.h"
35 
36 static const char better[] =
37 	"That is a legal move, but there is a better one.\n";
38 
39 static int brdeq(const int *, const int *);
40 static void clrest(void);
41 
42 void
43 tutor(struct move *mm)
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(mm, mm->mvlim);
68 			if (tflag) {
69 				refresh();
70 				clrest();
71 			}
72 			if ((!tflag) || curr == 19) {
73 				proll(mm);
74 				writec('\t');
75 			} else
76 				curmove(curr > 19 ? curr - 2 : curr + 4, 25);
77 			getmove(mm);
78 			if (cturn == 0)
79 				leave();
80 			continue;
81 		}
82 		if (tflag)
83 			curmove(18, 0);
84 		wrtext(*test[i].com);
85 		if (!tflag)
86 			writec('\n');
87 		if (i == maxmoves)
88 			break;
89 		mm->D0 = test[i].roll1;
90 		mm->D1 = test[i].roll2;
91 		mm->d0 = 0;
92 		mm->mvlim = 0;
93 		for (j = 0; j < 4; j++) {
94 			if (test[i].mp[j] == test[i].mg[j])
95 				break;
96 			mm->p[j] = test[i].mp[j];
97 			mm->g[j] = test[i].mg[j];
98 			mm->mvlim++;
99 		}
100 		if (mm->mvlim)
101 			for (j = 0; j < mm->mvlim; j++)
102 				if (makmove(mm, j))
103 					writel("AARGH!!!\n");
104 		if (tflag)
105 			refresh();
106 		nexturn();
107 		mm->D0 = test[i].new1;
108 		mm->D1 = test[i].new2;
109 		mm->d0 = 0;
110 		i++;
111 		mm->mvlim = movallow(mm);
112 		if (mm->mvlim) {
113 			if (tflag)
114 				clrest();
115 			proll(mm);
116 			writec('\t');
117 			getmove(mm);
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 }
152