[comp.sources.games] v11i035: vcraps - display-oriented craps game, Part02/02

billr@saab.CNA.TEK.COM (Bill Randle) (08/24/90)

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

#! /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
# Wrapped by billr@saab on Thu Aug 23 14:15:45 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'\" \(29518 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[which]) {
X	CrapsPayoff_t   payoff;
X	int             win;
X
X	Craps_GetPayoff(t, which, &payoff);
X	win = (t->bets[which] / payoff.denominator) * payoff.numerator;
X	Craps_ReportPayoff(t, which, &payoff, win);
X	t->bankroll += (t->bets[which] + win);
X	t->bets[which] = 0;
X    }
X}
X
Xstatic void     Return(t, which)
XCrapsTable_t   *t;
XCrapsBet_t      which;
X{
X    if (t->bets[which]) {
X	Craps_ReportReturn(t, which);
X	t->bankroll += t->bets[which];
X	t->bets[which] = 0;
X    }
X}
X
Xstatic void     Collect(t, which)
XCrapsTable_t   *t;
XCrapsBet_t      which;
X{
X    if (t->bets[which]) {
X	Craps_ReportCollect(t, which);
X	t->bets[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 < 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[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[craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come4);
X		t->bets[craps_Come4] = t->bets[craps_ComeBox];
X		t->bets[craps_ComeBox] = 0;
X	    }
X	    if (t->bets[craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome4);
X		t->bets[craps_DontCome4] = t->bets[craps_DontComeBox];
X		t->bets[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[craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come5);
X		t->bets[craps_Come5] = t->bets[craps_ComeBox];
X		t->bets[craps_ComeBox] = 0;
X	    }
X	    if (t->bets[craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome5);
X		t->bets[craps_DontCome5] = t->bets[craps_DontComeBox];
X		t->bets[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[craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come6);
X		t->bets[craps_Come6] = t->bets[craps_ComeBox];
X		t->bets[craps_ComeBox] = 0;
X	    }
X	    if (t->bets[craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome6);
X		t->bets[craps_DontCome6] = t->bets[craps_DontComeBox];
X		t->bets[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[craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come8);
X		t->bets[craps_Come8] = t->bets[craps_ComeBox];
X		t->bets[craps_ComeBox] = 0;
X	    }
X	    if (t->bets[craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome8);
X		t->bets[craps_DontCome8] = t->bets[craps_DontComeBox];
X		t->bets[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[craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come9);
X		t->bets[craps_Come9] = t->bets[craps_ComeBox];
X		t->bets[craps_ComeBox] = 0;
X	    }
X	    if (t->bets[craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome9);
X		t->bets[craps_DontCome9] = t->bets[craps_DontComeBox];
X		t->bets[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[craps_ComeBox]) {
X		Craps_ReportMove(t, craps_ComeBox, craps_Come10);
X		t->bets[craps_Come10] = t->bets[craps_ComeBox];
X		t->bets[craps_ComeBox] = 0;
X	    }
X	    if (t->bets[craps_DontComeBox]) {
X		Craps_ReportMove(t, craps_DontComeBox, craps_DontCome10);
X		t->bets[craps_DontCome10] = t->bets[craps_DontComeBox];
X		t->bets[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[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[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[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[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[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[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[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[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[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[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[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[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[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[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[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[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[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 29518 -ne `wc -c <'crapslib.c'`; then
    echo shar: \"'crapslib.c'\" unpacked with wrong size!
fi
# end of 'crapslib.c'
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