309 lines
6.3 KiB
C
309 lines
6.3 KiB
C
|
/*
|
|||
|
* Copyright (c) 1980 Regents of the University of California.
|
|||
|
* All rights reserved.
|
|||
|
*
|
|||
|
* Redistribution and use in source and binary forms, with or without
|
|||
|
* modification, are permitted provided that the following conditions
|
|||
|
* are met:
|
|||
|
* 1. Redistributions of source code must retain the above copyright
|
|||
|
* notice, this list of conditions and the following disclaimer.
|
|||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|||
|
* notice, this list of conditions and the following disclaimer in the
|
|||
|
* documentation and/or other materials provided with the distribution.
|
|||
|
* 3. All advertising materials mentioning features or use of this software
|
|||
|
* must display the following acknowledgement:
|
|||
|
* This product includes software developed by the University of
|
|||
|
* California, Berkeley and its contributors.
|
|||
|
* 4. Neither the name of the University nor the names of its contributors
|
|||
|
* may be used to endorse or promote products derived from this software
|
|||
|
* without specific prior written permission.
|
|||
|
*
|
|||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|||
|
* SUCH DAMAGE.
|
|||
|
*/
|
|||
|
|
|||
|
#ifndef lint
|
|||
|
static char sccsid[] = "@(#)table.c 5.4 (Berkeley) 6/1/90";
|
|||
|
#endif /* not lint */
|
|||
|
|
|||
|
#include "back.h"
|
|||
|
|
|||
|
char *help2[] = {
|
|||
|
" Enter moves as <s>-<f> or <s>/<r> where <s> is the starting",
|
|||
|
"position, <f> is the finishing position, and <r> is the roll.",
|
|||
|
"Remember, each die roll must be moved separately.",
|
|||
|
0
|
|||
|
};
|
|||
|
|
|||
|
struct state {
|
|||
|
char ch;
|
|||
|
int fcode;
|
|||
|
int newst;
|
|||
|
};
|
|||
|
|
|||
|
struct state atmata[] = {
|
|||
|
|
|||
|
'R', 1, 0, '?', 7, 0, 'Q', 0, -3, 'B', 8, 25,
|
|||
|
'9', 2, 25, '8', 2, 25, '7', 2, 25, '6', 2, 25,
|
|||
|
'5', 2, 25, '4', 2, 25, '3', 2, 25, '2', 2, 19,
|
|||
|
'1', 2, 15, '0', 2, 25, '.', 0, 0, '9', 2, 25,
|
|||
|
'8', 2, 25, '7', 2, 25, '6', 2, 25, '5', 2, 25,
|
|||
|
|
|||
|
'4', 2, 25, '3', 2, 25, '2', 2, 25, '1', 2, 25,
|
|||
|
'0', 2, 25, '/', 0, 32, '-', 0, 39, '.', 0, 0,
|
|||
|
'/', 5, 32, ' ', 6, 3, ',', 6, 3, '\n', 0, -1,
|
|||
|
'6', 3, 28, '5', 3, 28, '4', 3, 28, '3', 3, 28,
|
|||
|
'2', 3, 28, '1', 3, 28, '.', 0, 0, 'H', 9, 61,
|
|||
|
|
|||
|
'9', 4, 61, '8', 4, 61, '7', 4, 61, '6', 4, 61,
|
|||
|
'5', 4, 61, '4', 4, 61, '3', 4, 61, '2', 4, 53,
|
|||
|
'1', 4, 51, '0', 4, 61, '.', 0, 0, '9', 4, 61,
|
|||
|
'8', 4, 61, '7', 4, 61, '6', 4, 61, '5', 4, 61,
|
|||
|
'4', 4, 61, '3', 4, 61, '2', 4, 61, '1', 4, 61,
|
|||
|
|
|||
|
'0', 4, 61, ' ', 6, 3, ',', 6, 3, '-', 5, 39,
|
|||
|
'\n', 0, -1, '.', 0, 0
|
|||
|
};
|
|||
|
|
|||
|
checkmove (ist)
|
|||
|
|
|||
|
int ist;
|
|||
|
|
|||
|
{
|
|||
|
register int j, n;
|
|||
|
register char c;
|
|||
|
char a;
|
|||
|
|
|||
|
domove:
|
|||
|
if (ist == 0) {
|
|||
|
if (tflag)
|
|||
|
curmove (curr,32);
|
|||
|
else
|
|||
|
writel ("\t\t");
|
|||
|
writel ("Move: ");
|
|||
|
}
|
|||
|
ist = mvl = ncin = 0;
|
|||
|
for (j = 0; j < 5; j++)
|
|||
|
p[j] = g[j] = -1;
|
|||
|
|
|||
|
dochar:
|
|||
|
c = readc();
|
|||
|
|
|||
|
if (c == 'S') {
|
|||
|
raflag = 0;
|
|||
|
save (1);
|
|||
|
if (tflag) {
|
|||
|
curmove (cturn == -1? 18: 19,39);
|
|||
|
ist = -1;
|
|||
|
goto domove;
|
|||
|
} else {
|
|||
|
proll ();
|
|||
|
ist = 0;
|
|||
|
goto domove;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (c == tty.sg_erase && ncin > 0) {
|
|||
|
if (tflag)
|
|||
|
curmove (curr,curc-1);
|
|||
|
else {
|
|||
|
if (tty.sg_erase == '\010')
|
|||
|
writel ("\010 \010");
|
|||
|
else
|
|||
|
writec (cin[ncin-1]);
|
|||
|
}
|
|||
|
ncin--;
|
|||
|
n = rsetbrd();
|
|||
|
if (n == 0) {
|
|||
|
n = -1;
|
|||
|
if (tflag)
|
|||
|
refresh();
|
|||
|
}
|
|||
|
if ((ist = n) > 0)
|
|||
|
goto dochar;
|
|||
|
goto domove;
|
|||
|
}
|
|||
|
|
|||
|
if (c == tty.sg_kill && ncin > 0) {
|
|||
|
if (tflag) {
|
|||
|
refresh();
|
|||
|
curmove (curr,39);
|
|||
|
ist = -1;
|
|||
|
goto domove;
|
|||
|
} else if (tty.sg_erase == '\010') {
|
|||
|
for (j = 0; j < ncin; j++)
|
|||
|
writel ("\010 \010");
|
|||
|
ist = -1;
|
|||
|
goto domove;
|
|||
|
} else {
|
|||
|
writec ('\\');
|
|||
|
writec ('\n');
|
|||
|
proll ();
|
|||
|
ist = 0;
|
|||
|
goto domove;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
n = dotable(c,ist);
|
|||
|
if (n >= 0) {
|
|||
|
cin[ncin++] = c;
|
|||
|
if (n > 2)
|
|||
|
if ((! tflag) || c != '\n')
|
|||
|
writec (c);
|
|||
|
ist = n;
|
|||
|
if (n)
|
|||
|
goto dochar;
|
|||
|
else
|
|||
|
goto domove;
|
|||
|
}
|
|||
|
|
|||
|
if (n == -1 && mvl >= mvlim)
|
|||
|
return(0);
|
|||
|
if (n == -1 && mvl < mvlim-1)
|
|||
|
return(-4);
|
|||
|
|
|||
|
if (n == -6) {
|
|||
|
if (! tflag) {
|
|||
|
if (movokay(mvl+1)) {
|
|||
|
wrboard();
|
|||
|
movback (mvl+1);
|
|||
|
}
|
|||
|
proll ();
|
|||
|
writel ("\t\tMove: ");
|
|||
|
for (j = 0; j < ncin;)
|
|||
|
writec (cin[j++]);
|
|||
|
} else {
|
|||
|
if (movokay(mvl+1)) {
|
|||
|
refresh();
|
|||
|
movback (mvl+1);
|
|||
|
} else
|
|||
|
curmove (cturn == -1? 18:19,ncin+39);
|
|||
|
}
|
|||
|
ist = n = rsetbrd();
|
|||
|
goto dochar;
|
|||
|
}
|
|||
|
|
|||
|
if (n != -5)
|
|||
|
return(n);
|
|||
|
writec ('\007');
|
|||
|
goto dochar;
|
|||
|
}
|
|||
|
|
|||
|
dotable (c,i)
|
|||
|
char c;
|
|||
|
register int i;
|
|||
|
|
|||
|
{
|
|||
|
register int a, j;
|
|||
|
int test;
|
|||
|
|
|||
|
test = (c == 'R');
|
|||
|
|
|||
|
while ( (a = atmata[i].ch) != '.') {
|
|||
|
if (a == c || (test && a == '\n')) {
|
|||
|
switch (atmata[i].fcode) {
|
|||
|
|
|||
|
case 1:
|
|||
|
wrboard();
|
|||
|
if (tflag) {
|
|||
|
curmove (cturn == -1? 18: 19,0);
|
|||
|
proll ();
|
|||
|
writel ("\t\t");
|
|||
|
} else
|
|||
|
proll ();
|
|||
|
break;
|
|||
|
|
|||
|
case 2:
|
|||
|
if (p[mvl] == -1)
|
|||
|
p[mvl] = c-'0';
|
|||
|
else
|
|||
|
p[mvl] = p[mvl]*10+c-'0';
|
|||
|
break;
|
|||
|
|
|||
|
case 3:
|
|||
|
if (g[mvl] != -1) {
|
|||
|
if (mvl < mvlim)
|
|||
|
mvl++;
|
|||
|
p[mvl] = p[mvl-1];
|
|||
|
}
|
|||
|
g[mvl] = p[mvl]+cturn*(c-'0');
|
|||
|
if (g[mvl] < 0)
|
|||
|
g[mvl] = 0;
|
|||
|
if (g[mvl] > 25)
|
|||
|
g[mvl] = 25;
|
|||
|
break;
|
|||
|
|
|||
|
case 4:
|
|||
|
if (g[mvl] == -1)
|
|||
|
g[mvl] = c-'0';
|
|||
|
else
|
|||
|
g[mvl] = g[mvl]*10+c-'0';
|
|||
|
break;
|
|||
|
|
|||
|
case 5:
|
|||
|
if (mvl < mvlim)
|
|||
|
mvl++;
|
|||
|
p[mvl] = g[mvl-1];
|
|||
|
break;
|
|||
|
|
|||
|
case 6:
|
|||
|
if (mvl < mvlim)
|
|||
|
mvl++;
|
|||
|
break;
|
|||
|
|
|||
|
case 7:
|
|||
|
if (tflag)
|
|||
|
curmove (20,0);
|
|||
|
else
|
|||
|
writec ('\n');
|
|||
|
text (help2);
|
|||
|
if (tflag) {
|
|||
|
curmove (cturn == -1? 18: 19,39);
|
|||
|
} else {
|
|||
|
writec ('\n');
|
|||
|
proll();
|
|||
|
writel ("\t\tMove: ");
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case 8:
|
|||
|
p[mvl] = bar;
|
|||
|
break;
|
|||
|
|
|||
|
case 9:
|
|||
|
g[mvl] = home;
|
|||
|
}
|
|||
|
|
|||
|
if (! test || a != '\n')
|
|||
|
return (atmata[i].newst);
|
|||
|
else
|
|||
|
return (-6);
|
|||
|
}
|
|||
|
|
|||
|
i++;
|
|||
|
}
|
|||
|
|
|||
|
return (-5);
|
|||
|
}
|
|||
|
|
|||
|
rsetbrd () {
|
|||
|
register int i, j, n;
|
|||
|
|
|||
|
n = 0;
|
|||
|
mvl = 0;
|
|||
|
for (i = 0; i < 4; i++)
|
|||
|
p[i] = g[i] = -1;
|
|||
|
for (j = 0; j < ncin; j++)
|
|||
|
n = dotable (cin[j],n);
|
|||
|
return (n);
|
|||
|
}
|