home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
games
/
xmille.zip
/
XMILLE1.3
< prev
next >
Wrap
Text File
|
1987-07-05
|
61KB
|
2,384 lines
Article 42 of comp.sources.games:
Path: ncrcce!rd1632!ncrlnk!ncrcae!hubcap!gatech!mcnc!seismo!rutgers!mit-eddie!uw-beaver!tektronix!tekgen!tekred!games-request
From: games-request@tekred.TEK.COM
Newsgroups: comp.sources.games
Subject: v01i068: xmille - mille bournes for X-windows, Part01/03
Message-ID: <1358@tekred.TEK.COM>
Date: 30 Jun 87 17:27:12 GMT
Expires: 30 Jul 87 17:19:24 GMT
Sender: billr@tekred.TEK.COM
Lines: 2369
Approved: billr@tekred.TEK.COM
Submitted by: keithp@copper.TEK.COM (Keith Packard)
Comp.sources.games: Volume 1, Issue 68
Archive-name: xmille/Part01
[The following note is from the author... -br]
[Well, after a letter arrived from Ken Arnold, I found out
that these sources are public domain, so I'm posting the
whole mess.
This and the next two articles make up xmille - a mille
bournes program that has a fun user-interface. The last
article will be a uuencoded compress'ed shar file. I know
this sounds a bit silly, but in compressed form it's only
60K while in uncompressed form it's 600K, about what you'd
expect from bitmaps. So, you'll need to uudecode and
uncompress it and *then* un-shar it. Make a directory,
un-shar the files in it and type 'make'. Then fix the
porting problems and flame me for a crummy distribution.
I'll ignore those.
Don't spend too much time playing, your manager will start
to suspect things when you start talking about
'coup-fourre's' in meetings...
keith packard keithp@copper.tek.com]
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 1 (of 3)."
# Contents: README MANIFEST comp.c control curses_ui.c drawcard.c
# end.c fill ui.c
# Wrapped by billr@tekred on Mon Jun 29 17:24:34 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f README -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"README\"
else
echo shar: Extracting \"README\" \(736 characters\)
sed "s/^X//" >README <<'END_OF_README'
XNotes on porting xmille:
X
X The bitmaps in 'cards' are set up for a color display, they probably
Xwill not be readable in monocrome without a bit of editing. Also, the
Xcard display routines insist on color, so those will need fixing as well.
X
X The major porting headache of mille is roll.c. You'll probably
Xhave to fix it for your machine, it's terrible now -- but that's what came
Xwith it and it works on *my* machine...
X
X I'll cheerfully accept bug reports in xmille, and may even be
Xwilling to maintain a current version; but I wash my hands of this mess by
Xputting it into the public domain, I don't care what you do with it.
X
X May 28, 1987
X
X keith packard
X
X keithp@copper.tek.com (at least for now)
X
X reed!dinadan!keith (at home)
X
END_OF_README
if test 736 -ne `wc -c <README`; then
echo shar: \"README\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f MANIFEST -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"MANIFEST\"
else
echo shar: Extracting \"MANIFEST\" \(974 characters\)
sed "s/^X//" >MANIFEST <<'END_OF_MANIFEST'
File Name Archive # Description
-----------------------------------------------------------
MANIFEST 1 This shipping list
Makefile 2
README 1
animate.c 2
background.h 2
card.h 2
cards.Z.uu 3 compressed shar file of bitmaps
color.h 2
comp.c 1
control 1
curses_ui.c 1
drawcard.c 1
end.c 1
extern.c 2
fill 1
init.c 2
mille.c 2
mille.h 2
misc.c 2
move.c 2
print.c 2
roll.c 2
save.c 2
table.c 2
types.c 2
ui.c 1
ui.h 2
varpush.c 2
END_OF_MANIFEST
if test 974 -ne `wc -c <MANIFEST`; then
echo shar: \"MANIFEST\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f comp.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"comp.c\"
else
echo shar: Extracting \"comp.c\" \(9582 characters\)
sed "s/^X//" >comp.c <<'END_OF_comp.c'
X# include "mille.h"
X
X/*
X * @(#)comp.c 1.1 (Berkeley) 4/1/82
X */
X
X# define V_VALUABLE 40
X
Xcalcmove() {
X
X reg CARD card;
X reg int *value;
X reg PLAY *pp, *op;
X reg bool foundend, cango, canstop, foundlow;
X reg unsgn int i, count200, badcount, nummin, nummax, diff;
X reg int curmin, curmax;
X reg CARD safe, oppos;
X int valbuf[HAND_SZ], count[NUM_CARDS];
X bool playit[HAND_SZ];
X
X Message ("");
X pp = &Player[COMP];
X op = &Player[PLAYER];
X safe = 0;
X cango = 0;
X canstop = FALSE;
X foundend = FALSE;
X for (i = 0; i < NUM_CARDS; i++)
X count[i] = 0;
X for (i = 0; i < HAND_SZ; i++) {
X card = pp->hand[i];
X switch (card) {
X case C_STOP: case C_CRASH:
X case C_FLAT: case C_EMPTY:
X if (playit[i] = canplay(pp, op, card))
X canstop = TRUE;
X goto norm;
X case C_LIMIT:
X if ((playit[i] = canplay(pp, op, card))
X && Numseen[C_25] == Numcards[C_25]
X && Numseen[C_50] == Numcards[C_50])
X canstop = TRUE;
X goto norm;
X case C_25: case C_50: case C_75:
X case C_100: case C_200:
X if ((playit[i] = canplay(pp, op, card))
X && pp->mileage + Value[card] == End)
X foundend = TRUE;
X goto norm;
X default:
X playit[i] = canplay(pp, op, card);
Xnorm:
X if (playit[i])
X ++cango;
X break;
X case C_GAS_SAFE: case C_DRIVE_SAFE:
X case C_SPARE_SAFE: case C_RIGHT_WAY:
X if (pp->battle == opposite(card)
X || (pp->speed == C_LIMIT && card == C_RIGHT_WAY)) {
X Movetype = M_PLAY;
X Card_no = i;
X return;
X }
X ++safe;
X playit[i] = TRUE;
X break;
X }
X ++count[card];
X }
X if (pp->hand[0] == C_INIT && Topcard > Deck) {
X Movetype = M_DRAW;
X return;
X }
X if (Debug)
X fprintf(outf, "CALCMOVE: cango = %d, canstop = %d, safe = %d\n", cango, canstop, safe);
X if (foundend)
X foundend = !check_ext(TRUE);
X for (i = 0; safe && i < HAND_SZ; i++) {
X if (issafety(pp->hand[i])) {
X if (onecard(op) || (foundend && cango && !canstop)) {
X if (Debug)
X fprintf(outf, "CALCMOVE: onecard(op) = %d, foundend = %d\n", onecard(op), foundend);
Xplaysafe:
X Movetype = M_PLAY;
X Card_no = i;
X return;
X }
X oppos = opposite(pp->hand[i]);
X if (Numseen[oppos] == Numcards[oppos])
X goto playsafe;
X else if (!cango
X && (op->can_go || !pp->can_go || Topcard < Deck)) {
X card = (Topcard - Deck) - roll(1, 10);
X if ((!pp->mileage) != (!op->mileage))
X card -= 7;
X if (Debug)
X fprintf(outf, "CALCMOVE: card = %d, DECK_SZ / 4 = %d\n", card, DECK_SZ / 4);
X if (card < DECK_SZ / 4)
X goto playsafe;
X }
X safe--;
X playit[i] = cango;
X }
X }
X if (!pp->can_go && !isrepair(pp->battle))
X Numneed[opposite(pp->battle)]++;
Xredoit:
X foundlow = (cango || count[C_END_LIMIT] != 0
X || Numseen[C_LIMIT] == Numcards[C_LIMIT]
X || pp->safety[S_RIGHT_WAY] != S_UNKNOWN);
X foundend = FALSE;
X count200 = pp->nummiles[C_200];
X badcount = 0;
X curmax = -1;
X curmin = 101;
X nummin = -1;
X nummax = -1;
X value = valbuf;
X for (i = 0; i < HAND_SZ; i++) {
X card = pp->hand[i];
X if (issafety(card) || playit[i] == (cango != 0)) {
X if (Debug)
X fprintf(outf, "CALCMOVE: switch(\"%s\")\n", C_name[card]);
X switch (card) {
X case C_25: case C_50:
X diff = End - pp->mileage;
X /* avoid getting too close */
X if (Topcard > Deck && cango && diff <= 100
X && diff / Value[card] > count[card]
X && (card == C_25 || diff % 50 == 0)) {
X if (card == C_50 && diff - 50 == 25
X && count[C_25] > 0)
X goto okay;
X *value = 0;
X if (--cango <= 0)
X goto redoit;
X break;
X }
Xokay:
X *value = (Value[card] >> 3);
X if (pp->speed == C_LIMIT)
X ++*value;
X else
X --*value;
X if (!foundlow
X && (card == C_50 || count[C_50] == 0)) {
X *value = (pp->mileage ? 10 : 20);
X foundlow = TRUE;
X }
X goto miles;
X case C_200:
X if (++count200 > 2) {
X *value = 0;
X break;
X }
X case C_75: case C_100:
X *value = (Value[card] >> 3);
X if (pp->speed == C_LIMIT)
X --*value;
X else
X ++*value;
Xmiles:
X if (pp->mileage + Value[card] > End)
X *value = (End == 700 ? card : 0);
X else if (pp->mileage + Value[card] == End) {
X *value = (foundend ? card : V_VALUABLE);
X foundend = TRUE;
X }
X break;
X case C_END_LIMIT:
X if (pp->safety[S_RIGHT_WAY] != S_UNKNOWN)
X *value = (pp->safety[S_RIGHT_WAY] == S_PLAYED ? -1 : 1);
X else if (pp->speed == C_LIMIT && End - pp->mileage <= 50)
X *value = 1;
X else if (pp->speed == C_LIMIT
X || Numseen[C_LIMIT] != Numcards[C_LIMIT]) {
X safe = S_RIGHT_WAY;
X oppos = C_LIMIT;
X goto repair;
X }
X else {
X *value = 0;
X --count[C_END_LIMIT];
X }
X break;
X case C_REPAIRS: case C_SPARE: case C_GAS:
X safe = safety(card) - S_CONV;
X oppos = opposite(card);
X if (pp->safety[safe] != S_UNKNOWN)
X *value = (pp->safety[safe] == S_PLAYED ? -1 : 1);
X else if (pp->battle != oppos
X && (Numseen[oppos] == Numcards[oppos] || Numseen[oppos] + count[card] > Numcards[oppos])) {
X *value = 0;
X --count[card];
X }
X else {
Xrepair:
X *value = Numcards[oppos] * 6;
X *value += (Numseen[card] - Numseen[oppos]);
X if (!cango)
X *value /= (count[card]*count[card]);
X count[card]--;
X }
X break;
X case C_GO:
X if (pp->safety[S_RIGHT_WAY] != S_UNKNOWN)
X *value = (pp->safety[S_RIGHT_WAY] == S_PLAYED ? -1 : 2);
X else if (pp->can_go
X && Numgos + count[C_GO] == Numneed[C_GO]) {
X *value = 0;
X --count[C_GO];
X }
X else {
X *value = Numneed[C_GO] * 3;
X *value += (Numseen[C_GO] - Numgos);
X *value /= (count[C_GO] * count[C_GO]);
X count[C_GO]--;
X }
X break;
X case C_LIMIT:
X if (op->mileage + 50 >= End) {
X *value = (End == 700 && !cango);
X break;
X }
X if (canstop || (cango && !op->can_go))
X *value = 1;
X else {
X *value = (pp->safety[S_RIGHT_WAY] != S_UNKNOWN ? 2 : 3);
X safe = S_RIGHT_WAY;
X oppos = C_END_LIMIT;
X goto normbad;
X }
X break;
X case C_CRASH: case C_EMPTY: case C_FLAT:
X safe = safety(card) - S_CONV;
X oppos = opposite(card);
X *value = (pp->safety[safe]!=S_UNKNOWN ? 3 : 4);
Xnormbad:
X if (op->safety[safe] == S_PLAYED)
X *value = -1;
X else {
X *value *= (Numneed[oppos] + Numseen[oppos] + 2);
X if (!pp->mileage || foundend || onecard(op))
X *value += 5;
X if (op->mileage == 0 || onecard(op))
X *value += 5;
X if (op->speed == C_LIMIT)
X *value -= 3;
X if (cango && pp->safety[safe] != S_UNKNOWN)
X *value += 3;
X if (!cango)
X *value /= ++badcount;
X }
X break;
X case C_STOP:
X if (op->safety[S_RIGHT_WAY] == S_PLAYED)
X *value = -1;
X else {
X *value = (pp->safety[S_RIGHT_WAY] != S_UNKNOWN ? 3 : 4);
X *value *= (Numcards[C_STOP] + Numseen[C_GO]);
X if (!pp->mileage || foundend || onecard(op))
X *value += 5;
X if (!cango)
X *value /= ++badcount;
X if (op->mileage == 0)
X *value += 5;
X if ((card == C_LIMIT
X && op->speed == C_LIMIT) || (!op->can_go))
X *value -= 5;
X if (cango && pp->safety[S_RIGHT_WAY] != S_UNKNOWN)
X *value += 5;
X }
X break;
X case C_GAS_SAFE: case C_DRIVE_SAFE:
X case C_SPARE_SAFE: case C_RIGHT_WAY:
X *value = cango ? 0 : 101;
X break;
X case C_INIT:
X *value = 0;
X }
X }
X else
X *value = cango ? 0 : 101;
X if (card != C_INIT) {
X if (*value >= curmax) {
X nummax = i;
X curmax = *value;
X }
X if (*value <= curmin) {
X nummin = i;
X curmin = *value;
X }
X }
X if (Debug)
X debug(i, "%3d %-14s",*value,C_name[pp->hand[i]]);
X value++;
X }
X if (!pp->can_go && !isrepair(pp->battle))
X Numneed[opposite(pp->battle)]++;
X if (cango) {
X ComputerStatus ("PLAY\n");
X if (Debug)
X getmove();
X if (!Debug || Movetype == M_DRAW) {
X Movetype = M_PLAY;
X Card_no = nummax;
X }
X }
X else {
X ComputerStatus ("DISCARD\n");
X if (Debug)
X getmove();
X if (!Debug || Movetype == M_DRAW) {
X Movetype = M_DISCARD;
X Card_no = nummin;
X }
X }
X ComputerCard (pp->hand[Card_no]);
X}
X
Xonecard(pp)
Xreg PLAY *pp; {
X
X reg CARD bat, spd, card;
X
X bat = pp->battle;
X spd = pp->speed;
X card = -1;
X if (pp->can_go || ((isrepair(bat) || bat == C_STOP
X || spd == C_LIMIT) && Numseen[S_RIGHT_WAY] != 0)
X || Numseen[safety(bat)] != 0)
X switch (End - pp->mileage) {
X case 200:
X if (pp->nummiles[C_200] == 2)
X return FALSE;
X card = C_200;
X case 100:
X case 75:
X if (card == -1)
X card = (End - pp->mileage == 75 ? C_75 : C_100);
X if (spd == C_LIMIT)
X return Numseen[S_RIGHT_WAY] == 0;
X case 50:
X case 25:
X if (card == -1)
X card = (End - pp->mileage == 25 ? C_25 : C_50);
X return Numseen[card] != Numcards[card];
X }
X return FALSE;
X}
X
Xcanplay(pp, op, card)
Xreg PLAY *pp, *op;
Xreg CARD card; {
X
X switch (card) {
X case C_200:
X if (pp->nummiles[C_200] == 2)
X break;
X case C_75: case C_100:
X if (pp->speed == C_LIMIT)
X break;
X case C_50:
X if (pp->mileage + Value[card] > End)
X break;
X case C_25:
X if (pp->can_go)
X return TRUE;
X break;
X case C_EMPTY: case C_FLAT: case C_CRASH:
X case C_STOP:
X if (op->can_go && op->safety[safety(card) - S_CONV] != S_PLAYED)
X return TRUE;
X break;
X case C_LIMIT:
X if (op->speed != C_LIMIT && op->safety[S_RIGHT_WAY] != S_PLAYED
X && op->mileage + 50 < End)
X return TRUE;
X break;
X case C_GAS: case C_SPARE: case C_REPAIRS:
X if (pp->battle == opposite(card))
X return TRUE;
X break;
X case C_GO:
X if (!pp->can_go
X && (isrepair(pp->battle) || pp->battle == C_STOP))
X return TRUE;
X break;
X case C_END_LIMIT:
X if (pp->speed == C_LIMIT)
X return TRUE;
X }
X return FALSE;
X}
END_OF_comp.c
if test 9582 -ne `wc -c <comp.c`; then
echo shar: \"comp.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test ! -d control ; then
echo shar: Creating directory \"control\"
mkdir control
fi
if test -f curses_ui.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"curses_ui.c\"
else
echo shar: Extracting \"curses_ui.c\" \(10994 characters\)
sed "s/^X//" >curses_ui.c <<'END_OF_curses_ui.c'
X/*
X * ui.c
X *
X * curses interface routines for mille
X */
X
X# include "mille.h"
X#undef TRUE
X#undef FALSE
X# include "ui.h"
X#ifdef CTRL
X# undef CTRL
X#endif
X#define CTRL(x) (x - 'A' + 1)
X
XWINDOW *Board, *Miles, *Score;
X
Xchar *C_fmt = "%-18.18s"; /* format for printing cards */
Xchar Initstr[100]; /* initial string for error field */
Xchar *_cn[NUM_CARDS] = { /* Card name buffer */
X "",
X "25",
X "50",
X "75",
X "100",
X "200",
X "Out of Gas",
X "Flat Tire",
X "Accident",
X "Stop",
X "Speed Limit",
X "Gasoline",
X "Spare Tire",
X "Repairs",
X "Go",
X "End of Limit",
X "Extra Tank",
X "Puncture Proof",
X "Driving Ace",
X "Right of Way"
X },
X **C_name = &_cn[1]; /* Card names */
X
XMessage (string)
Xchar *string;
X{
X wmove (Score, ERR_Y, ERR_X);
X waddstr (Score, string);
X wclrtoeol (Score);
X}
X
Xdebug (pos, string, a0, a1, a2)
X{
X mvprintw (pos+6, 2, string, a0, a1, a2);
X}
X
XComputerStatus (string)
X{
X mvaddstr (MOVE_Y + 1, MOVE_X, string);
X}
X
XComputerCard (type)
Xint type;
X{
X mvprintw (MOVE_Y + 2, MOVE_X, "%16s", C_name[type]);
X}
X
X
XPrompt (string)
Xchar *string;
X{
X mvaddstr (MOVE_Y, MOVE_X, string);
X clrtoeol ();
X refresh ();
X}
X
Xchar *
XGetpromptedInput (string)
Xchar *string;
X{
X static char buf[1024];
X char *sp;
X
X sp = buf;
X Prompt (string);
X leaveok (Board, FALSE);
X while ((*sp = readch()) != '\n') {
X if (*sp == _tty.sg_kill) {
X sp = buf;
X break;
X }
X else if (*sp == _tty.sg_erase) {
X if (--sp < buf)
X sp = buf;
X else {
X addch('\b');
X /*
X * if the previous char was a control
X * char, cover up two characters.
X */
X if (*sp < ' ')
X addch('\b');
X clrtoeol();
X }
X }
X else
X addstr(unctrl(*sp++));
X refresh();
X }
X *sp = '\0';
X leaveok (Board, TRUE);
X return buf;
X}
X
Xnewboard()
X{
X werase(Board);
X werase(Score);
X mvaddstr(5, 0, "--HAND--");
X mvaddch(6, 0, 'P');
X mvaddch(7, 0, '1');
X mvaddch(8, 0, '2');
X mvaddch(9, 0, '3');
X mvaddch(10, 0, '4');
X mvaddch(11, 0, '5');
X mvaddch(12, 0, '6');
X mvaddstr(13, 0, "--BATTLE--");
X mvaddstr(15, 0, "--SPEED--");
X mvaddstr(5, 20, "--DECK--");
X mvaddstr(7, 20, "--DISCARD--");
X mvaddstr(13, 20, "--BATTLE--");
X mvaddstr(15, 20, "--SPEED--");
X wmove(Miles, 0, 0);
X if (winch(Miles) != '-') {
X werase(Miles);
X mvwaddstr(Miles, 0, 0, "--MILEAGE--");
X mvwaddstr(Miles, 0, 41, "--MILEAGE--");
X }
X else {
X wmove(Miles, 1, 0);
X wclrtobot(Miles);
X }
X newscore();
X stdscr = Board;
X}
X
Xnewscore() {
X
X reg int i;
X
X stdscr = Score;
X move(0, 22);
X if (inch() != 'Y') {
X erase();
X mvaddstr(0, 22, "You Comp Value");
X mvaddstr(1, 2, "Milestones Played");
X mvaddstr(2, 8, "Each Safety");
X mvaddstr(3, 5, "All 4 Safeties");
X mvaddstr(4, 3, "Each Coup Fourre");
X mvaddstr(2, 37, "100");
X mvaddstr(3, 37, "300");
X mvaddstr(4, 37, "300");
X }
X else {
X move(5, 1);
X clrtobot();
X }
X for (i = 0; i < SCORE_Y; i++)
X mvaddch(i, 0, '|');
X move(SCORE_Y - 1, 1);
X while (addch('_') != ERR)
X continue;
X if (WIndow == W_FULL || Finished) {
X mvaddstr(5, 5, "Trip Completed");
X mvaddstr(6, 10, "Safe Trip");
X mvaddstr(7, 5, "Delayed Action");
X mvaddstr(8, 10, "Extension");
X mvaddstr(9, 11, "Shut-Out");
X mvaddstr(10, 21, "---- ---- -----");
X mvaddstr(11, 9, "Hand Total");
X mvaddstr(12, 20, "----- -----");
X mvaddstr(13, 6, "Overall Total");
X mvaddstr(14, 15, "Games");
X mvaddstr(5, 37, "400");
X mvaddstr(6, 37, "300");
X mvaddstr(7, 37, "300");
X mvaddstr(8, 37, "200");
X mvaddstr(9, 37, "500");
X }
X else {
X mvaddstr(5, 21, "---- ---- -----");
X mvaddstr(6, 9, "Hand Total");
X mvaddstr(7, 20, "----- -----");
X mvaddstr(8, 6, "Overall Total");
X mvaddstr(9, 15, "Games");
X mvaddstr(11, 2, "p: pick");
X mvaddstr(12, 2, "u: use #");
X mvaddstr(13, 2, "d: discard #");
X mvaddstr(14, 2, "w: toggle window");
X mvaddstr(11, 21, "q: quit");
X mvaddstr(12, 21, "o: order hand");
X mvaddstr(13, 21, "s: save");
X mvaddstr(14, 21, "r: reprint");
X }
X stdscr = Board;
X}
X
Xinit_ui ()
X{
X initscr();
X# ifdef attron
X# define CA cursor_address
X# endif
X if (!CA) {
X printf("Sorry. Need cursor addressing to play mille\n");
X exit(-1);
X }
X delwin(stdscr);
X stdscr = Board = newwin(BOARD_Y, BOARD_X, 0, 0);
X Score = newwin(SCORE_Y, SCORE_X, 0, 40);
X Miles = newwin(MILES_Y, MILES_X, 17, 0);
X#ifdef attron
X idlok(Board, TRUE);
X idlok(Score, TRUE);
X idlok(Miles, TRUE);
X#endif
X leaveok(Score, TRUE);
X leaveok(Miles, TRUE);
X clearok(curscr, TRUE);
X crmode();
X noecho();
X}
X
XError (string, arg)
Xchar *string;
X{
X stdscr = Score;
X mvprintw (Score, ERR_Y, ERR_X, string, arg);
X clrtoeol ();
X stdscr = Board;
X}
X
Xfinish_ui ()
X{
X mvcur(0, COLS - 1, LINES - 1, 0);
X endwin();
X}
X
Xupdate_ui ()
X{
X refresh ();
X}
X
XBeep ()
X{
X putchar ('\007');
X}
X
XCARD
Xgetcard()
X{
X reg char c, c1;
X
X for (;;) {
X while ((c = readch()) == '\n' || c == '\r' || c == ' ')
X continue;
X if (islower(c))
X c = toupper(c);
X if (c == _tty.sg_kill || c == _tty.sg_erase)
X return -1;
X addstr(unctrl(c));
X clrtoeol();
X switch (c) {
X case '1': case '2': case '3':
X case '4': case '5': case '6':
X c -= '0';
X break;
X case '0': case 'P': case 'p':
X c = 0;
X break;
X default:
X putchar('');
X addch('\b');
X if (!isprint(c))
X addch('\b');
X c = -1;
X break;
X }
X refresh();
X if (c >= 0) {
X while ((c1=readch()) != '\r' && c1 != '\n' && c1 != ' ')
X if (c1 == _tty.sg_kill)
X return -1;
X else if (c1 == _tty.sg_erase) {
X addch('\b');
X clrtoeol();
X refresh();
X goto cont;
X }
X else
X write(0, "", 1);
X return c;
X }
Xcont: ;
X }
X}
X
X
X/*
X * Get a yes or no answer to the given question. Saves are
X * also allowed. Return TRUE if the answer was yes, FALSE if no.
X */
Xgetyn(prompt)
Xreg char *prompt; {
X
X reg char c;
X
X Saved = FALSE;
X for (;;) {
X leaveok(Board, FALSE);
X mvaddstr(MOVE_Y, MOVE_X, prompt);
X clrtoeol();
X refresh();
X switch (c = readch()) {
X case 'n': case 'N':
X addch('N');
X refresh();
X leaveok(Board, TRUE);
X return FALSE;
X case 'y': case 'Y':
X addch('Y');
X refresh();
X leaveok(Board, TRUE);
X return TRUE;
X case 's': case 'S':
X addch('S');
X refresh();
X Saved = save();
X continue;
X default:
X addstr(unctrl(c));
X refresh();
X putchar('');
X break;
X }
X }
X}
X
Xreadch()
X{
X reg int cnt;
X static char c;
X
X for (cnt = 0; read(0, &c, 1) <= 0; cnt++)
X if (cnt > 100)
X exit(1);
X return c;
X}
X
X
Xgetmove()
X{
X reg char c, *sp;
X static char moveprompt[] = ">>:Move:";
X#ifdef EXTRAP
X static bool last_ex = FALSE; /* set if last command was E */
X
X if (last_ex) {
X undoex();
X prboard();
X last_ex = FALSE;
X }
X#endif
X for (;;) {
X stand(MOVE_Y, MOVE_X, moveprompt);
X clrtoeol();
X move(MOVE_Y, MOVE_X + sizeof moveprompt);
X leaveok(Board, FALSE);
X refresh();
X while ((c = readch()) == _tty.sg_kill || c == _tty.sg_erase)
X continue;
X if (islower(c))
X c = toupper(c);
X if (isprint(c) && !isspace(c)) {
X addch(c);
X refresh();
X }
X switch (c)
X {
X case 'P': /* Pick */
X Movetype = M_DRAW;
X goto ret;
X case 'U': /* Use Card */
X case 'D': /* Discard Card */
X if ((Card_no = getcard()) < 0)
X break;
X Movetype = (c == 'U' ? M_PLAY : M_DISCARD);
X goto ret;
X case 'O': /* Order */
X Order = !Order;
X Movetype = M_ORDER;
X goto ret;
X case 'Q': /* Quit */
X rub(); /* Same as a rubout */
X break;
X case 'W': /* WIndow toggle */
X WIndow = nextwin(WIndow);
X newscore();
X prscore(TRUE);
X wrefresh(Score);
X break;
X case 'R': /* Redraw screen */
X case CTRL('L'):
X clearok(curscr, TRUE);
X newboard();
X prboard();
X break;
X case 'S': /* Save game */
X On_exit = FALSE;
X save();
X break;
X case 'E': /* Extrapolate */
X#ifdef EXTRAP
X if (last_ex)
X break;
X Finished = TRUE;
X if (WIndow != W_FULL)
X newscore();
X prscore(FALSE);
X wrefresh(Score);
X last_ex = TRUE;
X Finished = FALSE;
X#else
X error("%c: command not implemented", c);
X#endif
X break;
X case '\r': /* Ignore RETURNs and */
X case '\n': /* Line Feeds */
X case ' ': /* Spaces */
X case '\0': /* and nulls */
X break;
X case 'Z': /* Debug code */
X if (geteuid() == ARNOLD) {
X if (!Debug && outf == NULL) {
X char buf[40];
Xover:
X mvaddstr(MOVE_Y, MOVE_X, "file: ");
X clrtoeol();
X leaveok(Board, FALSE);
X refresh();
X sp = buf;
X while ((*sp = readch()) != '\n') {
X if (*sp == _tty.sg_kill)
X goto over;
X else if (*sp == _tty.sg_erase) {
X if (--sp < buf)
X sp = buf;
X else {
X addch('\b');
X if (*sp < ' ')
X addch('\b');
X clrtoeol();
X }
X }
X else
X addstr(unctrl(*sp++));
X refresh();
X }
X *sp = '\0';
X leaveok(Board, TRUE);
X if ((outf = fopen(buf, "w")) == NULL)
X perror(buf);
X setbuf(outf, 0);
X }
X Debug = !Debug;
X break;
X }
X /* FALLTHROUGH */
X default:
X error("unknown command: %s", unctrl(c));
X break;
X }
X }
Xret:
X leaveok(Board, TRUE);
X}
X
X
X# define COMP_STRT 20
X# define CARD_STRT 2
X
Xprboard() {
X
X reg PLAY *pp;
X reg int i, j, k, temp;
X
X for (k = 0; k < 2; k++) {
X pp = &Player[k];
X temp = k * COMP_STRT + CARD_STRT;
X for (i = 0; i < NUM_SAFE; i++)
X if (pp->safety[i] == S_PLAYED) {
X mvaddstr(i, temp, C_name[i + S_CONV]);
X if (pp->coups[i])
X mvaddch(i, temp - CARD_STRT, '*');
X }
X mvprintw(14, temp, C_fmt, C_name[pp->battle]);
X mvprintw(16, temp, C_fmt, C_name[pp->speed]);
X for (i = C_25; i <= C_200; ) {
X reg char *name;
X reg int end;
X
X name = C_name[i];
X temp = k * 40;
X end = pp->nummiles[i++];
X for (j = 0; j < end; j++)
X mvwaddstr(Miles, i, (j << 2) + temp, name);
X }
X }
X prscore(TRUE);
X temp = CARD_STRT;
X pp = &Player[PLAYER];
X for (i = 0; i < HAND_SZ; i++)
X mvprintw(i + 6, temp, C_fmt, C_name[pp->hand[i]]);
X mvprintw(6, COMP_STRT + CARD_STRT, "%2d", Topcard - Deck);
X mvprintw(8, COMP_STRT + CARD_STRT, C_fmt, C_name[Discard]);
X if (End == 1000) {
X static char ext[] = "Extension";
X
X stand(EXT_Y, EXT_X, ext);
X }
X wrefresh(Board);
X wrefresh(Miles);
X wrefresh(Score);
X}
X
X/*
X * Put str at (y,x) in standout mode
X */
Xstand(y, x, str)
Xreg int y, x;
Xreg char *str; {
X
X standout();
X mvaddstr(y, x, str);
X standend();
X return TRUE;
X}
X
Xprscore(for_real)
Xreg bool for_real; {
X
X reg PLAY *pp;
X reg int x;
X reg char *Score_fmt = "%4d";
X
X stdscr = Score;
X for (pp = Player; pp < &Player[2]; pp++) {
X x = (pp - Player) * 6 + 21;
X mvprintw(1, x, Score_fmt, pp->mileage);
X mvprintw(2, x, Score_fmt, pp->safescore);
X if (pp->safescore == 400)
X mvaddstr(3, x + 1, "300");
X else
X mvaddch(3, x + 3, '0');
X mvprintw(4, x, Score_fmt, pp->coupscore);
X if (WIndow == W_FULL || Finished) {
X#ifdef EXTRAP
X if (for_real)
X finalscore(pp);
X else
X extrapolate(pp);
X#else
X finalscore(pp);
X#endif
X mvprintw(11, x, Score_fmt, pp->hand_tot);
X mvprintw(13, x, Score_fmt, pp->total);
X mvprintw(14, x, Score_fmt, pp->games);
X }
X else {
X mvprintw(6, x, Score_fmt, pp->hand_tot);
X mvprintw(8, x, Score_fmt, pp->total);
X mvprintw(9, x, Score_fmt, pp->games);
X }
X }
X stdscr = Board;
X}
X
XFlushInput ()
X{
X raw(); /* Flush input */
X noraw();
X
X}
END_OF_curses_ui.c
if test 10994 -ne `wc -c <curses_ui.c`; then
echo shar: \"curses_ui.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f drawcard.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"drawcard.c\"
else
echo shar: Extracting \"drawcard.c\" \(4771 characters\)
sed "s/^X//" >drawcard.c <<'END_OF_drawcard.c'
X/*
X * drawcard.c
X *
X * display cards on the table
X */
X
X# include "mille.h"
X# include "ui.h"
X# include "card.h"
X
Xstruct card_init {
X short *bits;
X short *mask;
X int color;
X};
X
Xextern short go_bits[], go_mask_bits[];
Xextern short stop_bits[], stop_mask_bits[];
Xextern short right_bits[], right_mask_bits[];
Xextern short speed_bits[], speed_mask_bits[];
Xextern short end_bits[], end_mask_bits[];
Xextern short accident_bits[], accident_mask_bits[];
Xextern short repairs_bits[], repairs_mask_bits[];
Xextern short ace_bits[], ace_mask_bits[];
Xextern short flat_bits[], flat_mask_bits[];
Xextern short spare_bits[], spare_mask_bits[];
Xextern short puncture_bits[], puncture_mask_bits[];
Xextern short out_bits[], out_mask_bits[];
Xextern short gas_bits[], gas_mask_bits[];
Xextern short extra_bits[], extra_mask_bits[];
Xextern short miles_mask_bits[];
Xextern short _25_bits[], _50_bits[], _75_bits[], _100_bits[], _200_bits[];
X
Xstruct card_init card_inits[NUM_CARDS] = {
X{ _25_bits, miles_mask_bits, BLUE_COLOR, },
X{ _50_bits, miles_mask_bits, BLUE_COLOR, },
X{ _75_bits, miles_mask_bits, BLUE_COLOR, },
X{ _100_bits, miles_mask_bits, BLUE_COLOR, },
X{ _200_bits, miles_mask_bits, BLUE_COLOR, },
X{ out_bits, out_mask_bits, RED_COLOR, },
X{ flat_bits, flat_mask_bits, RED_COLOR, },
X{ accident_bits, accident_mask_bits, RED_COLOR, },
X{ stop_bits, stop_mask_bits, RED_COLOR, },
X{ speed_bits, speed_mask_bits, RED_COLOR, },
X{ gas_bits, gas_mask_bits, GREEN_COLOR, },
X{ spare_bits, spare_mask_bits, GREEN_COLOR, },
X{ repairs_bits, repairs_mask_bits, GREEN_COLOR, },
X{ go_bits, go_mask_bits, GREEN_COLOR, },
X{ end_bits, end_mask_bits, GREEN_COLOR, },
X{ extra_bits, extra_mask_bits, BLUE_COLOR, },
X{ puncture_bits, puncture_mask_bits, BLUE_COLOR, },
X{ ace_bits, ace_mask_bits, BLUE_COLOR, },
X{ right_bits, right_mask_bits, RED_COLOR, },
X};
X
Xextern short deck_red_bits[], deck_blue_bits[], deck_mask_bits[];
X
Xextern short blank_bits[];
X
Xstruct card cards[NUM_CARDS];
X
Xstruct card backside;
Xstruct card eraseCard;
X
X
Xinit_cards ()
X{
X int i;
X for (i = 0; i < NUM_CARDS; i++) {
X cards[i].planes[2].bits = XStoreBitmap (WIDTH, HEIGHT, card_inits[i].bits);
X cards[i].planes[2].pixel = colorMap[card_inits[i].color].pixel;
X cards[i].planes[1].bits = XStoreBitmap (WIDTH, HEIGHT, card_inits[i].mask);
X cards[i].planes[1].pixel = colorMap[BLACK_COLOR].pixel;
X cards[i].planes[0].bits = fill;
X cards[i].planes[0].pixel = colorMap[WHITE_COLOR].pixel;
X cards[i].nPlanes = 3;
X }
X backside.planes[3].bits = XStoreBitmap (WIDTH, HEIGHT, deck_red_bits);
X backside.planes[3].pixel = colorMap[RED_COLOR].pixel;
X backside.planes[2].bits = XStoreBitmap (WIDTH, HEIGHT, deck_blue_bits);
X backside.planes[2].pixel = colorMap[BLUE_COLOR].pixel;
X backside.planes[1].bits = XStoreBitmap (WIDTH, HEIGHT, deck_mask_bits);
X backside.planes[1].pixel = colorMap[BLACK_COLOR].pixel;
X backside.planes[0].bits = fill;
X backside.planes[0].pixel = colorMap[GREEN_COLOR].pixel;
X backside.nPlanes = 4;
X eraseCard.planes[0].bits = XStoreBitmap (WIDTH, HEIGHT, blank_bits);
X eraseCard.planes[0].pixel = colorMap[GREY_COLOR].pixel;
X eraseCard.nPlanes = 1;
X}
X
XdisplayCard (card, x, y)
Xint card;
Xint x, y;
X{
X if (card < 0 || card >= NUM_CARDS) {
X cardDisplay (&eraseCard, x, y);
X } else {
X cardDisplay (&cards[card], x, y);
X }
X}
X
Xstruct displayed {
X struct displayed *next;
X struct card *card;
X int x, y;
X int flag;
X};
X
Xstatic struct displayed *onscreen;
X
XcardDisplay (c, x, y)
Xstruct card *c;
X{
X int i;
X struct displayed *d, *p;
X char *malloc ();
X
X p = 0;
X for (d = onscreen; d; d = d->next) {
X if (d->x == x && d->y == y) {
X if (d->card == c)
X return;
X if (p) {
X p->next = d->next;
X d->next = onscreen;
X onscreen = d;
X }
X goto gotim;
X }
X p = d;
X }
X d = (struct displayed *) malloc (sizeof (struct displayed));
X d->x = x;
X d->y = y;
X if (p)
X p->next = d;
X else
X onscreen = d;
X d->next = 0;
Xgotim: ;
X d->card = c;
X drawIm (c, x, y);
X}
X
Xstatic
XdrawIm (c, x, y)
Xstruct card *c;
Xint x, y;
X{
X int i;
X
X for (i = 0; i < c->nPlanes; i++) {
X XPixFill (xwindow, x, y, WIDTH, HEIGHT,
X c->planes[i].pixel, c->planes[i].bits, GXcopy, AllPlanes);
X }
X}
X
XcardRedisplay (x, y, w, h)
X{
X struct displayed *d;
X
X for (d = onscreen; d; d = d->next)
X d->flag = 0;
X redisplaybelow (onscreen, x, y, w, h);
X}
X
Xstatic
Xredisplaybelow (d, x, y, w, h)
Xstruct displayed *d;
X{
X int x2, y2;
X
X x2 = x + w;
X y2 = y + h;
X for (; d; d = d->next) {
X if ((d->x <= x2 && x <= (d->x + WIDTH)) &&
X (d->y <= y2 && y <= (d->y + HEIGHT)))
X {
X if (d->flag == 0) {
X drawIm (d->card, d->x, d->y);
X d->flag = 1;
X redisplaybelow (d->next, d->x, d->y, WIDTH, HEIGHT);
X }
X }
X }
X
X}
X
XcardEraseAll ()
X{
X struct displayed *d, *n;
X
X for (d = onscreen; d; d = n) {
X n = d->next;
X free (d);
X }
X onscreen = 0;
X}
END_OF_drawcard.c
if test 4771 -ne `wc -c <drawcard.c`; then
echo shar: \"drawcard.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f end.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"end.c\"
else
echo shar: Extracting \"end.c\" \(2207 characters\)
sed "s/^X//" >end.c <<'END_OF_end.c'
X# include "mille.h"
X
X/*
X * @(#)end.c 1.1 (Berkeley) 4/1/82
X */
X
X/*
X * print out the score as if it was final, and add the totals for
X * the end-of-games points to the user who deserves it (if any).
X */
Xfinalscore(pp)
Xreg PLAY *pp; {
X
X reg int temp, tot, num;
X
X num = pp - Player;
X for (tot = 4; tot <= 8; tot++) {
X InScore (tot, num, " 0 ");
X }
X if (pp->mileage == End) {
X InScore (4, num, " 400 ");
X tot = SC_TRIP;
X if (pp->nummiles[C_200] == 0) {
X InScore (5, num, " 300 ");
X tot = SC_TRIP + SC_SAFE;
X }
X if (Topcard <= Deck) {
X InScore (6, num, " 300 ");
X tot += SC_DELAY;
X }
X if (End == 1000) {
X InScore (7, num, " 200 ");
X tot += SC_EXTENSION;
X }
X if (Player[other(num)].mileage == 0) {
X InScore (8, num, " 500 ");
X tot += SC_SHUT_OUT;
X }
X pp->total += tot;
X pp->hand_tot += tot;
X }
X}
X
X# ifdef EXTRAP
Xstatic int Last_tot[2]; /* last tot used for extrapolate */
X
X/*
X * print out the score as if it was final, and add the totals for
X * the end-of-games points to the user who deserves it (if any).
X */
Xextrapolate(pp)
Xreg PLAY *pp; {
X
X reg int x, num, tot, count;
X
X#ifdef NOTYET
X num = pp - Player;
X tot += SC_TRIP + SC_DELAY + SC_EXT;
X x = num * 6 + 21 + 3;
X for (tot = 5; tot <= 9; tot++)
X mvaddch(tot, x, '0');
X x -= 2;
X pp = &Player[other(num)];
X for (count = 0, tot = 0; tot < NUM_SAFE; tot++)
X if (pp->safety[tot] != S_PLAYED)
X count += SC_SAFE;
X mvprintw(3, x, "%3d", count);
X tot += count;
X if (count == 400) {
X mvaddstr(4, x, "30");
X tot += SC_ALL_SAFE;
X }
X pp = &Player[num];
X for (count = 0, tot = 0; tot < NUM_SAFE; tot++)
X if (pp->safety[tot] != S_PLAYED)
X count += SC_COUP / 10;
X mvprintw(4, x - 1, "%3d", count);
X tot += count;
X tot += 1000 - pp->mileage;
X mvaddstr(5, x, "40");
X mvaddstr(7, x, "30");
X mvaddstr(8, x, "20");
X if (pp->nummiles[C_200] == 0) {
X mvaddstr(6, x, "30");
X tot = SC_TRIP + SC_SAFE;
X }
X if (Player[other(num)].mileage == 0) {
X mvaddstr(9, x, "50");
X tot += SC_SHUT_OUT;
X }
X pp->total += tot;
X pp->hand_tot += tot;
X Last_tot[num] = tot;
X#endif
X}
X
Xundoex() {
X
X reg PLAY *pp;
X reg int i;
X
X i = 0;
X for (pp = Player; pp < &Player[2]; pp++) {
X pp->total -= Last_tot[i];
X pp->hand_tot -= Last_tot[i++];
X }
X}
X# endif
END_OF_end.c
if test 2207 -ne `wc -c <end.c`; then
echo shar: \"end.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f fill -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"fill\"
else
echo shar: Extracting \"fill\" \(9266 characters\)
sed "s/^X//" >fill <<'END_OF_fill'
X#define fill_width 100
X#define fill_height 150
Xstatic short fill_bits[] = {
X 0x0000, 0x0000, 0x0000, 0x0000,
X 0x0000, 0x0000, 0xfff0, 0xff00,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0x0fff, 0xfff0, 0xffc0, 0xffff,
X 0xffff, 0xffff, 0xffff, 0x3fff,
X 0xfff0, 0xfff0, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff0,
X 0xfff8, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff1, 0xfff8,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff1, 0xfffc, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff3, 0xfffc, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff3,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffe, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff7, 0xfffe, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff7,
X 0xfffe, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff7, 0xfffe,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff7, 0xfffc, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff3, 0xfffc, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xfff3,
X 0xfff8, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xffff, 0xfff1, 0xfff8,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xffff, 0xfff1, 0xfff0, 0xffff,
X 0xffff, 0xffff, 0xffff, 0xffff,
X 0xfff0, 0xffc0, 0xffff, 0xffff,
X 0xffff, 0xffff, 0x3fff, 0xfff0,
X 0xff00, 0xffff, 0xffff, 0xffff,
X 0xffff, 0x0fff, 0xfff0, 0x0000,
X 0x0000, 0x0000, 0x0000, 0x0000,
X 0x0000, 0xfff0};
END_OF_fill
if test 9266 -ne `wc -c <fill`; then
echo shar: \"fill\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f ui.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"ui.c\"
else
echo shar: Extracting \"ui.c\" \(12859 characters\)
sed "s/^X//" >ui.c <<'END_OF_ui.c'
X/*
X * ui.c
X *
X * interface routines for mille
X */
X
X# include "mille.h"
X# include "ui.h"
X
X#ifdef CTRL
X# undef CTRL
X#endif
X#define CTRL(x) (x - 'A' + 1)
X
X# include "background.h"
X# include "card.h"
X
Xstruct color colorMap[NUM_COLOR] = {
X "black", 0,
X "white", 0,
X "red", 0,
X "green", 0,
X "light gray", 0,
X "blue", 0,
X};
X
Xchar *C_fmt = "%-18.18s"; /* format for printing cards */
Xchar Initstr[100]; /* initial string for error field */
Xchar *_cn[NUM_CARDS] = { /* Card name buffer */
X "",
X "25",
X "50",
X "75",
X "100",
X "200",
X "Out of Gas",
X "Flat Tire",
X "Accident",
X "Stop",
X "Speed Limit",
X "Gasoline",
X "Spare Tire",
X "Repairs",
X "Go",
X "End of Limit",
X "Extra Tank",
X "Puncture Proof",
X "Driving Ace",
X "Right of Way"
X },
X **C_name = &_cn[1]; /* Card names */
X
XWindow xwindow;
XFontInfo *font;
XBitmap fill;
XButton QUIT, SAVE;
XWindow qwindow, swindow;
X
Xstruct safety_offset safety_offsets[4] = {
X 0, 0,
X WIDTH+PAD_CARD, 0,
X 0, HEIGHT+PAD_CARD,
X WIDTH+PAD_CARD, HEIGHT+PAD_CARD,
X};
X
Xchar *
Xprune (orig, max)
Xchar *orig;
X{
X static char buf[512];
X int len;
X char c;
X
X if (XStringWidth (orig, font, 0, 0) < max)
X return orig;
X strcpy (buf, orig);
X len = strlen (orig);
X do {
X buf[--len] = '\0';
X } while (len > 0 && XStringWidth (buf, font, 0, 0) >= max);
X return buf;
X}
X
XMessage (string)
Xchar *string;
X{
X string = prune (string, MESS_W);
X XPixSet (xwindow, MESS_X, MESS_Y, MESS_W, MESS_H, colorMap[GREY_COLOR].pixel);
X XText (xwindow, MESS_X, MESS_Y, string, strlen(string), font->id,
X colorMap[BLACK_COLOR].pixel, colorMap[GREY_COLOR].pixel);
X}
X
XError (string, arg)
Xchar *string;
X{
X char buf[512];
X char *o;
X
X sprintf (buf, string, arg);
X o = prune (buf, ERROR_W);
X XPixSet (xwindow, ERROR_X, ERROR_Y, ERROR_W, ERROR_H, colorMap[GREY_COLOR].pixel);
X XText (xwindow, ERROR_X, ERROR_Y, o, strlen(o), font->id,
X colorMap[BLACK_COLOR].pixel, colorMap[GREY_COLOR].pixel);
X}
X
XPrompt (string)
Xchar *string;
X{
X string = prune (string, PROMPT_W);
X XPixSet (xwindow, PROMPT_X, PROMPT_Y, PROMPT_W, PROMPT_H, colorMap[GREY_COLOR].pixel);
X XText (xwindow, PROMPT_X, PROMPT_Y, string, strlen(string), font->id,
X colorMap[BLACK_COLOR].pixel, colorMap[GREY_COLOR].pixel);
X}
X
Xdebug (pos, string, a0, a1, a2)
X{
X}
X
XComputerStatus (string)
X{
X char buffer[512];
X/*
X sprintf (buffer, "I %-10.10s", string);
X XText (xwindow, COMP_CARD_TX, COMP_CARD_TY, buffer, strlen(buffer), font->id,
X colorMap[BLACK_COLOR].pixel, colorMap[GREY_COLOR].pixel);
X*/
X}
X
XComputerCard (type)
Xint type;
X{
X/* displayCard (type, COMP_CARD_X, COMP_CARD_Y);*/
X}
X
Xstatic int computer_distance = 0;
X
XComputerDistance (distance)
X{
X displayDistance (COMP_DIST_X, COMP_DIST_Y, distance, DIST_WIDTH, DIST_HEIGHT);
X computer_distance = distance;
X}
X
XEraseComputerDistance ()
X{
X computer_distance = 0;
X}
X
XRedisplayComputerDistance ()
X{
X displayDistance (COMP_DIST_X, COMP_DIST_Y, computer_distance, DIST_WIDTH, DIST_HEIGHT);
X}
X
XComputerSpeed (type)
X{
X displayCard (type, COMP_PLAY_X, COMP_PLAY_Y);
X}
X
XComputerBattle (type)
X{
X displayCard (type, COMP_PLAY_X + WIDTH + PAD_CARD, COMP_PLAY_Y);
X}
X
Xstatic int computer_miles_count[5];
X
XComputerMiles (type, index, count)
X{
X while (computer_miles_count[index] < count) {
X displayCard (type, COMP_PLAY_X + (WIDTH + PAD_CARD) * (index + 2),
X COMP_PLAY_Y + (MILE_OFFSET * computer_miles_count[index]));
X ++computer_miles_count[index];
X }
X}
X
XEraseComputerMiles ()
X{
X int i;
X
X for (i = 0; i < 5; i++)
X computer_miles_count[i] = 0;
X}
X
XComputerSafety (type, index)
X{
X displayCard (type, COMP_SAFE_X + safety_offsets[index].x,
X COMP_SAFE_Y + safety_offsets[index].y);
X}
X
XDisplayDiscard (type)
X{
X displayCard (type, DISCARD_X, DISCARD_Y);
X}
X
XDisplayDeck (numberLeft)
X{
X char buffer[512];
X
X sprintf (buffer, "Cards: %3d ", numberLeft);
X XText (xwindow, DECK_TX, DECK_TY, buffer, strlen (buffer), font->id,
X colorMap[BLACK_COLOR].pixel, colorMap[GREY_COLOR].pixel);
X}
X
Xstatic int human_distance = 0;
X
XHumanDistance (distance)
X{
X displayDistance (HUM_DIST_X, HUM_DIST_Y, distance, DIST_WIDTH, DIST_HEIGHT);
X human_distance = distance;
X}
X
XEraseHumanDistance ()
X{
X human_distance = 0;
X}
X
XRedisplayHumanDistance ()
X{
X displayDistance (HUM_DIST_X, HUM_DIST_Y, human_distance, DIST_WIDTH, DIST_HEIGHT);
X}
X
XHumanSpeed (type)
X{
X displayCard (type, HUM_PLAY_X, HUM_PLAY_Y);
X}
X
XHumanBattle (type)
X{
X displayCard (type, HUM_PLAY_X + WIDTH + PAD_CARD, HUM_PLAY_Y);
X}
X
Xstatic int human_miles_count[5];
X
XHumanMiles (type, index, count)
X{
X while (human_miles_count[index] < count) {
X displayCard (type, HUM_PLAY_X + (WIDTH + PAD_CARD) * (index + 2),
X HUM_PLAY_Y + (MILE_OFFSET * human_miles_count[index]));
X ++human_miles_count[index];
X }
X}
X
XEraseHumanMiles ()
X{
X int i;
X
X for (i = 0; i < 5; i++)
X human_miles_count[i] = 0;
X}
X
XHumanSafety (type, index)
X{
X displayCard (type, HUM_SAFE_X + safety_offsets[index].x,
X HUM_SAFE_Y + safety_offsets[index].y);
X}
X
XHumanHand (type, index)
Xint type, index;
X{
X displayCard (type, HUM_HAND_X + (WIDTH + PAD_CARD) * index, HUM_HAND_Y);
X}
X
XdisplayDistance (x, y, value, width, height)
X{
X XPixSet (xwindow, x, y, (value * width) / 1000, height, colorMap[BLUE_COLOR].pixel);
X}
X
XeraseDistance (x, y, value, width, height)
X{
X XPixSet (xwindow, x, y, (value * width) / 1000, height, colorMap[GREY_COLOR].pixel);
X}
X
Xchar *
XGetpromptedInput (string)
Xchar *string;
X{
X extern char *co_prompted ();
X
X return co_prompted (string);
X}
X
Xnewboard()
X{
X int i;
X char buffer[20];
X int len;
X int x, y1, y2, ym1, ym2;
X int width;
X
X XClear (xwindow);
X cardEraseAll ();
X EraseHumanMiles ();
X EraseComputerMiles ();
X EraseHumanDistance ();
X EraseComputerDistance ();
X cardDisplay (&backside, DECK_X, DECK_Y);
X redraw_board ();
X}
X
Xnewscore()
X{
X register int i;
X
X InScore (-1, 0, "You");
X InScore (-1, 1, "Computer");
X InScore (0, -1, "Milestones");
X InScore (1, -1, "Safeties");
X InScore (2, -1, "All 4 Safeties");
X InScore (3, -1, "Coup Fourre");
X InScore (4, -1, "Trip Complete");
X InScore (5, -1, "Safe Trip");
X InScore (6, -1, "Delayed Action");
X InScore (7, -1, "Extension");
X InScore (8, -1, "Shut Out");
X InScore (9, -1, "Hand Total");
X InScore (10, -1, "Overall Total");
X InScore (11, -1, "Games");
X}
X
Xredraw_board ()
X{
X redraw_region (0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
X}
X
XexposeBoard (rep)
XXExposeEvent *rep;
X{
X redraw_region (rep->x, rep->y, rep->width, rep->height);
X}
X
Xredraw_region (xpos, ypos, w, h)
X{
X int x1, y1, x2, y2;
X int i;
X int ym1, ym2, x;
X char buffer[20];
X int width;
X
X XText (xwindow, DISCARD_TX, DISCARD_TY, "Discard Pile", 12, font->id,
X colorMap[BLACK_COLOR].pixel, colorMap[GREY_COLOR].pixel);
X newscore ();
X RedisplayHumanDistance ();
X RedisplayComputerDistance ();
X x1 = HUM_HAND_X - PAD_CARD/2;
X y1 = HUM_HAND_Y - PAD_CARD/2,
X x2 = HUM_HAND_X + (WIDTH + PAD_CARD) * 7 - PAD_CARD/2;
X y2 = HUM_HAND_Y + (HEIGHT + PAD_CARD) - PAD_CARD/2;
X XLine (xwindow, x1, y1, x2, y1, 1, 1, colorMap[BLACK_COLOR].pixel, GXcopy, AllPlanes);
X XLine (xwindow, x2, y1, x2, y2, 1, 1, colorMap[BLACK_COLOR].pixel, GXcopy, AllPlanes);
X XLine (xwindow, x2, y2, x1, y2, 1, 1, colorMap[BLACK_COLOR].pixel, GXcopy, AllPlanes);
X XLine (xwindow, x1, y2, x1, y1, 1, 1, colorMap[BLACK_COLOR].pixel, GXcopy, AllPlanes);
X for (i = 0; i <= 1000; i += 100) {
X sprintf (buffer, "%d", i);
X x = COMP_DIST_TX + (i * DIST_WIDTH) / 1000;
X y1 = COMP_DIST_TY;
X ym1 = COMP_DIST_MY;
X y2 = HUM_DIST_TY;
X ym2 = HUM_DIST_MY;
X width = XQueryWidth (buffer, font->id);
X XText (xwindow, x - width / 2, y1, buffer, strlen(buffer), font->id,
X colorMap[BLACK_COLOR].pixel, colorMap[GREY_COLOR].pixel);
X XLine (xwindow, x, ym1, x, ym1 + DIST_MARK, 1, 1, colorMap[BLACK_COLOR].pixel, GXcopy, AllPlanes);
X XText (xwindow, x - width / 2, y2, buffer, strlen(buffer), font->id,
X colorMap[BLACK_COLOR].pixel, colorMap[GREY_COLOR].pixel);
X XLine (xwindow, x, ym2, x, ym2 + DIST_MARK, 1, 1, colorMap[BLACK_COLOR].pixel, GXcopy, AllPlanes);
X }
X cardRedisplay (xpos, ypos, w, h);
X}
X
Xinit_ui ()
X{
X Color hardware_color, exact_color;
X XEvent rep;
X Pixmap background;
X Pixmap border;
X int i;
X int do_quit (), do_save ();
X int CmanageButton ();
X
X XOpenDisplay ("");
X for (i = 0; i < NUM_COLOR; i++) {
X XGetColor (colorMap[i].name, &hardware_color, &exact_color);
X colorMap[i].pixel = hardware_color.pixel;
X }
X fill = XStoreBitmap (WIDTH, HEIGHT, fill_bits);
X init_cards ();
X co_init ();
X background = XMakePixmap (0, colorMap[GREY_COLOR].pixel, colorMap[WHITE_COLOR].pixel);
X border = XMakePixmap (0, colorMap[WHITE_COLOR].pixel, colorMap[GREY_COLOR].pixel);
X font = XOpenFont ("timrom12");
X xwindow = XCreateWindow (RootWindow, 50, 50, WINDOW_WIDTH, WINDOW_HEIGHT, 1,
X WhitePixmap, background);
X QUIT = CcreateButton (font, "Quit", 50, colorMap[WHITE_COLOR].pixel,
X colorMap[GREY_COLOR].pixel, 1);
X SAVE = CcreateButton (font, "Save", 50, colorMap[WHITE_COLOR].pixel,
X colorMap[GREY_COLOR].pixel, 1);
X qwindow = CmapButton (xwindow, QUIT_X, QUIT_Y, QUIT, do_quit);
X swindow = CmapButton (xwindow, SAVE_X, SAVE_Y, SAVE, do_save);
X bindEvent (qwindow, ExposeWindow|ButtonPressed|LeaveWindow|ButtonReleased,
X CmanageButton);
X bindEvent (swindow, ExposeWindow|ButtonPressed|LeaveWindow|ButtonReleased,
X CmanageButton);
X XMapWindow (xwindow);
X
X bindEvent (xwindow, ExposeWindow|ExposeRegion, exposeBoard);
X}
X
X
Xfinish_ui ()
X{
X}
X
Xupdate_ui ()
X{
X XFlush ();
X}
X
XBeep ()
X{
X XFeep (0);
X}
X
X/*
X * Get a yes or no answer to the given question. Saves are
X * also allowed. Return TRUE if the answer was yes, FALSE if no.
X */
X
Xgetyn(prompt)
Xregister char *prompt;
X{
X
X register char c;
X
X return co_affirm (prompt);
X}
X
Xstatic char incharacter;
Xstatic int gotcharacter;
X
Xstatic int getmove_done;
X
Xmouse_event (rep)
XXButtonEvent *rep;
X{
X int x, y;
X
X x = rep->x;
X y = rep->y;
X if (HUM_HAND_Y <= y && y <= HUM_HAND_Y + HEIGHT &&
X HUM_HAND_X <= x && x <= HUM_HAND_X + (WIDTH + PAD_CARD) * 7) {
X switch (rep->detail & 0377) {
X case RightButton:
X Movetype = M_DISCARD;
X break;
X case MiddleButton:
X Movetype = M_REASONABLE;
X break;
X case LeftButton:
X Movetype = M_PLAY;
X break;
X }
X Card_no = (x - HUM_HAND_X) / (WIDTH + PAD_CARD);
X getmove_done = 1;
X return;
X }
X if (DECK_Y <= y && y <= DECK_Y + HEIGHT &&
X DECK_X <= x && x <= DECK_X + WIDTH) {
X Movetype = M_DRAW;
X getmove_done = 1;
X return;
X }
X Beep ();
X}
X
Xgetmove()
X{
X
X getmove_done = 0;
X bindEvent (xwindow, ButtonPressed, mouse_event);
X while (!getmove_done) {
X dispatch ();
X }
X unbindEvent (xwindow, ButtonPressed);
X}
X
X
Xdo_save ()
X{
X save ();
X}
X
Xdo_quit ()
X{
X rub();
X}
X
X# define COMP_STRT 20
X# define CARD_STRT 2
X
Xprboard() {
X
X register PLAY *pp;
X register int i, j, k, temp;
X
X for (k = 0; k < 2; k++) {
X pp = &Player[k];
X temp = k * COMP_STRT + CARD_STRT;
X for (i = 0; i < NUM_SAFE; i++)
X if (pp->safety[i] == S_PLAYED) {
X if (k == 0) {
X HumanSafety (i + S_CONV, i);
X } else {
X ComputerSafety (i + S_CONV, i);
X }
X }
X if (k == 0) {
X HumanBattle (pp->battle);
X HumanSpeed (pp->speed);
X } else {
X ComputerBattle (pp->battle);
X ComputerSpeed (pp->speed);
X }
X for (i = C_25; i <= C_200; i++) {
X register char *name;
X register int end;
X
X name = C_name[i];
X temp = k * 40;
X end = pp->nummiles[i];
X if (k == 0)
X HumanMiles (i, C_200-i, end);
X else
X ComputerMiles (i, C_200-i, end);
X }
X }
X prscore(TRUE);
X temp = CARD_STRT;
X pp = &Player[PLAYER];
X for (i = 0; i < HAND_SZ; i++) {
X HumanHand (pp->hand[i], i);
X }
X DisplayDeck (Topcard - Deck);
X DisplayDiscard (Discard);
X if (End == 1000) {
X static char ext[] = "Extension";
X
X/* stand(EXT_Y, EXT_X, ext); */
X }
X}
X
X/*
X * Put str at (y,x) in standout mode
X */
X
Xstand(y, x, str)
Xregister int y, x;
Xregister char *str;
X{
X}
X
XInScore (line, player, text)
Xint line, player;
Xchar *text;
X{
X XText (xwindow, SCORE_X + player * SCORE_W, SCORE_Y + SCORE_H * (line + 1),
X text, strlen (text), font->id, colorMap[BLACK_COLOR].pixel,
X colorMap[GREY_COLOR].pixel);
X}
X
Xprscore(for_real)
Xregister bool for_real;
X{
X
X register PLAY *pp;
X register int x;
X register char *Score_fmt = "%4d ";
X char buffer[512];
X
X ComputerDistance (Player[1].mileage);
X HumanDistance (Player[0].mileage);
X
X for (pp = Player; pp < &Player[2]; pp++) {
X x = (pp - Player) * 6 + 21;
X sprintf (buffer, Score_fmt, pp->mileage);
X InScore (0, pp - Player, buffer);
X sprintf (buffer, Score_fmt, pp->safescore);
X InScore (1, pp - Player, buffer);
X if (pp->safescore == 400)
X InScore (2, pp - Player, " 300 ");
X else
X InScore (2, pp - Player, " 0 ");
X sprintf (buffer, Score_fmt, pp->coupscore);
X InScore (3, pp - Player, buffer);
X#ifdef EXTRAP
X if (for_real)
X finalscore(pp);
X else
X extrapolate(pp);
X#else
X finalscore(pp);
X#endif
X sprintf (buffer, Score_fmt, pp->hand_tot);
X InScore (9, pp - Player, buffer);
X sprintf (buffer, Score_fmt, pp->total);
X InScore (10, pp - Player, buffer);
X sprintf (buffer, Score_fmt, pp->games);
X InScore (11, pp - Player, buffer);
X }
X}
X
XFlushInput ()
X{
X}
END_OF_ui.c
if test 12859 -ne `wc -c <ui.c`; then
echo shar: \"ui.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 1 \(of 3\).
cp /dev/null ark1isdone
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