1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  */
17 
18 #ifndef lint
19 static char sccsid[] = "@(#)tutor.c	5.3 (Berkeley) 06/18/88";
20 #endif /* not lint */
21 
22 #include "back.h"
23 #include "tutor.h"
24 
25 extern int	maxmoves;
26 extern char	*finis[];
27 
28 extern struct situatn	test[];
29 
30 static char	better[] = "That is a legal move, but there is a better one.\n";
31 
32 tutor ()  {
33 	register int	i, j;
34 
35 	i = 0;
36 	begscr = 18;
37 	cturn = -1;
38 	home = 0;
39 	bar = 25;
40 	inptr = &in[0];
41 	inopp = &in[1];
42 	offptr = &off[0];
43 	offopp = &off[1];
44 	Colorptr = &color[0];
45 	colorptr = &color[2];
46 	colen = 5;
47 	wrboard();
48 
49 	while (1)  {
50 		if (! brdeq(test[i].brd,board))  {
51 			if (tflag && curr == 23)
52 				curmove (18,0);
53 			writel (better);
54 			nexturn();
55 			movback (mvlim);
56 			if (tflag)  {
57 				refresh();
58 				clrest ();
59 			}
60 			if ((! tflag) || curr == 19)  {
61 				proll();
62 				writec ('\t');
63 			}
64 			else
65 				curmove (curr > 19? curr-2: curr+4,25);
66 			getmove();
67 			if (cturn == 0)
68 				leave();
69 			continue;
70 		}
71 		if (tflag)
72 			curmove (18,0);
73 		text (*test[i].com);
74 		if (! tflag)
75 			writec ('\n');
76 		if (i == maxmoves)
77 			break;
78 		D0 = test[i].roll1;
79 		D1 = test[i].roll2;
80 		d0 = 0;
81 		mvlim = 0;
82 		for (j = 0; j < 4; j++)  {
83 			if (test[i].mp[j] == test[i].mg[j])
84 				break;
85 			p[j] = test[i].mp[j];
86 			g[j] = test[i].mg[j];
87 			mvlim++;
88 		}
89 		if (mvlim)
90 			for (j = 0; j < mvlim; j++)
91 				if (makmove(j))
92 					writel ("AARGH!!!\n");
93 		if (tflag)
94 			refresh();
95 		nexturn();
96 		D0 = test[i].new1;
97 		D1 = test[i].new2;
98 		d0 = 0;
99 		i++;
100 		mvlim = movallow();
101 		if (mvlim)  {
102 			if (tflag)
103 				clrest();
104 			proll();
105 			writec('\t');
106 			getmove();
107 			if (tflag)
108 				refresh();
109 			if (cturn == 0)
110 				leave();
111 		}
112 	}
113 	leave();
114 }
115 
116 clrest ()  {
117 	register int	r, c, j;
118 
119 	r = curr;
120 	c = curc;
121 	for (j = r+1; j < 24; j++)  {
122 		curmove (j,0);
123 		cline();
124 	}
125 	curmove (r,c);
126 }
127 
128 brdeq (b1,b2)
129 register int  *b1, *b2;
130 
131 {
132 	register int  *e;
133 
134 	e = b1+26;
135 	while (b1 < e)
136 		if (*b1++ != *b2++)
137 			return(0);
138 	return(1);
139 }
140