121223Sdist /*
2*60748Sbostic  * Copyright (c) 1980, 1993
3*60748Sbostic  *	The Regents of the University of California.  All rights reserved.
433487Sbostic  *
542567Sbostic  * %sccs.include.redist.c%
621223Sdist  */
76772Srrh 
821223Sdist #ifndef lint
9*60748Sbostic static char sccsid[] = "@(#)tutor.c	8.1 (Berkeley) 05/31/93";
1033487Sbostic #endif /* not lint */
1121223Sdist 
126772Srrh #include "back.h"
136772Srrh #include "tutor.h"
146772Srrh 
156772Srrh extern int	maxmoves;
166772Srrh extern char	*finis[];
176772Srrh 
186772Srrh extern struct situatn	test[];
196772Srrh 
206772Srrh static char	better[] = "That is a legal move, but there is a better one.\n";
216772Srrh 
tutor()226772Srrh tutor ()  {
236772Srrh 	register int	i, j;
246772Srrh 
256772Srrh 	i = 0;
266772Srrh 	begscr = 18;
276772Srrh 	cturn = -1;
286772Srrh 	home = 0;
296772Srrh 	bar = 25;
306772Srrh 	inptr = &in[0];
316772Srrh 	inopp = &in[1];
326772Srrh 	offptr = &off[0];
336772Srrh 	offopp = &off[1];
346772Srrh 	Colorptr = &color[0];
356772Srrh 	colorptr = &color[2];
366772Srrh 	colen = 5;
376772Srrh 	wrboard();
386772Srrh 
396772Srrh 	while (1)  {
406772Srrh 		if (! brdeq(test[i].brd,board))  {
416772Srrh 			if (tflag && curr == 23)
426772Srrh 				curmove (18,0);
436772Srrh 			writel (better);
446772Srrh 			nexturn();
456772Srrh 			movback (mvlim);
466772Srrh 			if (tflag)  {
476772Srrh 				refresh();
486772Srrh 				clrest ();
496772Srrh 			}
506772Srrh 			if ((! tflag) || curr == 19)  {
516772Srrh 				proll();
526772Srrh 				writec ('\t');
536772Srrh 			}
546772Srrh 			else
556772Srrh 				curmove (curr > 19? curr-2: curr+4,25);
566772Srrh 			getmove();
576772Srrh 			if (cturn == 0)
586772Srrh 				leave();
596772Srrh 			continue;
606772Srrh 		}
616772Srrh 		if (tflag)
626772Srrh 			curmove (18,0);
636772Srrh 		text (*test[i].com);
646772Srrh 		if (! tflag)
656772Srrh 			writec ('\n');
666772Srrh 		if (i == maxmoves)
676772Srrh 			break;
686772Srrh 		D0 = test[i].roll1;
696772Srrh 		D1 = test[i].roll2;
706772Srrh 		d0 = 0;
716772Srrh 		mvlim = 0;
726772Srrh 		for (j = 0; j < 4; j++)  {
736772Srrh 			if (test[i].mp[j] == test[i].mg[j])
746772Srrh 				break;
756772Srrh 			p[j] = test[i].mp[j];
766772Srrh 			g[j] = test[i].mg[j];
776772Srrh 			mvlim++;
786772Srrh 		}
796772Srrh 		if (mvlim)
806772Srrh 			for (j = 0; j < mvlim; j++)
816772Srrh 				if (makmove(j))
826772Srrh 					writel ("AARGH!!!\n");
836772Srrh 		if (tflag)
846772Srrh 			refresh();
856772Srrh 		nexturn();
866772Srrh 		D0 = test[i].new1;
876772Srrh 		D1 = test[i].new2;
886772Srrh 		d0 = 0;
896772Srrh 		i++;
906772Srrh 		mvlim = movallow();
916772Srrh 		if (mvlim)  {
926772Srrh 			if (tflag)
936772Srrh 				clrest();
946772Srrh 			proll();
956772Srrh 			writec('\t');
966772Srrh 			getmove();
976772Srrh 			if (tflag)
986772Srrh 				refresh();
996772Srrh 			if (cturn == 0)
1006772Srrh 				leave();
1016772Srrh 		}
1026772Srrh 	}
1036772Srrh 	leave();
1046772Srrh }
1056772Srrh 
clrest()1066772Srrh clrest ()  {
1076772Srrh 	register int	r, c, j;
1086772Srrh 
1096772Srrh 	r = curr;
1106772Srrh 	c = curc;
1116772Srrh 	for (j = r+1; j < 24; j++)  {
1126772Srrh 		curmove (j,0);
1136772Srrh 		cline();
1146772Srrh 	}
1156772Srrh 	curmove (r,c);
1166772Srrh }
1176772Srrh 
brdeq(b1,b2)1186772Srrh brdeq (b1,b2)
1196772Srrh register int  *b1, *b2;
1206772Srrh 
1216772Srrh {
1226772Srrh 	register int  *e;
1236772Srrh 
1246772Srrh 	e = b1+26;
1256772Srrh 	while (b1 < e)
1266772Srrh 		if (*b1++ != *b2++)
1276772Srrh 			return(0);
1286772Srrh 	return(1);
1296772Srrh }
130