1/* $NetBSD: tutor.c,v 1.12 2021/05/02 12:50:43 rillig Exp $ */ 2 3/* 4 * Copyright (c) 1980, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32#include <sys/cdefs.h> 33#ifndef lint 34#if 0 35static char sccsid[] = "@(#)tutor.c 8.1 (Berkeley) 5/31/93"; 36#else 37__RCSID("$NetBSD: tutor.c,v 1.12 2021/05/02 12:50:43 rillig Exp $"); 38#endif 39#endif /* not lint */ 40 41#include "back.h" 42#include "tutor.h" 43 44static const char better[] = 45 "That is a legal move, but there is a better one.\n"; 46 47static int brdeq(const int *, const int *); 48static void clrest(void); 49 50void 51tutor(struct move *mm) 52{ 53 int i, j; 54 55 i = 0; 56 begscr = 18; 57 cturn = -1; 58 home = 0; 59 bar = 25; 60 inptr = &in[0]; 61 inopp = &in[1]; 62 offptr = &off[0]; 63 offopp = &off[1]; 64 Colorptr = &color[0]; 65 colorptr = &color[2]; 66 colen = 5; 67 wrboard(); 68 69 while (1) { 70 if (!brdeq(test[i].brd, board)) { 71 if (tflag && curr == 23) 72 curmove(18, 0); 73 writel(better); 74 nexturn(); 75 movback(mm, mm->mvlim); 76 if (tflag) { 77 refresh(); 78 clrest(); 79 } 80 if ((!tflag) || curr == 19) { 81 proll(mm); 82 writec('\t'); 83 } else 84 curmove(curr > 19 ? curr - 2 : curr + 4, 25); 85 getmove(mm); 86 if (cturn == 0) 87 leave(); 88 continue; 89 } 90 if (tflag) 91 curmove(18, 0); 92 wrtext(*test[i].com); 93 if (!tflag) 94 writec('\n'); 95 if (i == maxmoves) 96 break; 97 mm->D0 = test[i].roll1; 98 mm->D1 = test[i].roll2; 99 mm->d0 = 0; 100 mm->mvlim = 0; 101 for (j = 0; j < 4; j++) { 102 if (test[i].mp[j] == test[i].mg[j]) 103 break; 104 mm->p[j] = test[i].mp[j]; 105 mm->g[j] = test[i].mg[j]; 106 mm->mvlim++; 107 } 108 if (mm->mvlim) 109 for (j = 0; j < mm->mvlim; j++) 110 if (makmove(mm, j)) 111 writel("AARGH!!!\n"); 112 if (tflag) 113 refresh(); 114 nexturn(); 115 mm->D0 = test[i].new1; 116 mm->D1 = test[i].new2; 117 mm->d0 = 0; 118 i++; 119 mm->mvlim = movallow(mm); 120 if (mm->mvlim) { 121 if (tflag) 122 clrest(); 123 proll(mm); 124 writec('\t'); 125 getmove(mm); 126 if (tflag) 127 refresh(); 128 if (cturn == 0) 129 leave(); 130 } 131 } 132 leave(); 133} 134 135static void 136clrest(void) 137{ 138 int r, c, j; 139 140 r = curr; 141 c = curc; 142 for (j = r + 1; j < 24; j++) { 143 curmove(j, 0); 144 cline(); 145 } 146 curmove(r, c); 147} 148 149static int 150brdeq(const int *b1, const int *b2) 151{ 152 const int *e; 153 154 e = b1 + 26; 155 while (b1 < e) 156 if (*b1++ != *b2++) 157 return (0); 158 return (1); 159} 160