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