[comp.sources.games] v11i048: vcraps2 - display-oriented craps game

billr@saab.CNA.TEK.COM (Bill Randle) (09/15/90)

Submitted-by: Robert Steven Glickstein <bobg+@andrew.cmu.edu>
Posting-number: Volume 11, Issue 48
Archive-name: vcraps2/Part01
Supersedes: vcraps: Volume 11, Issue 34-35

	[[This is version 2 of the public-domain full-screen
	 casino-style craps game based on curses, plus an
	 interface-independent library providing craps-game
	 functionality.]]

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 2)."
# Contents:  README MANIFEST Makefile patchlevel.h vcraps.c
# Wrapped by billr@saab on Fri Sep 14 14:36:32 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(3321 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X	       VCRAPS -- display-oriented casino craps
X	    CRAPSLIB -- interface-independent craps engine
X
XThis package contains crapslib and vcraps.  Crapslib is an
Xinterface-independent craps-game library; vcraps is a curses-based
Xinterface built on top of crapslib.
X
XThe game is a full implementation of professional casino-style craps.
XVcraps provides on-line help in the form of the '?' key.  For rules of
Xplay and betting, plus interesting strategies to minimize the "house
Xadvantage," please refer to Edwin Silberstang's excellent book,
X"Winning Casino Craps".
X
XThe "table" is a one-dollar table (i.e., all bets are in multiples of
X$1).  By default, vcraps starts you off with a bankroll of $1,000 in a
Xcasino offering double free odds.  The -b<bankroll> command-line
Xswitch can be used to start with a different bankroll.  The -s switch
Xmeans use single free odds.
X
XVcraps input can be interrupted at any time with the escape key or
Xcontrol-L; the latter redraws the screen.  Messages appear at the
Xbottom of the screen and must be cleared by pressing the spacebar.
X
XSome casinos pay different bets differently.  Vcraps offers a single
Xconfiguration of payoffs, but other clients of crapslib can configure
Xthe payoffs that vary.  (The varying payoffs are Big 6, Big 8, Field,
Xand the one-roll bets on 2, 3, 11, and 12.)
X
XThe bets and payoffs are as follows:
X
X
XPass-line                           1-1.
XFree odds on pass-line              2-1 for 4 and 10,
X                                    3-2 for 5 and 9,
X                                    6-5 for 6 and 8.
XCome                                1-1.
XFree odds on a come number          2-1 for 4 and 10,
X                                    3-2 for 5 and 9,
X                                    6-5 for 6 and 8.
XDon't pass (bar 12)                 1-1.
XFree odds on don't pass             1-2 for 4 and 10,
X                                    2-3 for 5 and 9,
X                                    5-6 for 6 and 8.
XDon't come (bar 12)                 1-1.
XFree odds on a don't come number    1-2 for 4 and 10,
X                                    2-3 for 5 and 9,
X                                    5-6 for 6 and 8.
XPlace numbers                       9-5 for 4 and 10 (2-1 if bought),
X                                    7-5 for 5 and 9,
X                                    7-6 for 6 and 8.
X    (Buying the 4 or 10 requires a 5% commission on the wager.)
X
XDon't place numbers                 1-2 for 4 and 10,
X                                    2-3 for 5 and 9,
X                                    5-6 for 6 and 8.
X    (Don't-place wagers require a 5% commission on the possible payoff.)
X
XBig 6 and Big 8                     1-1
X    (Some casinos pay 6-5.)
X
XField                               1-1 for 3, 4, 9, 10, and 11,
X                                    2-1 for 2 and 12.
X    (Some casinos pay 3-1 on either the 2 or the 12.)
X
XHardway bets                        7-1 for 4 and 10,
X                                    9-1 for 6 and 8.
XOne-roll bets                       29-1 for 2 and 12,
X                                    14-1 for 3 and 11.
X    (Some casinos pay 30-1 and 15-1.)
X
XAny 7                               4-1.
XAny Craps                           7-1.
X
X
XAuthor:  Bob Glickstein (bobg@andrew.cmu.edu)  August 1990
XThis program is in the public domain.
END_OF_FILE
if test 3321 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MANIFEST'\"
else
echo shar: Extracting \"'MANIFEST'\" \(331 characters\)
sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
X   File Name		Archive #	Description
X-----------------------------------------------------------
X MANIFEST                   1	This shipping list
X Makefile                   1	
X README                     1	
X crapslib.c                 2	
X crapslib.h                 2	
X patchlevel.h               1	
X vcraps.c                   1	
END_OF_FILE
if test 331 -ne `wc -c <'MANIFEST'`; then
    echo shar: \"'MANIFEST'\" unpacked with wrong size!
fi
# end of 'MANIFEST'
fi
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(384 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
Xvcraps: crapslib.o vcraps.o
X	cc -O -o vcraps vcraps.o crapslib.o -lcurses -ltermlib
X
Xvcraps.o: vcraps.c crapslib.h
X	cc -O -I. -c vcraps.c
X
Xcrapslib.o: crapslib.c crapslib.h
X	cc -O -I. -c crapslib.c
X
Xclean:
X	-rm -f vcraps *.o *.a *~ *.BAK *.CKP core a.out mon.out gmon.out
X
Xshar:
X	shar -n1 -e2 README Makefile crapslib.c crapslib.h > craps.1.shar
X	shar -n2 -e2 vcraps.c > craps.2.shar
END_OF_FILE
if test 384 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'patchlevel.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patchlevel.h'\"
else
echo shar: Extracting \"'patchlevel.h'\" \(21 characters\)
sed "s/^X//" >'patchlevel.h' <<'END_OF_FILE'
X#define PATCHLEVEL 0
END_OF_FILE
if test 21 -ne `wc -c <'patchlevel.h'`; then
    echo shar: \"'patchlevel.h'\" unpacked with wrong size!
fi
# end of 'patchlevel.h'
fi
if test -f 'vcraps.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'vcraps.c'\"
else
echo shar: Extracting \"'vcraps.c'\" \(46362 characters\)
sed "s/^X//" >'vcraps.c' <<'END_OF_FILE'
X#include <crapslib.h>
X#include <curses.h>
X#include <setjmp.h>
X
X#define VCRAPS_VERSION (2)
X#define VCRAPS_PATCHLEVEL (0)
X
X#define MSGQUEUELEN (20)
X
Xextern int      CrapsErrorDatum;
Xextern int      optind;
Xextern char    *optarg, *malloc();
X
Xint             MsgQueueLen, MsgQueueLatest;
Xchar           *MsgQueue[MSGQUEUELEN];
X
Xjmp_buf         LoopEnv;
X
XWINDOW         *dontplace4win, *dontplace5win, *dontplace6win, *dontplace8win;
XWINDOW         *dontplace9win, *dontplace10win;
XWINDOW         *dontcome4win, *dontcome5win, *dontcome6win, *dontcome8win;
XWINDOW         *dontcome9win, *dontcome10win;
XWINDOW         *place4win, *place5win, *place6win, *place8win, *place9win;
XWINDOW         *place10win;
XWINDOW         *come4win, *come5win, *come6win, *come8win, *come9win;
XWINDOW         *come10win;
XWINDOW         *bankrollwin, *pointwin, *passlinewin, *comewin;
XWINDOW         *dontpasswin, *dontcomewin, *fieldwin, *big6win, *big8win;
XWINDOW         *hard4win, *hard6win, *hard8win, *hard10win;
XWINDOW         *oneroll2win, *oneroll3win, *oneroll11win, *oneroll12win;
XWINDOW         *any7win, *anycrapswin;
XWINDOW         *dicewin;
XWINDOW         *promptwin, *commandwin, *msgwin;
X
Xchar           *BetName[] = {
X    "Pass Line", "Pass Line Odds",
X    "Come",
X    "Come 4", "Come 5", "Come 6", "Come 8", "Come 9", "Come 10",
X    "Come 4 Odds", "Come 5 Odds", "Come 6 Odds", "Come 8 Odds",
X    "Come 9 Odds", "Come 10 Odds",
X    "Don't Pass", "Don't Pass Odds",
X    "Don't Come",
X    "Don't Come 4", "Don't Come 5", "Don't Come 6",
X    "Don't Come 8", "Don't Come 9", "Don't Come 10",
X    "Don't Come 4 Odds", "Don't Come 5 Odds", "Don't Come 6 Odds",
X    "Don't Come 8 Odds", "Don't Come 9 Odds", "Don't Come 10 Odds",
X    "Place 4", "Place 5", "Place 6", "Place 8", "Place 9", "Place 10",
X    "Don't Place 4", "Don't Place 5", "Don't Place 6",
X    "Don't Place 8", "Don't Place 9", "Don't Place 10",
X    "Field", "Big 6", "Big 8", "Hard 4", "Hard 6",
X    "Hard 8", "Hard 10", "Any 7", "Any Craps",
X    "One-Roll 2", "One-Roll 3", "One-Roll 11", "One-Roll 12"
X};
X
XCrapsTable_t    Table, OldTable;
X
Xinit()
X{
X    initscr();
X    cbreak();
X    noecho();
X    dontplace4win = newwin(1, 9, 1, 13);
X    dontplace5win = newwin(1, 9, 1, 24);
X    dontplace6win = newwin(1, 9, 1, 35);
X    dontplace8win = newwin(1, 9, 1, 46);
X    dontplace9win = newwin(1, 9, 1, 57);
X    dontplace10win = newwin(1, 9, 1, 68);
X    dontcome4win = newwin(1, 9, 2, 13);
X    dontcome5win = newwin(1, 9, 2, 24);
X    dontcome6win = newwin(1, 9, 2, 35);
X    dontcome8win = newwin(1, 9, 2, 46);
X    dontcome9win = newwin(1, 9, 2, 57);
X    dontcome10win = newwin(1, 9, 2, 68);
X    place4win = newwin(1, 9, 3, 13);
X    place5win = newwin(1, 9, 3, 24);
X    place6win = newwin(1, 9, 3, 35);
X    place8win = newwin(1, 9, 3, 46);
X    place9win = newwin(1, 9, 3, 57);
X    place10win = newwin(1, 9, 3, 68);
X    come4win = newwin(1, 9, 4, 13);
X    come5win = newwin(1, 9, 4, 24);
X    come6win = newwin(1, 9, 4, 35);
X    come8win = newwin(1, 9, 4, 46);
X    come9win = newwin(1, 9, 4, 57);
X    come10win = newwin(1, 9, 4, 68);
X    bankrollwin = newwin(1, 14, 7, 0);
X    pointwin = newwin(1, 11, 7, 16);
X    passlinewin = newwin(1, 19, 7, 31);
X    comewin = newwin(1, 14, 7, 52);
X    dontpasswin = newwin(1, 16, 10, 0);
X    dontcomewin = newwin(1, 16, 10, 18);
X    fieldwin = newwin(1, 11, 10, 38);
X    big6win = newwin(1, 11, 10, 53);
X    big8win = newwin(1, 11, 10, 66);
X    hard4win = newwin(1, 9, 16, 0);
X    hard6win = newwin(1, 9, 13, 0);
X    hard8win = newwin(1, 9, 13, 11);
X    hard10win = newwin(1, 9, 16, 11);
X    oneroll2win = newwin(1, 9, 13, 24);
X    oneroll3win = newwin(1, 9, 16, 24);
X    oneroll11win = newwin(1, 9, 16, 35);
X    oneroll12win = newwin(1, 9, 13, 35);
X    any7win = newwin(1, 15, 13, 48);
X    anycrapswin = newwin(1, 15, 16, 48);
X    dicewin = newwin(1, 4, 20, 0);
X    promptwin = newwin(1, 70, 19, 6);
X    commandwin = newwin(1, 70, 20, 6);
X    msgwin = newwin(1, 78, 22, 0);
X    Craps_Init(&Table);
X    srandom(time(0) + getpid());
X}
X
Xvoid            wcenter(win, str, line, highlightp)
XWINDOW         *win;
Xchar           *str;
Xint             line, highlightp;
X{
X    wmove(win, line, 0);
X    wclrtoeol(win);
X    wmove(win, line, (int) ((win->_maxx - strlen(str)) / 2));
X    if (highlightp)
X	wstandout(win);
X    waddstr(win, str);
X    if (highlightp)
X	wstandend(win);
X}
X
Xmain(argc, argv)
Xint             argc;
Xchar          **argv;
X{
X    int             c;
X
X    MsgQueueLen = 0;
X    MsgQueueLatest = -1;
X    init();
X    Craps_SetBankroll(&Table, 1000);
X    while ((c = getopt(argc, argv, "b:sx")) != EOF) {
X	switch (c) {
X	    case 'b':
X		Craps_SetBankroll(&Table, atoi(optarg));
X		break;
X	    case 's':
X		Craps_SetDouble(&Table, 0);
X		break;
X	    default:
X		deinit();
X		fprintf(stderr, "Usage: vcraps [-b bankroll] [-s]\n");
X		exit(1);
X	}
X    }
X    Driver();
X    deinit();
X    exit(0);
X}
X
XDriver()
X{
X    int             c, amount, fullupdate = 1, jmpval, die1, die2, i;
X    int             msgptr, msgcount;
X    int             firsttime = 1;
X    char            buf[20], welcomebuf[100];
X    CrapsError_t    err;
X    CrapsTable_t   *t = &Table;
X
X    if ((jmpval = setjmp(LoopEnv)) == 1)
X	Message("ABORTED");
X    if (jmpval == 2)
X	fullupdate = 1;
X    while (1) {
X	Update(fullupdate);
X	bcopy(&Table, &OldTable, (sizeof(CrapsTable_t)));
X	fullupdate = 0;
X	if (firsttime) {
X	    firsttime = 0;
X	    sprintf(welcomebuf,
X		    "Welcome to Vcraps version %d.%d (crapslib %d.%d)",
X		    VCRAPS_VERSION, VCRAPS_PATCHLEVEL,
X		    CRAPSLIB_VERSION, CRAPSLIB_PATCHLEVEL);
X	    Message(welcomebuf);
X	    Message("Copr. 1990 by Bob Glickstein");
X	    Message("Please send comments to bobg@andrew.cmu.edu");
X	}
X	Prompt("Command [12345689abcdfhmprt$X?]:");
X	wclear(commandwin);
X	wrefresh(commandwin);
X	c = Getch("12345689abcdfhmprt$X?", 1);
X	switch (c) {
X	    case '1':
X		Prompt("[012]:");
X		c = Getch("012", 1);
X		switch (c) {
X		    case '0':
X			Prompt("[cdp]:");
X			c = Getch("cdp", 1);
X			switch (c) {
X			    case 'c':
X				Prompt("Amount for come-odds on 10:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_ComeOdds10,
X						    amount))
X				    Error(err);
X				break;
X			    case 'd':
X				Prompt("[cp]:");
X				c = Getch("cp", 1);
X				switch (c) {
X				    case 'c':
X					Prompt("Amount for don't-come odds on 10:");
X					amount = ReadNumber();
X					if (err = Craps_Bet(&Table,
X						    craps_DontComeOdds10,
X							    amount))
X					    Error(err);
X					break;
X				    case 'p':
X					Prompt("Amount for don't-pass bet on 10:");
X					amount = ReadNumber();
X					if (err = Craps_Bet(&Table,
X						       craps_DontPlace10,
X							    amount))
X					    Error(err);
X					break;
X				}
X				break;
X			    case 'p':
X				Prompt("Amount for place bet on 10:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_Place10, amount))
X				    Error(err);
X			}
X			break;
X		    case '1':
X			Prompt("Amount for one-roll bet on 11:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_OneRoll11, amount))
X			    Error(err);
X			break;
X		    case '2':
X			Prompt("Amount for one-roll bet on 12:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_OneRoll12, amount))
X			    Error(err);
X			break;
X		}
X		break;
X	    case '2':
X		Prompt("Amount for one-roll bet on 2:");
X		amount = ReadNumber();
X		if (err = Craps_Bet(&Table, craps_OneRoll2, amount))
X		    Error(err);
X		break;
X	    case '3':
X		Prompt("Amount for one-roll bet on 3:");
X		amount = ReadNumber();
X		if (err = Craps_Bet(&Table, craps_OneRoll3, amount))
X		    Error(err);
X		break;
X	    case '4':
X		Prompt("[cdp]:");
X		c = Getch("cdp", 1);
X		switch (c) {
X		    case 'c':
X			Prompt("Amount for come-odds on 4:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_ComeOdds4, amount))
X			    Error(err);
X			break;
X		    case 'd':
X			Prompt("[cp]:");
X			c = Getch("cp", 1);
X			switch (c) {
X			    case 'c':
X				Prompt("Amount for don't-come odds on 4:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_DontComeOdds4,
X						    amount))
X				    Error(err);
X				break;
X			    case 'p':
X				Prompt("Amount for don't-pass bet on 4:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_DontPlace4,
X						    amount))
X				    Error(err);
X				break;
X			}
X			break;
X		    case 'p':
X			Prompt("Amount for place bet on 4:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Place4, amount))
X			    Error(err);
X			break;
X		}
X		break;
X	    case '5':
X		Prompt("[cdp]:");
X		c = Getch("cdp", 1);
X		switch (c) {
X		    case 'c':
X			Prompt("Amount for come-odds on 5:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_ComeOdds5, amount))
X			    Error(err);
X			break;
X		    case 'd':
X			Prompt("[cp]:");
X			c = Getch("cp", 1);
X			switch (c) {
X			    case 'c':
X				Prompt("Amount for don't-come odds on 5:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_DontComeOdds5,
X						    amount))
X				    Error(err);
X				break;
X			    case 'p':
X				Prompt("Amount for don't-pass bet on 5:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_DontPlace5,
X						    amount))
X				    Error(err);
X				break;
X			}
X			break;
X		    case 'p':
X			Prompt("Amount for place bet on 5:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Place5, amount))
X			    Error(err);
X			break;
X		}
X		break;
X	    case '6':
X		Prompt("[cdp]:");
X		c = Getch("cdp", 1);
X		switch (c) {
X		    case 'c':
X			Prompt("Amount for come-odds on 6:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_ComeOdds6, amount))
X			    Error(err);
X			break;
X		    case 'd':
X			Prompt("[cp]:");
X			c = Getch("cp", 1);
X			switch (c) {
X			    case 'c':
X				Prompt("Amount for don't-come odds on 6:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_DontComeOdds6,
X						    amount))
X				    Error(err);
X				break;
X			    case 'p':
X				Prompt("Amount for don't-pass bet on 6:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_DontPlace6,
X						    amount))
X				    Error(err);
X				break;
X			}
X			break;
X		    case 'p':
X			Prompt("Amount for place bet on 6:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Place6, amount))
X			    Error(err);
X			break;
X		}
X		break;
X	    case '8':
X		Prompt("[cdp]:");
X		c = Getch("cdp", 1);
X		switch (c) {
X		    case 'c':
X			Prompt("Amount for come-odds on 8:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_ComeOdds8, amount))
X			    Error(err);
X			break;
X		    case 'd':
X			Prompt("[cp]:");
X			c = Getch("cp", 1);
X			switch (c) {
X			    case 'c':
X				Prompt("Amount for don't-come odds on 8:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_DontComeOdds8,
X						    amount))
X				    Error(err);
X				break;
X			    case 'p':
X				Prompt("Amount for don't-pass bet on 8:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_DontPlace8,
X						    amount))
X				    Error(err);
X				break;
X			}
X			break;
X		    case 'p':
X			Prompt("Amount for place bet on 8:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Place8, amount))
X			    Error(err);
X			break;
X		}
X		break;
X	    case '9':
X		Prompt("[cdp]:");
X		c = Getch("cdp", 1);
X		switch (c) {
X		    case 'c':
X			Prompt("Amount for come-odds on 9:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_ComeOdds9, amount))
X			    Error(err);
X			break;
X		    case 'd':
X			Prompt("[cp]:");
X			c = Getch("cp", 1);
X			switch (c) {
X			    case 'c':
X				Prompt("Amount for don't-come odds on 9:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_DontComeOdds9,
X						    amount))
X				    Error(err);
X				break;
X			    case 'p':
X				Prompt("Amount for don't-pass bet on 9:");
X				amount = ReadNumber();
X				if (err = Craps_Bet(&Table, craps_DontPlace9,
X						    amount))
X				    Error(err);
X				break;
X			}
X			break;
X		    case 'p':
X			Prompt("Amount for place bet on 9:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Place9, amount))
X			    Error(err);
X			break;
X		}
X		break;
X	    case 'a':
X		Prompt("[7c]:");
X		c = Getch("7c", 1);
X		switch (c) {
X		    case '7':
X			Prompt("Amount for bet on Any 7:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Any7, amount))
X			    Error(err);
X			break;
X		    case 'c':
X			Prompt("Amount for bet on Any Craps:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_AnyCraps, amount))
X			    Error(err);
X			break;
X		}
X		break;
X	    case 'b':
X		Prompt("[1468]:");
X		c = Getch("1468", 1);
X		switch (c) {
X		    case '1':
X			Prompt("[0]:");
X			Getch("0", 1);
X			if (err = Craps_Buy(t, 10))
X			    Error(err);
X			break;
X		    case '4':
X			if (err = Craps_Buy(t, 4))
X			    Error(err);
X			break;
X		    case '6':
X			Prompt("Amount for bet on Big 6:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Big6, amount))
X			    Error(err);
X			break;
X		    case '8':
X			Prompt("Amount for bet on Big 8:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Big8, amount))
X			    Error(err);
X			break;
X		}
X		break;
X	    case 'c':
X		Prompt("Amount for bet on Come:");
X		amount = ReadNumber();
X		if (err = Craps_Bet(&Table, craps_ComeBox, amount))
X		    Error(err);
X		break;
X	    case 'd':
X		Prompt("[cp]:");
X		c = Getch("cp", 1);
X		switch (c) {
X		    case 'c':
X			Prompt("Amount for bet on Don't Come:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_DontComeBox, amount))
X			    Error(err);
X			break;
X		    case 'p':
X			if (Craps_Point(&Table)) {
X			    Prompt("Amount for odds on Don't Pass:");
X			    amount = ReadNumber();
X			    if (err = Craps_Bet(&Table, craps_DontPassOdds, amount))
X				Error(err);
X			}
X			else {
X			    Prompt("Amount for bet on Don't Pass:");
X			    amount = ReadNumber();
X			    if (err = Craps_Bet(&Table, craps_DontPass, amount))
X				Error(err);
X			}
X			break;
X		}
X		break;
X	    case 'f':
X		Prompt("Amount for bet on Field:");
X		amount = ReadNumber();
X		if (err = Craps_Bet(&Table, craps_Field, amount))
X		    Error(err);
X		break;
X	    case 'h':
X		Prompt("[2345]:");
X		c = Getch("2345", 1);
X		switch (c) {
X		    case '2':
X			Prompt("[2]:");
X			Getch("2", 1);
X			Prompt("Amount for bet on Hard 4:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Hard4, amount))
X			    Error(err);
X			break;
X		    case '3':
X			Prompt("[3]:");
X			Getch("3", 1);
X			Prompt("Amount for bet on Hard 6:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Hard6, amount))
X			    Error(err);
X			break;
X		    case '4':
X			Prompt("[4]:");
X			Getch("4", 1);
X			Prompt("Amount for bet on Hard 8:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Hard8, amount))
X			    Error(err);
X			break;
X		    case '5':
X			Prompt("[5]:");
X			Getch("5", 1);
X			Prompt("Amount for bet on Hard 10:");
X			amount = ReadNumber();
X			if (err = Craps_Bet(&Table, craps_Hard10, amount))
X			    Error(err);
X			break;
X		}
X		break;
X	    case 'm':
X		msgptr = MsgQueueLatest;
X		msgcount = 0;
X		do {
X		    if (++msgcount > MsgQueueLen)
X			c = ' ';
X		    else {
X			wcenter(msgwin, MsgQueue[msgptr], 0, 0);
X			wrefresh(msgwin);
X			msgptr = (msgptr - 1 + MSGQUEUELEN) % MSGQUEUELEN;
X			c = wgetch(msgwin);
X			wclear(msgwin);
X		    }
X		} while (c != ' ');
X		wrefresh(msgwin);
X		break;
X	    case 'p':
X		if (Craps_Point(&Table)) {
X		    Prompt("Amount for odds on Pass Line:");
X		    amount = ReadNumber();
X		    if (err = Craps_Bet(&Table, craps_PassLineOdds, amount))
X			Error(err);
X		}
X		else {
X		    Prompt("Amount for bet on Pass Line:");
X		    amount = ReadNumber();
X		    if (err = Craps_Bet(&Table, craps_PassLine, amount))
X			Error(err);
X		}
X		break;
X	    case 'r':
X		Prompt("ROLL");
X		for (i = (random() % 40) + 40; i >= 0; --i) {
X		    die1 = 1 + (random() % 6);
X		    die2 = 1 + (random() % 6);
X		    sprintf(buf, "%d  %d", die1, die2);
X		    wcenter(dicewin, buf, 0, 1);
X		    wrefresh(dicewin);
X		}
X		Craps_Update(&Table, die1, die2);
X		break;
X	    case 't':
X		Prompt("[12345689abcdfhp]:");
X		c = Getch("12345689abcdfhp", 1);
X		switch (c) {
X		    case '1':
X			Prompt("[012]:");
X			c = Getch("012", 1);
X			switch (c) {
X			    case '0':
X				Prompt("[cdp]:");
X				c = Getch("cdp", 1);
X				switch (c) {
X				    case 'c':
X					if (err = Craps_TakeDown(t,
X						       craps_ComeOdds10))
X					    Error(err);
X					break;
X				    case 'd':
X					Prompt("[cp]:");
X					c = Getch("cp", 1);
X					switch (c) {
X					    case 'c':
X						if (err = Craps_TakeDown(t,
X						   craps_DontComeOdds10))
X						    Error(err);
X						break;
X					    case 'p':
X						if (err = Craps_TakeDown(t,
X						      craps_DontPlace10))
X						    Error(err);
X						break;
X					}
X					break;
X				    case 'p':
X					if (err = Craps_TakeDown(t, craps_Place10))
X					    Error(err);
X					break;
X				}
X				break;
X			    case '1':
X				if (err = Craps_TakeDown(t, craps_OneRoll11))
X				    Error(err);
X				break;
X			    case '2':
X				if (err = Craps_TakeDown(t, craps_OneRoll12))
X				    Error(err);
X				break;
X			}
X			break;
X		    case '2':
X			if (err = Craps_TakeDown(t, craps_OneRoll2))
X			    Error(err);
X			break;
X		    case '3':
X			if (err = Craps_TakeDown(t, craps_OneRoll3))
X			    Error(err);
X			break;
X		    case '4':
X			Prompt("[cdp]:");
X			c = Getch("cdp", 1);
X			switch (c) {
X			    case 'c':
X				if (err = Craps_TakeDown(t, craps_ComeOdds4))
X				    Error(err);
X				break;
X			    case 'd':
X				Prompt("[cp]:");
X				c = Getch("cp", 1);
X				switch (c) {
X				    case 'c':
X					if (err = Craps_TakeDown(t,
X						    craps_DontComeOdds4))
X					    Error(err);
X					break;
X				    case 'p':
X					if (err = Craps_TakeDown(t,
X						       craps_DontPlace4))
X					    Error(err);
X					break;
X				}
X				break;
X			    case 'p':
X				if (err = Craps_TakeDown(t, craps_Place4))
X				    Error(err);
X				break;
X			}
X			break;
X		    case '5':
X			Prompt("[cdp]:");
X			c = Getch("cdp", 1);
X			switch (c) {
X			    case 'c':
X				if (err = Craps_TakeDown(t, craps_ComeOdds5))
X				    Error(err);
X				break;
X			    case 'd':
X				Prompt("[cp]:");
X				c = Getch("cp", 1);
X				switch (c) {
X				    case 'c':
X					if (err = Craps_TakeDown(t,
X						    craps_DontComeOdds5))
X					    Error(err);
X					break;
X				    case 'p':
X					if (err = Craps_TakeDown(t,
X						       craps_DontPlace5))
X					    Error(err);
X					break;
X				}
X				break;
X			    case 'p':
X				if (err = Craps_TakeDown(t, craps_Place5))
X				    Error(err);
X				break;
X			}
X			break;
X		    case '6':
X			Prompt("[cdp]:");
X			c = Getch("cdp", 1);
X			switch (c) {
X			    case 'c':
X				if (err = Craps_TakeDown(t, craps_ComeOdds6))
X				    Error(err);
X				break;
X			    case 'd':
X				Prompt("[cp]:");
X				c = Getch("cp", 1);
X				switch (c) {
X				    case 'c':
X					if (err = Craps_TakeDown(t,
X						    craps_DontComeOdds6))
X					    Error(err);
X					break;
X				    case 'p':
X					if (err = Craps_TakeDown(t,
X						       craps_DontPlace6))
X					    Error(err);
X					break;
X				}
X				break;
X			    case 'p':
X				if (err = Craps_TakeDown(t, craps_Place6))
X				    Error(err);
X				break;
X			}
X			break;
X		    case '8':
X			Prompt("[cdp]:");
X			c = Getch("cdp", 1);
X			switch (c) {
X			    case 'c':
X				if (err = Craps_TakeDown(t, craps_ComeOdds8))
X				    Error(err);
X				break;
X			    case 'd':
X				Prompt("[cp]:");
X				c = Getch("cp", 1);
X				switch (c) {
X				    case 'c':
X					if (err = Craps_TakeDown(t,
X						    craps_DontComeOdds8))
X					    Error(err);
X					break;
X				    case 'p':
X					if (err = Craps_TakeDown(t,
X						       craps_DontPlace8))
X					    Error(err);
X					break;
X				}
X				break;
X			    case 'p':
X				if (err = Craps_TakeDown(t, craps_Place8))
X				    Error(err);
X				break;
X			}
X			break;
X		    case '9':
X			Prompt("[cdp]:");
X			c = Getch("cdp", 1);
X			switch (c) {
X			    case 'c':
X				if (err = Craps_TakeDown(t, craps_ComeOdds9))
X				    Error(err);
X				break;
X			    case 'd':
X				Prompt("[cp]:");
X				c = Getch("cp", 1);
X				switch (c) {
X				    case 'c':
X					if (err = Craps_TakeDown(t,
X						    craps_DontComeOdds9))
X					    Error(err);
X					break;
X				    case 'p':
X					if (err = Craps_TakeDown(t,
X						       craps_DontPlace9))
X					    Error(err);
X					break;
X				}
X				break;
X			    case 'p':
X				if (err = Craps_TakeDown(t, craps_Place9))
X				    Error(err);
X				break;
X			}
X			break;
X		    case 'a':
X			Prompt("[7c]:");
X			c = Getch("7c", 1);
X			switch (c) {
X			    case '7':
X				if (err = Craps_TakeDown(t, craps_Any7))
X				    Error(err);
X				break;
X			    case 'c':
X				if (err = Craps_TakeDown(t, craps_AnyCraps))
X				    Error(err);
X				break;
X			}
X			break;
X		    case 'b':
X			Prompt("[68]:");
X			c = Getch("68", 1);
X			switch (c) {
X			    case '6':
X				if (err = Craps_TakeDown(t, craps_Big6))
X				    Error(err);
X				break;
X			    case '8':
X				if (err = Craps_TakeDown(t, craps_Big8))
X				    Error(err);
X				break;
X			}
X			break;
X		    case 'c':
X			if (err = Craps_TakeDown(t, craps_ComeBox))
X			    Error(err);
X			break;
X		    case 'd':
X			Prompt("[cp]:");
X			c = Getch("cp", 1);
X			switch (c) {
X			    case 'c':
X				if (err = Craps_TakeDown(t, craps_DontComeBox))
X				    Error(err);
X				break;
X			    case 'p':
X				if (err = Craps_TakeDown(t,
X							 Craps_Point(t) ?
X						     craps_DontPassOdds :
X							 craps_DontPass))
X				    Error(err);
X				break;
X			}
X			break;
X		    case 'f':
X			if (err = Craps_TakeDown(t, craps_Field))
X			    Error(err);
X			break;
X		    case 'h':
X			Prompt("[2345]:");
X			c = Getch("2345", 1);
X			switch (c) {
X			    case '2':
X				Prompt("[2]:");
X				Getch("2", 1);
X				if (err = Craps_TakeDown(t, craps_Hard4))
X				    Error(err);
X				break;
X			    case '3':
X				Prompt("[3]:");
X				Getch("3", 1);
X				if (err = Craps_TakeDown(t, craps_Hard6))
X				    Error(err);
X				break;
X			    case '4':
X				Prompt("[4]:");
X				Getch("4", 1);
X				if (err = Craps_TakeDown(t, craps_Hard8))
X				    Error(err);
X				break;
X			    case '5':
X				Prompt("[5]:");
X				Getch("5", 1);
X				if (err = Craps_TakeDown(t, craps_Hard10))
X				    Error(err);
X				break;
X			}
X			break;
X		    case 'p':
X			if (err = Craps_TakeDown(t,
X						 Craps_Point(t) ?
X						 craps_PassLineOdds :
X						 craps_PassLine))
X			    Error(err);
X			break;
X		}
X		break;
X	    case '$':
X		ShowTotal();
X		break;
X	    case 'X':
X		return (0);
X	    case '?':
X		Help();
X		break;
X	}
X    }
X}
X
XMessage(str)
Xchar           *str;
X{
X    char           *copy = malloc(1 + strlen(str));
X    int             c, msgptr, msgcount;
X
X    if (copy) {
X	strcpy(copy, str);
X	MsgQueueLatest = (MsgQueueLatest + 1) % MSGQUEUELEN;
X	if (MsgQueueLen == MSGQUEUELEN)
X	    free(MsgQueue[MsgQueueLatest]);
X	else
X	    ++MsgQueueLen;
X	MsgQueue[MsgQueueLatest] = copy;
X    }
X    msgptr = (MsgQueueLatest - 1 + MSGQUEUELEN) % MSGQUEUELEN;
X    msgcount = 1;
X    wcenter(msgwin, str, 0, 0);
X    wrefresh(msgwin);
X    do {
X	c = wgetch(msgwin);
X	if (c == 'm') {
X	    if (++msgcount > MsgQueueLen)
X		c = ' ';
X	    else {
X		wcenter(msgwin, MsgQueue[msgptr], 0, 0);
X		wrefresh(msgwin);
X		msgptr = (msgptr - 1 + MSGQUEUELEN) % MSGQUEUELEN;
X	    }
X	}
X    } while (c != ' ');
X    wclear(msgwin);
X    wrefresh(msgwin);
X}
X
XPrompt(str)
Xchar           *str;
X{
X    wclear(promptwin);
X    wmove(promptwin, 0, 0);
X    waddstr(promptwin, str);
X    wrefresh(promptwin);
X}
X
Xint             Getch(key, echop)
Xchar           *key;
Xint             echop;
X{
X    int             c;
X
X    do {
X	c = wgetch(commandwin);
X	if (c == 27)
X	    longjmp(LoopEnv, 1);
X	if (c == 12)
X	    longjmp(LoopEnv, 2);
X	if ((c == 127) && index(key, '\b'))
X	    break;
X    } while (!index(key, c));
X    if (echop) {
X	waddch(commandwin, c);
X	wrefresh(commandwin);
X    }
X    return (c);
X}
X
Xdeinit()
X{
X    clear();
X    refresh();
X    endwin();
X}
X
Xvoid            Craps_ReportPayoff(t, bet, payoff, win)
XCrapsTable_t   *t;
XCrapsBet_t      bet;
XCrapsPayoff_t  *payoff;
Xint             win;
X{
X    char            buf[100];
X
X    sprintf(buf, "Casino pays $%d %s bet at %d-%d; you collect $%d",
X	    Craps_GetBet(t, bet), BetName[(int) bet], payoff->numerator,
X	    payoff->denominator, win + Craps_GetBet(t, bet));
X    Message(buf);
X}
X
Xvoid            Craps_ReportCollect(t, bet)
XCrapsTable_t   *t;
XCrapsBet_t      bet;
X{
X}
X
Xvoid            Craps_ReportReturn(t, bet)
XCrapsTable_t   *t;
XCrapsBet_t      bet;
X{
X    char            buf[100];
X
X    sprintf(buf, "Casino returns $%d %s bet",
X	    Craps_GetBet(t, bet), BetName[(int) bet]);
X    Message(buf);
X}
X
Xvoid            Craps_ReportCommission(t, amount)
XCrapsTable_t   *t;
Xint             amount;
X{
X    char            buf[100];
X
X    sprintf(buf, "Casino takes $%d commission", amount);
X    Message(buf);
X}
X
Xvoid            Craps_ReportMove(t, from, to)
XCrapsTable_t   *t;
XCrapsBet_t      from, to;
X{
X}
X
XUpdate(full)
Xint             full;
X{
X    char            buf[80];
X    int             num;
X
X    if (full) {
X	clear();
X	move(0, 0);
X	addstr("	     ----4----  ----5----  ----6----  ----8----  ----9----  ---10----");
X	move(1, 0);
X	addstr("DON'T PLACE");
X	move(2, 0);
X	addstr(" DON'T COME");
X	move(3, 0);
X	addstr("      PLACE");
X	move(4, 0);
X	addstr("       COME");
X	move(6, 0);
X	addstr("---Bankroll---  ---Point---    -----Pass Line-----  -----Come-----");
X	move(9, 0);
X	addstr("---Don't Pass---  ---Don't Come---    ---Field---    ---Big 6---  ---Big 8---");
X	move(12, 0);
X	addstr("---3-3---  ---4-4---    ---1-1---  ---6-6---    ---Any Seven---");
X	move(15, 0);
X	addstr("---2-2---  ---5-5---    ---1-2---  ---5-6---	---Any Craps---");
X	move(18, 0);
X	addstr("=============================================================================");
X	move(19, 0);
X	addstr("DICE");
X	move(21, 0);
X	addstr("=============================================================================");
X	refresh();
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontPlace4) != Craps_GetBet(&OldTable, craps_DontPlace4))) {
X	if (num = Craps_GetBet(&Table, craps_DontPlace4)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(dontplace4win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontplace4win);
X	}
X	wrefresh(dontplace4win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontPlace5) !=
X		 Craps_GetBet(&OldTable, craps_DontPlace5))) {
X	if (num = Craps_GetBet(&Table, craps_DontPlace5)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(dontplace5win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontplace5win);
X	}
X	wrefresh(dontplace5win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontPlace6) !=
X		 Craps_GetBet(&OldTable, craps_DontPlace6))) {
X	if (num = Craps_GetBet(&Table, craps_DontPlace6)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(dontplace6win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontplace6win);
X	}
X	wrefresh(dontplace6win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontPlace8) !=
X		 Craps_GetBet(&OldTable, craps_DontPlace8))) {
X	if (num = Craps_GetBet(&Table, craps_DontPlace8)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(dontplace8win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontplace8win);
X	}
X	wrefresh(dontplace8win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontPlace9) !=
X		 Craps_GetBet(&OldTable, craps_DontPlace9))) {
X	if (num = Craps_GetBet(&Table, craps_DontPlace9)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(dontplace9win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontplace9win);
X	}
X	wrefresh(dontplace9win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontPlace10) !=
X		 Craps_GetBet(&OldTable, craps_DontPlace10))) {
X	if (num = Craps_GetBet(&Table, craps_DontPlace10)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(dontplace10win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontplace10win);
X	}
X	wrefresh(dontplace10win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontCome4) !=
X		 Craps_GetBet(&OldTable, craps_DontCome4)) ||
X	(Craps_GetBet(&Table, craps_DontComeOdds4) !=
X	 Craps_GetBet(&OldTable, craps_DontComeOdds4))) {
X	if (num = Craps_GetBet(&Table, craps_DontCome4)) {
X	    if (Craps_GetBet(&Table, craps_DontComeOdds4))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_DontComeOdds4));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(dontcome4win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontcome4win);
X	}
X	wrefresh(dontcome4win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontCome5) !=
X		 Craps_GetBet(&OldTable, craps_DontCome5)) ||
X	(Craps_GetBet(&Table, craps_DontComeOdds5) !=
X	 Craps_GetBet(&OldTable, craps_DontComeOdds5))) {
X	if (num = Craps_GetBet(&Table, craps_DontCome5)) {
X	    if (Craps_GetBet(&Table, craps_DontComeOdds5))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_DontComeOdds5));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(dontcome5win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontcome5win);
X	}
X	wrefresh(dontcome5win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontCome6) !=
X		 Craps_GetBet(&OldTable, craps_DontCome6)) ||
X	(Craps_GetBet(&Table, craps_DontComeOdds6) !=
X	 Craps_GetBet(&OldTable, craps_DontComeOdds6))) {
X	if (num = Craps_GetBet(&Table, craps_DontCome6)) {
X	    if (Craps_GetBet(&Table, craps_DontComeOdds6))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_DontComeOdds6));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(dontcome6win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontcome6win);
X	}
X	wrefresh(dontcome6win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontCome8) !=
X		 Craps_GetBet(&OldTable, craps_DontCome8)) ||
X	(Craps_GetBet(&Table, craps_DontComeOdds8) !=
X	 Craps_GetBet(&OldTable, craps_DontComeOdds8))) {
X	if (num = Craps_GetBet(&Table, craps_DontCome8)) {
X	    if (Craps_GetBet(&Table, craps_DontComeOdds8))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_DontComeOdds8));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(dontcome8win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontcome8win);
X	}
X	wrefresh(dontcome8win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontCome9) !=
X		 Craps_GetBet(&OldTable, craps_DontCome9)) ||
X	(Craps_GetBet(&Table, craps_DontComeOdds9) !=
X	 Craps_GetBet(&OldTable, craps_DontComeOdds9))) {
X	if (num = Craps_GetBet(&Table, craps_DontCome9)) {
X	    if (Craps_GetBet(&Table, craps_DontComeOdds9))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_DontComeOdds9));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(dontcome9win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontcome9win);
X	}
X	wrefresh(dontcome9win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontCome10) !=
X		 Craps_GetBet(&OldTable, craps_DontCome10)) ||
X	(Craps_GetBet(&Table, craps_DontComeOdds10) !=
X	 Craps_GetBet(&OldTable, craps_DontComeOdds10))) {
X	if (num = Craps_GetBet(&Table, craps_DontCome10)) {
X	    if (Craps_GetBet(&Table, craps_DontComeOdds10))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_DontComeOdds10));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(dontcome10win, buf, 0, 1);
X	}
X	else {
X	    wclear(dontcome10win);
X	}
X	wrefresh(dontcome10win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Place4) !=
X		 Craps_GetBet(&OldTable, craps_Place4)) ||
X	(Craps_Bought4(&Table) != Craps_Bought4(&OldTable))) {
X	if (num = Craps_GetBet(&Table, craps_Place4)) {
X	    sprintf(buf, " %s%d ", Craps_Bought4(&Table) ? "buy " : "", num);
X	    wcenter(place4win, buf, 0, 1);
X	}
X	else {
X	    wclear(place4win);
X	}
X	wrefresh(place4win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Place5) !=
X		 Craps_GetBet(&OldTable, craps_Place5))) {
X	if (num = Craps_GetBet(&Table, craps_Place5)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(place5win, buf, 0, 1);
X	}
X	else {
X	    wclear(place5win);
X	}
X	wrefresh(place5win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Place6) !=
X		 Craps_GetBet(&OldTable, craps_Place6))) {
X	if (num = Craps_GetBet(&Table, craps_Place6)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(place6win, buf, 0, 1);
X	}
X	else {
X	    wclear(place6win);
X	}
X	wrefresh(place6win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Place8) !=
X		 Craps_GetBet(&OldTable, craps_Place8))) {
X	if (num = Craps_GetBet(&Table, craps_Place8)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(place8win, buf, 0, 1);
X	}
X	else {
X	    wclear(place8win);
X	}
X	wrefresh(place8win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Place9) !=
X		 Craps_GetBet(&OldTable, craps_Place9))) {
X	if (num = Craps_GetBet(&Table, craps_Place9)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(place9win, buf, 0, 1);
X	}
X	else {
X	    wclear(place9win);
X	}
X	wrefresh(place9win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Place10) !=
X		 Craps_GetBet(&OldTable, craps_Place10)) ||
X	(Craps_Bought10(&Table) != Craps_Bought10(&Table))) {
X	if (num = Craps_GetBet(&Table, craps_Place10)) {
X	    sprintf(buf, " %s%d ", Craps_Bought10(&Table) ? "buy " : "", num);
X	    wcenter(place10win, buf, 0, 1);
X	}
X	else {
X	    wclear(place10win);
X	}
X	wrefresh(place10win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Come4) !=
X		 Craps_GetBet(&OldTable, craps_Come4)) ||
X	(Craps_GetBet(&Table, craps_ComeOdds4) !=
X	 Craps_GetBet(&OldTable, craps_ComeOdds4)) ||
X	((Craps_Point(&Table) == 4) && (Craps_Point(&OldTable) !=
X					4)) ||
X	((Craps_Point(&Table) != 4) && (Craps_Point(&OldTable) == 4))) {
X	if (num = Craps_GetBet(&Table, craps_Come4)) {
X	    if (Craps_GetBet(&Table, craps_ComeOdds4))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_ComeOdds4));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(come4win, buf, 0, 1);
X	}
X	else {
X	    if (Craps_Point(&Table) == 4)
X		wcenter(come4win, "*****", 0, 1);
X	    else
X		wclear(come4win);
X	}
X	wrefresh(come4win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Come5) !=
X		 Craps_GetBet(&OldTable, craps_Come5)) ||
X	(Craps_GetBet(&Table, craps_ComeOdds5) !=
X	 Craps_GetBet(&OldTable, craps_ComeOdds5)) ||
X	((Craps_Point(&Table) == 5) && (Craps_Point(&OldTable) !=
X					5)) ||
X	((Craps_Point(&Table) != 5) && (Craps_Point(&OldTable) == 5))) {
X	if (num = Craps_GetBet(&Table, craps_Come5)) {
X	    if (Craps_GetBet(&Table, craps_ComeOdds5))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_ComeOdds5));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(come5win, buf, 0, 1);
X	}
X	else {
X	    if (Craps_Point(&Table) == 5)
X		wcenter(come5win, "*****", 0, 1);
X	    else
X		wclear(come5win);
X	}
X	wrefresh(come5win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Come6) !=
X		 Craps_GetBet(&OldTable, craps_Come6)) ||
X	(Craps_GetBet(&Table, craps_ComeOdds6) !=
X	 Craps_GetBet(&OldTable, craps_ComeOdds6)) ||
X	((Craps_Point(&Table) == 6) && (Craps_Point(&OldTable) != 6)) ||
X	((Craps_Point(&Table) != 6) && (Craps_Point(&OldTable) == 6))) {
X	if (num = Craps_GetBet(&Table, craps_Come6)) {
X	    if (Craps_GetBet(&Table, craps_ComeOdds6))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_ComeOdds6));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(come6win, buf, 0, 1);
X	}
X	else {
X	    if (Craps_Point(&Table) == 6)
X		wcenter(come6win, "*****", 0, 1);
X	    else
X		wclear(come6win);
X	}
X	wrefresh(come6win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Come8) !=
X		 Craps_GetBet(&OldTable, craps_Come8)) ||
X	(Craps_GetBet(&Table, craps_ComeOdds8) !=
X	 Craps_GetBet(&OldTable, craps_ComeOdds8)) ||
X	((Craps_Point(&Table) == 8) && (Craps_Point(&OldTable) !=
X					8)) ||
X	((Craps_Point(&Table) != 8) && (Craps_Point(&OldTable) == 8))) {
X	if (num = Craps_GetBet(&Table, craps_Come8)) {
X	    if (Craps_GetBet(&Table, craps_ComeOdds8))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_ComeOdds8));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(come8win, buf, 0, 1);
X	}
X	else {
X	    if (Craps_Point(&Table) == 8)
X		wcenter(come8win, "*****", 0, 1);
X	    else
X		wclear(come8win);
X	}
X	wrefresh(come8win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Come9) !=
X		 Craps_GetBet(&OldTable, craps_Come9)) ||
X	(Craps_GetBet(&Table, craps_ComeOdds9) !=
X	 Craps_GetBet(&OldTable, craps_ComeOdds9)) ||
X	((Craps_Point(&Table) == 9) && (Craps_Point(&OldTable) != 9)) ||
X	((Craps_Point(&Table) != 9) && (Craps_Point(&OldTable) == 9))) {
X	if (num = Craps_GetBet(&Table, craps_Come9)) {
X	    if (Craps_GetBet(&Table, craps_ComeOdds9))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_ComeOdds9));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(come9win, buf, 0, 1);
X	}
X	else {
X	    if (Craps_Point(&Table) == 9)
X		wcenter(come9win, "*****", 0, 1);
X	    else
X		wclear(come9win);
X	}
X	wrefresh(come9win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Come10) !=
X		 Craps_GetBet(&OldTable, craps_Come10)) ||
X	(Craps_GetBet(&Table, craps_ComeOdds10) !=
X	 Craps_GetBet(&OldTable, craps_ComeOdds10)) ||
X	((Craps_Point(&Table) == 10) && (Craps_Point(&OldTable) != 10)) ||
X	((Craps_Point(&Table) != 10) && (Craps_Point(&OldTable) == 10))) {
X	if (num = Craps_GetBet(&Table, craps_Come10)) {
X	    if (Craps_GetBet(&Table, craps_ComeOdds10))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_ComeOdds10));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(come10win, buf, 0, 1);
X	}
X	else {
X	    if (Craps_Point(&Table) == 10)
X		wcenter(come10win, "*****", 0, 1);
X	    else
X		wclear(come10win);
X	}
X	wrefresh(come10win);
X    }
X    if (full || (Craps_Bankroll(&Table) != Craps_Bankroll(&OldTable))) {
X	sprintf(buf, "%d", Craps_Bankroll(&Table));
X	wcenter(bankrollwin, buf, 0, 0);
X	wrefresh(bankrollwin);
X    }
X    if (full || (Craps_Point(&Table) != Craps_Point(&OldTable))) {
X	if (num = Craps_Point(&Table)) {
X	    sprintf(buf, " %d ", num);
X	}
X	else {
X	    strcpy(buf, " COME  OUT ");
X	}
X	wcenter(pointwin, buf, 0, 1);
X	wrefresh(pointwin);
X    }
X    if (full || (Craps_GetBet(&Table, craps_PassLine) !=
X		 Craps_GetBet(&OldTable, craps_PassLine)) ||
X	(Craps_GetBet(&Table, craps_PassLineOdds) !=
X	 Craps_GetBet(&OldTable, craps_PassLineOdds))) {
X	if (num = Craps_GetBet(&Table, craps_PassLine)) {
X	    if (Craps_GetBet(&Table, craps_PassLineOdds))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_PassLineOdds));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(passlinewin, buf, 0, 1);
X	}
X	else {
X	    wclear(passlinewin);
X	}
X	wrefresh(passlinewin);
X    }
X    if (full || (Craps_GetBet(&Table, craps_ComeBox) !=
X		 Craps_GetBet(&OldTable, craps_ComeBox))) {
X	if (num = Craps_GetBet(&Table, craps_ComeBox)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(comewin, buf, 0, 1);
X	}
X	else {
X	    wclear(comewin);
X	}
X	wrefresh(comewin);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontPass) !=
X		 Craps_GetBet(&OldTable, craps_DontPass)) ||
X	(Craps_GetBet(&Table, craps_DontPassOdds) !=
X	 Craps_GetBet(&OldTable, craps_DontPassOdds))) {
X	if (num = Craps_GetBet(&Table, craps_DontPass)) {
X	    if (Craps_GetBet(&Table, craps_DontPassOdds))
X		sprintf(buf, " %d/%d ", num,
X			Craps_GetBet(&Table, craps_DontPassOdds));
X	    else
X		sprintf(buf, " %d ", num);
X	    wcenter(dontpasswin, buf, 0, 1);
X	}
X	else {
X	    wclear(dontpasswin);
X	}
X	wrefresh(dontpasswin);
X    }
X    if (full || (Craps_GetBet(&Table, craps_DontComeBox) !=
X		 Craps_GetBet(&OldTable, craps_DontComeBox))) {
X	if (num = Craps_GetBet(&Table, craps_DontComeBox)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(dontcomewin, buf, 0, 1);
X	}
X	else {
X	    wclear(dontcomewin);
X	}
X	wrefresh(dontcomewin);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Field) !=
X		 Craps_GetBet(&OldTable, craps_Field))) {
X	if (num = Craps_GetBet(&Table, craps_Field)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(fieldwin, buf, 0, 1);
X	}
X	else {
X	    wclear(fieldwin);
X	}
X	wrefresh(fieldwin);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Big6) !=
X		 Craps_GetBet(&OldTable, craps_Big6))) {
X	if (num = Craps_GetBet(&Table, craps_Big6)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(big6win, buf, 0, 1);
X	}
X	else {
X	    wclear(big6win);
X	}
X	wrefresh(big6win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Big8) !=
X		 Craps_GetBet(&OldTable, craps_Big8))) {
X	if (num = Craps_GetBet(&Table, craps_Big8)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(big8win, buf, 0, 1);
X	}
X	else {
X	    wclear(big8win);
X	}
X	wrefresh(big8win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Hard4) !=
X		 Craps_GetBet(&OldTable, craps_Hard4))) {
X	if (num = Craps_GetBet(&Table, craps_Hard4)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(hard4win, buf, 0, 1);
X	}
X	else {
X	    wclear(hard4win);
X	}
X	wrefresh(hard4win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Hard6) !=
X		 Craps_GetBet(&OldTable, craps_Hard6))) {
X	if (num = Craps_GetBet(&Table, craps_Hard6)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(hard6win, buf, 0, 1);
X	}
X	else {
X	    wclear(hard6win);
X	}
X	wrefresh(hard6win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Hard8) !=
X		 Craps_GetBet(&OldTable, craps_Hard8))) {
X	if (num = Craps_GetBet(&Table, craps_Hard8)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(hard8win, buf, 0, 1);
X	}
X	else {
X	    wclear(hard8win);
X	}
X	wrefresh(hard8win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Hard10) !=
X		 Craps_GetBet(&OldTable, craps_Hard10))) {
X	if (num = Craps_GetBet(&Table, craps_Hard10)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(hard10win, buf, 0, 1);
X	}
X	else {
X	    wclear(hard10win);
X	}
X	wrefresh(hard10win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_OneRoll2) !=
X		 Craps_GetBet(&OldTable, craps_OneRoll2))) {
X	if (num = Craps_GetBet(&Table, craps_OneRoll2)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(oneroll2win, buf, 0, 1);
X	}
X	else {
X	    wclear(oneroll2win);
X	}
X	wrefresh(oneroll2win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_OneRoll3) !=
X		 Craps_GetBet(&OldTable, craps_OneRoll3))) {
X	if (num = Craps_GetBet(&Table, craps_OneRoll3)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(oneroll3win, buf, 0, 1);
X	}
X	else {
X	    wclear(oneroll3win);
X	}
X	wrefresh(oneroll3win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_OneRoll11) !=
X		 Craps_GetBet(&OldTable, craps_OneRoll11))) {
X	if (num = Craps_GetBet(&Table, craps_OneRoll11)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(oneroll11win, buf, 0, 1);
X	}
X	else {
X	    wclear(oneroll11win);
X	}
X	wrefresh(oneroll11win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_OneRoll12) !=
X		 Craps_GetBet(&OldTable, craps_OneRoll12))) {
X	if (num = Craps_GetBet(&Table, craps_OneRoll12)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(oneroll12win, buf, 0, 1);
X	}
X	else {
X	    wclear(oneroll12win);
X	}
X	wrefresh(oneroll12win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_Any7) !=
X		 Craps_GetBet(&OldTable, craps_Any7))) {
X	if (num = Craps_GetBet(&Table, craps_Any7)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(any7win, buf, 0, 1);
X	}
X	else {
X	    wclear(any7win);
X	}
X	wrefresh(any7win);
X    }
X    if (full || (Craps_GetBet(&Table, craps_AnyCraps) !=
X		 Craps_GetBet(&OldTable, craps_AnyCraps))) {
X	if (num = Craps_GetBet(&Table, craps_AnyCraps)) {
X	    sprintf(buf, " %d ", num);
X	    wcenter(anycrapswin, buf, 0, 1);
X	}
X	else {
X	    wclear(anycrapswin);
X	}
X	wrefresh(anycrapswin);
X    }
X    if (full || (Craps_Die1(&Table) !=
X		 Craps_Die1(&OldTable)) ||
X	(Craps_Die2(&Table) != Craps_Die2(&OldTable))) {
X	sprintf(buf, "%d  %d", Craps_Die1(&Table), Craps_Die2(&Table));
X	wcenter(dicewin, buf, 0, 1);
X	wrefresh(dicewin);
X    }
X}
X
XError(err)
XCrapsError_t    err;
X{
X    char            buf[100];
X
X    switch (err) {
X	case crapserr_NoReturn:
X	    Message("Cannot take down bet");
X	    break;
X	case crapserr_AlreadyBought:
X	    Message("Already bought");
X	    break;
X	case crapserr_Nonpositive:
X	    Message("Bet must be positive");
X	    break;
X	case crapserr_NoBet:
X	    Message("No bet to take odds on");
X	    break;
X	case crapserr_InsufficientFunds:
X	    Message("Insufficient funds");
X	    break;
X	case crapserr_NotComeOut:
X	    Message("Not come-out roll");
X	    break;
X	case crapserr_ComeOut:
X	    Message("Come-out roll");
X	    break;
X	case crapserr_TooMuch:
X	    sprintf(buf, "Maximum is $%d", CrapsErrorDatum);
X	    Message(buf);
X	    break;
X	case crapserr_NotDivisible:
X	    sprintf(buf, "Bet must be divisible by %d", CrapsErrorDatum);
X	    Message(buf);
X	    break;
X    }
X}
X
Xint             ReadNumber()
X{
X    int             c, len = 0;
X    char            buf[100], *bufptr = buf;
X
X    buf[0] = '\0';
X    wclear(commandwin);
X    wrefresh(commandwin);
X    while (1) {
X	c = Getch("0123456789\n\r\b", 0);
X	switch (c) {
X	    case '\n':
X	    case '\r':
X		if (len)
X		    return (atoi(buf));
X		break;
X	    case '\b':
X	    case 127:
X		if (len > 0) {
X		    *(--bufptr) = '\0';
X		    --len;
X		}
X		break;
X	    default:
X		*(bufptr++) = c;
X		*bufptr = '\0';
X		++len;
X		break;
X	}
X	wclear(commandwin);
X	waddstr(commandwin, buf);
X	wrefresh(commandwin);
X    }
X}
X
XHelp()
X{
X    clear();
X    addstr("p   - pass-line (or odds)     dp  - don't pass (or odds)\n");
X    addstr("c   - come bet                dc  - don't come\n");
X    addstr("b6  - big 6                   b8  - big 8\n");
X    addstr("h22 - hard 4                  h33 - hard 6\n");
X    addstr("h44 - hard 8                  h55 - hard 10\n");
X    addstr("2   - one-roll bet on 2       3   - one-roll bet on 3\n");
X    addstr("11  - one-roll bet on 11      12  - one-roll bet on 12\n");
X    addstr("a7  - any 7                   ac  - any craps\n");
X    addstr("b4  - buy the 4               b10 - buy the 10\n");
X    addstr("f   - field                   r   - ROLL DICE\n\n");
X    addstr("Come-odds, place bets, don't-come odds, and don't place bets\n");
X    addstr("are made by typing the desired number, then c, p, dc, or dp.\n");
X    addstr("For example:\n\n");
X    addstr("4c  - come-odds on 4          4p  - place 4\n");
X    addstr("4dc - don't-come odds on 4    4dp - don't place 4\n\n");
X    addstr("Bets are taken down by typing t followed by one of the\n");
X    addstr("bet commands above.\n\n");
X    addstr("$ - show total bets   m - review messages   X - exit\n");
X    addstr("                                                        continue...");
X    refresh();
X    getch();
X    longjmp(LoopEnv, 2);
X}
X
XShowTotal()
X{
X    int             i, total = 0, returnable = 0;
X    char            buf[80];
X
X    for (i = 0; i < (int) craps_Bets; ++i) {
X	total += Craps_GetBet(&Table, i);
X	switch (i) {
X	    case craps_PassLine:
X	    case craps_DontPass:
X		if (Craps_Point(&Table) == 0)
X		    returnable += Craps_GetBet(&Table, i);
X		break;
X	    case craps_Come4:
X	    case craps_Come5:
X	    case craps_Come6:
X	    case craps_Come8:
X	    case craps_Come9:
X	    case craps_Come10:
X	    case craps_DontCome4:
X	    case craps_DontCome5:
X	    case craps_DontCome6:
X	    case craps_DontCome8:
X	    case craps_DontCome9:
X	    case craps_DontCome10:
X		break;
X	    default:
X		returnable += Craps_GetBet(&Table, i);
X		break;
X	}
X    }
X    sprintf(buf, "Wagers on table total $%d ($%d returnable)",
X	    total, returnable);
X    Message(buf);
X}
END_OF_FILE
if test 46362 -ne `wc -c <'vcraps.c'`; then
    echo shar: \"'vcraps.c'\" unpacked with wrong size!
fi
# end of 'vcraps.c'
fi
echo shar: End of archive 1 \(of 2\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked both archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0