summaryrefslogtreecommitdiffstats
path: root/backgammon/common_source/subs.c
diff options
context:
space:
mode:
authorcgd <cgd@NetBSD.org>1993-03-21 09:45:37 +0000
committercgd <cgd@NetBSD.org>1993-03-21 09:45:37 +0000
commit77e3814f0c0e3dea4d0032e25666f77e6f83bfff (patch)
tree7eddfcbf3dd12089e71dc3fafb0a106c5c5766c7 /backgammon/common_source/subs.c
parente81d63576b2e46ab90da7d75fa155ea57ee4d32e (diff)
downloadbsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.tar.gz
bsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.tar.zst
bsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.zip
initial import of 386bsd-0.1 sources
Diffstat (limited to 'backgammon/common_source/subs.c')
-rw-r--r--backgammon/common_source/subs.c477
1 files changed, 477 insertions, 0 deletions
diff --git a/backgammon/common_source/subs.c b/backgammon/common_source/subs.c
new file mode 100644
index 00000000..7917124f
--- /dev/null
+++ b/backgammon/common_source/subs.c
@@ -0,0 +1,477 @@
+/*
+ * 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[] = "@(#)subs.c 5.5 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+#include <stdio.h>
+#include "back.h"
+
+int buffnum;
+char outbuff[BUFSIZ];
+
+static char plred[] = "Player is red, computer is white.";
+static char plwhite[] = "Player is white, computer is red.";
+static char nocomp[] = "(No computer play.)";
+
+char *descr[] = {
+ "Usage: backgammon [-] [n r w b pr pw pb t3a]\n",
+ "\t-\tgets this list\n\tn\tdon't ask for rules or instructions",
+ "\tr\tplayer is red (implies n)\n\tw\tplayer is white (implies n)",
+ "\tb\ttwo players, red and white (implies n)",
+ "\tpr\tprint the board before red's turn",
+ "\tpw\tprint the board before white's turn",
+ "\tpb\tprint the board before both player's turn",
+ "\tterm\tterminal is a term",
+ "\tsfile\trecover saved game from file",
+ 0
+};
+
+errexit (s)
+register char *s;
+{
+ write (2,"\n",1);
+ perror (s);
+ getout();
+}
+
+strset (s1,s2)
+register char *s1, *s2;
+{
+ while ( (*s1++ = *s2++) != '\0');
+}
+
+addbuf (c)
+register char c;
+
+{
+ buffnum++;
+ if (buffnum == BUFSIZ) {
+ if (write(1,outbuff,BUFSIZ) != BUFSIZ)
+ errexit ("addbuf (write):");
+ buffnum = 0;
+ }
+ outbuff[buffnum] = c;
+}
+
+buflush () {
+ if (buffnum < 0)
+ return;
+ buffnum++;
+ if (write (1,outbuff,buffnum) != buffnum)
+ errexit ("buflush (write):");
+ buffnum = -1;
+}
+
+readc () {
+ char c;
+
+ if (tflag) {
+ cline();
+ newpos();
+ }
+ buflush();
+ if (read(0,&c,1) != 1)
+ errexit ("readc");
+#ifdef WHY_IS_THIS_HARDWIRED_IN_HERE
+ if (c == '\177')
+ getout();
+#endif
+ if (c == '\033' || c == '\015')
+ return ('\n');
+ if (cflag)
+ return (c);
+ if (c == '\014')
+ return ('R');
+ if (c >= 'a' && c <= 'z')
+ return (c & 0137);
+ return (c);
+}
+
+writec (c)
+char c;
+{
+ if (tflag)
+ fancyc (c);
+ else
+ addbuf (c);
+}
+
+writel (l)
+register char *l;
+{
+#ifdef DEBUG
+ register char *s;
+
+ if (trace == NULL)
+ trace = fopen ("bgtrace","w");
+
+ fprintf (trace,"writel: \"");
+ for (s = l; *s; s++) {
+ if (*s < ' ' || *s == '\177')
+ fprintf (trace,"^%c",(*s)^0100);
+ else
+ putc (*s,trace);
+ }
+ fprintf (trace,"\"\n");
+ fflush (trace);
+#endif
+
+ while (*l)
+ writec (*l++);
+}
+
+proll () {
+ if (d0)
+ swap;
+ if (cturn == 1)
+ writel ("Red's roll: ");
+ else
+ writel ("White's roll: ");
+ writec (D0+'0');
+ writec ('\040');
+ writec (D1+'0');
+ if (tflag)
+ cline();
+}
+
+wrint (n)
+int n;
+{
+ register int i, j, t;
+
+ for (i = 4; i > 0; i--) {
+ t = 1;
+ for (j = 0; j<i; j++)
+ t *= 10;
+ if (n > t-1)
+ writec ((n/t)%10+'0');
+ }
+ writec (n%10+'0');
+}
+
+gwrite() {
+ register int r, c;
+
+ if (tflag) {
+ r = curr;
+ c = curc;
+ curmove (16,0);
+ }
+
+ if (gvalue > 1) {
+ writel ("Game value: ");
+ wrint (gvalue);
+ writel (". ");
+ if (dlast == -1)
+ writel (color[0]);
+ else
+ writel (color[1]);
+ writel (" doubled last.");
+ } else {
+ switch (pnum) {
+ case -1: /* player is red */
+ writel (plred);
+ break;
+ case 0: /* player is both colors */
+ writel (nocomp);
+ break;
+ case 1: /* player is white */
+ writel (plwhite);
+ }
+ }
+
+ if (rscore || wscore) {
+ writel (" ");
+ wrscore();
+ }
+
+ if (tflag) {
+ cline();
+ curmove (r,c);
+ }
+}
+
+quit () {
+ register int i;
+
+ if (tflag) {
+ curmove (20,0);
+ clend();
+ } else
+ writec ('\n');
+ writel ("Are you sure you want to quit?");
+ if (yorn (0)) {
+ if (rfl) {
+ writel ("Would you like to save this game?");
+ if (yorn(0))
+ save(0);
+ }
+ cturn = 0;
+ return (1);
+ }
+ return (0);
+}
+
+yorn (special)
+register char special; /* special response */
+{
+ register char c;
+ register int i;
+
+ i = 1;
+ while ( (c = readc()) != 'Y' && c != 'N') {
+ if (special && c == special)
+ return (2);
+ if (i) {
+ if (special) {
+ writel (" (Y, N, or ");
+ writec (special);
+ writec (')');
+ } else
+ writel (" (Y or N)");
+ i = 0;
+ } else
+ writec ('\007');
+ }
+ if (c == 'Y')
+ writel (" Yes.\n");
+ else
+ writel (" No.\n");
+ if (tflag)
+ buflush();
+ return (c == 'Y');
+}
+
+wrhit (i)
+register int i;
+{
+ writel ("Blot hit on ");
+ wrint (i);
+ writec ('.');
+ writec ('\n');
+}
+
+nexturn () {
+ register int c;
+
+ cturn = -cturn;
+ c = cturn/abs(cturn);
+ home = bar;
+ bar = 25-bar;
+ offptr += c;
+ offopp -= c;
+ inptr += c;
+ inopp -= c;
+ Colorptr += c;
+ colorptr += c;
+}
+
+getarg (arg)
+register char ***arg;
+
+{
+ register char **s;
+
+ /* process arguments here. dashes are ignored, nbrw are ignored
+ if the game is being recovered */
+
+ s = *arg;
+ while (s[0][0] == '-') {
+ switch (s[0][1]) {
+
+ /* don't ask if rules or instructions needed */
+ case 'n':
+ if (rflag)
+ break;
+ aflag = 0;
+ args[acnt++] = 'n';
+ break;
+
+ /* player is both read and white */
+ case 'b':
+ if (rflag)
+ break;
+ pnum = 0;
+ aflag = 0;
+ args[acnt++] = 'b';
+ break;
+
+ /* player is red */
+ case 'r':
+ if (rflag)
+ break;
+ pnum = -1;
+ aflag = 0;
+ args[acnt++] = 'r';
+ break;
+
+ /* player is white */
+ case 'w':
+ if (rflag)
+ break;
+ pnum = 1;
+ aflag = 0;
+ args[acnt++] = 'w';
+ break;
+
+ /* print board after move according to following character */
+ case 'p':
+ if (s[0][2] != 'r' && s[0][2] != 'w' && s[0][2] != 'b')
+ break;
+ args[acnt++] = 'p';
+ args[acnt++] = s[0][2];
+ if (s[0][2] == 'r')
+ bflag = 1;
+ if (s[0][2] == 'w')
+ bflag = -1;
+ if (s[0][2] == 'b')
+ bflag = 0;
+ break;
+
+ case 't':
+ if (s[0][2] == '\0') { /* get terminal caps */
+ s++;
+ tflag = getcaps (*s);
+ } else
+ tflag = getcaps (&s[0][2]);
+ break;
+
+ case 's':
+ s++;
+ /* recover file */
+ recover (s[0]);
+ break;
+ }
+ s++;
+ }
+ if (s[0] != 0)
+ recover(s[0]);
+}
+
+init () {
+ register int i;
+ for (i = 0; i < 26;)
+ board[i++] = 0;
+ board[1] = 2;
+ board[6] = board[13] = -5;
+ board[8] = -3;
+ board[12] = board[19] = 5;
+ board[17] = 3;
+ board[24] = -2;
+ off[0] = off[1] = -15;
+ in[0] = in[1] = 5;
+ gvalue = 1;
+ dlast = 0;
+}
+
+wrscore () {
+ writel ("Score: ");
+ writel (color[1]);
+ writec (' ');
+ wrint (rscore);
+ writel (", ");
+ writel (color[0]);
+ writec (' ');
+ wrint (wscore);
+}
+
+fixtty (mode)
+int mode;
+{
+ if (tflag)
+ newpos();
+ buflush();
+ tty.sg_flags = mode;
+ if (stty (0,&tty) < 0)
+ errexit("fixtty");
+}
+
+getout () {
+ /* go to bottom of screen */
+ if (tflag) {
+ curmove (23,0);
+ cline();
+ } else
+ writec ('\n');
+
+ /* fix terminal status */
+ fixtty (old);
+ exit();
+}
+roll () {
+ register char c;
+ register int row;
+ register int col;
+
+ if (iroll) {
+ if (tflag) {
+ row = curr;
+ col = curc;
+ curmove (17,0);
+ } else
+ writec ('\n');
+ writel ("ROLL: ");
+ c = readc();
+ if (c != '\n') {
+ while (c < '1' || c > '6')
+ c = readc();
+ D0 = c-'0';
+ writec (' ');
+ writec (c);
+ c = readc();
+ while (c < '1' || c > '6')
+ c = readc();
+ D1 = c-'0';
+ writec (' ');
+ writec (c);
+ if (tflag) {
+ curmove (17,0);
+ cline();
+ curmove (row,col);
+ } else
+ writec ('\n');
+ return;
+ }
+ if (tflag) {
+ curmove (17,0);
+ cline();
+ curmove (row,col);
+ } else
+ writec ('\n');
+ }
+ D0 = rnum(6)+1;
+ D1 = rnum(6)+1;
+ d0 = 0;
+}