games-request@tekred.TEK.COM (06/30/87)
Submitted by: keithp@copper.TEK.COM (Keith Packard) Comp.sources.games: Volume 1, Issue 69 Archive-name: xmille/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 3)." # Contents: Makefile animate.c background.h card.h color.h extern.c # init.c mille.c mille.h misc.c move.c print.c roll.c save.c table.c # types.c ui.h varpush.c # Wrapped by billr@tekred on Mon Jun 29 17:24:36 1987 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f Makefile -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"Makefile\" else echo shar: Extracting \"Makefile\" \(1945 characters\) sed "s/^X//" >Makefile <<'END_OF_Makefile' X# @(#)Makefile 1.2 ULTRIX 6/29/84 X# X# mille bourne game makefile X# X# @(#)Makefile 1.7 (Berkeley) 8/14/83 X# XDESTROOT= XHEADERS=mille.h XCFILES= comp.c end.c extern.c init.c mille.c misc.c move.c print.c \ X roll.c save.c types.c varpush.c ui.c drawcard.c animate.c XOBJS= comp.o end.o extern.o init.o mille.o misc.o move.o print.o \ X roll.o save.o types.o varpush.o ui.o drawcard.o animate.o XPOBJS= comp.po end.po extern.po init.po mille.po misc.po move.po \ X roll.po print.po save.po types.po varpush.po ui.po drawcard.po animate.po XCRL= XL= control/control.a cards/cardlib.a -lX -lm XLIBS= ${CRL} ${L} XDEFS= XCFLAGS= -O ${DEFS} XBINDIR= ${DESTROOT}/usr/games X.SUFFIXES: .po .i X X.c.po: X rm -f x.c ; ln $*.c x.c X ${CC} ${CFLAGS} -p -c x.c X mv x.o $*.po X X.c.i: X ${CC} ${CFLAGS} -P $*.c X Xa.out: ${OBJS} ${CRL} control/control.a cards/cardlib.a X ${CC} ${CFLAGS} ${OBJS} ${LIBS} X Xmille: ${OBJS} ${CRL} X ${CC} ${CFLAGS} -o mille ${OBJS} ${LIBS} X Xcontrol/control.a: always X cd control; make control.a X Xcards/cardlib.a: always X cd cards; make cardlib.a X Xalways: X Xinstall: mille X install -c -s mille ${BINDIR} X Xpmb: ${POBJS} ../pcrlib X ${CC} ${CFLAGS} -p -o pmb ${POBJS} ../pcrlib -ltermlib X Xmille.po: mille.c X rm -f x.c ; ln mille.c x.c X ${CC} ${CFLAGS} -DPROF -p -c x.c X mv x.o mille.po X Xtable: table.o extern.o X ${CC} ${CFLAGS} -i -o table table.o extern.o X Xanimate.o ui.o: ui.h X Xreaddump: readdump.o extern.o varpush.o X ${CC} ${CFLAGS} -i -o readdump readdump.o extern.o varpush.o X Xctags: X ctags ${HEADERS} ${CFILES} X ed - tags < :ctfix X sort tags -o tags X Xlint: X lint -hxb ${DEFS} ${CFILES} ${L} > lint.out X Xmille.ar: X ar ruv mille.ar Makefile tags ${HEADERS} ${CFILES} X Xtar: X tar rvf /dev/rmt0 Makefile tags :ctfix ${HEADERS} ${CFILES} X Xlpr: X pr Makefile ${HEADERS} ${CFILES} tags | lpr ; lpq X Xclean: X rm -f ${OBJS} ${POBJS} core ? a.out mille X Xclobber: clean X rm -f *.[ch] Makefile X Xsccsinfo: X sccs info X Xsccsget: X sccs get SCCS X X.DEFAULT: X sccs get $< END_OF_Makefile if test 1945 -ne `wc -c <Makefile`; then echo shar: \"Makefile\" unpacked with wrong size! fi # end of overwriting check fi if test -f animate.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"animate.c\" else echo shar: Extracting \"animate.c\" \(4533 characters\) sed "s/^X//" >animate.c <<'END_OF_animate.c' X/* X * animation X */ X X# include "mille.h" X# include "ui.h" X# include "card.h" X# include <math.h> X Xanimate_move (player, orig_type, orig_arg, dest_type, dest_arg) X{ X int ox, oy, dx, dy; X X compute_position (player, orig_type, orig_arg, &ox, &oy); X compute_position (player, dest_type, dest_arg, &dx, &dy); X do_animate (ox, oy, dx, dy); X} X X# define abs(x) ((x) < 0 ? -(x) : (x)) X X# define SPEED_FACTOR (2.5) X# define accerate(v,r) ((v) + (0.1 * (r))) X Xstatic Xdo_animate (ox, oy, dx, dy) X{ X double x, y; X double xc, yc; X int xd, yd; X int xp, yp; X int x1, y1, x2, y2, x3, y3, x4, y4; X int ix, iy; X double dist; X double rx, ry; X X x = ox; X y = oy; X xd = dx - ox; X yd = dy - oy; X dist = sqrt ((double) xd * xd + yd * yd); X rx = (double) xd / dist; X ry = (double) yd / dist; X xc = SPEED_FACTOR * rx; X yc = SPEED_FACTOR * ry; X xp = yp = -32767; X XFlush (); X while (abs(dx - x) > abs (xc) || abs(dy - y) > abs (yc)) { X ix = x; X iy = y; X if (xp == -32767) X draw_square (ix, iy, ix + WIDTH, iy + HEIGHT); X else { X if (xp < ix) { X x1 = xp + WIDTH; X x2 = ix + WIDTH; X x3 = ix; X x4 = ix + WIDTH; X } else if (xp > ix) { X x1 = ix; X x2 = xp; X x3 = ix; X x4 = ix + WIDTH; X } else { X x1 = -32767; X x2 = -32767; X x3 = ix; X x4 = ix + WIDTH; X } X if (yp < iy) { X y1 = iy; X y2 = yp + HEIGHT; X y3 = yp + HEIGHT; X y4 = iy + HEIGHT; X } else if (yp > iy) { X y1 = yp; X y2 = iy + HEIGHT; X y3 = iy; X y4 = yp; X } else { X y1 = iy; X y2 = iy + HEIGHT; X y3 = -32767; X y4 = -32767; X } X if (x1 != -32767 && y1 != -32767) X draw_square (x1, y1, x2, y2); X if (x3 != -32767 && y3 != -32767) X draw_square (x3, y3, x4, y4); X if (ix < xp) { X x1 = ix + WIDTH; X x2 = xp + WIDTH; X x3 = xp; X x4 = xp + WIDTH; X } else if (ix > xp) { X x1 = xp; X x2 = ix; X x3 = xp; X x4 = xp + WIDTH; X } else { X x1 = -32767; X x2 = -32767; X x3 = xp; X x4 = xp + WIDTH; X } X if (iy < yp) { X y1 = yp; X y2 = iy + HEIGHT; X y3 = iy + HEIGHT; X y4 = yp + HEIGHT; X } else if (iy > yp) { X y1 = iy; X y2 = yp + HEIGHT; X y3 = yp; X y4 = iy; X } else { X y1 = yp; X y2 = yp + HEIGHT; X y3 = -32767; X y4 = -32767; X } X if (x1 != -32767 && y1 != -32767) X draw_square (x1, y1, x2, y2); X if (x3 != -32767 && y3 != -32767) X draw_square (x3, y3, x4, y4); X } X xp = ix; X yp = iy; X if (abs (dx - x) > xc) X x += xc; X if (abs (dy - y) > yc) X y += yc; X xc = accerate(xc, rx); X yc = accerate(yc, ry); X } X draw_square (xp, yp, xp+WIDTH, yp+HEIGHT); X XFlush (); X} X Xstatic Xdraw_square (x1, y1, x2, y2) X{ X XPixFill (xwindow, x1, y1, x2-x1, y2-y1, colorMap[BLACK_COLOR].pixel, 0, X GXxor, AllPlanes); X} X Xstatic Xcompute_position (player, type, arg, xp, yp) Xint *xp, *yp; X{ X switch (type) { X case ANIMATE_HAND: X switch (player) { X case 0: X *xp = HUM_HAND_X + (WIDTH + PAD_CARD) * arg; X *yp = HUM_HAND_Y; X break; X case 1: X *xp = COMP_HAND_X + (WIDTH + PAD_CARD) * arg; X *yp = COMP_HAND_Y; X break; X } X break; X case ANIMATE_DECK: X *xp = DECK_X; X *yp = DECK_Y; X break; X case ANIMATE_DISC: X *xp = DISCARD_X; X *yp = DISCARD_Y; X break; X case ANIMATE_MILES: X switch (player) { X case 0: X *xp = HUM_PLAY_X + (WIDTH + PAD_CARD) * (2 + C_200 - arg); X *yp = HUM_PLAY_Y; X break; X case 1: X *xp = COMP_PLAY_X + (WIDTH + PAD_CARD) * (2 + C_200 - arg); X *yp = COMP_PLAY_Y; X break; X } X break; X case ANIMATE_BATTLE: X switch (player) { X case 0: X *xp = HUM_PLAY_X + WIDTH + PAD_CARD; X *yp = HUM_PLAY_Y; X break; X case 1: X *xp = COMP_PLAY_X + WIDTH + PAD_CARD; X *yp = COMP_PLAY_Y; X break; X } X break; X case ANIMATE_SPEED: X switch (player) { X case 0: X *xp = HUM_PLAY_X; X *yp = HUM_PLAY_Y; X break; X case 1: X *xp = COMP_PLAY_X; X *yp = COMP_PLAY_Y; X break; X } X break; X case ANIMATE_OBATTLE: X switch (1-player) { X case 0: X *xp = HUM_PLAY_X + WIDTH + PAD_CARD; X *yp = HUM_PLAY_Y; X break; X case 1: X *xp = COMP_PLAY_X + WIDTH + PAD_CARD; X *yp = COMP_PLAY_Y; X break; X } X break; X case ANIMATE_OSPEED: X switch (1-player) { X case 0: X *xp = HUM_PLAY_X; X *yp = HUM_PLAY_Y; X break; X case 1: X *xp = COMP_PLAY_X; X *yp = COMP_PLAY_Y; X break; X } X break; X case ANIMATE_SAFETY: X switch (player) { X case 0: X *xp = HUM_SAFE_X + safety_offsets[arg - S_CONV].x; X *yp = HUM_SAFE_Y + safety_offsets[arg - S_CONV].y; X break; X case 1: X *xp = COMP_SAFE_X + safety_offsets[arg - S_CONV].x; X *yp = COMP_SAFE_Y + safety_offsets[arg - S_CONV].y; X break; X } X break; X } X} END_OF_animate.c if test 4533 -ne `wc -c <animate.c`; then echo shar: \"animate.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f background.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"background.h\" else echo shar: Extracting \"background.h\" \(17 characters\) sed "s/^X//" >background.h <<'END_OF_background.h' X# include "fill" END_OF_background.h if test 17 -ne `wc -c <background.h`; then echo shar: \"background.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f card.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"card.h\" else echo shar: Extracting \"card.h\" \(39 characters\) sed "s/^X//" >card.h <<'END_OF_card.h' X# define HEIGHT 150 X# define WIDTH 100 END_OF_card.h if test 39 -ne `wc -c <card.h`; then echo shar: \"card.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f color.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"color.h\" else echo shar: Extracting \"color.h\" \(299 characters\) sed "s/^X//" >color.h <<'END_OF_color.h' X/* X * color.h X * X * definitions for standard colors X */ X X# define BLACK_COLOR 0 X# define WHITE_COLOR 1 X# define RED_COLOR 2 X# define GREEN_COLOR 3 X# define GREY_COLOR 4 X# define BLUE_COLOR 5 X# define NUM_COLOR 6 X X Xstruct color { X char *name; X int pixel; X}; X Xextern struct color colorMap[NUM_COLOR]; END_OF_color.h if test 299 -ne `wc -c <color.h`; then echo shar: \"color.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f extern.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"extern.c\" else echo shar: Extracting \"extern.c\" \(2988 characters\) sed "s/^X//" >extern.c <<'END_OF_extern.c' X# include "mille.h" X X/* X * @(#)extern.c 1.1 (Berkeley) 4/1/82 X */ X Xbool Debug, /* set if debugging code on */ X Finished, /* set if current hand is finished */ X Next, /* set if changing players */ X On_exit, /* set if game saved on exiting */ X Order, /* set if hand should be sorted */ X Saved; /* set if game just saved */ X Xchar *Fromfile = NULL; /* startup file for game */ X Xint Card_no, /* Card number for current move */ X End, /* End value for current hand */ X Handstart = COMP, /* Player who starts hand */ X Movetype, /* Current move type */ X Play, /* Current player */ X Numgos, /* Number of Go cards used by computer */ X WIndow = W_SMALL, /* Current window wanted */ X Numseen[NUM_CARDS], /* Number of cards seen in current hand */ X Value[NUM_MILES] = { /* Value of mileage cards */ X 25, 50, 75, 100, 200 X }, X Numcards[NUM_CARDS] = { /* Number of cards in deck */ X 10, /* C_25 */ X 10, /* C_50 */ X 10, /* C_75 */ X 12, /* C_100 */ X 4, /* C_200 */ X 2, /* C_EMPTY */ X 2, /* C_FLAT */ X 2, /* C_CRASH */ X 4, /* C_STOP */ X 3, /* C_LIMIT */ X 6, /* C_GAS */ X 6, /* C_SPARE */ X 6, /* C_REPAIRS */ X 14, /* C_GO */ X 6, /* C_END_LIMIT */ X 1, /* C_GAS_SAFE */ X 1, /* C_SPARE_SAFE */ X 1, /* C_DRIVE_SAFE */ X 1, /* C_RIGHT_WAY */ X 0 /* C_INIT */ X }; X Numneed[NUM_CARDS] = { /* number of cards needed per hand */ X 0, /* C_25 */ X 0, /* C_50 */ X 0, /* C_75 */ X 0, /* C_100 */ X 0, /* C_200 */ X 2, /* C_EMPTY */ X 2, /* C_FLAT */ X 2, /* C_CRASH */ X 4, /* C_STOP */ X 3, /* C_LIMIT */ X 2, /* C_GAS */ X 2, /* C_SPARE */ X 2, /* C_REPAIRS */ X 10, /* C_GO */ X 3, /* C_END_LIMIT */ X 1, /* C_GAS_SAFE */ X 1, /* C_SPARE_SAFE */ X 1, /* C_DRIVE_SAFE */ X 1, /* C_RIGHT_WAY */ X 0 /* C_INIT */ X }; X XCARD Discard, /* Top of discard pile */ X *Topcard, /* Pointer to next card to be picked */ X Opposite[NUM_CARDS] = { /* Opposites of each card */ X C_25, C_50, C_75, C_100, C_200, C_GAS, C_SPARE, X C_REPAIRS, C_GO, C_END_LIMIT, C_EMPTY, C_FLAT, C_CRASH, X C_STOP, C_LIMIT, C_EMPTY, C_FLAT, C_CRASH, C_STOP, C_INIT X }, X Deck[DECK_SZ] = { /* Current deck */ X C_25, C_25, C_25, C_25, C_25, C_25, C_25, C_25, C_25, C_25, X C_50, C_50, C_50, C_50, C_50, C_50, C_50, C_50, C_50, C_50, X C_75, C_75, C_75, C_75, C_75, C_75, C_75, C_75, C_75, C_75, X C_100, C_100, C_100, C_100, C_100, C_100, C_100, C_100, C_100, X C_100, C_100, C_100, X C_200, C_200, C_200, C_200, X C_EMPTY, C_EMPTY, X C_FLAT, C_FLAT, X C_CRASH, C_CRASH, X C_STOP, C_STOP, C_STOP, C_STOP, X C_LIMIT, C_LIMIT, C_LIMIT, X C_GAS, C_GAS, C_GAS, C_GAS, C_GAS, C_GAS, X C_SPARE, C_SPARE, C_SPARE, C_SPARE, C_SPARE, C_SPARE, X C_REPAIRS, C_REPAIRS, C_REPAIRS, C_REPAIRS, C_REPAIRS, X C_REPAIRS, X C_END_LIMIT, C_END_LIMIT, C_END_LIMIT, C_END_LIMIT, C_END_LIMIT, X C_END_LIMIT, X C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, X C_GO, C_GO, C_GO, C_GO, X C_GAS_SAFE, C_SPARE_SAFE, C_DRIVE_SAFE, C_RIGHT_WAY X }; X XFILE *outf; X XPLAY Player[2]; /* Player descriptions */ END_OF_extern.c if test 2988 -ne `wc -c <extern.c`; then echo shar: \"extern.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f init.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"init.c\" else echo shar: Extracting \"init.c\" \(1198 characters\) sed "s/^X//" >init.c <<'END_OF_init.c' X# include "mille.h" X X/* X * @(#)init.c 1.1 (Berkeley) 4/1/82 X */ X Xinit() { X X reg PLAY *pp; X reg int i, j; X reg CARD card; X X for (j = 0; j < C_RIGHT_WAY; j++) X Numseen[j] = 0; X Numgos = 0; X X for (i = 0; i < 2; i++) { X pp = &Player[i]; X pp->hand[0] = C_INIT; X for (j = 0; j < NUM_SAFE; j++) { X pp->safety[j] = S_UNKNOWN; X pp->coups[j] = FALSE; X } X for (j = 1; j < HAND_SZ; j++) { X pp->hand[j] = *--Topcard; X if (i == COMP) { X account(card = *Topcard); X if (issafety(card)) X pp->safety[card - S_CONV] = S_IN_HAND; X } X } X pp->mileage = 0; X pp->hand_tot = 0; X pp->safescore = 0; X pp->coupscore = 0; X pp->can_go = FALSE; X pp->speed = C_INIT; X pp->battle = C_INIT; X pp->new_speed = FALSE; X pp->new_battle = FALSE; X for (j = 0; j < NUM_MILES; j++) X pp->nummiles[j] = 0; X } X if (Order) X sort(Player[PLAYER].hand); X Discard = C_INIT; X Finished = FALSE; X End = 700; X} X Xshuffle() { X X reg int i, r; X reg CARD temp; X X for (i = 0; i < DECK_SZ; i++) { X r = roll(1, DECK_SZ) - 1; X if (r < 0 || r > DECK_SZ - 1) { X fprintf(stderr, "shuffle: card no. error: %d\n", r); X die(); X } X temp = Deck[r]; X Deck[r] = Deck[i]; X Deck[i] = temp; X } X Topcard = &Deck[DECK_SZ]; X} END_OF_init.c if test 1198 -ne `wc -c <init.c`; then echo shar: \"init.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f mille.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"mille.c\" else echo shar: Extracting \"mille.c\" \(1892 characters\) sed "s/^X//" >mille.c <<'END_OF_mille.c' X# include "mille.h" X# include <signal.h> X# ifdef attron X# include <term.h> X# endif attron X X/* X * @(#)mille.c 1.3 (Berkeley) 5/10/83 X */ X Xint rub(); X Xchar _sobuf[BUFSIZ]; X Xmain(ac, av) Xreg int ac; Xreg char *av[]; { X X reg bool restore; X double avs[3]; X X if (strcmp(av[0], "a.out") == 0) { X outf = fopen("q", "w"); X setbuf(outf, 0); X Debug = TRUE; X } X restore = FALSE; X# ifdef pdp11 X if (geteuid() != ARNOLD) { X loadav(avs); X if (avs[2] > 9.0) { X printf("Sorry. The load average is too high.\n"); X printf("Please try again later\n"); X exit(1); X } X } X# endif X switch (ac) { X case 2: X rest_f(av[1]); X restore = TRUE; X case 1: X break; X default: X printf("usage: milles [ restore_file ]\n"); X exit(-1); X /* NOTREACHED */ X } X setbuf(stdout, _sobuf); X Play = PLAYER; X init_ui (); X# ifndef PROF X srand(getpid()); X# else X srand(0); X# endif X signal(SIGINT, rub); X for (;;) { X if (!restore || (Player[PLAYER].total >= 5000 X || Player[COMP].total >= 5000)) { X if (Player[COMP].total < Player[PLAYER].total) X Player[PLAYER].games++; X else if (Player[COMP].total > Player[PLAYER].total) X Player[COMP].games++; X Player[COMP].total = 0; X Player[PLAYER].total = 0; X } X do { X if (!restore) X Handstart = Play = other(Handstart); X if (!restore || On_exit) { X shuffle(); X init(); X } X newboard(); X if (restore) X Error (Initstr); X prboard(); X do { X domove(); X if (Finished) X newscore(); X prboard(); X } while (!Finished); X check_more(); X restore = On_exit = FALSE; X } while (Player[COMP].total < 5000 X && Player[PLAYER].total < 5000); X } X} X X/* X * Routine to trap rubouts, and make sure they really want to X * quit. X */ Xrub() { X X signal(SIGINT, 1); X if (getyn("Really? ")) X die(); X signal(SIGINT, rub); X} X X/* X * Time to go beddy-by X */ Xdie() { X X signal(SIGINT, 1); X if (outf) X fflush(outf); X finish_ui (); X exit(1); X} END_OF_mille.c if test 1892 -ne `wc -c <mille.c`; then echo shar: \"mille.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f mille.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"mille.h\" else echo shar: Extracting \"mille.h\" \(3206 characters\) sed "s/^X//" >mille.h <<'END_OF_mille.h' X# include <ctype.h> X# include <stdio.h> X Xtypedef char bool; X# define reg register X# define TRUE 1 X# define FALSE 0 X X/* X * @(#)mille.h 1.1 (Berkeley) 4/1/82 X */ X X/* X * Miscellaneous constants X */ X X# define unsgn unsigned X# define CARD short X X# ifdef vax X# define ARNOLD 78 /* my uid */ X# else X# define ARNOLD 24601 /* my uid */ X# endif X X# define GURP 28672 /* bad uid */ X# define MAXUSERS 35 /* max # of users for startup */ X# define HAND_SZ 7 /* number of cards in a hand */ X# define DECK_SZ 101 /* number of cards in decks */ X# define NUM_SAFE 4 /* number of saftey cards */ X# define NUM_MILES 5 /* number of milestones types */ X# define NUM_CARDS 20 /* number of types of cards */ X X# define PLAYER 0 X# define COMP 1 X X# define W_SMALL 0 /* Small (initial) window */ X# define W_FULL 1 /* Full (final) window */ X X/* X * Move types X */ X X# define M_DISCARD 0 X# define M_DRAW 1 X# define M_PLAY 2 X# define M_ORDER 3 X# define M_REASONABLE 4 X X/* X * Scores X */ X X# define SC_SAFETY 100 X# define SC_ALL_SAFE 300 X# define SC_COUP 300 X# define SC_TRIP 400 X# define SC_SAFE 300 X# define SC_DELAY 300 X# define SC_EXTENSION 200 X# define SC_SHUT_OUT 500 X X/* X * safety descriptions X */ X X# define S_UNKNOWN 0 /* location of safety unknown */ X# define S_IN_HAND 1 /* safety in player's hand */ X# define S_PLAYED 2 /* safety has been played */ X# define S_GAS_SAFE 0 /* Gas safety card index */ X# define S_SPARE_SAFE 1 /* Tire safety card index */ X# define S_DRIVE_SAFE 2 /* Driveing safety card index */ X# define S_RIGHT_WAY 3 /* Right-of-Way card index */ X# define S_CONV 15 /* conversion from C_ to S_ */ X X/* X * card numbers X */ X X# define C_INIT -1 X# define C_25 0 X# define C_50 1 X# define C_75 2 X# define C_100 3 X# define C_200 4 X# define C_EMPTY 5 X# define C_FLAT 6 X# define C_CRASH 7 X# define C_STOP 8 X# define C_LIMIT 9 X# define C_GAS 10 X# define C_SPARE 11 X# define C_REPAIRS 12 X# define C_GO 13 X# define C_END_LIMIT 14 X# define C_GAS_SAFE 15 X# define C_SPARE_SAFE 16 X# define C_DRIVE_SAFE 17 X# define C_RIGHT_WAY 18 X Xtypedef struct { X bool coups[NUM_SAFE]; X bool can_go; X bool new_battle; X bool new_speed; X short safety[NUM_SAFE]; X short nummiles[NUM_MILES]; X CARD hand[HAND_SZ]; X CARD battle; X CARD speed; X int mileage; X int hand_tot; X int safescore; X int coupscore; X int total; X int games; X} PLAY; X X/* X * animation constants X */ X X# define ANIMATE X# define ANIMATE_HAND 0 X# define ANIMATE_DECK 1 X# define ANIMATE_DISC 2 X# define ANIMATE_MILES 3 X# define ANIMATE_BATTLE 4 X# define ANIMATE_SPEED 5 X# define ANIMATE_OBATTLE 6 X# define ANIMATE_OSPEED 7 X# define ANIMATE_SAFETY 8 X X/* X * macros X */ X X# define other(x) (1 - x) X# define nextplay() (Play = other(Play)) X# define nextwin(x) (1 - x) X# define opposite(x) (Opposite[x]) X# define issafety(x) (x >= C_GAS_SAFE) X X/* X * externals X */ X Xextern bool Debug, Finished, Next, On_exit, Order, Saved; X Xextern char *C_fmt, **C_name, *Fromfile, Initstr[]; X Xextern int Card_no, End, Handstart, Movetype, Numcards[], Numgos, X Numneed[], Numseen[NUM_CARDS], Play, Value[], WIndow; X Xextern CARD Deck[DECK_SZ], Discard, Opposite[NUM_CARDS], *Topcard; X Xextern FILE *outf; X Xextern PLAY Player[2]; X X/* X * functions X */ X XCARD getcard(); END_OF_mille.h if test 3206 -ne `wc -c <mille.h`; then echo shar: \"mille.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f misc.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"misc.c\" else echo shar: Extracting \"misc.c\" \(1986 characters\) sed "s/^X//" >misc.c <<'END_OF_misc.c' X#include "mille.h" X# ifdef attron X# include <term.h> X# define _tty cur_term->Nttyb X# endif attron X X/* X * @(#)misc.c 1.3 (Berkeley) 7/2/83 X */ X X#define NUMSAFE 4 X X/* VARARGS1 */ Xerror(str, arg) Xchar *str; X{ X Error (str, arg); X Beep (); X update_ui (); X return FALSE; X} X Xcheck_ext(forcomp) Xreg bool forcomp; { X X X if (End == 700) X if (Play == PLAYER) { X if (getyn("Extension? ")) { Xextend: X if (!forcomp) X End = 1000; X return TRUE; X } X else { Xdone: X if (!forcomp) X Finished = TRUE; X return FALSE; X } X } X else { X reg PLAY *pp, *op; X reg int i, safe, miles; X X pp = &Player[COMP]; X op = &Player[PLAYER]; X for (safe = 0, i = 0; i < NUMSAFE; i++) X if (pp->safety[i] != S_UNKNOWN) X safe++; X if (safe < 2) X goto done; X if (op->mileage == 0 || onecard(op) X || (op->can_go && op->mileage >= 500)) X goto done; X for (miles = 0, i = 0; i < NUMSAFE; i++) X if (op->safety[i] != S_PLAYED X && pp->safety[i] == S_UNKNOWN) X miles++; X if (miles + safe == NUMSAFE) X goto extend; X for (miles = 0, i = 0; i < HAND_SZ; i++) X if ((safe = pp->hand[i]) <= C_200) X miles += Value[safe]; X if (miles + (Topcard - Deck) * 3 > 1000) X goto extend; X goto done; X } X else X goto done; X} X X/* X * Check to see if more games are desired. If not, and game X * came from a saved file, make sure that they don't want to restore X * it. Exit appropriately. X */ Xcheck_more() { X X FlushInput (); X X On_exit = TRUE; X if (Player[PLAYER].total >= 5000 || Player[COMP].total >= 5000) X if (getyn("Another game? ")) X return; X else { X /* X * must do accounting normally done in main() X */ X if (Player[PLAYER].total > Player[COMP].total) X Player[PLAYER].games++; X else if (Player[PLAYER].total < Player[COMP].total) X Player[COMP].games++; X Player[COMP].total = 0; X Player[PLAYER].total = 0; X } X else X if (getyn("Another hand? ")) X return; X if (!Saved && getyn("Save game? ")) X if (!save()) X return; X die(); X} END_OF_misc.c if test 1986 -ne `wc -c <misc.c`; then echo shar: \"misc.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f move.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"move.c\" else echo shar: Extracting \"move.c\" \(8310 characters\) sed "s/^X//" >move.c <<'END_OF_move.c' X#include "mille.h" X X/* X * @(#)move.c 1.3 (Berkeley) 7/2/83 X */ X X#ifdef CTRL X#undef CTRL X#endif X#define CTRL(c) (c - 'A' + 1) X Xchar *Movenames[] = { X "M_DISCARD", "M_DRAW", "M_PLAY", "M_ORDER" X }; X Xchar *playcard (), *sprint (); X Xdomove() X{ X reg PLAY *pp; X reg int i, j; X reg bool goodplay; X char *foo; X X pp = &Player[Play]; X if (Play == PLAYER) X getmove(); X else X calcmove(); X Next = FALSE; X goodplay = TRUE; X switch (Movetype) { X case M_DISCARD: Xtrydiscard: ; X if (haspicked(pp)) { X if (pp->hand[Card_no] == C_INIT) X if (Card_no == 6) X Finished = TRUE; X else X error("no card there"); X else { X Discard = pp->hand[Card_no]; X pp->hand[Card_no] = C_INIT; X#ifdef ANIMATE X animate_move (Play, ANIMATE_HAND, Card_no, X ANIMATE_DISC, Discard); X#endif X Next = TRUE; X if (Play == PLAYER) X account(Discard); X } X } X else X error("must pick first"); X break; X case M_REASONABLE: X case M_PLAY: X foo = playcard(pp); X if (foo) { X if (Movetype == M_REASONABLE) X goto trydiscard; X error (foo); X goodplay = 0; X } else X goodplay = 1; X break; X case M_DRAW: X Card_no = 0; X if (Topcard <= Deck) X error("no more cards"); X else if (haspicked(pp)) X error("already picked"); X else { X pp->hand[0] = *--Topcard; X#ifdef ANIMATE X animate_move (Play, ANIMATE_DECK, pp->hand[0], ANIMATE_HAND, 0); X#endif X if (Debug) X fprintf(outf, "DOMOVE: Draw %s\n", C_name[*Topcard]); Xacc: X if (Play == COMP) { X account(*Topcard); X if (issafety(*Topcard)) X pp->safety[*Topcard-S_CONV] = S_IN_HAND; X } X if (pp->hand[1] == C_INIT && Topcard > Deck) { X Card_no = 1; X pp->hand[1] = *--Topcard; X if (Debug) X fprintf(outf, "DOMOVE: Draw %s\n", C_name[*Topcard]); X goto acc; X } X pp->new_battle = FALSE; X pp->new_speed = FALSE; X } X break; X X case M_ORDER: X break; X } X /* X * move blank card to top by one of two methods. If the X * computer's hand was sorted, the randomness for picking X * between equally valued cards would be lost X */ X if (Order && Movetype != M_DRAW && goodplay && pp == &Player[PLAYER]) X sort(pp->hand); X else X for (i = 1; i < HAND_SZ; i++) X if (pp->hand[i] == C_INIT) { X for (j = 0; pp->hand[j] == C_INIT; j++) X if (j >= HAND_SZ) { X j = 0; X break; X } X pp->hand[i] = pp->hand[j]; X pp->hand[j] = C_INIT; X } X if (Topcard <= Deck) X check_go(); X if (Next) X nextplay(); X} X X/* X * Check and see if either side can go. If they cannot, X * the game is over X */ Xcheck_go() { X X reg CARD card; X reg PLAY *pp, *op; X reg int i; X X for (pp = Player; pp < &Player[2]; pp++) { X op = (pp == &Player[COMP] ? &Player[PLAYER] : &Player[COMP]); X for (i = 0; i < HAND_SZ; i++) { X card = pp->hand[i]; X if (issafety(card) || canplay(pp, op, card)) { X if (Debug) { X fprintf(outf, "CHECK_GO: can play %s (%d), ", C_name[card], card); X fprintf(outf, "issafety(card) = %d, ", issafety(card)); X fprintf(outf, "canplay(pp, op, card) = %d\n", canplay(pp, op, card)); X } X return; X } X else if (Debug) X fprintf(outf, "CHECK_GO: cannot play %s\n", X C_name[card]); X } X } X Finished = TRUE; X} X Xchar * Xplaycard(pp) Xreg PLAY *pp; X{ X reg int v; X reg CARD card; X X /* X * check and see if player has picked X */ X switch (pp->hand[Card_no]) { X default: X if (!haspicked(pp)) Xmustpick: X return ("must pick first"); X case C_GAS_SAFE: case C_SPARE_SAFE: X case C_DRIVE_SAFE: case C_RIGHT_WAY: X break; X } X X card = pp->hand[Card_no]; X if (Debug) X fprintf(outf, "PLAYCARD: Card = %s\n", C_name[card]); X Next = FALSE; X switch (card) { X case C_200: X if (pp->nummiles[C_200] == 2) X return ("only two 200's per hand"); X case C_100: case C_75: X if (pp->speed == C_LIMIT) X return ("limit of 50"); X case C_50: X if (pp->mileage + Value[card] > End) X return sprint ("puts you over %d", End); X case C_25: X if (!pp->can_go) X return ("cannot move now"); X#ifdef ANIMATE X animate_move (Play, ANIMATE_HAND, Card_no, ANIMATE_MILES, card); X#endif X pp->nummiles[card]++; X v = Value[card]; X pp->total += v; X pp->hand_tot += v; X if ((pp->mileage += v) == End) X check_ext(FALSE); X break; X X case C_GAS: case C_SPARE: case C_REPAIRS: X if (pp->battle != opposite(card)) X return sprint ("can't play \"%s\"", C_name[card]); X#ifdef ANIMATE X animate_move (Play, ANIMATE_HAND, Card_no, ANIMATE_BATTLE, card); X#endif X pp->battle = card; X if (pp->safety[S_RIGHT_WAY] == S_PLAYED) X pp->can_go = TRUE; X break; X X case C_GO: X if (pp->battle != C_INIT && pp->battle != C_STOP X && !isrepair(pp->battle)) X return sprint ("cannot play \"Go\" on a \"%s\"", X C_name[pp->battle]); X#ifdef ANIMATE X animate_move (Play, ANIMATE_HAND, Card_no, ANIMATE_BATTLE, card); X#endif X pp->battle = C_GO; X pp->can_go = TRUE; X break; X X case C_END_LIMIT: X if (pp->speed != C_LIMIT) X return ("not limited"); X#ifdef ANIMATE X animate_move (Play, ANIMATE_HAND, Card_no, ANIMATE_SPEED, card); X#endif X pp->speed = C_END_LIMIT; X break; X X case C_EMPTY: case C_FLAT: case C_CRASH: X case C_STOP: X pp = &Player[other(Play)]; X if (!pp->can_go) X return ("opponent cannot go"); X else if (pp->safety[safety(card) - S_CONV] == S_PLAYED) Xprotected: X return ("opponent is protected"); X#ifdef ANIMATE X animate_move (Play, ANIMATE_HAND, Card_no, ANIMATE_OBATTLE, card); X#endif X pp->battle = card; X pp->new_battle = TRUE; X pp->can_go = FALSE; X pp = &Player[Play]; X break; X X case C_LIMIT: X pp = &Player[other(Play)]; X if (pp->speed == C_LIMIT) X return ("opponent has limit"); X if (pp->safety[S_RIGHT_WAY] == S_PLAYED) X goto protected; X#ifdef ANIMATE X animate_move (Play, ANIMATE_HAND, Card_no, ANIMATE_OSPEED, card); X#endif X pp->speed = C_LIMIT; X pp->new_speed = TRUE; X pp = &Player[Play]; X break; X X case C_GAS_SAFE: case C_SPARE_SAFE: X case C_DRIVE_SAFE: case C_RIGHT_WAY: X if (pp->battle == opposite(card) X || (card == C_RIGHT_WAY && pp->speed == C_LIMIT)) { X if (!(card == C_RIGHT_WAY && !isrepair(pp->battle))) { X pp->battle = C_GO; X pp->can_go = TRUE; X } X if (card == C_RIGHT_WAY && pp->speed == C_LIMIT) X pp->speed = C_INIT; X if (pp->new_battle X || (pp->new_speed && card == C_RIGHT_WAY)) { X pp->coups[card - S_CONV] = TRUE; X pp->total += SC_COUP; X pp->hand_tot += SC_COUP; X pp->coupscore += SC_COUP; X } X } X /* X * if not coup, must pick first X */ X else if (pp->hand[0] == C_INIT && Topcard > Deck) X goto mustpick; X#ifdef ANIMATE X animate_move (Play, ANIMATE_HAND, Card_no, ANIMATE_SAFETY, card); X#endif X pp->safety[card - S_CONV] = S_PLAYED; X pp->total += SC_SAFETY; X pp->hand_tot += SC_SAFETY; X if ((pp->safescore += SC_SAFETY) == NUM_SAFE * SC_SAFETY) { X pp->total += SC_ALL_SAFE; X pp->hand_tot += SC_ALL_SAFE; X } X if (card == C_RIGHT_WAY) { X if (pp->speed == C_LIMIT) X pp->speed = C_INIT; X if (pp->battle == C_STOP || pp->battle == C_INIT) { X pp->can_go = TRUE; X pp->battle = C_INIT; X } X if (!pp->can_go && isrepair(pp->battle)) X pp->can_go = TRUE; X } X Next = -1; X break; X X case C_INIT: X Next = -1; X return ("no card there"); X break; X } X if (pp == &Player[PLAYER]) X account(card); X pp->hand[Card_no] = C_INIT; X Next = (Next == -1 ? FALSE : TRUE); X return 0; X} X Xchar * Xsprint (string, arg) X{ X static char buf[512]; X X sprintf (buf, string, arg); X return buf; X} X X/* X * return whether or not the player has picked X */ Xhaspicked(pp) Xreg PLAY *pp; { X X reg int card; X X if (Topcard <= Deck) X return TRUE; X switch (pp->hand[Card_no]) { X case C_GAS_SAFE: case C_SPARE_SAFE: X case C_DRIVE_SAFE: case C_RIGHT_WAY: X card = 1; X break; X default: X card = 0; X break; X } X return (pp->hand[card] != C_INIT); X} X Xaccount(card) Xreg CARD card; { X X reg CARD oppos; X X if (card == C_INIT) X return; X ++Numseen[card]; X if (Play == COMP) X switch (card) { X case C_GAS_SAFE: X case C_SPARE_SAFE: X case C_DRIVE_SAFE: X oppos = opposite(card); X Numgos += Numcards[oppos] - Numseen[oppos]; X break; X case C_CRASH: X case C_FLAT: X case C_EMPTY: X case C_STOP: X Numgos++; X break; X } X} X Xsort(hand) Xreg CARD *hand; X{ X reg CARD *cp, *tp; X reg int j; X reg CARD temp; X X cp = hand; X hand += HAND_SZ; X for ( ; cp < &hand[-1]; cp++) X for (tp = cp + 1; tp < hand; tp++) X if (*cp > *tp) { X temp = *cp; X *cp = *tp; X *tp = temp; X } X} END_OF_move.c if test 8310 -ne `wc -c <move.c`; then echo shar: \"move.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f print.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"print.c\" else echo shar: Extracting \"print.c\" \(65 characters\) sed "s/^X//" >print.c <<'END_OF_print.c' X# include "mille.h" X X/* X * @(#)print.c 1.1 (Berkeley) 4/1/82 X */ END_OF_print.c if test 65 -ne `wc -c <print.c`; then echo shar: \"print.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f roll.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"roll.c\" else echo shar: Extracting \"roll.c\" \(575 characters\) sed "s/^X//" >roll.c <<'END_OF_roll.c' X/* X * This routine rolls ndie nside-sided dice. X * X * @(#)roll.c 1.1 (Berkeley) 4/1/82 X * X */ X X# define reg register X X# ifndef vax X# define MAXRAND 32767L X Xroll(ndie, nsides) Xint ndie, nsides; { X X reg long tot; X reg unsigned n, r; X X tot = 0; X n = ndie; X while (n--) X tot += rand(); X return (int) ((tot * (long) nsides) / ((long) MAXRAND + 1)) + ndie; X} X X# else X Xroll(ndie, nsides) Xreg int ndie, nsides; { X X reg int tot, r; X reg double num_sides; X X num_sides = nsides; X tot = 0; X while (ndie--) X tot += (r = rand()) * (num_sides / 017777777777) + 1; X return tot; X} X# endif END_OF_roll.c if test 575 -ne `wc -c <roll.c`; then echo shar: \"roll.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f save.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"save.c\" else echo shar: Extracting \"save.c\" \(1815 characters\) sed "s/^X//" >save.c <<'END_OF_save.c' X#include "mille.h" X#include <sys/types.h> X#include <sys/stat.h> X#include <sys/time.h> X# ifdef attron X# include <term.h> X# define _tty cur_term->Nttyb X# endif attron X X/* X * @(#)save.c 1.4 (Berkeley) 7/3/83 X */ X Xtypedef struct stat STAT; Xtypedef struct tm TIME; X Xchar *ctime(); X Xint read(), write(); X X/* X * This routine saves the current game for use at a later date X */ Xextern int errno; Xextern char *sys_errlist[]; X Xsave() { X X reg char *sp; X reg int outf; X reg TIME *tp; X char buf[80]; X TIME tme; X STAT junk; X X tp = &tme; X if (Fromfile && getyn("Same file? ")) X strcpy(buf, Fromfile); X else { Xover: X X strcpy (buf, GetpromptedInput ("file: ")); X sp = buf + strlen (buf); X } X X /* X * check for existing files, and confirm overwrite if needed X */ X X if (sp == buf || (!Fromfile && stat(buf, &junk) > -1 X && getyn("Overwrite File? ") == FALSE)) X return FALSE; X X if ((outf = creat(buf, 0644)) < 0) { X error(sys_errlist[errno]); X return FALSE; X } X Error (buf); X time(tp); /* get current time */ X strcpy(buf, ctime(tp)); X for (sp = buf; *sp != '\n'; sp++) X continue; X *sp = '\0'; X varpush(outf, write); X close(outf); X return TRUE; X} X X/* X * This does the actual restoring. It returns TRUE if the X * backup was made on exiting, in which case certain things must X * be cleaned up before the game starts. X */ Xrest_f(file) Xreg char *file; { X X reg char *sp; X reg int inf; X char buf[80]; X STAT sbuf; X X if ((inf = open(file, 0)) < 0) { X perror(file); X exit(1); X } X if (fstat(inf, &sbuf) < 0) { /* get file stats */ X perror(file); X exit(1); X } X varpush(inf, read); X close(inf); X strcpy(buf, ctime(&sbuf.st_mtime)); X for (sp = buf; *sp != '\n'; sp++) X continue; X *sp = '\0'; X /* X * initialize some necessary values X */ X sprintf(Initstr, "%s [%s]\n", file, buf); X Fromfile = file; X return !On_exit; X} END_OF_save.c if test 1815 -ne `wc -c <save.c`; then echo shar: \"save.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f table.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"table.c\" else echo shar: Extracting \"table.c\" \(431 characters\) sed "s/^X//" >table.c <<'END_OF_table.c' X# define DEBUG X X/* X * @(#)table.c 1.1 (Berkeley) 4/1/82 X */ X X# include "mille.h" X Xmain() { X X reg int i, j, count; X X printf(" %16s -> %5s %5s %4s %s\n", "Card", "cards", "count", "need", "opposite"); X for (i = 0; i < NUM_CARDS - 1; i++) { X for (j = 0, count = 0; j < DECK_SZ; j++) X if (Deck[j] == i) X count++; X printf("%2d %16s -> %5d %5d %4d %s\n", i, C_name[i], Numcards[i], count, Numneed[i], C_name[opposite(i)]); X } X} END_OF_table.c if test 431 -ne `wc -c <table.c`; then echo shar: \"table.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f types.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"types.c\" else echo shar: Extracting \"types.c\" \(597 characters\) sed "s/^X//" >types.c <<'END_OF_types.c' X# include "mille.h" X X/* X * @(#)types.c 1.1 (Berkeley) 4/1/82 X */ X Xisrepair(card) Xreg CARD card; { X X return card == C_GAS || card == C_SPARE || card == C_REPAIRS || card == C_INIT; X} X Xsafety(card) Xreg CARD card; { X X switch (card) { X case C_EMPTY: X case C_GAS: X case C_GAS_SAFE: X return C_GAS_SAFE; X case C_FLAT: X case C_SPARE: X case C_SPARE_SAFE: X return C_SPARE_SAFE; X case C_CRASH: X case C_REPAIRS: X case C_DRIVE_SAFE: X return C_DRIVE_SAFE; X case C_GO: X case C_STOP: X case C_RIGHT_WAY: X case C_LIMIT: X case C_END_LIMIT: X return C_RIGHT_WAY; X } X /* NOTREACHED */ X} END_OF_types.c if test 597 -ne `wc -c <types.c`; then echo shar: \"types.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f ui.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"ui.h\" else echo shar: Extracting \"ui.h\" \(2948 characters\) sed "s/^X//" >ui.h <<'END_OF_ui.h' X# include "color.h" X# include <X/Xlib.h> X# include "control/control.h" X Xextern Window xwindow; Xextern FontInfo *font; Xextern Bitmap fill; X Xstruct plane { X Bitmap bits; X int pixel; X}; X Xstruct card { X int nPlanes; X struct plane planes[5]; X}; X Xextern struct card cards[]; Xextern struct card backside; Xextern struct card eraseCard; X X Xstruct safety_offset { X int x; X int y; X}; X Xextern struct safety_offset safety_offsets[4]; X X# define PAD_CARD (5) X# define MILE_OFFSET (5) X# define PAD_TEXT (20) X# define DIST_HEIGHT (15) X# define DIST_WIDTH ((WIDTH + PAD_CARD) * 5 - PAD_CARD) X# define DIST_MARK (4) X X# define COMP_HAND_X (PAD_CARD) X# define COMP_HAND_Y (-HEIGHT) X# define COMP_DIST_TX (PAD_CARD + (WIDTH + PAD_CARD) * 2) X# define COMP_DIST_TY (PAD_CARD) X# define COMP_DIST_MX (COMP_DIST_TX) X# define COMP_DIST_MY (COMP_DIST_TY + PAD_TEXT) X# define COMP_DIST_X (COMP_DIST_MX) X# define COMP_DIST_Y (COMP_DIST_MY + DIST_MARK + 1) X X# define COMP_PLAY_X PAD_CARD X# define COMP_PLAY_Y (COMP_DIST_Y + DIST_HEIGHT + PAD_CARD) X X# define COMP_SAFE_X (COMP_PLAY_X + ((WIDTH + PAD_CARD) * 7)) X# define COMP_SAFE_Y COMP_PLAY_Y X X# define COMP_CARD_TX PAD_CARD X# define COMP_CARD_TY (COMP_PLAY_Y + HEIGHT + 6 * MILE_OFFSET + PAD_CARD) X# define COMP_CARD_X COMP_CARD_TX X# define COMP_CARD_Y (COMP_CARD_TY + PAD_TEXT) X X# define MESS_X (PAD_CARD) X# define MESS_Y (COMP_PLAY_Y + HEIGHT + 6 * MILE_OFFSET + PAD_CARD + PAD_TEXT) X# define MESS_W 150 X# define MESS_H (font->height) X# define PROMPT_X MESS_X X# define PROMPT_Y (MESS_Y + PAD_TEXT) X# define PROMPT_W (MESS_W) X# define PROMPT_H (MESS_H) X# define ERROR_X PROMPT_X X# define ERROR_Y (PROMPT_Y + PAD_TEXT) X# define ERROR_W (MESS_W) X# define ERROR_H (MESS_H) X X# define QUIT_X (MESS_X) X# define QUIT_Y (ERROR_Y + PAD_TEXT + PAD_CARD) X# define SAVE_X (QUIT_X + 75) X# define SAVE_Y (QUIT_Y) X X# define DISCARD_TX (MESS_X + MESS_W + PAD_CARD) X# define DISCARD_TY (MESS_Y - PAD_TEXT) X# define DISCARD_X (DISCARD_TX) X# define DISCARD_Y (DISCARD_TY + PAD_TEXT) X X# define DECK_TX (DISCARD_X + WIDTH + PAD_CARD) X# define DECK_TY (DISCARD_TY) X# define DECK_X (DECK_TX) X# define DECK_Y (DISCARD_Y) X X# define SCORE_W (100) X# define SCORE_H (font->height) X# define SCORE_N 13 X# define SCORE_X (DECK_X + WIDTH + PAD_CARD + SCORE_W) X# define SCORE_Y (DECK_TY) X X# define HUM_DIST_TX (COMP_DIST_TX) X# define HUM_DIST_TY (SCORE_Y + SCORE_N * SCORE_H + PAD_CARD) X# define HUM_DIST_MX (HUM_DIST_TX) X# define HUM_DIST_MY (HUM_DIST_TY + PAD_TEXT) X# define HUM_DIST_X (HUM_DIST_MX) X# define HUM_DIST_Y (HUM_DIST_MY + DIST_MARK + 1) X X# define HUM_PLAY_X PAD_CARD X# define HUM_PLAY_Y (HUM_DIST_Y + DIST_HEIGHT + PAD_CARD) X# define HUM_SAFE_X (HUM_PLAY_X + ((WIDTH + PAD_CARD) * 7)) X# define HUM_SAFE_Y (HUM_PLAY_Y) X X# define HUM_HAND_X PAD_CARD X# define HUM_HAND_Y (HUM_PLAY_Y + HEIGHT + 6 * MILE_OFFSET + PAD_CARD) X X# define WINDOW_WIDTH (HUM_SAFE_X + (WIDTH + PAD_CARD) * 2) X# define WINDOW_HEIGHT (HUM_HAND_Y + HEIGHT + PAD_CARD) END_OF_ui.h if test 2948 -ne `wc -c <ui.h`; then echo shar: \"ui.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f varpush.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"varpush.c\" else echo shar: Extracting \"varpush.c\" \(1170 characters\) sed "s/^X//" >varpush.c <<'END_OF_varpush.c' X# include "mille.h" X X/* X * @(#)varpush.c 1.1 (Berkeley) 4/1/82 X */ X Xint read(), write(); X X/* X * push variables around via the routine func() on the file X * channel file. func() is either read or write. X */ Xvarpush(file, func) Xreg int file; Xreg int (*func)(); { X X int temp; X X (*func)(file, &Debug, sizeof Debug); X (*func)(file, &Finished, sizeof Finished); X (*func)(file, &Order, sizeof Order); X (*func)(file, &End, sizeof End); X (*func)(file, &On_exit, sizeof On_exit); X (*func)(file, &Handstart, sizeof Handstart); X (*func)(file, &Numgos, sizeof Numgos); X (*func)(file, Numseen, sizeof Numseen); X (*func)(file, &Play, sizeof Play); X (*func)(file, &WIndow, sizeof WIndow); X (*func)(file, Deck, sizeof Deck); X (*func)(file, &Discard, sizeof Discard); X (*func)(file, Player, sizeof Player); X if (func == read) { X read(file, &temp, sizeof temp); X Topcard = &Deck[temp]; X if (Debug) { X char buf[80]; Xover: X printf("Debug file:"); X gets(buf); X if ((outf = fopen(buf, "w")) == NULL) { X perror(buf); X goto over; X } X if (strcmp(buf, "/dev/null") != 0) X setbuf(outf, 0); X } X } X else { X temp = Topcard - Deck; X write(file, &temp, sizeof temp); X } X} END_OF_varpush.c if test 1170 -ne `wc -c <varpush.c`; then echo shar: \"varpush.c\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of archive 2 \(of 3\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 3 archives. echo "Now uudecode and uncompress 'cards.Z.uu' and feed to sh" 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