|
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 - downloadIndex: ┃ T s ┃
Length: 5174 (0x1436) Types: TextFile Names: »stats.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─ ⟦this⟧ »./X.V10R4/xtrek/stats.c«
#ifndef lint static char *rcsid_stats_c = "$Header: stats.c,v 10.1 86/11/30 15:29:08 jg Rel $"; #endif lint /* Copyright (c) 1986 Chris Guthrie */ #include <X/Xlib.h> #include <stdio.h> #include "defs.h" #include "struct.h" #include "data.h" #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #define BX_OFF() ((textWidth + 1) * dfontinfo->width + S_IBORDER) #define BY_OFF(line) ((line) * (dfontinfo->height + S_IBORDER) + S_IBORDER) #define TX_OFF(len) ((textWidth - len) * dfontinfo->width + S_IBORDER) #define TY_OFF(line) BY_OFF(line) #define STAT_WIDTH 160 #define STAT_HEIGHT BY_OFF(NUM_SLIDERS) #define STAT_BORDER 2 #define S_IBORDER 5 #define STAT_X 422 #define STAT_Y 13 #define SL_WID \ (STAT_WIDTH - 2 * S_IBORDER - (textWidth + 1) * dfontinfo->width) #define SL_HEI (dfontinfo->height) #define NUM_ELS(a) (sizeof (a) / sizeof (*(a))) #define NUM_SLIDERS NUM_ELS(sliders) typedef struct slider { char *label; int min, max; int low_red, high_red; int label_length; int diff; } SLIDER; typedef struct record { short *data; short last_value; } RECORD; static SLIDER sliders[] = { { "Shields", 0, 100, 20, 100 }, { "Damage", 0, 100, 0, 0 }, { "Fuel", 0, 10000, 1000, 10000 }, { "Warp", 0, 9, 0, 9 }, { "Weapon Temp", 0, 1200, 0, 1000 }, { "Engine Temp", 0, 1200, 0, 1000 }, }; static XAssocTable *table; static int textWidth = 0; static int statX = STAT_X, statY = STAT_Y; initStats(prog) char *prog; { int i, dummy; char *str; if ((str = XGetDefault(prog, "stats.geometry")) != NULL) XParseGeometry(str, &statX, &statY, &dummy, &dummy); table = (XAssocTable *) XCreateAssocTable(8); for (i = 0; i < NUM_SLIDERS; i++) { sliders[i].label_length = strlen(sliders[i].label); textWidth = MAX(textWidth, sliders[i].label_length); sliders[i].diff = sliders[i].max - sliders[i].min; } } Window openStats(p) struct player *p; { Window w; RECORD *rp; extern Cursor crosshair; w = XCreateWindow(RootWindow, statX, statY, STAT_WIDTH, STAT_HEIGHT, STAT_BORDER, foreTile, backTile); XDefineCursor(w, crosshair); rp = (RECORD *) calloc(NUM_SLIDERS, sizeof (RECORD)); rp[0].data = &(p->p_shield); rp[1].data = &(p->p_damage); rp[2].data = &(p->p_fuel); rp[3].data = &(p->p_speed); rp[4].data = &(p->p_wtemp); rp[5].data = &(p->p_etemp); XMakeAssoc(table, w, rp); XSelectInput(w, ExposeWindow|ExposeRegion); XMapWindow(w); return (w); } redrawStats(w) Window w; { int i; RECORD *rp; rp = (RECORD *) XLookUpAssoc(table, w); if (rp == NULL) { fputs("You gave redrawStats a bum window\n", stderr); return; } XClear(w); for (i = 0; i < NUM_SLIDERS; i++) { rp[i].last_value = 0; XText(w, TX_OFF(sliders[i].label_length), TY_OFF(i), sliders[i].label, sliders[i].label_length, dfont, textColor, backColor); box(w, 0, BX_OFF() - 1, BY_OFF(i) - 1, SL_WID+2, SL_HEI+2, borderColor, GXcopy, AllPlanes); } } closeStats(w) Window w; { WindowInfo wi; XDeleteAssoc(table, w); if (XQueryWindow(w, &wi) != 0) { statX = wi.x; statY = wi.y; } XDestroyWindow(w); } updateStats(w) Window w; { int i, value, diff, color, old_x, new_x, wid; RECORD *rp, *r; SLIDER *s; rp = (RECORD *) XLookUpAssoc(table, w); for (i = 0; i < NUM_SLIDERS; i++) { r = &rp[i]; s = &sliders[i]; value = *(r->data); if (value < s->min) value = s->min; else if (value > s->max) value = s->max; if (value == r->last_value) continue; diff = value - r->last_value; if (diff < 0) color = backColor; else { if (value < s->low_red) color = warningColor; else if (value > s->high_red) { color = warningColor; if (r->last_value <= s->high_red) r->last_value = 0; } else { color = myColor; if (r->last_value < s->low_red) r->last_value = 0; } } old_x = r->last_value * SL_WID / s->diff; new_x = value * SL_WID / s->diff; wid = new_x - old_x; /* if (wid > 0) wid++; else if (wid < 0) wid--; */ box(w, 1, BX_OFF() + old_x, BY_OFF(i), wid, SL_HEI, color, GXcopy, AllPlanes); if (diff < 0) { if (r->last_value >= s->low_red && value < s->low_red) box(w, 1, BX_OFF(), BY_OFF(i), new_x, SL_HEI, warningColor, GXcopy, AllPlanes); else if (r->last_value > s->high_red && value <= s->high_red) box(w, 1, BX_OFF(), BY_OFF(i), new_x, SL_HEI, myColor, GXcopy, AllPlanes); } r->last_value = value; } } box(w, filled, x, y, wid, hei, pixel, func, planes) Window w; { Vertex vertex[5]; if (wid == 0 || hei == 0) return; if (filled) { int minX, minY; minX = MIN(x, x + wid); wid = ABS(wid); minY = MIN(y, y + hei); hei = ABS(hei); XPixFill(w, minX, minY, wid + 1, hei + 1, pixel, 0, func, planes); return; } vertex[0].x = x; vertex[0].y = y; vertex[0].flags = VertexStartClosed; vertex[1].x = x + wid; vertex[1].y = y; vertex[1].flags = 0; vertex[2].x = x + wid; vertex[2].y = y + hei; vertex[2].flags = 0; vertex[3].x = x; vertex[3].y = y + hei; vertex[3].flags = 0; vertex[4].x = x; vertex[4].y = y; vertex[4].flags = VertexEndClosed; XDraw(w, vertex, 5, 1, 1, pixel, func, planes); }