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