13cf635f5Sdist /*
2*0e395338Sbostic  * Copyright (c) 1980, 1993
3*0e395338Sbostic  *	The Regents of the University of California.  All rights reserved.
466562148Sbostic  *
57dc4431aSbostic  * %sccs.include.redist.c%
63cf635f5Sdist  */
73cf635f5Sdist 
83cf635f5Sdist #ifndef lint
9*0e395338Sbostic static char copyright[] =
10*0e395338Sbostic "@(#) Copyright (c) 1980, 1993\n\
11*0e395338Sbostic 	The Regents of the University of California.  All rights reserved.\n";
1266562148Sbostic #endif /* not lint */
133cf635f5Sdist 
143cf635f5Sdist #ifndef lint
15*0e395338Sbostic static char sccsid[] = "@(#)main.c	8.1 (Berkeley) 05/31/93";
1666562148Sbostic #endif /* not lint */
17e1e8e3bfSrrh 
18e1e8e3bfSrrh #include <stdio.h>
19e1e8e3bfSrrh #include "back.h"
20e1e8e3bfSrrh 
21e1e8e3bfSrrh #define MVPAUSE	5				/* time to sleep when stuck */
22e1e8e3bfSrrh #define MAXUSERS 35				/* maximum number of users */
23e1e8e3bfSrrh 
24e1e8e3bfSrrh char	*instr[];				/* text of instructions */
25e1e8e3bfSrrh char	*message[];				/* update message */
26e1e8e3bfSrrh char	ospeed;					/* tty output speed */
27e1e8e3bfSrrh 
28e1e8e3bfSrrh char	*helpm[] = {				/* help message */
29e1e8e3bfSrrh 	"Enter a space or newline to roll, or",
30e1e8e3bfSrrh 	"     R   to reprint the board\tD   to double",
31e1e8e3bfSrrh 	"     S   to save the game\tQ   to quit",
32e1e8e3bfSrrh 	0
33e1e8e3bfSrrh };
34e1e8e3bfSrrh 
35e1e8e3bfSrrh char	*contin[] = {				/* pause message */
36e1e8e3bfSrrh 	"(Type a newline to continue.)",
37e1e8e3bfSrrh 	"",
38e1e8e3bfSrrh 	0
39e1e8e3bfSrrh };
40e1e8e3bfSrrh 
41e1e8e3bfSrrh static char user1a[] =
42e1e8e3bfSrrh 	"Sorry, you cannot play backgammon when there are more than ";
43e1e8e3bfSrrh static char user1b[] =
44e1e8e3bfSrrh 	" users\non the system.";
45e1e8e3bfSrrh static char user2a[] =
46e1e8e3bfSrrh 	"\nThere are now more than ";
47e1e8e3bfSrrh static char user2b[] =
48e1e8e3bfSrrh 	" users on the system, so you cannot play\nanother game.  ";
49e1e8e3bfSrrh static char	rules[] = "\nDo you want the rules of the game?";
50e1e8e3bfSrrh static char	noteach[] = "Teachgammon not available!\n\007";
51e1e8e3bfSrrh static char	need[] = "Do you need instructions for this program?";
52e1e8e3bfSrrh static char	askcol[] =
53e1e8e3bfSrrh 	"Enter 'r' to play red, 'w' to play white, 'b' to play both:";
54e1e8e3bfSrrh static char	rollr[] = "Red rolls a ";
55e1e8e3bfSrrh static char	rollw[] = ".  White rolls a ";
56e1e8e3bfSrrh static char	rstart[] = ".  Red starts.\n";
57e1e8e3bfSrrh static char	wstart[] = ".  White starts.\n";
58e1e8e3bfSrrh static char	toobad1[] = "Too bad, ";
59e1e8e3bfSrrh static char	unable[] = " is unable to use that roll.\n";
60e1e8e3bfSrrh static char	toobad2[] = ".  Too bad, ";
61e1e8e3bfSrrh static char	cantmv[] = " can't move.\n";
62e1e8e3bfSrrh static char	bgammon[] = "Backgammon!  ";
63e1e8e3bfSrrh static char	gammon[] = "Gammon!  ";
64e1e8e3bfSrrh static char	again[] = ".\nWould you like to play again?";
65e1e8e3bfSrrh static char	svpromt[] = "Would you like to save this game?";
66e1e8e3bfSrrh 
67e1e8e3bfSrrh static char	password[] = "losfurng";
68e1e8e3bfSrrh static char	pbuf[10];
69e1e8e3bfSrrh 
main(argc,argv)70e1e8e3bfSrrh main (argc,argv)
71e1e8e3bfSrrh int	argc;
72e1e8e3bfSrrh char	**argv;
73e1e8e3bfSrrh 
74e1e8e3bfSrrh {
75e1e8e3bfSrrh 	register int	i;		/* non-descript index */
76e1e8e3bfSrrh 	register int	l;		/* non-descript index */
77e1e8e3bfSrrh 	register char	c;		/* non-descript character storage */
782a66274cSmckusick 	long	t;			/* time for random num generator */
79e1e8e3bfSrrh 
80e1e8e3bfSrrh 	/* initialization */
81e1e8e3bfSrrh 	bflag = 2;					/* default no board */
82e1e8e3bfSrrh 	signal (2,getout);				/* trap interrupts */
83e1e8e3bfSrrh 	if (gtty (0,&tty) == -1)			/* get old tty mode */
84e1e8e3bfSrrh 		errexit ("backgammon(gtty)");
85e1e8e3bfSrrh 	old = tty.sg_flags;
86e1e8e3bfSrrh #ifdef V7
87e1e8e3bfSrrh 	raw = ((noech = old & ~ECHO) | CBREAK);		/* set up modes */
88e1e8e3bfSrrh #else
89e1e8e3bfSrrh 	raw = ((noech = old & ~ECHO) | RAW);		/* set up modes */
90e1e8e3bfSrrh #endif
910e743930Sbostic 	ospeed = tty.sg_ospeed;				/* for termlib */
92e1e8e3bfSrrh 
93e1e8e3bfSrrh 							/* check user count */
94e1e8e3bfSrrh # ifdef CORY
95e1e8e3bfSrrh 	if (ucount() > MAXUSERS)  {
96e1e8e3bfSrrh 		writel (user1a);
97e1e8e3bfSrrh 		wrint (MAXUSERS);
98e1e8e3bfSrrh 		writel (user1b);
99e1e8e3bfSrrh 		getout();
100e1e8e3bfSrrh 	}
101e1e8e3bfSrrh # endif
102e1e8e3bfSrrh 
103e1e8e3bfSrrh 							/* get terminal
104e1e8e3bfSrrh 							 * capabilities, and
105e1e8e3bfSrrh 					   		 * decide if it can
106e1e8e3bfSrrh 							 * cursor address */
107e1e8e3bfSrrh 	tflag = getcaps (getenv ("TERM"));
108e1e8e3bfSrrh 							/* use whole screen
109e1e8e3bfSrrh 							 * for text */
110e1e8e3bfSrrh 	if (tflag)
111e1e8e3bfSrrh 		begscr = 0;
1122a66274cSmckusick 	t = time(0);
1132a66274cSmckusick 	srandom(t);					/* 'random' seed */
114e1e8e3bfSrrh 
115e1e8e3bfSrrh #ifdef V7
116e1e8e3bfSrrh 	while (*++argv != 0)				/* process arguments */
117e1e8e3bfSrrh #else
118e1e8e3bfSrrh 	while (*++argv != -1)				/* process arguments */
119e1e8e3bfSrrh #endif
120e1e8e3bfSrrh 		getarg (&argv);
121e1e8e3bfSrrh 	args[acnt] = '\0';
122e1e8e3bfSrrh 	if (tflag)  {					/* clear screen */
123e1e8e3bfSrrh 		noech &= ~(CRMOD|XTABS);
124e1e8e3bfSrrh 		raw &= ~(CRMOD|XTABS);
125e1e8e3bfSrrh 		clear();
126e1e8e3bfSrrh 	}
127e1e8e3bfSrrh 	fixtty (raw);					/* go into raw mode */
128e1e8e3bfSrrh 
129e1e8e3bfSrrh 							/* check if restored
130e1e8e3bfSrrh 							 * game and save flag
131e1e8e3bfSrrh 							 * for later */
132e1e8e3bfSrrh 	if (rfl = rflag)  {
133e1e8e3bfSrrh 		text (message);				/* print message */
134e1e8e3bfSrrh 		text (contin);
135e1e8e3bfSrrh 		wrboard();				/* print board */
136e1e8e3bfSrrh 							/* if new game, pretend
137e1e8e3bfSrrh 							 * to be a non-restored
138e1e8e3bfSrrh 							 * game */
139e1e8e3bfSrrh 		if (cturn == 0)
140e1e8e3bfSrrh 			rflag = 0;
141e1e8e3bfSrrh 	} else  {
142e1e8e3bfSrrh 		rscore = wscore = 0;			/* zero score */
143e1e8e3bfSrrh 		text (message);				/* update message
144e1e8e3bfSrrh 							 * without pausing */
145e1e8e3bfSrrh 
146e1e8e3bfSrrh 		if (aflag)  {				/* print rules */
147e1e8e3bfSrrh 			writel (rules);
148e1e8e3bfSrrh 			if (yorn(0))  {
149e1e8e3bfSrrh 
150e1e8e3bfSrrh 				fixtty (old);		/* restore tty */
151a1365f3bSbostic 				execl (TEACH,"teachgammon",args,0);
152e1e8e3bfSrrh 
153e1e8e3bfSrrh 				tflag = 0;		/* error! */
154e1e8e3bfSrrh 				writel (noteach);
155e1e8e3bfSrrh 				exit();
156e1e8e3bfSrrh 			} else  {			/* if not rules, then
157e1e8e3bfSrrh 							 * instructions */
158e1e8e3bfSrrh 				writel (need);
159e1e8e3bfSrrh 				if (yorn(0))  {		/* print instructions */
160e1e8e3bfSrrh 					clear();
161e1e8e3bfSrrh 					text (instr);
162e1e8e3bfSrrh 				}
163e1e8e3bfSrrh 			}
164e1e8e3bfSrrh 		}
165e1e8e3bfSrrh 
166e1e8e3bfSrrh 		init();					/* initialize board */
167e1e8e3bfSrrh 
168e1e8e3bfSrrh 		if (pnum == 2)  {			/* ask for color(s) */
169e1e8e3bfSrrh 			writec ('\n');
170e1e8e3bfSrrh 			writel (askcol);
171e1e8e3bfSrrh 			while (pnum == 2)  {
172e1e8e3bfSrrh 				c = readc();
173e1e8e3bfSrrh 				switch (c)  {
174e1e8e3bfSrrh 
175e1e8e3bfSrrh 				case 'R':		/* red */
176e1e8e3bfSrrh 					pnum = -1;
177e1e8e3bfSrrh 					break;
178e1e8e3bfSrrh 
179e1e8e3bfSrrh 				case 'W':		/* white */
180e1e8e3bfSrrh 					pnum = 1;
181e1e8e3bfSrrh 					break;
182e1e8e3bfSrrh 
183e1e8e3bfSrrh 				case 'B':		/* both */
184e1e8e3bfSrrh 					pnum = 0;
185e1e8e3bfSrrh 					break;
186e1e8e3bfSrrh 
187e1e8e3bfSrrh 				case 'P':
188e1e8e3bfSrrh 					if (iroll)
189e1e8e3bfSrrh 						break;
190e1e8e3bfSrrh 					if (tflag)
191e1e8e3bfSrrh 						curmove (curr,0);
192e1e8e3bfSrrh 					else
193e1e8e3bfSrrh 						writec ('\n');
194e1e8e3bfSrrh 					writel ("Password:");
195e1e8e3bfSrrh 					signal (14,getout);
196e1e8e3bfSrrh 					cflag = 1;
197e1e8e3bfSrrh 					alarm (10);
198e1e8e3bfSrrh 					for (i = 0; i < 10; i++)  {
199e1e8e3bfSrrh 						pbuf[i] = readc();
200e1e8e3bfSrrh 						if (pbuf[i] == '\n')
201e1e8e3bfSrrh 							break;
202e1e8e3bfSrrh 					}
203e1e8e3bfSrrh 					if (i == 10)
204e1e8e3bfSrrh 						while (readc() != '\n');
205e1e8e3bfSrrh 					alarm (0);
206e1e8e3bfSrrh 					cflag = 0;
207e1e8e3bfSrrh 					if (i < 10)
208e1e8e3bfSrrh 						pbuf[i] = '\0';
209e1e8e3bfSrrh 					for (i = 0; i < 9; i++)
210e1e8e3bfSrrh 						if (pbuf[i] != password[i])
211e1e8e3bfSrrh 							getout();
212e1e8e3bfSrrh 					iroll = 1;
213e1e8e3bfSrrh 					if (tflag)
214e1e8e3bfSrrh 						curmove (curr,0);
215e1e8e3bfSrrh 					else
216e1e8e3bfSrrh 						writec ('\n');
217e1e8e3bfSrrh 					writel (askcol);
218e1e8e3bfSrrh 					break;
219e1e8e3bfSrrh 
220e1e8e3bfSrrh 				default:		/* error */
221e1e8e3bfSrrh 					writec ('\007');
222e1e8e3bfSrrh 				}
223e1e8e3bfSrrh 			}
224e1e8e3bfSrrh 		} else  if (!aflag)
225e1e8e3bfSrrh 							/* pause to read
226e1e8e3bfSrrh 							 * message */
227e1e8e3bfSrrh 			text (contin);
228e1e8e3bfSrrh 
229e1e8e3bfSrrh 		wrboard();				/* print board */
230e1e8e3bfSrrh 
231e1e8e3bfSrrh 		if (tflag)
232e1e8e3bfSrrh 			curmove (18,0);
233e1e8e3bfSrrh 		else
234e1e8e3bfSrrh 			writec ('\n');
235e1e8e3bfSrrh 	}
236e1e8e3bfSrrh 							/* limit text to bottom
237e1e8e3bfSrrh 							 * of screen */
238e1e8e3bfSrrh 	if (tflag)
239e1e8e3bfSrrh 		begscr = 17;
240e1e8e3bfSrrh 
241e1e8e3bfSrrh 	for (;;)  {					/* begin game! */
242e1e8e3bfSrrh 							/* initial roll if
243e1e8e3bfSrrh 							 * needed */
244e1e8e3bfSrrh 		if ((! rflag) || raflag)
245e1e8e3bfSrrh 			roll();
246e1e8e3bfSrrh 
247e1e8e3bfSrrh 							/* perform ritual of
248e1e8e3bfSrrh 							 * first roll */
249e1e8e3bfSrrh 		if (! rflag)  {
250e1e8e3bfSrrh 			if (tflag)
251e1e8e3bfSrrh 				curmove (17,0);
252e1e8e3bfSrrh 			while (D0 == D1)		/* no doubles */
253e1e8e3bfSrrh 				roll();
254e1e8e3bfSrrh 
255e1e8e3bfSrrh 							/* print rolls */
256e1e8e3bfSrrh 			writel (rollr);
257e1e8e3bfSrrh 			writec (D0+'0');
258e1e8e3bfSrrh 			writel (rollw);
259e1e8e3bfSrrh 			writec (D1+'0');
260e1e8e3bfSrrh 
261e1e8e3bfSrrh 							/* winner goes first */
262e1e8e3bfSrrh 			if (D0 > D1)  {
263e1e8e3bfSrrh 				writel (rstart);
264e1e8e3bfSrrh 				cturn = 1;
265e1e8e3bfSrrh 			} else  {
266e1e8e3bfSrrh 				writel (wstart);
267e1e8e3bfSrrh 				cturn = -1;
268e1e8e3bfSrrh 			}
269e1e8e3bfSrrh 		}
270e1e8e3bfSrrh 
271e1e8e3bfSrrh 							/* initalize variables
272e1e8e3bfSrrh 							 * according to whose
273e1e8e3bfSrrh 							 * turn it is */
274e1e8e3bfSrrh 
275e1e8e3bfSrrh 		if (cturn == 1)  {			    /* red */
276e1e8e3bfSrrh 			home = 25;
277e1e8e3bfSrrh 			bar = 0;
278e1e8e3bfSrrh 			inptr = &in[1];
279e1e8e3bfSrrh 			inopp = &in[0];
280e1e8e3bfSrrh 			offptr = &off[1];
281e1e8e3bfSrrh 			offopp = &off[0];
282e1e8e3bfSrrh 			Colorptr = &color[1];
283e1e8e3bfSrrh 			colorptr = &color[3];
284e1e8e3bfSrrh 			colen = 3;
285e1e8e3bfSrrh 		} else  {				    /* white */
286e1e8e3bfSrrh 			home = 0;
287e1e8e3bfSrrh 			bar = 25;
288e1e8e3bfSrrh 			inptr = &in[0];
289e1e8e3bfSrrh 			inopp = &in[1];
290e1e8e3bfSrrh 			offptr = &off[0];
291e1e8e3bfSrrh 			offopp = &off[1];
292e1e8e3bfSrrh 			Colorptr = &color[0];
293e1e8e3bfSrrh 			colorptr = &color[2];
294e1e8e3bfSrrh 			colen = 5;
295e1e8e3bfSrrh 		}
296e1e8e3bfSrrh 
297e1e8e3bfSrrh 							/* do first move
298e1e8e3bfSrrh 							 * (special case) */
299e1e8e3bfSrrh 		if (! (rflag && raflag))  {
300e1e8e3bfSrrh 			if (cturn == pnum)		/* computer's move */
301e1e8e3bfSrrh 				move (0);
302e1e8e3bfSrrh 			else  {				/* player's move */
303e1e8e3bfSrrh 				mvlim = movallow();
304e1e8e3bfSrrh 							/* reprint roll */
305e1e8e3bfSrrh 				if (tflag)
306e1e8e3bfSrrh 					curmove (cturn == -1? 18: 19,0);
307e1e8e3bfSrrh 				proll();
308e1e8e3bfSrrh 				getmove();		/* get player's move */
309e1e8e3bfSrrh 			}
310e1e8e3bfSrrh 		}
311e1e8e3bfSrrh 		if (tflag)  {
312e1e8e3bfSrrh 			curmove (17,0);
313e1e8e3bfSrrh 			cline();
314e1e8e3bfSrrh 			begscr = 18;
315e1e8e3bfSrrh 		}
316e1e8e3bfSrrh 
317e1e8e3bfSrrh 							/* no longer any diff-
318e1e8e3bfSrrh 							 * erence between normal
319e1e8e3bfSrrh 							 * game and recovered
320e1e8e3bfSrrh 							 * game. */
321e1e8e3bfSrrh 		rflag = 0;
322e1e8e3bfSrrh 
323e1e8e3bfSrrh 							/* move as long as it's
324e1e8e3bfSrrh 							 * someone's turn */
325e1e8e3bfSrrh 		while (cturn == 1 || cturn == -1)  {
326e1e8e3bfSrrh 
327e1e8e3bfSrrh 							/* board maintainence */
328e1e8e3bfSrrh 			if (tflag)
329e1e8e3bfSrrh 				refresh();		/* fix board */
330e1e8e3bfSrrh 			else
331e1e8e3bfSrrh 							/* redo board if -p */
332e1e8e3bfSrrh 				if (cturn == bflag || bflag == 0)
333e1e8e3bfSrrh 					wrboard();
334e1e8e3bfSrrh 
335e1e8e3bfSrrh 							/* do computer's move */
336e1e8e3bfSrrh 			if (cturn == pnum)  {
337e1e8e3bfSrrh 				move (1);
338e1e8e3bfSrrh 
339e1e8e3bfSrrh 							/* see if double
340e1e8e3bfSrrh 							 * refused */
341e1e8e3bfSrrh 				if (cturn == -2 || cturn == 2)
342e1e8e3bfSrrh 					break;
343e1e8e3bfSrrh 
344e1e8e3bfSrrh 							/* check for winning
345e1e8e3bfSrrh 							 * move */
346e1e8e3bfSrrh 				if (*offopp == 15)  {
347e1e8e3bfSrrh 					cturn *= -2;
348e1e8e3bfSrrh 					break;
349e1e8e3bfSrrh 				}
350e1e8e3bfSrrh 				continue;
351e1e8e3bfSrrh 
352e1e8e3bfSrrh 			}
353e1e8e3bfSrrh 
354e1e8e3bfSrrh 							/* (player's move) */
355e1e8e3bfSrrh 
356e1e8e3bfSrrh 							/* clean screen if
357e1e8e3bfSrrh 							 * safe */
358e1e8e3bfSrrh 			if (tflag && hflag)  {
359e1e8e3bfSrrh 				curmove (20,0);
360e1e8e3bfSrrh 				clend ();
361e1e8e3bfSrrh 				hflag = 1;
362e1e8e3bfSrrh 			}
363e1e8e3bfSrrh 
364e1e8e3bfSrrh 							/* if allowed, give him
365e1e8e3bfSrrh 							 * a chance to double */
366e1e8e3bfSrrh 			if (dlast != cturn && gvalue < 64)  {
367e1e8e3bfSrrh 				if (tflag)
368e1e8e3bfSrrh 					curmove (cturn == -1? 18: 19,0);
369e1e8e3bfSrrh 				writel (*Colorptr);
370e1e8e3bfSrrh 				c = readc();
371e1e8e3bfSrrh 
372e1e8e3bfSrrh 							/* character cases */
373e1e8e3bfSrrh 				switch (c)  {
374e1e8e3bfSrrh 
375e1e8e3bfSrrh 							/* reprint board */
376e1e8e3bfSrrh 				case 'R':
377e1e8e3bfSrrh 					wrboard();
378e1e8e3bfSrrh 					break;
379e1e8e3bfSrrh 
380e1e8e3bfSrrh 							/* save game */
381e1e8e3bfSrrh 				case 'S':
382e1e8e3bfSrrh 					raflag = 1;
383e1e8e3bfSrrh 					save (1);
384e1e8e3bfSrrh 					break;
385e1e8e3bfSrrh 
386e1e8e3bfSrrh 							/* quit */
387e1e8e3bfSrrh 				case 'Q':
388e1e8e3bfSrrh 					quit();
389e1e8e3bfSrrh 					break;
390e1e8e3bfSrrh 
391e1e8e3bfSrrh 							/* double */
392e1e8e3bfSrrh 				case 'D':
393e1e8e3bfSrrh 					dble();
394e1e8e3bfSrrh 					break;
395e1e8e3bfSrrh 
396e1e8e3bfSrrh 							/* roll */
397e1e8e3bfSrrh 				case ' ':
398e1e8e3bfSrrh 				case '\n':
399e1e8e3bfSrrh 					roll();
400e1e8e3bfSrrh 					writel (" rolls ");
401e1e8e3bfSrrh 					writec (D0+'0');
402e1e8e3bfSrrh 					writec (' ');
403e1e8e3bfSrrh 					writec (D1+'0');
404e1e8e3bfSrrh 					writel (".  ");
405e1e8e3bfSrrh 
406e1e8e3bfSrrh 							/* see if he can move */
407e1e8e3bfSrrh 					if ( (mvlim = movallow()) == 0)  {
408e1e8e3bfSrrh 
409e1e8e3bfSrrh 							/* can't move */
410e1e8e3bfSrrh 						writel (toobad1);
411e1e8e3bfSrrh 						writel (*colorptr);
412e1e8e3bfSrrh 						writel (unable);
413e1e8e3bfSrrh 						if (tflag)  {
414e1e8e3bfSrrh 							if (pnum)  {
415e1e8e3bfSrrh 								buflush();
416e1e8e3bfSrrh 								sleep (MVPAUSE);
417e1e8e3bfSrrh 							}
418e1e8e3bfSrrh 						}
419e1e8e3bfSrrh 						nexturn();
420e1e8e3bfSrrh 						break;
421e1e8e3bfSrrh 					}
422e1e8e3bfSrrh 
423e1e8e3bfSrrh 							/* get move */
424e1e8e3bfSrrh 					getmove();
425e1e8e3bfSrrh 
426e1e8e3bfSrrh 							/* okay to clean
427e1e8e3bfSrrh 							 * screen */
428e1e8e3bfSrrh 					hflag = 1;
429e1e8e3bfSrrh 					break;
430e1e8e3bfSrrh 
431e1e8e3bfSrrh 							/* invalid character */
432e1e8e3bfSrrh 				default:
433e1e8e3bfSrrh 
434e1e8e3bfSrrh 							/* print help message */
435e1e8e3bfSrrh 					if (tflag)
436e1e8e3bfSrrh 						curmove (20,0);
437e1e8e3bfSrrh 					else
438e1e8e3bfSrrh 						writec ('\n');
439e1e8e3bfSrrh 					text (helpm);
440e1e8e3bfSrrh 					if (tflag)
441e1e8e3bfSrrh 						curmove (cturn == -1? 18: 19,0);
442e1e8e3bfSrrh 					else
443e1e8e3bfSrrh 						writec ('\n');
444e1e8e3bfSrrh 
445e1e8e3bfSrrh 							/* don't erase */
446e1e8e3bfSrrh 					hflag = 0;
447e1e8e3bfSrrh 				}
448e1e8e3bfSrrh 			} else  {			/* couldn't double */
449e1e8e3bfSrrh 
450e1e8e3bfSrrh 							/* print roll */
451e1e8e3bfSrrh 				roll();
452e1e8e3bfSrrh 				if (tflag)
453e1e8e3bfSrrh 					curmove (cturn == -1? 18: 19,0);
454e1e8e3bfSrrh 				proll ();
455e1e8e3bfSrrh 
456e1e8e3bfSrrh 							/* can he move? */
457e1e8e3bfSrrh 				if ((mvlim = movallow()) == 0)  {
458e1e8e3bfSrrh 
459e1e8e3bfSrrh 							/* he can't */
460e1e8e3bfSrrh 					writel (toobad2);
461e1e8e3bfSrrh 					writel (*colorptr);
462e1e8e3bfSrrh 					writel (cantmv);
463e1e8e3bfSrrh 					buflush();
464e1e8e3bfSrrh 					sleep (MVPAUSE);
465e1e8e3bfSrrh 					nexturn();
466e1e8e3bfSrrh 					continue;
467e1e8e3bfSrrh 				}
468e1e8e3bfSrrh 
469e1e8e3bfSrrh 							/* get move */
470e1e8e3bfSrrh 				getmove();
471e1e8e3bfSrrh 			}
472e1e8e3bfSrrh 		}
473e1e8e3bfSrrh 
474e1e8e3bfSrrh 							/* don't worry about who
475e1e8e3bfSrrh 							 * won if quit */
476e1e8e3bfSrrh 		if (cturn == 0)
477e1e8e3bfSrrh 			break;
478e1e8e3bfSrrh 
479e1e8e3bfSrrh 							/* fix cturn = winner */
480e1e8e3bfSrrh 		cturn /= -2;
481e1e8e3bfSrrh 
482e1e8e3bfSrrh 							/* final board pos. */
483e1e8e3bfSrrh 		if (tflag)
484e1e8e3bfSrrh 			refresh();
485e1e8e3bfSrrh 
486e1e8e3bfSrrh 							/* backgammon? */
487e1e8e3bfSrrh 		mflag = 0;
488e1e8e3bfSrrh 		l = bar+7*cturn;
489e1e8e3bfSrrh 		for (i = bar; i != l; i += cturn)
490e1e8e3bfSrrh 			if (board[i]*cturn)  mflag++;
491e1e8e3bfSrrh 
492e1e8e3bfSrrh 							/* compute game value */
493e1e8e3bfSrrh 		if (tflag)
494e1e8e3bfSrrh 			curmove (20,0);
495e1e8e3bfSrrh 		if (*offopp == 15)  {
496e1e8e3bfSrrh 			if (mflag)  {
497e1e8e3bfSrrh 				writel (bgammon);
498e1e8e3bfSrrh 				gvalue *= 3;
499e1e8e3bfSrrh 			}
500e1e8e3bfSrrh 			else  if (*offptr <= 0)  {
501e1e8e3bfSrrh 				writel (gammon);
502e1e8e3bfSrrh 				gvalue *= 2;
503e1e8e3bfSrrh 			}
504e1e8e3bfSrrh 		}
505e1e8e3bfSrrh 
506e1e8e3bfSrrh 							/* report situation */
507e1e8e3bfSrrh 		if (cturn == -1)  {
508e1e8e3bfSrrh 			writel ("Red wins ");
509e1e8e3bfSrrh 			rscore += gvalue;
510e1e8e3bfSrrh 		} else {
511e1e8e3bfSrrh 			writel ("White wins ");
512e1e8e3bfSrrh 			wscore += gvalue;
513e1e8e3bfSrrh 		}
514e1e8e3bfSrrh 		wrint (gvalue);
515e1e8e3bfSrrh 		writel (" point");
516e1e8e3bfSrrh 		if (gvalue > 1)
517e1e8e3bfSrrh 			writec ('s');
518e1e8e3bfSrrh 		writel (".\n");
519e1e8e3bfSrrh 
520e1e8e3bfSrrh 							/* write score */
521e1e8e3bfSrrh 		wrscore();
522e1e8e3bfSrrh 
523e1e8e3bfSrrh 							/* check user count */
524e1e8e3bfSrrh # ifdef CORY
525e1e8e3bfSrrh 		if (ucount() > MAXUSERS)  {
526e1e8e3bfSrrh 			writel (user2a);
527e1e8e3bfSrrh 			wrint (MAXUSERS);
528e1e8e3bfSrrh 			writel (user2b);
529e1e8e3bfSrrh 			rfl = 1;
530e1e8e3bfSrrh 			break;
531e1e8e3bfSrrh 		}
532e1e8e3bfSrrh # endif
533e1e8e3bfSrrh 
534e1e8e3bfSrrh 							/* see if he wants
535e1e8e3bfSrrh 							 * another game */
536e1e8e3bfSrrh 		writel (again);
537e1e8e3bfSrrh 		if ((i = yorn ('S')) == 0)
538e1e8e3bfSrrh 			break;
539e1e8e3bfSrrh 
540e1e8e3bfSrrh 		init();
541e1e8e3bfSrrh 		if (i == 2)  {
542e1e8e3bfSrrh 			writel ("  Save.\n");
543e1e8e3bfSrrh 			cturn = 0;
544e1e8e3bfSrrh 			save (0);
545e1e8e3bfSrrh 		}
546e1e8e3bfSrrh 
547e1e8e3bfSrrh 							/* yes, reset game */
548e1e8e3bfSrrh 		wrboard();
549e1e8e3bfSrrh 	}
550e1e8e3bfSrrh 
551e1e8e3bfSrrh 	/* give him a chance to save if game was recovered */
552e1e8e3bfSrrh 	if (rfl && cturn)  {
553e1e8e3bfSrrh 		writel (svpromt);
554e1e8e3bfSrrh 		if (yorn (0))  {
555e1e8e3bfSrrh 							/* re-initialize for
556e1e8e3bfSrrh 							 * recovery */
557e1e8e3bfSrrh 			init();
558e1e8e3bfSrrh 			cturn = 0;
559e1e8e3bfSrrh 			save(0);
560e1e8e3bfSrrh 		}
561e1e8e3bfSrrh 	}
562e1e8e3bfSrrh 
563e1e8e3bfSrrh 							/* leave peacefully */
564e1e8e3bfSrrh 	getout ();
565e1e8e3bfSrrh }
566