[BACK]Return to table.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / games / backgammon / common_source

File: [cvs.NetBSD.org] / src / games / backgammon / common_source / table.c (download)

Revision 1.13, Sat Oct 13 19:19:39 2012 UTC (11 years, 6 months ago) by dholland
Branch: MAIN
CVS Tags: yamt-pagecache-base9, yamt-pagecache-base8, yamt-pagecache-base7, yamt-pagecache-base6, tls-maxphys-base, tls-earlyentropy-base, tls-earlyentropy, riastradh-xf86-video-intel-2-7-1-pre-2-21-15, riastradh-drm2-base3, riastradh-drm2-base2, riastradh-drm2-base1, riastradh-drm2-base, riastradh-drm2, prg-localcount2-base3, prg-localcount2-base2, prg-localcount2-base1, prg-localcount2-base, prg-localcount2, phil-wifi-base, phil-wifi-20200421, phil-wifi-20200411, phil-wifi-20200406, phil-wifi-20191119, phil-wifi-20190609, phil-wifi, pgoyette-localcount-base, pgoyette-localcount-20170426, pgoyette-localcount-20170320, pgoyette-localcount-20170107, pgoyette-localcount-20161104, pgoyette-localcount-20160806, pgoyette-localcount-20160726, pgoyette-localcount, pgoyette-compat-merge-20190127, pgoyette-compat-base, pgoyette-compat-20190127, pgoyette-compat-20190118, pgoyette-compat-1226, pgoyette-compat-1126, pgoyette-compat-1020, pgoyette-compat-0930, pgoyette-compat-0906, pgoyette-compat-0728, pgoyette-compat-0625, pgoyette-compat-0521, pgoyette-compat-0502, pgoyette-compat-0422, pgoyette-compat-0415, pgoyette-compat-0407, pgoyette-compat-0330, pgoyette-compat-0322, pgoyette-compat-0315, pgoyette-compat, perseant-stdc-iso10646-base, perseant-stdc-iso10646, netbsd-9-base, netbsd-9-3-RELEASE, netbsd-9-2-RELEASE, netbsd-9-1-RELEASE, netbsd-9-0-RELEASE, netbsd-9-0-RC2, netbsd-9-0-RC1, netbsd-9, netbsd-8-base, netbsd-8-2-RELEASE, netbsd-8-1-RELEASE, netbsd-8-1-RC1, netbsd-8-0-RELEASE, netbsd-8-0-RC2, netbsd-8-0-RC1, netbsd-8, netbsd-7-nhusb-base-20170116, netbsd-7-nhusb-base, netbsd-7-nhusb, netbsd-7-base, netbsd-7-2-RELEASE, netbsd-7-1-RELEASE, netbsd-7-1-RC2, netbsd-7-1-RC1, netbsd-7-1-2-RELEASE, netbsd-7-1-1-RELEASE, netbsd-7-1, netbsd-7-0-RELEASE, netbsd-7-0-RC3, netbsd-7-0-RC2, netbsd-7-0-RC1, netbsd-7-0-2-RELEASE, netbsd-7-0-1-RELEASE, netbsd-7-0, netbsd-7, netbsd-10-base, netbsd-10-0-RELEASE, netbsd-10-0-RC6, netbsd-10-0-RC5, netbsd-10-0-RC4, netbsd-10-0-RC3, netbsd-10-0-RC2, netbsd-10-0-RC1, netbsd-10, matt-nb8-mediatek-base, matt-nb8-mediatek, localcount-20160914, is-mlppp-base, is-mlppp, cjep_sun2x-base1, cjep_sun2x-base, cjep_sun2x, cjep_staticlib_x-base1, cjep_staticlib_x-base, cjep_staticlib_x, bouyer-socketcan-base1, bouyer-socketcan-base, bouyer-socketcan, agc-symver-base, agc-symver, HEAD
Changes since 1.12: +22 -25 lines

Pass the move info around instead of using it as a global.

/*	$NetBSD: table.c,v 1.13 2012/10/13 19:19:39 dholland Exp $	*/

/*
 * Copyright (c) 1980, 1993
 *	The 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. 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.
 */

#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)table.c	8.1 (Berkeley) 5/31/93";
#else
__RCSID("$NetBSD: table.c,v 1.13 2012/10/13 19:19:39 dholland Exp $");
#endif
#endif /* not lint */

#include "back.h"

static const char *const 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;
};

static int mvl;			/* working copy of move->mvlim */

static const 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}
};

static int dotable(struct move *, int, int);
static int rsetbrd(struct move *);

int
checkmove(struct move *mm, int ist)
{
	int     j, n;
	char    c;

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++)
		mm->p[j] = mm->g[j] = -1;

dochar:
	c = readc();

	if (c == 'S') {
		raflag = 0;
		save(mm, 1);
		if (tflag) {
			curmove(cturn == -1 ? 18 : 19, 39);
			ist = -1;
			goto domove;
		} else {
			proll(mm);
			ist = 0;
			goto domove;
		}
	}
	if (c == old.c_cc[VERASE] && ncin > 0) {
		if (tflag)
			curmove(curr, curc - 1);
		else {
			if (old.c_cc[VERASE] == '\010')
				writel("\010 \010");
			else
				writec(cin[ncin - 1]);
		}
		ncin--;
		n = rsetbrd(mm);
		if (n == 0) {
			n = -1;
			if (tflag)
				refresh();
		}
		if ((ist = n) > 0)
			goto dochar;
		goto domove;
	}
	if (c == old.c_cc[VKILL] && ncin > 0) {
		if (tflag) {
			refresh();
			curmove(curr, 39);
			ist = -1;
			goto domove;
		} else
			if (old.c_cc[VERASE] == '\010') {
				for (j = 0; j < ncin; j++)
					writel("\010 \010");
				ist = -1;
				goto domove;
			} else {
				writec('\\');
				writec('\n');
				proll(mm);
				ist = 0;
				goto domove;
			}
	}
	n = dotable(mm, 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 >= mm->mvlim)
		return (0);
	if (n == -1 && mvl < mm->mvlim - 1)
		return (-4);

	if (n == -6) {
		if (!tflag) {
			if (movokay(mm, mvl + 1)) {
				wrboard();
				movback(mm, mvl + 1);
			}
			proll(mm);
			writel("\t\tMove:  ");
			for (j = 0; j < ncin;)
				writec(cin[j++]);
		} else {
			if (movokay(mm, mvl + 1)) {
				refresh();
				movback(mm, mvl + 1);
			} else
				curmove(cturn == -1 ? 18 : 19, ncin + 39);
		}
		ist = n = rsetbrd(mm);
		goto dochar;
	}
	if (n != -5)
		return (n);
	writec('\007');
	goto dochar;
}

static int
dotable(struct move *mm, int c, int i)
{
	int     a;
	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(mm);
					writel("\t\t");
				} else
					proll(mm);
				break;

			case 2:
				if (mm->p[mvl] == -1)
					mm->p[mvl] = c - '0';
				else
					mm->p[mvl] = mm->p[mvl] * 10 + c - '0';
				break;

			case 3:
				if (mm->g[mvl] != -1) {
					if (mvl < mm->mvlim)
						mvl++;
					mm->p[mvl] = mm->p[mvl - 1];
				}
				mm->g[mvl] = mm->p[mvl] + cturn * (c - '0');
				if (mm->g[mvl] < 0)
					mm->g[mvl] = 0;
				if (mm->g[mvl] > 25)
					mm->g[mvl] = 25;
				break;

			case 4:
				if (mm->g[mvl] == -1)
					mm->g[mvl] = c - '0';
				else
					mm->g[mvl] = mm->g[mvl] * 10 + c - '0';
				break;

			case 5:
				if (mvl < mm->mvlim)
					mvl++;
				mm->p[mvl] = mm->g[mvl - 1];
				break;

			case 6:
				if (mvl < mm->mvlim)
					mvl++;
				break;

			case 7:
				if (tflag)
					curmove(20, 0);
				else
					writec('\n');
				(void) wrtext(help2);
				if (tflag) {
					curmove(cturn == -1 ? 18 : 19, 39);
				} else {
					writec('\n');
					proll(mm);
					writel("\t\tMove:  ");
				}
				break;

			case 8:
				mm->p[mvl] = bar;
				break;

			case 9:
				mm->g[mvl] = home;
			}

			if (!test || a != '\n')
				return (atmata[i].newst);
			else
				return (-6);
		}
		i++;
	}

	return (-5);
}

static int
rsetbrd(struct move *mm)
{
	int     i, j, n;

	n = 0;
	mvl = 0;
	for (i = 0; i < 4; i++)
		mm->p[i] = mm->g[i] = -1;
	for (j = 0; j < ncin; j++)
		if ((n = dotable(mm, cin[j], n)) < 0)
			return n;
	return (n);
}