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 d

⟦fbcb4394d⟧ TextFile

    Length: 12888 (0x3258)
    Types: TextFile
    Names: »display.c«

Derivation

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

TextFile

/*	display.c */
#include "header.h"

#define makecode(_a,_b,_c) (((_a)<<16) + ((_b)<<8) + (_c))

static int minx,maxx,miny,maxy,k,m;
static char bot1f=0,bot2f=0,bot3f=0;
char always=0;

/*
	bottomline()

	for the bottom line of the display
 */
bottomline()
{	
	recalc();	
	bot1f=1;	
}
bottomhp()
{	
	bot2f=1;	
}
bottomspell()
{	
	bot3f=1;	
}
bottomdo()
{
	if (bot1f) { 
		bot3f=bot1f=bot2f=0; 
		bot_linex(); 
		return; 
	}
	if (bot2f) { 
		bot2f=0; 
		bot_hpx(); 
	}
	if (bot3f) { 
		bot3f=0; 
		bot_spellx(); 
	}
}

bot_linex()
{
	register int i;
	if (cbak[SPELLS] <= -50 || (always)) {
		cursor( 1,18);
		if (c[SPELLMAX]>99)  
			lprintf("Spells:%3d(%3d)", c[SPELLS],c[SPELLMAX]);
		else 
			lprintf("Spells:%3d(%2d) ",c[SPELLS],c[SPELLMAX]);
		lprintf(" AC: %-3d  WC: %-3d  Level",c[AC],c[WCLASS]);
		if (c[LEVEL]>99) 
			lprintf("%3d",c[LEVEL]);
		else 
			lprintf(" %-2d",c[LEVEL]);
		lprintf(" Exp: %-9d %s\n",c[EXPERIENCE],class[c[LEVEL]-1]);
		lprintf("HP: %3d(%3d) STR=%-2d INT=%-2d ",
			c[HP],c[HPMAX],c[STRENGTH]+c[STREXTRA],
			c[INTELLIGENCE]);
		lprintf("WIS=%-2d CON=%-2d DEX=%-2d CHA=%-2d LV:",
			c[WISDOM],c[CONSTITUTION],c[DEXTERITY],c[CHARISMA]);

		if ((level==0) || (wizard))  
			c[TELEFLAG]=0;
		if (c[TELEFLAG])  
			lprcat(" ?");  
		else  
			lprcat(levelname[level]);
		lprintf("  Gold: %-6d",c[GOLD]);
		always=1;  
		botside();
		c[TMP] = c[STRENGTH]+c[STREXTRA];
		for (i=0; i<100; i++) cbak[i]=c[i];
		return;
	}

	botsub(makecode(SPELLS,8,18),"%3d");
	if (c[SPELLMAX]>99)  
		botsub(makecode(SPELLMAX,12,18),"%3d)");
	else 
		botsub(makecode(SPELLMAX,12,18),"%2d) ");
	botsub(makecode(HP,5,19),"%3d");
	botsub(makecode(HPMAX,9,19),"%3d");
	botsub(makecode(AC,21,18),"%-3d");
	botsub(makecode(WCLASS,30,18),"%-3d");
	botsub(makecode(EXPERIENCE,49,18),"%-9d");
	if (c[LEVEL] != cbak[LEVEL]) { 
		cursor(59,18);	
		lprcat(class[c[LEVEL]-1]);  
	}
	if (c[LEVEL]>99) 
		botsub(makecode(LEVEL,40,18),"%3d");
	else 
		botsub(makecode(LEVEL,40,18)," %-2d");
	c[TMP] = c[STRENGTH]+c[STREXTRA];	
	botsub(makecode(TMP,18,19),"%-2d");
	botsub(makecode(INTELLIGENCE,25,19),"%-2d");
	botsub(makecode(WISDOM,32,19),"%-2d");
	botsub(makecode(CONSTITUTION,39,19),"%-2d");
	botsub(makecode(DEXTERITY,46,19),"%-2d");
	botsub(makecode(CHARISMA,53,19),"%-2d");
	if ((level != cbak[CAVELEVEL]) || (c[TELEFLAG] != cbak[TELEFLAG])) {
		if ((level==0) || (wizard))  c[TELEFLAG]=0;
		cbak[TELEFLAG] = c[TELEFLAG];
		cbak[CAVELEVEL] = level;	
		cursor(59,19);
		if (c[TELEFLAG])  
			lprcat(" ?");  
		else  
			lprcat(levelname[level]);
	}
	botsub(makecode(GOLD,69,19),"%-6d");
	botside();
}

/*
	special subroutine to update only the gold number on the bottomlines
	called from ogold()
 */
bottomgold()
{
	botsub(makecode(GOLD,69,19),"%-6d");
}

/*
	special routine to update hp and level fields on bottom lines
	called in monster.c hitplayer() and spattack()
 */
bot_hpx()
{
	if (c[EXPERIENCE] != cbak[EXPERIENCE]) {
		recalc();
		bot_linex();
	}
	else botsub(makecode(HP,5,19),"%3d");	
}

/*
	special routine to update number of spells called from regen()
 */
bot_spellx()
{
	botsub(makecode(SPELLS,9,18),"%2d");
}

/*
	common subroutine for a more economical bottomline()
 */
static struct bot_side_def
{
	int typ;
	char *string;
}
bot_data[] =
{
	STEALTH,"stealth",		
	UNDEADPRO,"undead pro",		
	SPIRITPRO,"spirit pro",
	CHARMCOUNT,"Charm",		
	TIMESTOP,"Time Stop",		
	HOLDMONST,"Hold Monst",
	GIANTSTR,"Giant Str",	
	FIRERESISTANCE,"Fire Resit", 
	DEXCOUNT,"Dexterity",
	STRCOUNT,"Strength",	
	SCAREMONST,"Scare",			
	HASTESELF,"Haste Self",
	CANCELLATION,"Cancel",	
	INVISIBILITY,"Invisible",	
	ALTPRO,"Protect 3",
	PROTECTIONTIME,"Protect 2", 
	WTW,"Wall-Walk"
};

botside()
{
	register int i,idx;

	for (i=0; i<17; i++) {
		idx = bot_data[i].typ;
		if ((always) || (c[idx] != cbak[idx])) {
			if ((always) || (cbak[idx] == 0)) { 
				if (c[idx]) { 
					cursor(70,i+1); 
					lprcat(bot_data[i].string); 
				} 
			}  
			else
				if (c[idx]==0)     { 
					cursor(70,i+1); 
					lprcat("          "); 
				}
			cbak[idx]=c[idx];
		}
	}
	always=0;
}

botsub(idx,str)
register int idx;
char *str;
{
	register int x,y;

	y = idx & 0xff;
	x = (idx>>8) & 0xff;
	idx >>= 16;
	if (c[idx] != cbak[idx]) { 
		cbak[idx]=c[idx];  
		cursor(x,y);  
		lprintf(str,c[idx]); 
	}
}

/*
 *	subroutine to draw only a section of the screen
 *	only the top section of the screen is updated.  If entire lines are being
 *	drawn, then they will be cleared first.
 */
int d_xmin=0,d_xmax=MAXX,d_ymin=0,d_ymax=MAXY;	/* for limited screen drawing */
draws(xmin,xmax,ymin,ymax)
int xmin,xmax,ymin,ymax;
{
	register int i,idx;
	if (xmin==0 && xmax==MAXX) /* clear section of screen as needed */
	{
		if (ymin==0) cl_up(79,ymax);
		else for (i=ymin; i<ymin; i++)  cl_line(1,i+1);
		xmin = -1;
	}
	d_xmin=xmin;	
	d_xmax=xmax;	
	d_ymin=ymin;	
	d_ymax=ymax;	/* for limited screen drawing */
	drawscreen();
	if (xmin<=0 && xmax==MAXX)  {
/* draw stuff on right side of screen as needed*/
		for (i=ymin; i<ymax; i++) {
			idx = bot_data[i].typ;
			if (c[idx]) {
				cursor(70,i+1); 
				lprcat(bot_data[i].string);
			}
			cbak[idx]=c[idx];
		}
	}
}

/*
	drawscreen()

	subroutine to redraw the whole screen as the player knows it
 */
char screen[MAXX][MAXY],d_flag;	/* template for the screen */
drawscreen()
{
	register int i,j,k;

	int lastx,lasty;  /* variables used to optimize the object printing */
	if (d_xmin==0 && d_xmax==MAXX && d_ymin==0 && d_ymax==MAXY) {
		d_flag=1;  
		clear(); /* clear the screen */
	}
	else {
		d_flag=0;  
		cursor(1,1);
	}
	if (d_xmin<0)
		d_xmin=0; /* d_xmin=-1 means display all without bottomline */

	for (i=d_ymin; i<d_ymax; i++)
		for (j=d_xmin; j<d_xmax; j++)
			if (know[j][i]==0)  screen[j][i] = ' ';  
			else
				if (k=mitem[j][i])  {
				  if (k==MIMIC)
					screen[j][i] = 
						monstnamelist[rund(MAXMONST)];
				  else
				  	screen[j][i] = monstnamelist[k];  
				}
			else
				if ((k=item[j][i])==OWALL) 
					screen[j][i] = '#';
					else screen[j][i] = ' ';

	for (i=d_ymin; i<d_ymax; i++) {
		j=d_xmin;  
		while ((screen[j][i]==' ') && (j<d_xmax)) j++;
		if (j >= d_xmax)  
			m=d_xmin; /* don't search backwards if blank line */
		else {	/* search backwards for end of line */
			m=d_xmax-1;  
			while ((screen[m][i]==' ') && (m>d_xmin)) --m;
			if (j<=m)  cursor(j+1,i+1);  
			else continue;
		}
		while (j <= m) {
			if (j <= m-3) {
				for (k=j; k<=j+3; k++) 
					if (screen[k][i] != ' ') 
						k=1000;
				if (k < 1000) { 
					while(screen[j][i]==' ' && j<=m) 
						j++;  
					cursor(j+1,i+1); 
				}
			}
			lprc(screen[j++][i]);
		}
	}
	if (boldon) setbold();		/* print out only bold objects now */

	for (lastx=lasty=127, i=d_ymin; i<d_ymax; i++)
	  for (j=d_xmin; j<d_xmax; j++) {
		if (k=item[j][i])
			if (k != OWALL)
				if ((know[j][i]) && (mitem[j][i]==0))
					if (objnamelist[k]!=' ') {
						if (lasty!=i+1 || lastx!=j)
						   cursor(lastx=j+1,lasty=i+1);
						else lastx++;
						lprc(objnamelist[k]);
					}
	}

	if (boldon) resetbold();  
	if (d_flag)  { 
		always=1; 
		botside(); 
		always=1; 
		bot_linex(); 
	}
	oldx=99;
	/* for limited screen drawing */
	d_xmin = 0 , d_xmax = MAXX , d_ymin = 0 , d_ymax = MAXY; 
}

/*
	showcell(x,y)

	subroutine to display a cell location on the screen
 */
showcell(x,y)
int x,y;
{
	register int i,j,k,m;

	if (c[BLINDCOUNT])  return;	/* see nothing if blind		*/
	if (c[AWARENESS]) { 
		minx = x-3;	
		maxx = x+3;	
		miny = y-3;	
		maxy = y+3; 
	}
	else	  { 
		minx = x-1;	
		maxx = x+1;	
		miny = y-1;	
		maxy = y+1; 
	}

	if (minx < 0) minx=0;		
	if (maxx > MAXX-1) maxx = MAXX-1;
	if (miny < 0) miny=0;		
	if (maxy > MAXY-1) maxy = MAXY-1;

	for (j=miny; j<=maxy; j++)
		for (m=minx; m<=maxx; m++)
			if (know[m][j]==0) {
				cursor(m+1,j+1);
				x=maxx;  
				while (know[x][j]) --x;
				for (i=m; i<=x; i++) {
				  if ((k=mitem[i][j]) != 0) {
				    if (k==MIMIC)
				    	lprc(monstnamelist[rund(MAXMONST)]);
				    else
					lprc(monstnamelist[k]);
				  }
					else switch(k=item[i][j]) {
					case 0: 
					case OWALL:  
					case OIVTELETRAP:  
					case OTRAPARROWIV:
					case OIVDARTRAP: 
					case OIVTRAPDOOR:	
						lprc(objnamelist[k]);	
						break;

					default: 
						if (boldon) setbold(); 
						lprc(objnamelist[k]); 
						if (boldon) resetbold();
					};
					know[i][j]=1;
				}
				m = maxx;
			}
}

/*
	this routine shows only the spot that is given it.  the spaces around
	these coordinated are not shown
	used in godirect() in monster.c for missile weapons display
 */
show1cell(x,y)
int x,y;
{
	if (c[BLINDCOUNT])  return;	/* see nothing if blind		*/
	cursor(x+1,y+1);
	if ((k=mitem[x][y]) != 0)  {
		if (k==MIMIC)
			lprc(monstnamelist[rund(MAXMONST)]);
		else
			lprc(monstnamelist[k]);
	}
	else switch(k=item[x][y]) {
	case OWALL:  
	case 0:  
	case OIVTELETRAP:  
	case OTRAPARROWIV: 
	case OIVDARTRAP: 
	case OIVTRAPDOOR:	
		lprc(objnamelist[k]);	
		break;

	default: 
		if (boldon) setbold(); 
		lprc(objnamelist[k]); 
		if (boldon) resetbold();
	};
	know[x][y]|=1;	/* we end up knowing about it */
}

/*
	showplayer()

	subroutine to show where the player is on the screen
	cursor values start from 1 up
 */
showplayer()
{
	cursor(playerx+1,playery+1);
	oldx=playerx;  
	oldy=playery;
}

/*
	moveplayer(dir)

	subroutine to move the player from one room to another
	returns 0 if can't move in that direction or hit a monster or on an object
	else returns 1
	nomove is set to 1 to stop the next move (inadvertent monsters hitting
	players when walking into walls) if player walks off screen or into wall
 */
short diroffx[] = { 0,  0, 1,  0, -1,  1, -1, 1, -1 };
short diroffy[] = { 0,  1, 0, -1,  0, -1, -1, 1,  1 };

moveplayer(dir)
int dir;	/*	from = present room #  direction = [1-north]
				[2-east] [3-south] [4-west] [5-northeast]
				[6-northwest] [7-southeast] [8-southwest]
			if direction=0, don't move--just show where he is */
{
	register int k,m,i,j;

	if (c[CONFUSE]) 
		if (c[LEVEL]<rnd(30)) dir=rund(9); /*if confused any dir*/
	k = playerx + diroffx[dir];		
	m = playery + diroffy[dir];

	if (k<0 || k>=MAXX || m<0 || m>=MAXY) { 
		nomove=1; 
		return(yrepcount = 0); 
	}

	i = item[k][m];
	j = mitem[k][m];

	/*	hit a wall	*/
	if (i==OWALL && c[WTW]==0) { 
		nomove=1;  
		return(yrepcount = 0); 
	}		

	if (k==33 && m==MAXY-1 && level==1) {
		newcavelevel(0); 
		for (k=0; k<MAXX; k++) for (m=0; m<MAXY; m++)
			if (item[k][m]==OENTRANCE) { 
				playerx=k; 
				playery=m; 
				positionplayer();  
				drawscreen(); 
				return(0); 
			}
	}
	if (j>0)     { 	
		hitmonster(k,m);	
		return(yrepcount = 0); 
	} /* hit a monster*/

	lastpx = playerx;			
	lastpy = playery;
	playerx = k;		
	playery = m;

	if (i && i!=OTRAPARROWIV && i!=OIVTELETRAP && i!=OIVDARTRAP 
	      && i!=OIVTRAPDOOR) 
		return(yrepcount = 0);  
	else return(1);
}

/*
 *	function to show what magic items have been discovered thus far
 *	enter with -1 for just spells, 99 gives all spells in game (for when 
 *	genie asks you what you want). anything else will give scrolls & potions
 */
static int lincount,count;

seemagic(arg)
int arg;
{
	register int i,number;
	count = lincount = 0;  
	nosignal=1;

	if (arg == 99) {
		number = (SPNUM+2)/3 + 4;	/* # lines needed to display */
		cl_up(79,number);  
		cursor(1,1);
		lprcat("Availible spells are:\n\n");
		for (i=0; i<SPNUM; i++) {
			lprintf("%s %-20s ",spelcode[i],spelname[i]);  
			seepage(); 
		}
		seepage();  
		more();	 
		nosignal=0;
		draws(0,MAXX,0,number);  
		return;
	}
	if (arg== -1) /* if display spells while casting one */
	{
		for (number=i=0; i<SPNUM; i++) if (spelknow[i]) number++;
		number = (number+2)/3 + 4;	/* # lines needed to display */
		cl_up(79,number);  
		cursor(1,1);
	}
	else {
		resetscroll();  
		clear();
	}

	lprcat("The magic spells you have discovered thus far:\n\n");
	for (i=0; i<SPNUM; i++)
		if (spelknow[i]) { 
			lprintf("%s %-20s ",spelcode[i],spelname[i]);  
			seepage(); 
		}

	if (arg== -1) {
		seepage();  
		more();	 
		nosignal=0;
		draws(0,MAXX,0,number);  
		return;
	}

	lincount += 3;  
	if (count!=0) { 
		count=2;  
		seepage(); 
	}

	lprcat("\nThe magic scrolls you have found to date are:\n\n");
	count=0;
	for (i=0; i<MAXSCROLL; i++)
		if (scrollname[i][0])
			if (scrollname[i][1]!=' ') { 
				lprintf("%-26s",&scrollname[i][1]);  
				seepage(); 
			}

	lincount += 3;  
	if (count!=0) { 
		count=2;  
		seepage(); 
	}

	lprcat("\nThe magic potions you have found to date are:\n\n");
	count=0;
	for (i=0; i<MAXPOTION; i++)
		if (potionname[i][0])
			if (potionname[i][1]!=' ') { 
				lprintf("%-26s",&potionname[i][1]);  
				seepage(); 
			}

	if (lincount!=0) more();	
	nosignal=0;  
	setscroll();	
	drawscreen();
}

/*
 *	subroutine to paginate the seemagic function
 */
seepage()
{
	if (++count==3) {
		lincount++;	
		count=0;	
		lprc('\n');
		if (lincount>17) {	
			lincount=0;  
			more();  
			clear();	
		}
	}
}