1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #ifndef lint
8 static char sccsid[] = "@(#)tutor.c	5.1 (Berkeley) 05/29/85";
9 #endif not lint
10 
11 #include "back.h"
12 #include "tutor.h"
13 
14 extern int	maxmoves;
15 extern char	*finis[];
16 
17 extern struct situatn	test[];
18 
19 static char	better[] = "That is a legal move, but there is a better one.\n";
20 
21 tutor ()  {
22 	register int	i, j;
23 
24 	i = 0;
25 	begscr = 18;
26 	cturn = -1;
27 	home = 0;
28 	bar = 25;
29 	inptr = &in[0];
30 	inopp = &in[1];
31 	offptr = &off[0];
32 	offopp = &off[1];
33 	Colorptr = &color[0];
34 	colorptr = &color[2];
35 	colen = 5;
36 	wrboard();
37 
38 	while (1)  {
39 		if (! brdeq(test[i].brd,board))  {
40 			if (tflag && curr == 23)
41 				curmove (18,0);
42 			writel (better);
43 			nexturn();
44 			movback (mvlim);
45 			if (tflag)  {
46 				refresh();
47 				clrest ();
48 			}
49 			if ((! tflag) || curr == 19)  {
50 				proll();
51 				writec ('\t');
52 			}
53 			else
54 				curmove (curr > 19? curr-2: curr+4,25);
55 			getmove();
56 			if (cturn == 0)
57 				leave();
58 			continue;
59 		}
60 		if (tflag)
61 			curmove (18,0);
62 		text (*test[i].com);
63 		if (! tflag)
64 			writec ('\n');
65 		if (i == maxmoves)
66 			break;
67 		D0 = test[i].roll1;
68 		D1 = test[i].roll2;
69 		d0 = 0;
70 		mvlim = 0;
71 		for (j = 0; j < 4; j++)  {
72 			if (test[i].mp[j] == test[i].mg[j])
73 				break;
74 			p[j] = test[i].mp[j];
75 			g[j] = test[i].mg[j];
76 			mvlim++;
77 		}
78 		if (mvlim)
79 			for (j = 0; j < mvlim; j++)
80 				if (makmove(j))
81 					writel ("AARGH!!!\n");
82 		if (tflag)
83 			refresh();
84 		nexturn();
85 		D0 = test[i].new1;
86 		D1 = test[i].new2;
87 		d0 = 0;
88 		i++;
89 		mvlim = movallow();
90 		if (mvlim)  {
91 			if (tflag)
92 				clrest();
93 			proll();
94 			writec('\t');
95 			getmove();
96 			if (tflag)
97 				refresh();
98 			if (cturn == 0)
99 				leave();
100 		}
101 	}
102 	leave();
103 }
104 
105 clrest ()  {
106 	register int	r, c, j;
107 
108 	r = curr;
109 	c = curc;
110 	for (j = r+1; j < 24; j++)  {
111 		curmove (j,0);
112 		cline();
113 	}
114 	curmove (r,c);
115 }
116 
117 brdeq (b1,b2)
118 register int  *b1, *b2;
119 
120 {
121 	register int  *e;
122 
123 	e = b1+26;
124 	while (b1 < e)
125 		if (*b1++ != *b2++)
126 			return(0);
127 	return(1);
128 }
129