[comp.sources.games] v11i049: 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 49
Archive-name: vcraps2/Part02
Supersedes: vcraps: Volume 11, Issue 34-35


#! /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 2 (of 2)."
# Contents:  crapslib.c crapslib.h
# Wrapped by billr@saab on Fri Sep 14 14:36:34 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'crapslib.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'crapslib.c'\"
else
echo shar: Extracting \"'crapslib.c'\" \(29974 characters\)
sed "s/^X//" >'crapslib.c' <<'END_OF_FILE'
X#include <crapslib.h>
X
X#define ComeOutP(t) (((t)->point)==0)
X
Xint             CrapsErrorDatum;
X
Xextern void     Craps_ReportPayoff();
Xextern void     Craps_ReportReturn();
Xextern void     Craps_ReportCollect();
Xextern void     Craps_ReportCommission();
Xextern void     Craps_ReportMove();
X
Xvoid            Craps_GetPayoff(t, which, buf)
XCrapsTable_t   *t;
XCrapsBet_t      which;
XCrapsPayoff_t  *buf;
X{
X    int             a = 1, b = 1;      /* Default payoff */
X
X    switch (which) {
X	case craps_PassLineOdds:
X	    switch (t->point) {
X		case 4:
X		case 10:
X		    a = 2;
X		    break;
X		case 5:
X		case 9:
X		    a = 3;
X		    b = 2;
X		    break;
X		case 6:
X		case 8:
X		    a = 6;
X		    b = 5;
X		    break;
X	    }
X	    break;
X	case craps_ComeOdds4:
X	case craps_ComeOdds10:
X	    a = 2;
X	    break;
X	case craps_ComeOdds5:
X	case craps_ComeOdds9:
X	    a = 3;
X	    b = 2;
X	    break;
X	case craps_ComeOdds6:
X	case craps_ComeOdds8:
X	    a = 6;
X	    b = 5;
X	    break;
X	case craps_DontPassOdds:
X	    switch (t->point) {
X		case 4:
X		case 10:
X		    b = 2;
X		    break;
X		case 5:
X		case 9:
X		    a = 2;
X		    b = 3;
X		    break;
X		case 6:
X		case 8:
X		    a = 5;
X		    b = 6;
X		    break;
X	    }
X	    break;
X	case craps_DontComeOdds4:
X	case craps_DontComeOdds10:
X	    b = 2;
X	    break;
X	case craps_DontComeOdds5:
X	case craps_DontComeOdds9:
X	    a = 2;
X	    b = 3;
X	    break;
X	case craps_DontComeOdds6:
X	case craps_DontComeOdds8:
X	    a = 5;
X	    b = 6;
X	    break;
X	case craps_Place4:
X	    if (t->bought4)
X		a = 2;
X	    else {
X		a = 9;
X		b = 5;
X	    }
X	    break;
X	case craps_Place5:
X	case craps_Place9:
X	    a = 7;
X	    b = 5;
X	    break;
X	case craps_Place6:
X	case craps_Place8:
X	    a = 7;
X	    b = 6;
X	    break;
X	case craps_Place10:
X	    if (t->bought10)
X		a = 2;
X	    else {
X		a = 9;
X		b = 5;
X	    }
X	    break;
X	case craps_DontPlace4:
X	case craps_DontPlace10:
X	    b = 2;
X	    break;
X	case craps_DontPlace5:
X	case craps_DontPlace9:
X	    a = 2;
X	    b = 3;
X	    break;
X	case craps_DontPlace6:
X	case craps_DontPlace8:
X	    a = 5;
X	    b = 6;
X	    break;
X	case craps_Field:
X	    switch (t->die1 + t->die2) {
X		case 2:
X		    a = t->field2payoff.numerator;
X		    b = t->field2payoff.denominator;
X		    break;
X		case 12:
X		    a = t->field12payoff.numerator;
X		    b = t->field12payoff.denominator;
X		    break;
X	    }
X	    break;
X	case craps_Big6:
X	    a = t->big6payoff.numerator;
X	    b = t->big6payoff.denominator;
X	    break;
X	case craps_Big8:
X	    a = t->big8payoff.numerator;
X	    b = t->big8payoff.denominator;
X	    break;
X	case craps_Hard4:
X	case craps_Hard10:
X	    a = 7;
X	    break;
X	case craps_Hard6:
X	case craps_Hard8:
X	    a = 9;
X	    break;
X	case craps_Any7:
X	    a = 4;
X	    break;
X	case craps_AnyCraps:
X	    a = 7;
X	    break;
X	case craps_OneRoll2:
X	    a = t->oneroll2payoff.numerator;
X	    b = t->oneroll2payoff.denominator;
X	    break;
X	case craps_OneRoll3:
X	    a = t->oneroll3payoff.numerator;
X	    b = t->oneroll3payoff.denominator;
X	    break;
X	case craps_OneRoll11:
X	    a = t->oneroll11payoff.numerator;
X	    b = t->oneroll11payoff.denominator;
X	    break;
X	case craps_OneRoll12:
X	    a = t->oneroll12payoff.numerator;
X	    b = t->oneroll12payoff.denominator;
X	    break;
X    }
X    buf->numerator = a;
X    buf->denominator = b;
X}
X
Xstatic void     Payoff(t, which)
XCrapsTable_t   *t;
XCrapsBet_t      which;
X{
X    if (t->bets[(int) which]) {
X	CrapsPayoff_t   payoff;
X	int             win;
X
X	Craps_GetPayoff(t, which, &payoff);
X	win = (t->bets[(int) which] / payoff.denominator) * payoff.numerator;
X	Craps_ReportPayoff(t, which, &payoff, win);
X	t->bankroll += (t->bets[(int) which] + win);
X	t->bets[(int) which] = 0;
X    }
X}
X
Xstatic void     Return(t, which)
XCrapsTable_t   *t;
XCrapsBet_t      which;
X{
X    if (t->bets[(int) which]) {
X	Craps_ReportReturn(t, which);
X	t->bankroll += t->bets[(int) which];
X	t->bets[(int) which] = 0;
X    }
X}
X
Xstatic void     Collect(t, which)
XCrapsTable_t   *t;
XCrapsBet_t      which;
X{
X    if (t->bets[(int) which]) {
X	Craps_ReportCollect(t, which);
X	t->bets[(int) which] = 0;
X    }
X}
X
Xvoid            Craps_Init(t)
XCrapsTable_t   *t;
X{
X    int             i;
X
X    t->bankroll = 0;
X    t->point = 0;
X    t->die1 = 5;
X    t->die2 = 6;
X    t->bought4 = t->bought10 = 0;
X    t->doublep = 1;
X    t->field2payoff.numerator = 2;
X    t->field2payoff.denominator = 1;
X    t->field12payoff.numerator = 2;
X    t->field12payoff.denominator = 1;
X    t->big6payoff.numerator = t->big6payoff.denominator = 1;
X    t->big8payoff.numerator = t->big8payoff.denominator = 1;
X    t->oneroll2payoff.numerator = 29;
X    t->oneroll2payoff.denominator = 1;
X    t->oneroll3payoff.numerator = 14;
X    t->oneroll3payoff.denominator = 1;
X    t->oneroll11payoff.numerator = 14;
X    t->oneroll11payoff.denominator = 1;
X    t->oneroll12payoff.numerator = 29;
X    t->oneroll12payoff.denominator = 1;
X    for (i = 0; i < (int) craps_Bets; ++i)
X	t->bets[i] = 0;
X}
X
Xstatic void     Decr(t, which, amt)
XCrapsTable_t   *t;
XCrapsBet_t      which;
Xint             amt;
X{
X    t->bets[(int) which] += amt;
X    t->bankroll -= amt;
X}
X
Xvoid            Craps_Update(t, die1, die2)
XCrapsTable_t   *t;
Xint             die1, die2;
X{
X    t->die1 = die1;
X    t->die2 = die2;
X    switch (die1 + die2) {
X	case 2:
X	    if (ComeOutP(t))
X		Collect(t, craps_PassLine);
X	    Collect(t, craps_ComeBox);
X	    if (ComeOutP(t))
X		Payoff(t, craps_DontPass);
X	    Payoff(t, craps_DontComeBox);
X	    Payoff(t, craps_Field);
X	    Collect(t, craps_Any7);
X	    Payoff(t, craps_AnyCraps);
X	    Payoff(t, craps_OneRoll2);
X	    Collect(t, craps_OneRoll3);
X	    Collect(t, craps_OneRoll11);
X	    Collect(t, craps_OneRoll12);
X	    break;
X	case 3:
X	    if (ComeOutP(t))
X		Collect(t, craps_PassLine);
X	    Collect(t, craps_ComeBox);
X	    if (ComeOutP(t))
X		Payoff(t, craps_DontPass);
X	    Payoff(t, craps_DontComeBox);
X	    Payoff(t, craps_Field);
X	    Collect(t, craps_Any7);
X	    Payoff(t, craps_AnyCraps);
X	    Collect(t, craps_OneRoll2);
X	    Payoff(t, craps_OneRoll3);
X	    Collect(t, craps_OneRoll11);
X	    Collect(t, craps_OneRoll12);
X	    break;
X	case 4:
X	    if (t->point == 4) {
X		Payoff(t, craps_PassLine);
X		Payoff(t, craps_PassLineOdds);
X	    }
X	    Payoff(t, craps_Come4);
X	    if (ComeOutP(t))
X		Return(t, craps_ComeOdds4);
X	    else
X		Payoff(t, craps_ComeOdds4);
X	    if (t->point == 4) {
X		Collect(t, craps_DontPass);
X		Collect(t, craps_DontPassOdds);
X	    }
X	    Collect(t, craps_DontCome4);
X	    Collect(t, craps_DontComeOdds4);
X	    if (t->point) {
X		Payoff(t, craps_Place4);
X		t->bought4 = 0;
X	    }
X	    Collect(t, craps_DontPlace4);
X	    Payoff(t, craps_Field);
X	    if (die1 == die2)
X		Payoff(t, craps_Hard4);
X	    else
X		Collect(t, craps_Hard4);
X	    Collect(t, craps_Any7);
X	    Collect(t, craps_AnyCraps);
X	    Collect(t, craps_OneRoll2);
X	    Collect(t, craps_OneRoll3);
X	    Collect(t, craps_OneRoll11);
X	    Collect(t, craps_OneRoll12);
X	    if (t->bets[(int) craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come4);
X		t->bets[(int) craps_Come4] = t->bets[(int) craps_ComeBox];
X		t->bets[(int) craps_ComeBox] = 0;
X	    }
X	    if (t->bets[(int) craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome4);
X		t->bets[(int) craps_DontCome4] = t->bets[(int) craps_DontComeBox];
X		t->bets[(int) craps_DontComeBox] = 0;
X	    }
X	    if (ComeOutP(t))
X		t->point = 4;
X	    else
X		if (t->point == 4)
X		    t->point = 0;
X	    break;
X	case 5:
X	    if (t->point == 5) {
X		Payoff(t, craps_PassLine);
X		Payoff(t, craps_PassLineOdds);
X	    }
X	    Payoff(t, craps_Come5);
X	    if (ComeOutP(t))
X		Return(t, craps_ComeOdds5);
X	    else
X		Payoff(t, craps_ComeOdds5);
X	    if (t->point == 5) {
X		Collect(t, craps_DontPass);
X		Collect(t, craps_DontPassOdds);
X	    }
X	    Collect(t, craps_DontCome5);
X	    Collect(t, craps_DontComeOdds5);
X	    if (t->point)
X		Payoff(t, craps_Place5);
X	    Collect(t, craps_DontPlace5);
X	    Collect(t, craps_Field);
X	    Collect(t, craps_Any7);
X	    Collect(t, craps_AnyCraps);
X	    Collect(t, craps_OneRoll2);
X	    Collect(t, craps_OneRoll3);
X	    Collect(t, craps_OneRoll11);
X	    Collect(t, craps_OneRoll12);
X	    if (t->bets[(int) craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come5);
X		t->bets[(int) craps_Come5] = t->bets[(int) craps_ComeBox];
X		t->bets[(int) craps_ComeBox] = 0;
X	    }
X	    if (t->bets[(int) craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome5);
X		t->bets[(int) craps_DontCome5] = t->bets[(int) craps_DontComeBox];
X		t->bets[(int) craps_DontComeBox] = 0;
X	    }
X	    if (ComeOutP(t))
X		t->point = 5;
X	    else
X		if (t->point == 5)
X		    t->point = 0;
X	    break;
X	case 6:
X	    if (t->point == 6) {
X		Payoff(t, craps_PassLine);
X		Payoff(t, craps_PassLineOdds);
X	    }
X	    Payoff(t, craps_Come6);
X	    if (ComeOutP(t))
X		Return(t, craps_ComeOdds6);
X	    else
X		Payoff(t, craps_ComeOdds6);
X	    if (t->point == 6) {
X		Collect(t, craps_DontPass);
X		Collect(t, craps_DontPassOdds);
X	    }
X	    Collect(t, craps_DontCome6);
X	    Collect(t, craps_DontComeOdds6);
X	    if (t->point)
X		Payoff(t, craps_Place6);
X	    Collect(t, craps_DontPlace6);
X	    Collect(t, craps_Field);
X	    Payoff(t, craps_Big6);
X	    if (die1 == die2)
X		Payoff(t, craps_Hard6);
X	    else
X		Collect(t, craps_Hard6);
X	    Collect(t, craps_Any7);
X	    Collect(t, craps_AnyCraps);
X	    Collect(t, craps_OneRoll2);
X	    Collect(t, craps_OneRoll3);
X	    Collect(t, craps_OneRoll11);
X	    Collect(t, craps_OneRoll12);
X	    if (t->bets[(int) craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come6);
X		t->bets[(int) craps_Come6] = t->bets[(int) craps_ComeBox];
X		t->bets[(int) craps_ComeBox] = 0;
X	    }
X	    if (t->bets[(int) craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome6);
X		t->bets[(int) craps_DontCome6] = t->bets[(int) craps_DontComeBox];
X		t->bets[(int) craps_DontComeBox] = 0;
X	    }
X	    if (ComeOutP(t))
X		t->point = 6;
X	    else
X		if (t->point == 6)
X		    t->point = 0;
X	    break;
X	case 7:
X	    if (ComeOutP(t))
X		Payoff(t, craps_PassLine);
X	    else {
X		Collect(t, craps_PassLine);
X		Collect(t, craps_PassLineOdds);
X	    }
X	    Payoff(t, craps_ComeBox);
X	    Collect(t, craps_Come4);
X	    Collect(t, craps_Come5);
X	    Collect(t, craps_Come6);
X	    Collect(t, craps_Come8);
X	    Collect(t, craps_Come9);
X	    Collect(t, craps_Come10);
X	    if (ComeOutP(t)) {
X		Return(t, craps_ComeOdds4);
X		Return(t, craps_ComeOdds5);
X		Return(t, craps_ComeOdds6);
X		Return(t, craps_ComeOdds8);
X		Return(t, craps_ComeOdds9);
X		Return(t, craps_ComeOdds10);
X		Collect(t, craps_DontPass);
X	    }
X	    else {
X		Collect(t, craps_ComeOdds4);
X		Collect(t, craps_ComeOdds5);
X		Collect(t, craps_ComeOdds6);
X		Collect(t, craps_ComeOdds8);
X		Collect(t, craps_ComeOdds9);
X		Collect(t, craps_ComeOdds10);
X		Payoff(t, craps_DontPass);
X	    }
X	    Payoff(t, craps_DontPassOdds);
X	    Collect(t, craps_DontComeBox);
X	    Payoff(t, craps_DontCome4);
X	    Payoff(t, craps_DontComeOdds4);
X	    Payoff(t, craps_DontCome5);
X	    Payoff(t, craps_DontComeOdds5);
X	    Payoff(t, craps_DontCome6);
X	    Payoff(t, craps_DontComeOdds6);
X	    Payoff(t, craps_DontCome8);
X	    Payoff(t, craps_DontComeOdds8);
X	    Payoff(t, craps_DontCome9);
X	    Payoff(t, craps_DontComeOdds9);
X	    Payoff(t, craps_DontCome10);
X	    Payoff(t, craps_DontComeOdds10);
X	    if (t->point) {
X		Collect(t, craps_Place4);
X		Collect(t, craps_Place5);
X		Collect(t, craps_Place6);
X		Collect(t, craps_Place8);
X		Collect(t, craps_Place9);
X		Collect(t, craps_Place10);
X		t->bought4 = t->bought10 = 0;
X	    }
X	    Payoff(t, craps_DontPlace4);
X	    Payoff(t, craps_DontPlace5);
X	    Payoff(t, craps_DontPlace6);
X	    Payoff(t, craps_DontPlace8);
X	    Payoff(t, craps_DontPlace9);
X	    Payoff(t, craps_DontPlace10);
X	    Collect(t, craps_Field);
X	    Collect(t, craps_Big6);
X	    Collect(t, craps_Big8);
X	    Collect(t, craps_Hard4);
X	    Collect(t, craps_Hard6);
X	    Collect(t, craps_Hard8);
X	    Collect(t, craps_Hard10);
X	    Payoff(t, craps_Any7);
X	    Collect(t, craps_AnyCraps);
X	    Collect(t, craps_OneRoll2);
X	    Collect(t, craps_OneRoll3);
X	    Collect(t, craps_OneRoll11);
X	    Collect(t, craps_OneRoll12);
X	    if (t->point)
X		t->point = 0;
X	    break;
X	case 8:
X	    if (t->point == 8) {
X		Payoff(t, craps_PassLine);
X		Payoff(t, craps_PassLineOdds);
X	    }
X	    Payoff(t, craps_Come8);
X	    if (ComeOutP(t))
X		Return(t, craps_ComeOdds8);
X	    else
X		Payoff(t, craps_ComeOdds8);
X	    if (t->point == 8) {
X		Collect(t, craps_DontPass);
X		Collect(t, craps_DontPassOdds);
X	    }
X	    Collect(t, craps_DontCome8);
X	    Collect(t, craps_DontComeOdds8);
X	    if (t->point)
X		Payoff(t, craps_Place8);
X	    Collect(t, craps_DontPlace8);
X	    Collect(t, craps_Field);
X	    Payoff(t, craps_Big8);
X	    if (die1 == die2)
X		Payoff(t, craps_Hard8);
X	    else
X		Collect(t, craps_Hard8);
X	    Collect(t, craps_Any7);
X	    Collect(t, craps_AnyCraps);
X	    Collect(t, craps_OneRoll2);
X	    Collect(t, craps_OneRoll3);
X	    Collect(t, craps_OneRoll11);
X	    Collect(t, craps_OneRoll12);
X	    if (t->bets[(int) craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come8);
X		t->bets[(int) craps_Come8] = t->bets[(int) craps_ComeBox];
X		t->bets[(int) craps_ComeBox] = 0;
X	    }
X	    if (t->bets[(int) craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome8);
X		t->bets[(int) craps_DontCome8] = t->bets[(int) craps_DontComeBox];
X		t->bets[(int) craps_DontComeBox] = 0;
X	    }
X	    if (ComeOutP(t))
X		t->point = 8;
X	    else
X		if (t->point == 8)
X		    t->point = 0;
X	    break;
X	case 9:
X	    if (t->point == 9) {
X		Payoff(t, craps_PassLine);
X		Payoff(t, craps_PassLineOdds);
X	    }
X	    Payoff(t, craps_Come9);
X	    if (ComeOutP(t))
X		Return(t, craps_ComeOdds9);
X	    else
X		Payoff(t, craps_ComeOdds9);
X	    if (t->point == 9) {
X		Collect(t, craps_DontPass);
X		Collect(t, craps_DontPassOdds);
X	    }
X	    Collect(t, craps_DontCome9);
X	    Collect(t, craps_DontComeOdds9);
X	    if (t->point)
X		Payoff(t, craps_Place9);
X	    Collect(t, craps_DontPlace9);
X	    Payoff(t, craps_Field);
X	    Collect(t, craps_Any7);
X	    Collect(t, craps_AnyCraps);
X	    Collect(t, craps_OneRoll2);
X	    Collect(t, craps_OneRoll3);
X	    Collect(t, craps_OneRoll11);
X	    Collect(t, craps_OneRoll12);
X	    if (t->bets[(int) craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come9);
X		t->bets[(int) craps_Come9] = t->bets[(int) craps_ComeBox];
X		t->bets[(int) craps_ComeBox] = 0;
X	    }
X	    if (t->bets[(int) craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome9);
X		t->bets[(int) craps_DontCome9] = t->bets[(int) craps_DontComeBox];
X		t->bets[(int) craps_DontComeBox] = 0;
X	    }
X	    if (ComeOutP(t))
X		t->point = 9;
X	    else
X		if (t->point == 9)
X		    t->point = 0;
X	    break;
X	case 10:
X	    if (t->point == 10) {
X		Payoff(t, craps_PassLine);
X		Payoff(t, craps_PassLineOdds);
X	    }
X	    Payoff(t, craps_Come10);
X	    if (ComeOutP(t))
X		Return(t, craps_ComeOdds10);
X	    else
X		Payoff(t, craps_ComeOdds10);
X	    if (t->point == 10) {
X		Collect(t, craps_DontPass);
X		Collect(t, craps_DontPassOdds);
X	    }
X	    Collect(t, craps_DontCome10);
X	    Collect(t, craps_DontComeOdds10);
X	    if (t->point) {
X		Payoff(t, craps_Place10);
X		t->bought10 = 0;
X	    }
X	    Collect(t, craps_DontPlace10);
X	    Payoff(t, craps_Field);
X	    if (die1 == die2)
X		Payoff(t, craps_Hard10);
X	    else
X		Collect(t, craps_Hard10);
X	    Collect(t, craps_Any7);
X	    Collect(t, craps_AnyCraps);
X	    Collect(t, craps_OneRoll2);
X	    Collect(t, craps_OneRoll3);
X	    Collect(t, craps_OneRoll11);
X	    Collect(t, craps_OneRoll12);
X	    if (t->bets[(int) craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come10);
X		t->bets[(int) craps_Come10] = t->bets[(int) craps_ComeBox];
X		t->bets[(int) craps_ComeBox] = 0;
X	    }
X	    if (t->bets[(int) craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome10);
X		t->bets[(int) craps_DontCome10] = t->bets[(int) craps_DontComeBox];
X		t->bets[(int) craps_DontComeBox] = 0;
X	    }
X	    if (ComeOutP(t))
X		t->point = 10;
X	    else
X		if (t->point == 10)
X		    t->point = 0;
X	    break;
X	case 11:
X	    if (ComeOutP(t))
X		Payoff(t, craps_PassLine);
X	    Payoff(t, craps_ComeBox);
X	    if (ComeOutP(t))
X		Collect(t, craps_DontPass);
X	    Collect(t, craps_DontComeBox);
X	    Payoff(t, craps_Field);
X	    Collect(t, craps_Any7);
X	    Collect(t, craps_AnyCraps);
X	    Collect(t, craps_OneRoll2);
X	    Collect(t, craps_OneRoll3);
X	    Payoff(t, craps_OneRoll11);
X	    Collect(t, craps_OneRoll12);
X	    break;
X	case 12:
X	    if (ComeOutP(t))
X		Collect(t, craps_PassLine);
X	    Collect(t, craps_ComeBox);
X	    Payoff(t, craps_Field);
X	    Collect(t, craps_Any7);
X	    Payoff(t, craps_AnyCraps);
X	    Collect(t, craps_OneRoll2);
X	    Collect(t, craps_OneRoll3);
X	    Collect(t, craps_OneRoll11);
X	    Payoff(t, craps_OneRoll12);
X	    break;
X    }
X}
X
XCrapsError_t    Craps_Bet(t, which, bet)
XCrapsTable_t   *t;
XCrapsBet_t      which;
Xint             bet;
X{
X    int             amount = bet - t->bets[(int) which], max, orig, commission;
X    CrapsPayoff_t   payoff;
X
X    if (bet <= 0)
X	return (crapserr_Nonpositive);
X    if (amount > t->bankroll)
X	return (crapserr_InsufficientFunds);
X    switch (which) {
X	case craps_PassLine:
X	    if (ComeOutP(t))
X		Decr(t, which, amount);
X	    else
X		return (crapserr_NotComeOut);
X	    break;
X	case craps_PassLineOdds:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    else {
X		Craps_GetPayoff(t, which, &payoff);
X		orig = t->bets[(int) craps_PassLine];
X		if (t->doublep)
X		    orig *= 2;
X		if (orig % payoff.denominator)
X		    max = (orig - (orig % payoff.denominator)) + payoff.denominator;
X		else
X		    max = orig;
X		if (!max)
X		    return (crapserr_NoBet);
X		if (bet > max) {
X		    CrapsErrorDatum = max;
X		    return (crapserr_TooMuch);
X		}
X		if (bet % payoff.denominator) {
X		    CrapsErrorDatum = payoff.denominator;
X		    return (crapserr_NotDivisible);
X		}
X		Decr(t, which, amount);
X	    }
X	    break;
X	case craps_ComeBox:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    Decr(t, which, amount);
X	    break;
X	case craps_ComeOdds4:
X	    if (!(max = t->bets[(int) craps_Come4]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		max *= 2;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_ComeOdds10:
X	    if (!(max = t->bets[(int) craps_Come10]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		max *= 2;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_ComeOdds5:
X	    if (!(max = t->bets[(int) craps_Come5]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		max *= 2;
X	    if (max % 2)
X		++max;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    if (bet % 2) {
X		CrapsErrorDatum = 2;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_ComeOdds9:
X	    if (!(max = t->bets[(int) craps_Come9]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		max *= 2;
X	    if (max % 2)
X		++max;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    if (bet % 2) {
X		CrapsErrorDatum = 2;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_ComeOdds6:
X	    if (!(orig = t->bets[(int) craps_Come6]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		orig *= 2;
X	    if (orig % 5)
X		max = (orig - (orig % 5)) + 5;
X	    else
X		max = orig;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    if (bet % 5) {
X		CrapsErrorDatum = 5;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_ComeOdds8:
X	    if (!(orig = t->bets[(int) craps_Come8]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		orig *= 2;
X	    if (orig % 5)
X		max = (orig - (orig % 5)) + 5;
X	    else
X		max = orig;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    if (bet % 5) {
X		CrapsErrorDatum = 5;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontPass:
X	    if (ComeOutP(t))
X		Decr(t, which, amount);
X	    else
X		return (crapserr_NotComeOut);
X	    break;
X	case craps_DontPassOdds:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (!(orig = t->bets[(int) craps_DontPass]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		orig *= 2;
X	    Craps_GetPayoff(t, which, &payoff);
X	    if (orig % payoff.numerator)
X		max = (orig - (orig % payoff.numerator)) + payoff.numerator;
X	    else
X		max = orig;
X	    max /= payoff.numerator;
X	    max *= payoff.denominator;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    if (bet % payoff.denominator) {
X		CrapsErrorDatum = payoff.denominator;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontComeBox:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontComeOdds4:
X	    if (!(orig = t->bets[(int) craps_DontCome4]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		orig *= 2;
X	    max = orig * 2;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    if (bet % 2) {
X		CrapsErrorDatum = 2;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontComeOdds10:
X	    if (!(orig = t->bets[(int) craps_DontCome10]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		orig *= 2;
X	    max = orig * 2;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    if (bet % 2) {
X		CrapsErrorDatum = 2;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontComeOdds5:
X	    if (!(orig = t->bets[(int) craps_DontCome5]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		orig *= 2;
X	    max = (orig % 2) ? (orig + 1) : orig;
X	    max /= 2;
X	    max *= 3;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    if (bet % 3) {
X		CrapsErrorDatum = 3;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontComeOdds9:
X	    if (!(orig = t->bets[(int) craps_DontCome9]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		orig *= 2;
X	    max = (orig % 2) ? (orig + 1) : orig;
X	    max /= 2;
X	    max *= 3;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    if (bet % 3) {
X		CrapsErrorDatum = 3;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontComeOdds6:
X	    if (!(orig = t->bets[(int) craps_DontCome6]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		orig *= 2;
X	    if (orig % 5)
X		max = (orig - (orig % 5)) + 5;
X	    else
X		max = orig;
X	    max /= 5;
X	    max *= 6;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    if (bet % 6) {
X		CrapsErrorDatum = 6;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontComeOdds8:
X	    if (!(orig = t->bets[(int) craps_DontCome8]))
X		return (crapserr_NoBet);
X	    if (t->doublep)
X		orig *= 2;
X	    if (orig % 5)
X		max = (orig - (orig % 5)) + 5;
X	    else
X		max = orig;
X	    max /= 5;
X	    max *= 6;
X	    if (bet > max) {
X		CrapsErrorDatum = max;
X		return (crapserr_TooMuch);
X	    }
X	    if (bet % 6) {
X		CrapsErrorDatum = 6;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_Place4:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 5) {
X		CrapsErrorDatum = 5;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    t->bought4 = 0;
X	    break;
X	case craps_Place5:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 5) {
X		CrapsErrorDatum = 5;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_Place6:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 6) {
X		CrapsErrorDatum = 6;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_Place8:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 6) {
X		CrapsErrorDatum = 6;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_Place9:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 5) {
X		CrapsErrorDatum = 5;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    break;
X	case craps_Place10:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 5) {
X		CrapsErrorDatum = 5;
X		return (crapserr_NotDivisible);
X	    }
X	    Decr(t, which, amount);
X	    t->bought10 = 0;
X	    break;
X	case craps_DontPlace4:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 40) {
X		CrapsErrorDatum = 40;
X		return (crapserr_NotDivisible);
X	    }
X	    commission = bet / 40;
X	    if ((amount + commission) > t->bankroll)
X		return (crapserr_InsufficientFunds);
X	    Craps_ReportCommission(t, commission);
X	    t->bankroll -= commission;
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontPlace10:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 40) {
X		CrapsErrorDatum = 40;
X		return (crapserr_NotDivisible);
X	    }
X	    commission = bet / 40;
X	    if ((amount + commission) > t->bankroll)
X		return (crapserr_InsufficientFunds);
X	    Craps_ReportCommission(t, commission);
X	    t->bankroll -= commission;
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontPlace5:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 30) {
X		CrapsErrorDatum = 30;
X		return (crapserr_NotDivisible);
X	    }
X	    commission = bet / 30;
X	    if ((amount + commission) > t->bankroll)
X		return (crapserr_InsufficientFunds);
X	    Craps_ReportCommission(t, commission);
X	    t->bankroll -= commission;
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontPlace9:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 30) {
X		CrapsErrorDatum = 30;
X		return (crapserr_NotDivisible);
X	    }
X	    commission = bet / 30;
X	    if ((amount + commission) > t->bankroll)
X		return (crapserr_InsufficientFunds);
X	    Craps_ReportCommission(t, commission);
X	    t->bankroll -= commission;
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontPlace6:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 24) {
X		CrapsErrorDatum = 24;
X		return (crapserr_NotDivisible);
X	    }
X	    commission = bet / 24;
X	    if ((amount + commission) > t->bankroll)
X		return (crapserr_InsufficientFunds);
X	    Craps_ReportCommission(t, commission);
X	    t->bankroll -= commission;
X	    Decr(t, which, amount);
X	    break;
X	case craps_DontPlace8:
X	    if (ComeOutP(t))
X		return (crapserr_ComeOut);
X	    if (bet % 24) {
X		CrapsErrorDatum = 24;
X		return (crapserr_NotDivisible);
X	    }
X	    commission = bet / 24;
X	    if ((amount + commission) > t->bankroll)
X		return (crapserr_InsufficientFunds);
X	    Craps_ReportCommission(t, commission);
X	    t->bankroll -= commission;
X	    Decr(t, which, amount);
X	    break;
X	default:
X	    Decr(t, which, amount);
X	    break;
X    }
X    return (crapserr_OK);
X}
X
XCrapsError_t    Craps_Buy(t, which)
XCrapsTable_t   *t;
Xint             which;
X{
X    int             orig, commission;
X
X    switch (which) {
X	case 4:
X	    if (t->bought4)
X		return (crapserr_AlreadyBought);
X	    if (!(orig = t->bets[(int) craps_Place4]))
X		return (crapserr_NoBet);
X	    if (orig % 20) {
X		CrapsErrorDatum = 20;
X		return (crapserr_NotDivisible);
X	    }
X	    if ((commission = orig / 20) > t->bankroll)
X		return (crapserr_InsufficientFunds);
X	    Craps_ReportCommission(t, commission);
X	    t->bankroll -= commission;
X	    t->bought4 = 1;
X	    break;
X	case 10:
X	    if (t->bought10)
X		return (crapserr_AlreadyBought);
X	    if (!(orig = t->bets[(int) craps_Place10]))
X		return (crapserr_NoBet);
X	    if (orig % 20) {
X		CrapsErrorDatum = 20;
X		return (crapserr_NotDivisible);
X	    }
X	    if ((commission = orig / 20) > t->bankroll)
X		return (crapserr_InsufficientFunds);
X	    Craps_ReportCommission(t, commission);
X	    t->bankroll -= commission;
X	    t->bought10 = 1;
X	    break;
X    }
X    return (crapserr_OK);
X}
X
XCrapsError_t    Craps_TakeDown(t, which)
XCrapsTable_t   *t;
XCrapsBet_t      which;
X{
X    switch (which) {
X	case craps_PassLine:
X	    if (ComeOutP(t))
X		Return(t, which);
X	    else
X		return (crapserr_NoReturn);
X	    break;
X	case craps_PassLineOdds:
X	case craps_ComeBox:
X	    Return(t, which);
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	    return (crapserr_NoReturn);
X	case craps_ComeOdds4:
X	case craps_ComeOdds5:
X	case craps_ComeOdds6:
X	case craps_ComeOdds8:
X	case craps_ComeOdds9:
X	case craps_ComeOdds10:
X	    Return(t, which);
X	    break;
X	case craps_DontPass:
X	    if (ComeOutP(t))
X		Return(t, which);
X	    else
X		return (crapserr_NoReturn);
X	    break;
X	case craps_DontPassOdds:
X	case craps_DontComeBox:
X	    Return(t, which);
X	    break;
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	    return (crapserr_NoReturn);
X	case craps_Place4:
X	    Return(t, which);
X	    t->bought4 = 0;
X	    break;
X	case craps_Place10:
X	    Return(t, which);
X	    t->bought10 = 0;
X	    break;
X	case craps_DontComeOdds4:
X	case craps_DontComeOdds5:
X	case craps_DontComeOdds6:
X	case craps_DontComeOdds8:
X	case craps_DontComeOdds9:
X	case craps_DontComeOdds10:
X	case craps_Place5:
X	case craps_Place6:
X	case craps_Place8:
X	case craps_Place9:
X	case craps_DontPlace4:
X	case craps_DontPlace5:
X	case craps_DontPlace6:
X	case craps_DontPlace8:
X	case craps_DontPlace9:
X	case craps_DontPlace10:
X	case craps_Field:
X	case craps_Big6:
X	case craps_Big8:
X	case craps_Hard4:
X	case craps_Hard6:
X	case craps_Hard8:
X	case craps_Hard10:
X	case craps_Any7:
X	case craps_AnyCraps:
X	case craps_OneRoll2:
X	case craps_OneRoll3:
X	case craps_OneRoll11:
X	case craps_OneRoll12:
X	    Return(t, which);
X	    break;
X    }
X    return (crapserr_OK);
X}
END_OF_FILE
if test 29974 -ne `wc -c <'crapslib.c'`; then
    echo shar: \"'crapslib.c'\" unpacked with wrong size!
fi
# end of 'crapslib.c'
fi
if test -f 'crapslib.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'crapslib.h'\"
else
echo shar: Extracting \"'crapslib.h'\" \(3047 characters\)
sed "s/^X//" >'crapslib.h' <<'END_OF_FILE'
X#define CRAPSLIB_VERSION (2)
X#define CRAPSLIB_PATCHLEVEL (0)
X
Xtypedef enum {
X    craps_PassLine = 0, craps_PassLineOdds,
X    craps_ComeBox, craps_Come4, craps_Come5, craps_Come6,
X    craps_Come8, craps_Come9, craps_Come10,
X    craps_ComeOdds4, craps_ComeOdds5, craps_ComeOdds6,
X    craps_ComeOdds8, craps_ComeOdds9, craps_ComeOdds10,
X    craps_DontPass, craps_DontPassOdds,
X    craps_DontComeBox, craps_DontCome4, craps_DontCome5,
X    craps_DontCome6, craps_DontCome8, craps_DontCome9,
X    craps_DontCome10,
X    craps_DontComeOdds4, craps_DontComeOdds5, craps_DontComeOdds6,
X    craps_DontComeOdds8, craps_DontComeOdds9, craps_DontComeOdds10,
X    craps_Place4, craps_Place5, craps_Place6, craps_Place8,
X    craps_Place9, craps_Place10,
X    craps_DontPlace4, craps_DontPlace5, craps_DontPlace6,
X    craps_DontPlace8, craps_DontPlace9, craps_DontPlace10,
X    craps_Field, craps_Big6, craps_Big8,
X    craps_Hard4, craps_Hard6, craps_Hard8, craps_Hard10,
X    craps_Any7, craps_AnyCraps,
X    craps_OneRoll2, craps_OneRoll3, craps_OneRoll11, craps_OneRoll12,
X    craps_Bets
X}               CrapsBet_t;
X
Xtypedef enum {
X    crapserr_OK,
X    crapserr_NoReturn,
X    crapserr_AlreadyBought,
X    crapserr_Nonpositive,
X    crapserr_NoBet,
X    crapserr_InsufficientFunds,
X    crapserr_NotComeOut,
X    crapserr_ComeOut,
X    crapserr_TooMuch,
X    crapserr_NotDivisible
X}               CrapsError_t;
X
Xtypedef struct {
X    int             numerator, denominator;
X}               CrapsPayoff_t;
X
Xtypedef struct {
X    int             bankroll, point, die1, die2;
X    int             bought4, bought10; /* booleans */
X    /* Configuration: */
X    int             doublep;
X    CrapsPayoff_t   field2payoff, field12payoff, big6payoff;
X    CrapsPayoff_t   big8payoff, oneroll2payoff, oneroll3payoff;
X    CrapsPayoff_t   oneroll11payoff, oneroll12payoff;
X    /* Bets: */
X    int             bets[(int) craps_Bets];
X}               CrapsTable_t;
X
X#define Craps_Bankroll(t) ((t)->bankroll)
X#define Craps_Point(t) ((t)->point)
X#define Craps_Die1(t) ((t)->die1)
X#define Craps_Die2(t) ((t)->die2)
X#define Craps_Bought4(t) ((t)->bought4)
X#define Craps_Bought10(t) ((t)->bought10)
X#define Craps_Doublep(t) ((t)->doublep)
X#define Craps_Field2Payoff(t) (&((t)->field2payoff))
X#define Craps_Field12Payoff(t) (&((t)->field12payoff))
X#define Craps_Big6Payoff(t) (&((t)->big6payoff))
X#define Craps_Big8Payoff(t) (&((t)->big8payoff))
X#define Craps_OneRoll2Payoff(t) (&((t)->oneroll2payoff))
X#define Craps_OneRoll3Payoff(t) (&((t)->oneroll3payoff))
X#define Craps_OneRoll11Payoff(t) (&((t)->oneroll11payoff))
X#define Craps_OneRoll12Payoff(t) (&((t)->oneroll12payoff))
X#define Craps_GetBet(t,type) ((t)->bets[(int)(type)])
X
X#define Craps_SetBankroll(t,b) (((t)->bankroll)=(b))
X#define Craps_SetDouble(t,d) (((t)->doublep)=(d))
X
X#define Craps_IncrBankroll(t,amt) (((t)->bankroll)+=(amt))
X
Xextern CrapsError_t Craps_Bet();
Xextern CrapsError_t Craps_Buy();
Xextern void     Craps_GetPayoff();
Xextern void     Craps_Init();
Xextern CrapsError_t Craps_TakeDown();
Xextern void     Craps_Update();
END_OF_FILE
if test 3047 -ne `wc -c <'crapslib.h'`; then
    echo shar: \"'crapslib.h'\" unpacked with wrong size!
fi
# end of 'crapslib.h'
fi
echo shar: End of archive 2 \(of 2\).
cp /dev/null ark2isdone
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