|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 14580 (0x38f4)
Types: TextFile
Names: »ui.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/X/Xmille/ui.c«
/*
* ui.c
*
* interface routines for mille
*/
# include "mille.h"
# include "ui.h"
# include <X11/Xutil.h>
#ifdef CTRL
# undef CTRL
#endif
#define CTRL(x) (x - 'A' + 1)
# include "card.h"
struct color colorMap[NUM_COLOR] = {
"black", 0,
"white", 0,
"red", 0,
"green", 0,
"light gray", 0,
"blue", 0,
};
char *C_fmt = "%-18.18s"; /* format for printing cards */
char Initstr[100]; /* initial string for error field */
char *_cn[NUM_CARDS] = { /* Card name buffer */
"",
"25",
"50",
"75",
"100",
"200",
"Out of Gas",
"Flat Tire",
"Accident",
"Stop",
"Speed Limit",
"Gasoline",
"Spare Tire",
"Repairs",
"Go",
"End of Limit",
"Extra Tank",
"Puncture Proof",
"Driving Ace",
"Right of Way",
};
char **C_name = &_cn[1]; /* Card names */
Display *dpy;
int screen;
Window xwindow;
Pixmap fill;
Button QUIT, SAVE;
Window qwindow, swindow;
XFontStruct *font;
GC text_gc;
GC black_gc;
GC blue_gc;
GC cheap_gc;
Region null, mine;
int iscolor;
struct safety_offset safety_offsets[4] = {
0, 0,
WIDTH+PAD_CARD, 0,
0, HEIGHT+PAD_CARD,
WIDTH+PAD_CARD, HEIGHT+PAD_CARD,
};
char *
prune (orig, max)
char *orig;
{
static char buf[512];
int len;
char c;
len = strlen (orig);
if (XTextWidth (font, orig, len) < max)
return orig;
strcpy (buf, orig);
do {
buf[--len] = '\0';
} while (len > 0 && XTextWidth (font, buf, len) >= max);
return buf;
}
Message (string)
char *string;
{
string = prune (string, MESS_W);
XClearArea (dpy, xwindow, MESS_X, MESS_Y, MESS_W, MESS_H, False);
XDrawImageString (dpy, xwindow, text_gc, MESS_X, MESS_Y,
string, strlen(string));
}
Error (string, arg)
char *string;
{
char buf[512];
char *o;
sprintf (buf, string, arg);
o = prune (buf, ERROR_W);
XClearArea (dpy, xwindow, ERROR_X, ERROR_Y, ERROR_W, ERROR_H, False);
XDrawImageString (dpy, xwindow, text_gc, ERROR_X, ERROR_Y,
o, strlen(o));
}
Prompt (string)
char *string;
{
string = prune (string, PROMPT_W);
XClearArea (dpy, xwindow, PROMPT_X, PROMPT_Y, PROMPT_W, PROMPT_H,
False);
XDrawImageString (dpy, xwindow, text_gc, PROMPT_X, PROMPT_Y,
string, strlen(string));
}
debug (pos, string, a0, a1, a2)
{
}
ComputerStatus (string)
{
/*
char buffer[512];
sprintf (buffer, "I %-10.10s", string);
XDrawImageString (dpy, xwindow, text_gc, COMP_CARD_TX, COMP_CARD_TY,
buffer, strlen(buffer));
*/
}
ComputerCard (type)
int type;
{
/* displayCard (type, COMP_CARD_X, COMP_CARD_Y);*/
}
static int computer_distance = 0;
ComputerDistance (distance)
{
displayDistance (COMP_DIST_X, COMP_DIST_Y, distance, DIST_WIDTH, DIST_HEIGHT);
computer_distance = distance;
}
EraseComputerDistance ()
{
computer_distance = 0;
}
RedisplayComputerDistance ()
{
displayDistance (COMP_DIST_X, COMP_DIST_Y, computer_distance, DIST_WIDTH, DIST_HEIGHT);
}
ComputerSpeed (type)
{
displayCard (type, COMP_PLAY_X, COMP_PLAY_Y);
}
ComputerBattle (type)
{
displayCard (type, COMP_PLAY_X + WIDTH + PAD_CARD, COMP_PLAY_Y);
}
static int computer_miles_count[5];
ComputerMiles (type, index, count)
{
while (computer_miles_count[index] < count) {
displayCard (type, COMP_PLAY_X + (WIDTH + PAD_CARD) * (index + 2),
COMP_PLAY_Y + (MILE_OFFSET * computer_miles_count[index]));
++computer_miles_count[index];
}
}
EraseComputerMiles ()
{
int i;
for (i = 0; i < 5; i++)
computer_miles_count[i] = 0;
}
ComputerSafety (type, index)
{
displayCard (type, COMP_SAFE_X + safety_offsets[index].x,
COMP_SAFE_Y + safety_offsets[index].y);
}
DisplayDiscard (type)
{
displayCard (type, DISCARD_X, DISCARD_Y);
}
DisplayDeck (numberLeft)
{
char buffer[512];
sprintf (buffer, "Cards: %3d ", numberLeft);
XDrawImageString (dpy, xwindow, text_gc, DECK_TX, DECK_TY,
buffer, strlen (buffer));
}
static int human_distance = 0;
HumanDistance (distance)
{
displayDistance (HUM_DIST_X, HUM_DIST_Y, distance, DIST_WIDTH, DIST_HEIGHT);
human_distance = distance;
}
EraseHumanDistance ()
{
human_distance = 0;
}
RedisplayHumanDistance ()
{
displayDistance (HUM_DIST_X, HUM_DIST_Y, human_distance, DIST_WIDTH, DIST_HEIGHT);
}
HumanSpeed (type)
{
displayCard (type, HUM_PLAY_X, HUM_PLAY_Y);
}
HumanBattle (type)
{
displayCard (type, HUM_PLAY_X + WIDTH + PAD_CARD, HUM_PLAY_Y);
}
static int human_miles_count[5];
HumanMiles (type, index, count)
{
while (human_miles_count[index] < count) {
displayCard (type, HUM_PLAY_X + (WIDTH + PAD_CARD) * (index + 2),
HUM_PLAY_Y + (MILE_OFFSET * human_miles_count[index]));
++human_miles_count[index];
}
}
EraseHumanMiles ()
{
int i;
for (i = 0; i < 5; i++)
human_miles_count[i] = 0;
}
HumanSafety (type, index)
{
displayCard (type, HUM_SAFE_X + safety_offsets[index].x,
HUM_SAFE_Y + safety_offsets[index].y);
}
HumanHand (type, index)
int type, index;
{
displayCard (type, HUM_HAND_X + (WIDTH + PAD_CARD) * index, HUM_HAND_Y);
}
displayDistance (x, y, value, width, height)
{
XFillRectangle (dpy, xwindow, blue_gc, x, y, (value * width) / 1000,
height);
}
eraseDistance (x, y, value, width, height)
{
XClearArea (dpy, xwindow, x, y, (value * width) / 1000, height, TRUE);
}
char *
GetpromptedInput (string)
char *string;
{
extern char *co_prompted ();
return co_prompted (string, xwindow);
}
newboard()
{
int i;
char buffer[20];
int len;
int x, y1, y2, ym1, ym2;
int width;
XClearWindow (dpy, xwindow);
cardEraseAll ();
EraseHumanMiles ();
EraseComputerMiles ();
EraseHumanDistance ();
EraseComputerDistance ();
cardDisplay (&backside, DECK_X, DECK_Y);
redraw_board ();
}
newscore()
{
register int i;
InScore (-1, 0, "You");
InScore (-1, 1, "Computer");
InScore (0, -1, "Milestones");
InScore (1, -1, "Safeties");
InScore (2, -1, "All 4 Safeties");
InScore (3, -1, "Coup Fourre");
InScore (4, -1, "Trip Complete");
InScore (5, -1, "Safe Trip");
InScore (6, -1, "Delayed Action");
InScore (7, -1, "Extension");
InScore (8, -1, "Shut Out");
InScore (9, -1, "Hand Total");
InScore (10, -1, "Overall Total");
InScore (11, -1, "Games");
}
redraw_board ()
{
redraw_region (0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
}
exposeBoard (rep)
XExposeEvent *rep;
{
XRectangle rect;
rect.x = rep->x;
rect.y = rep->y;
rect.width = rep->width;
rect.height = rep->height;
XUnionRectWithRegion(&rect, mine, mine);
if( rep->count == 0 )
{
XClipBox(mine, &rect);
XIntersectRegion(null, mine, mine);
redraw_region (rect.x, rect.y, rect.width, rect.height);
/*redraw_board();*/
}
}
redraw_region (xpos, ypos, w, h)
{
int x1, y1, x2, y2;
int i;
int ym1, ym2, x;
char buffer[20];
int width;
XDrawImageString (dpy, xwindow, text_gc, DISCARD_TX, DISCARD_TY,
"Discard Pile", 12);
newscore ();
RedisplayHumanDistance ();
RedisplayComputerDistance ();
x1 = HUM_HAND_X - PAD_CARD/2;
y1 = HUM_HAND_Y - PAD_CARD/2;
x2 = HUM_HAND_X + (WIDTH + PAD_CARD) * 7 - PAD_CARD/2;
y2 = HUM_HAND_Y + (HEIGHT + PAD_CARD) - PAD_CARD/2;
XDrawLine (dpy, xwindow, black_gc, x1, y1, x2, y1);
XDrawLine (dpy, xwindow, black_gc, x2, y1, x2, y2);
XDrawLine (dpy, xwindow, black_gc, x2, y2, x1, y2);
XDrawLine (dpy, xwindow, black_gc, x1, y2, x1, y1);
for (i = 0; i <= 1000; i += 100) {
sprintf (buffer, "%d", i);
x = COMP_DIST_TX + (i * DIST_WIDTH) / 1000;
y1 = COMP_DIST_TY + MESS_H;
ym1 = COMP_DIST_MY + MESS_H;
y2 = HUM_DIST_TY + MESS_H;
ym2 = HUM_DIST_MY + MESS_H;
width = XTextWidth (font, buffer, strlen(buffer));
XDrawImageString (dpy, xwindow, text_gc, x - width / 2,
y1, buffer, strlen(buffer));
XDrawLine (dpy, xwindow, black_gc, x, ym1, x, ym1 + DIST_MARK);
XDrawImageString (dpy, xwindow, text_gc, x - width / 2,
y2, buffer, strlen(buffer));
XDrawLine (dpy, xwindow, black_gc, x, ym2, x, ym2 + DIST_MARK);
}
cardRedisplay (xpos, ypos, w, h);
}
init_ui ()
{
XColor hardware_color, exact_color;
XClassHint xch;
XWMHints xwm;
XSizeHints xsh;
unsigned long background;
unsigned long border;
int i;
int do_quit (), do_save ();
int CmanageButton ();
XGCValues gcv;
Colormap def_cm;
dpy = XOpenDisplay ((char *) 0);
screen = DefaultScreen(dpy);
def_cm = DefaultColormap(dpy, screen);
for (i = 0; i < NUM_COLOR; i++) {
XAllocNamedColor (dpy, def_cm, colorMap[i].name,
&hardware_color, &exact_color);
colorMap[i].pixel = hardware_color.pixel;
}
if (DisplayCells(dpy, screen) > 2)
iscolor = 1;
else
iscolor = 0;
if( ! iscolor )
{
colorMap[BLUE_COLOR].pixel = BlackPixel(dpy, screen);
colorMap[GREY_COLOR].pixel = WhitePixel(dpy, screen);
}
background = colorMap[GREY_COLOR].pixel;
if (iscolor)
border = colorMap[WHITE_COLOR].pixel;
else
border = BlackPixel(dpy, screen);
gcv.font = XLoadFont(dpy, "timrom12");
font = XQueryFont(dpy, gcv.font);
xwindow = XCreateSimpleWindow (dpy, DefaultRootWindow(dpy), 50, 50,
WINDOW_WIDTH, WINDOW_HEIGHT, 1,
border, background);
XStoreName(dpy, xwindow, "XMILLE -- Version 1.0");
XSetIconName(dpy, xwindow, "XMILLE");
xch.res_name = "xmille";
xch.res_class = "XMille";
XSetClassHint(dpy, xwindow, &xch);
xwm.flags = InputHint | StateHint;
xwm.input = True;
xwm.initial_state = NormalState;
XSetWMHints(dpy, xwindow, &xwm);
xsh.flags = PPosition | PSize | PMinSize | PMaxSize;
xsh.x = 50;
xsh.y = 50;
xsh.width = xsh.min_width = xsh.max_width = WINDOW_WIDTH;
xsh.height = xsh.min_height = xsh.max_height = WINDOW_HEIGHT;
XSetNormalHints(dpy, xwindow, &xsh);
if( iscolor )
{
gcv.background = colorMap[GREY_COLOR].pixel;
gcv.foreground = colorMap[BLACK_COLOR].pixel;
}
else
{
gcv.background = colorMap[WHITE_COLOR].pixel;
gcv.foreground = colorMap[BLACK_COLOR].pixel;
}
text_gc = XCreateGC(dpy, xwindow, GCBackground | GCForeground | GCFont,
&gcv);
black_gc = text_gc;
blue_gc = text_gc;
cheap_gc = XCreateGC(dpy, xwindow,
GCBackground | GCForeground | GCFont, &gcv);
if( iscolor )
{
gcv.foreground = colorMap[BLUE_COLOR].pixel;
blue_gc = XCreateGC(dpy, xwindow,
GCBackground | GCForeground | GCFont,
&gcv);
}
if (iscolor) {
init_cards ();
}
else {
bw_init_cards();
}
co_init ();
if (iscolor) {
QUIT = CcreateButton ("Quit", 50, black_gc, font,
colorMap[GREY_COLOR].pixel, 1);
SAVE = CcreateButton ("Save", 50, black_gc, font,
colorMap[GREY_COLOR].pixel, 1);
}
else {
QUIT = CcreateButton ("Quit", 50, black_gc, font,
WhitePixel(dpy, screen), 1);
SAVE = CcreateButton ("Save", 50, black_gc, font,
WhitePixel(dpy, screen), 1);
}
qwindow = CmapButton (xwindow, QUIT_X, QUIT_Y, QUIT, do_quit);
swindow = CmapButton (xwindow, SAVE_X, SAVE_Y, SAVE, do_save);
bindEvent (qwindow, ExposureMask|ButtonPressMask|LeaveWindowMask|ButtonReleaseMask,
CmanageButton);
bindEvent (swindow, ExposureMask|ButtonPressMask|LeaveWindowMask|ButtonReleaseMask,
CmanageButton);
XMapWindow (dpy, xwindow);
bindEvent (xwindow, ExposureMask, exposeBoard);
mine = XCreateRegion();
null = XCreateRegion();
}
finish_ui ()
{
}
update_ui ()
{
XFlush (dpy);
}
Beep ()
{
XBell (dpy, 0);
}
/*
* Get a yes or no answer to the given question. Saves are
* also allowed. Return TRUE if the answer was yes, FALSE if no.
*/
getyn(prompt)
register char *prompt;
{
register char c;
return co_affirm (prompt, xwindow);
}
static char incharacter;
static int gotcharacter;
static int getmove_done;
mouse_event (rep)
XButtonEvent *rep;
{
int x, y;
x = rep->x;
y = rep->y;
if (HUM_HAND_Y <= y && y <= HUM_HAND_Y + HEIGHT &&
HUM_HAND_X <= x && x <= HUM_HAND_X + (WIDTH + PAD_CARD) * 7) {
switch (rep->button & 0377) {
case Button1:
Movetype = M_PLAY;
break;
case Button2:
Movetype = M_REASONABLE;
break;
case Button3:
Movetype = M_DISCARD;
break;
}
Card_no = (x - HUM_HAND_X) / (WIDTH + PAD_CARD);
getmove_done = 1;
return;
}
if (DECK_Y <= y && y <= DECK_Y + HEIGHT &&
DECK_X <= x && x <= DECK_X + WIDTH) {
Movetype = M_DRAW;
getmove_done = 1;
return;
}
Beep ();
}
getmove()
{
getmove_done = 0;
bindEvent (xwindow, ButtonPressMask, mouse_event);
while (!getmove_done) {
dispatch ();
}
unbindEvent (xwindow, ButtonPressMask);
}
do_save ()
{
save ();
}
do_quit ()
{
rub();
}
# define COMP_STRT 20
# define CARD_STRT 2
prboard() {
register PLAY *pp;
register int i, j, k, temp;
for (k = 0; k < 2; k++) {
pp = &Player[k];
temp = k * COMP_STRT + CARD_STRT;
for (i = 0; i < NUM_SAFE; i++)
if (pp->safety[i] == S_PLAYED) {
if (k == 0) {
HumanSafety (i + S_CONV, i);
} else {
ComputerSafety (i + S_CONV, i);
}
}
if (k == 0) {
HumanBattle (pp->battle);
HumanSpeed (pp->speed);
} else {
ComputerBattle (pp->battle);
ComputerSpeed (pp->speed);
}
for (i = C_25; i <= C_200; i++) {
register char *name;
register int end;
name = C_name[i];
temp = k * 40;
end = pp->nummiles[i];
if (k == 0)
HumanMiles (i, C_200-i, end);
else
ComputerMiles (i, C_200-i, end);
}
}
prscore(TRUE);
temp = CARD_STRT;
pp = &Player[PLAYER];
for (i = 0; i < HAND_SZ; i++) {
HumanHand (pp->hand[i], i);
}
DisplayDeck (Topcard - Deck);
DisplayDiscard (Discard);
if (End == 1000) {
static char ext[] = "Extension";
/* stand(EXT_Y, EXT_X, ext); */
}
}
/*
* Put str at (y,x) in standout mode
*/
stand(y, x, str)
register int y, x;
register char *str;
{
}
InScore (line, player, text)
int line, player;
char *text;
{
XDrawImageString (dpy, xwindow, text_gc, SCORE_X + player * SCORE_W,
SCORE_Y + SCORE_H * (line + 1), text, strlen (text));
}
prscore(for_real)
register bool for_real;
{
register PLAY *pp;
register int x;
register char *Score_fmt = "%4d ";
char buffer[512];
ComputerDistance (Player[1].mileage);
HumanDistance (Player[0].mileage);
for (pp = Player; pp < &Player[2]; pp++) {
x = (pp - Player) * 6 + 21;
sprintf (buffer, Score_fmt, pp->mileage);
InScore (0, pp - Player, buffer);
sprintf (buffer, Score_fmt, pp->safescore);
InScore (1, pp - Player, buffer);
if (pp->safescore == 400)
InScore (2, pp - Player, " 300 ");
else
InScore (2, pp - Player, " 0 ");
sprintf (buffer, Score_fmt, pp->coupscore);
InScore (3, pp - Player, buffer);
#ifdef EXTRAP
if (for_real)
finalscore(pp);
else
extrapolate(pp);
#else
finalscore(pp);
#endif
sprintf (buffer, Score_fmt, pp->hand_tot);
InScore (9, pp - Player, buffer);
sprintf (buffer, Score_fmt, pp->total);
InScore (10, pp - Player, buffer);
sprintf (buffer, Score_fmt, pp->games);
InScore (11, pp - Player, buffer);
}
}
FlushInput ()
{
}