DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T s

⟦9ea67caf7⟧ TextFile

    Length: 6138 (0x17fa)
    Types: TextFile
    Names: »stats.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/X/Xtrek/stats.c« 

TextFile

static char sccsid[] = "@(#)stats.c	1.1";
/*

	Copyright (c) 1986 	Chris Guthrie

Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation.  No representations are made about the
suitability of this software for any purpose.  It is
provided "as is" without express or implied warranty.

*/

#include <X11/Xlib.h>
#include <X11/cursorfont.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include "defs.h"
#include "data.h"

#define	MIN(a,b)	(((a) < (b)) ? (a) : (b))
#define	MAX(a,b)	(((a) > (b)) ? (a) : (b))

/* NOTE: These should be set in player data? */
#define	BX_OFF()	((p->textWidth + 1) * fontWidth(p->dfont) + S_IBORDER)
#define	BY_OFF(line)	((line) * (fontHeight(p->dfont) + S_IBORDER) + S_IBORDER)
#define	TX_OFF(len)	((p->textWidth - len) * fontWidth(p->dfont) + 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 - (p->textWidth + 1) * fontWidth(p->dfont))
#define SL_HEI			(fontHeight(p->dfont))

#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;

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	},
};

initStats(p, prog)
register struct player	*p;
	char	*prog;
{
	int	i;
	char	*str;
	unsigned int dummy1, dummy2;

	if ((str = XGetDefault(p->display, prog, "stats.geometry")) != NULL) {
		p->uspec = XParseGeometry(str, &p->statX, &p->statY, &dummy1, &dummy2);
		if ((p->uspec & (XValue|XNegative)) == (XValue|XNegative))
			p->statX = -(p->statX);
		if ((p->uspec & (YValue|YNegative)) == (YValue|YNegative))
			p->statY = -(p->statY);
	}
	for (i = 0; i < NUM_SLIDERS; i++) {
		sliders[i].label_length = strlen(sliders[i].label);
		p->textWidth = MAX(p->textWidth, sliders[i].label_length);
		sliders[i].diff = sliders[i].max - sliders[i].min;
	}
}

Window
openStats(p)
struct player	*p;
{
	Window		w;
	extern char 	*calloc();
	XSizeHints	wininfo;
	XGCValues	values;

	w = XCreateWindow(p->display, RootWindow(p->display, p->screen), p->statX, p->statY,
		(unsigned) STAT_WIDTH, (unsigned) STAT_HEIGHT, STAT_BORDER, DefaultDepth(p->display, p->screen), InputOutput,
		(Visual *)CopyFromParent, 0L, (XSetWindowAttributes *)0);
	XDefineCursor(p->display, w, (Cursor) XCreateFontCursor(p->display, XC_crosshair));
	wininfo.x = p->statX;
	wininfo.y = p->statY;
	wininfo.width = STAT_WIDTH;
	wininfo.height = STAT_HEIGHT;
	wininfo.min_width = STAT_WIDTH;
	wininfo.min_height = STAT_HEIGHT;
	wininfo.max_width = STAT_WIDTH;
	wininfo.max_height = STAT_HEIGHT;
	if (p->uspec & (XValue|YValue|XNegative|YNegative))
		wininfo.flags = USPosition | PSize | PMinSize | PMaxSize;
	else
		wininfo.flags = PPosition | PSize | PMinSize | PMaxSize;
	XSetNormalHints(p->display, w, &wininfo);
	XStoreName(p->display, w, "xtrek-stats");
	XSetWindowBackground(p->display, w, p->backColor);
	XSetWindowBorder(p->display, w, p->borderColor);
	values.foreground = p->myColor;
	values.background = p->backColor;
	p->sgc = XCreateGC(p->display, w, GCForeground|GCBackground, &values);
	p->rp = (RECORD *) calloc(NUM_SLIDERS, sizeof (RECORD));
	p->rp[0].data = &(p->p_shield);
	p->rp[1].data = &(p->p_damage);
	p->rp[2].data = &(p->p_fuel);
	p->rp[3].data = &(p->p_speed);
	p->rp[4].data = &(p->p_wtemp);
	p->rp[5].data = &(p->p_etemp);
	XSelectInput(p->display, w, ExposureMask);
	XMapWindow(p->display, w);
	return (w);
}

redrawStats(p, w)
register struct player	*p;
Window	w;
{
	int	i;

	if (p->rp == NULL) {
		fputs("You gave redrawStats a bum window\n", stderr);
		return;
	}
	XClearWindow(p->display, w);
	for (i = 0; i < NUM_SLIDERS; i++) {
		p->rp[i].last_value = 0;
		XSetForeground(p->display, p->sgc, p->myColor);
		XDrawImageString(p->display, w, p->sgc, TX_OFF(sliders[i].label_length), TY_OFF(i) + p->dfont->ascent,
			sliders[i].label, sliders[i].label_length);
		box(p, w, 0, BX_OFF() - 1, BY_OFF(i) - 1, SL_WID+1, SL_HEI+1, p->myColor);
	}
}

closeStats(p, w)
register struct player	*p;
	Window	w;
{
	XWindowAttributes wa;

	XFreeGC(p->display, p->sgc);
	XGetWindowAttributes(p->display, w, &wa);
	p->statX = wa.x;
	p->statY = wa.y;
	XDestroyWindow(p->display, w);
}

updateStats(p, w)
register struct player *p;
	Window		w;
{
	int	i, value, diff, old_x, new_x, wid;
	unsigned long	color;
	RECORD	*r;
	SLIDER	*s;

	for (i = 0; i < NUM_SLIDERS; i++) {
		r = &p->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;
		color = p->myColor;
		if (value < s->low_red)
			color = p->warningColor;
		else if (value > s->high_red)
			color = p->warningColor;
		old_x = r->last_value * SL_WID / s->diff;
		new_x = value * SL_WID / s->diff;
		wid = new_x - old_x;
		if (wid == 0)
			continue;
		if (wid < 0)
			wid = -wid;
		if (new_x > 0)
			box(p, w, 1, BX_OFF(), BY_OFF(i), new_x, SL_HEI, color);
		if (diff < 0)
			cbox(p, w, BX_OFF() + new_x, BY_OFF(i), wid, SL_HEI);
		r->last_value = value;
	}
}

/*ARGSUSED*/
box(p, w, filled, x, y, width, height, color)
register struct player	*p;
Window	w;
int	filled;
int	x, y;
unsigned width, height;
unsigned long	color;
{
	XSetForeground(p->display, p->sgc, color);
	if (filled)
		XFillRectangle(p->display, w, p->sgc, x, y, width, height);
	else
		XDrawRectangle(p->display, w, p->sgc, x, y, width, height);
}

cbox(p, w, x, y, width, height)
register struct player	*p;
Window	w;
int	x, y;
unsigned width, height;
{
	XClearArea(p->display, w, x, y, width, height, False);
}