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 f

⟦e2d864538⟧ TextFile

    Length: 25363 (0x6313)
    Types: TextFile
    Names: »func0.c«

Derivation

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

TextFile

/*
 * func0.c  Phantasia support routines
 */

#include "phant.h"

void	treasure(stat,treastyp,size)	    /* select a treasure */
reg struct  stats   *stat;
short	treastyp;
reg int size;
{
reg int which;
int ch;
double	temp, temp2;
char	aline[35];
FILE	*fp;

    which = roll(1,3);
    move(4,0);
    clrtobot();
    move(6,0);
    if (rnd() > 0.65)	/* gold and gems */
	if (treastyp > 7)   /* gems */
	    {
	    temp = roll(1,(treastyp - 7)*(treastyp - 7)*(size - 1)/4);
	    printw("You have discovered %.0f gems!  Will you pick them up ? ",temp);
	    ch = getans("NY", FALSE);
	    addstr("\n\n");
	    if (ch == 'Y')
		if (rnd() < treastyp/40 + 0.05) /* cursed */
		    {
		    addstr("They were cursed!\n");
		    goto CURSE;
		    }
		else
		    {
		    stat->gem += temp;
		    goto EXIT;
		    }
	    else
		return;
	    }
	else	/* gold */
	    {
	    temp = roll(treastyp*10,treastyp*treastyp*10*(size - 1));
	    printw("You have found %.0f gold pieces.  Do you want to pick them up ? ",temp);
	    ch = getans("NY", FALSE);
	    addstr("\n\n");
	    if (ch == 'Y')
		if (rnd() < treastyp/35 + 0.04) /* cursed */
		    {
		    addstr("They were cursed!\n");
		    goto CURSE;
		    }
		else
		    {
		    stat->gld += floor(0.9 * temp);
		    if ((fp = fopen(goldfile,"r")) == NULL)
			{
			error(goldfile);
			/*NOTREACHED*/
			}
		    fread((char *) &temp2,sizeof(double),1,fp);
		    fclose(fp);
		    fp = fopen(goldfile,"w");
		    temp2 += floor(temp/10);
		    fwrite((char *) &temp2,sizeof(double),1,fp);
		    fclose(fp);
		    goto EXIT;
		    }
	    else
		return;
	    }
    else    /* other treasures */
	{
	addstr("You have found some treasure.  Do you want to inspect it ? ");
	ch = getans("NY", FALSE);
	addstr("\n\n");
	if (ch != 'Y')
	    return;
	else
	    if (rnd() < 0.08 && treastyp != 4)
		{
		addstr("It was cursed!\n");
		goto CURSE;
		}
	    else
		switch(treastyp)
		    {
		    case 1:
			switch(which)
			    {
			    case 1:
				addstr("You've discovered a power booster!\n");
				stat->man += roll(size*4,size*30);
				break;
			    case 2:
				addstr("You have encountered a druid.\n");
				stat->exp += roll(0,2000 + size*400);
				break;
			    case 3:
				addstr("You have found a holy orb.\n");
				stat->sin = max(0,stat->sin - 0.25);
				break;
			    }
			break;
		    case 2:
			switch (which)
			    {
			    case 1:
				addstr("You have found an amulet.\n");
				++stat->amu;
				break;
			    case 2:
				addstr("You've found some holy water!\n");
				++stat->hw;
				break;
			    case 3:
				addstr("You've met a hermit!\n");
				stat->sin *= 0.75;
				stat->man += 12*size;
				break;
			    }
			break;
		    case 3:
			switch (which)
			    {
			    case 1:
				temp = roll(7,30 + size/10);
				printw("You've found a +%.0f shield!\n",temp);
				if (temp >= stat->shd)
				    stat->shd = temp;
				else
				    somebetter();
				break;
			    case 2:
				addstr("You have rescued a virgin.  Will you be honorable ? ");
				ch = getans("NY", FALSE);
				addstr("\n\n");
				if (ch == 'Y')
				    stat->vrg = TRUE;
				else
				    {
				    stat->exp += 2000*size;
				    ++stat->sin;
				    }
				break;
			    case 3:
				addstr("You've discovered some athelas!\n");
				--stat->psn;
				break;
			    }
			break;
		    case 4:
			addstr("You've found a scroll.  Will you read it ? ");
			ch = getans("NY", FALSE);
			addstr("\n\n");
			if (ch == 'Y')
			    switch ((int) roll(1,6))
				{
				case 1:
				    addstr("It throws up a shield for you next monster.\n");
				    getyx(stdscr, which, ch);
				    paws(which);
				    longjmp(fightenv,2);
				    /*NOTREACHED*/
				case 2:
				    addstr("It makes you invisible for you next monster.\n");
				    getyx(stdscr, which, ch);
				    paws(which);
				    speed = 1e6;
				    longjmp(fightenv,0);
				    /*NOTREACHED*/
				case 3:
				    addstr("It increases your strength ten fold to fight your next monster.\n");
				    getyx(stdscr, which, ch);
				    paws(which);
				    strength *= 10;
				    longjmp(fightenv,0);
				    /*NOTREACHED*/
				case 4:
				    addstr("It is a general knowledge scroll.\n");
				    stat->brn += roll(2,size);
				    stat->mag += roll(1,size/2);
				    break;
			    case 5:
				addstr("It tells you how to pick your next monster.\n");
				addstr("Which monster do you want [0-99] ? ");
				which = inflt();
				which = min(99,max(0,which));
				fight(stat,which);
				return;
			    case 6:
				addstr("It was cursed!\n");
				goto CURSE;
			    }
			break;
		    case 5:
			switch (which)
			    {
			    case 1:
				temp = roll(size/4+5,size/2 + 9);
				printw("You've discovered a +%.0f dagger.\n",temp);
				if (temp >= stat->swd)
				    stat->swd = temp;
				else
				    somebetter();
				break;
			    case 2:
				temp = roll(7.5 + size*3,size * 2 + 160);
				printw("You have found some +%.0f armour!\n",temp);
				if (temp >= stat->shd)
				    stat->shd = temp;
				else
				    somebetter();
				break;
			    case 3:
				addstr("You've found a tablet.\n");
				stat->brn += 4.5*size;
				break;
			    }
			break;
		    case 6:
			switch (which)
			    {
			    case 1:
				addstr("You've found a priest.\n");
				stat->nrg = stat->mxn + stat->shd;
				stat->sin /= 2;
				stat->man += 24*size;
				stat->brn += size;
				break;
			    case 2:
				addstr("You have come upon Robin Hood!\n");
				stat->shd += size*2;
				stat->str += size/2.5 + 1;
				break;
			    case 3:
				    temp = roll(2 + size/4,size/1.2 + 10);
				printw("You have found a +%.0f axe!\n",temp);
				if (temp >= stat->swd)
				    stat->swd = temp;
				else
				    somebetter();
				break;
			    }
			break;
		    case 7:
			switch (which)
			    {
			    case 1:
				addstr("You've discovered a charm!\n");
				++stat->chm;
				break;
			    case 2:
				addstr("You have encountered Merlyn!\n");
				stat->brn += size + 5;
				stat->mag += size/3 + 5;
				stat->man += size*10;
				break;
			    case 3:
				temp = roll(5+size/3,size/1.5 + 20);
				printw("You have found a +%.0f war hammer!\n",temp);
				if (temp >= stat->swd)
				    stat->swd = temp;
				else
				    somebetter();
				break;
			    }
			break;
		    case 8:
			switch (which)
			    {
			    case 1:
				addstr("You have found a healing potion.\n");
				stat->psn = min(-2,stat->psn-2);
				break;
			    case 2:
				addstr("You have discovered a transporter.  Do you wish to go anywhere ? ");
				ch = getans("NY", FALSE);
				addstr("\n\n");
				if (ch == 'Y')
				    {
				    addstr("X Y Coordinates ? ");
				    getstring(aline,80);
				    sscanf(aline,"%F %F",&stat->x,&stat->y);
				    stat->x = floor(stat->x);
				    stat->y = floor(stat->y);
				    }
				break;
			    case 3:
				temp = roll(10 + size/1.2,size*3 + 30);
				printw("You've found a +%.0f sword!\n",temp);
				if (temp >= stat->swd)
				    stat->swd = temp;
				else
				    somebetter();
				break;
			    }
			break;
		    case 10:
		    case 11:
		    case 12:
		    case 13:
			if (rnd() < 0.33)
			    {
			    if (treastyp == 10)
				{
				addstr("You've found a pair of elven boots!\n");
				stat->quk += 2;
				break;
				}
			    else if (treastyp == 11 && !stat->pal)
				{
				addstr("You've acquired Saruman's palantir.\n");
				stat->pal = TRUE;
				break;
				}
			    else if (!stat->rng.type && stat->typ < 20 && (treastyp == 12 || treastyp == 13))
				{
				if (treastyp == 12)
				    if (rnd() < 0.8)
					{
					which = NAZREG;
					temp = 15;
					}
				    else
					{
					which = NAZBAD;
					temp = 10 + rngcalc(stat->typ) + roll(0,5);
					}
				else
				    if (rnd() > 0.9)
					{
					which = DLREG;
					temp = 0;
					}
				    else
					{
					which = DLBAD;
					temp = 15 + rngcalc(stat->typ) + roll(0,5);
					}
				    addstr("You've discovered a ring.  Will you pick it up ? ");
				    ch = getans("NY", FALSE);
				    addstr("\n\n");
				    if (ch == 'Y')
					{
					stat->rng.type = which;
					stat->rng.duration = temp;
					}
				break;
				}
			    }
			case 9:
			    switch (which)
				{
				case 1:
				    if (!(stat->lvl > 1000 || stat->crn > floor((double) stat->lvl/100)
					    || stat->lvl < 10))
					{
					addstr("You have found a golden crown!\n");
					++stat->crn;
					break;
					}
				case 2:
				    addstr("You've been blessed!\n");
				    stat->bls = TRUE;
				    stat->sin /=3;
				    stat->nrg = stat->mxn + stat->shd;
				    stat->man += 100*size;
				    break;
				case 3:
				    temp = roll(1,size/5+5);
				    temp = min(temp,99);
				    printw("You have discovered some +%.0f quicksilver!\n",temp);
				    if (temp >= stat->quks)
					stat->quks = temp;
				    else
					somebetter();
				    break;
				}
			    break;
			}
	}
	goto EXIT;
CURSE:	if (stat->chm)
	{
	addstr("But your charm saved you!\n");
	--stat->chm;
	}
    else if (stat->amu)
	{
	addstr("But your amulet saved you!\n");
	--stat->amu;
	}
    else
	{
	stat->nrg = (stat->mxn + stat->shd)/10;
	stat->psn += 0.25;
	}
EXIT:
    getyx(stdscr, which, ch);
    paws(which);
}

void	callmonster(which,size,mons)	    /* fill a structure with monster 'which' of size 'size' */
reg int which, size;
reg struct  mstats  *mons;
{
FILE	*fp;
char	instr[100];

    which = min(which,99);
    if ((fp = fopen(monsterfile,"r")) == NULL)
	{
	error(monsterfile);
	/*NOTREACHED*/
	}
    for (++which; which; --which)
	fgets(instr,100,fp);
    strncpy(mons->name,instr,24);
    mons->name[24] = '\0';
    sscanf(instr + 24,"%F%F%F%F%F%d%d%d",&mons->str,&mons->brn,&mons->spd,&mons->hit,
	&mons->exp,&mons->trs,&mons->typ,&mons->flk);
    if (mons->typ == 2) /* Modnar */
	{
	mons->str *= rnd() + 0.5;
	mons->brn *= rnd() + 0.5;
	mons->spd *= rnd() + 0.5;
	mons->hit *= rnd() + 0.5;
	mons->exp *= rnd() + 0.5;
	mons->trs *= rnd();
	}
    else if (mons->typ == 3)	/* mimic */
	{
	fseek(fp,0L,0);
	for (which = roll(0,100); which; --which)
	    fgets(instr,100,fp);
	strncpy(mons->name,instr,24);
	}
    trunc(mons->name);
    mons->str += (size-1)*mons->str/2;
    mons->brn *= size;
    mons->spd += size * 1.e-9;
    mons->hit *= size;
    mons->exp *= size;
    fclose(fp);
}

struct	/* lookup table for rolling stats and making increases upon gaining levels */
    {
    struct
	{
	int base;
	int interval;
	float	increase;
	} quick,      strength,      mana,	energy,    brains,    magic;
    } table[7] =
	{
/* mag. usr: */ 30, 6, 0.0,   20, 6, 2.0,    50,51,75.0,    30,16,20.0,    60,26, 6.0,	  5, 5,2.75,
/* fighter:  */ 30, 6, 0.0,   40,16, 3.0,    30,21,40.0,    45,26,30.0,    25,21, 3.0,	  3, 4, 1.5,
/* elf:      */ 32, 7, 0.0,   35,11, 2.5,    45,46,65.0,    30,21,25.0,    40,26, 4.0,	  4, 4, 2.0,
/* dwarf:    */ 25, 6, 0.0,   45,21, 5.0,    25,21,30.0,    60,41,35.0,    20,21, 2.5,	  2, 4, 1.0,
/* halfling: */ 34, 0, 0.0,   20, 6, 2.0,    25,21,30.0,    55,36,30.0,    40,36, 4.5,	  1, 4, 1.0,
/* exprmnto: */ 27, 0, 0.0,   25, 0, 0.0,    100,0, 0.0,    35, 0, 0.0,    25, 0, 0.0,	  2, 0, 0.0,
/* super:    */ 38, 0, 0.0,   65, 0, 0.0,    100,0, 0.0,    80, 0, 0.0,    85, 0, 0.0,	  9, 0, 0.0
	};

void	genchar(res,type)		/* init a charac struct */
int type;
reg struct  stats   *res;
{
register int	subscript;

    if (type < '1' || type > '6')
	if (type != '7' || !su)
	    type = '2'; /* fighter is default */
    subscript = type - '1';
    res->quk = roll(table[subscript].quick.base,table[subscript].quick.interval);
    res->str = roll(table[subscript].strength.base,table[subscript].strength.interval);
    res->man = roll(table[subscript].mana.base,table[subscript].mana.interval);
    res->mxn = res->nrg = roll(table[subscript].energy.base,table[subscript].energy.interval);
    res->brn = roll(table[subscript].brains.base,table[subscript].brains.interval);
    res->mag = roll(table[subscript].magic.base,table[subscript].magic.interval);
    res->typ = subscript;
    if (subscript < 6)
	++res->typ;
    if (type == '5')
	res->exp = roll(600,200);   /* give halfling some exp. */
}

void	movelvl(stat)		    /* update stats for new level */
reg struct  stats   *stat;
{
reg int type;
reg unsigned new;
double	inc;

    changed = TRUE;
    type = abs(stat->typ);
    if (type < 6)
	;   /* normal */
    else if (type < 10)
	type = roll(1,5);   /* experimento */
    else if (type < 20)
	{
	type -= 10; /* king */
	if (type > 5)
	    type = roll(1,5);	/* experimento */
	}
    else if (type < 26)
	type -= 20; /* council of wise */
    else
	type = roll(1,5);   /* everything else */
    new = level(stat->exp);
    inc = new - stat->lvl;
    --type;	    /* set up for subscripting into table */
    stat->str += table[type].strength.increase * inc;
    stat->man += table[type].mana.increase * inc;
    stat->brn += table[type].brains.increase * inc;
    stat->mag += table[type].magic.increase * inc;
    stat->mxn += table[type].energy.increase * inc;
    stat->nrg = stat->mxn + stat->shd;
    if ((stat->lvl = min(10000,new)) >= 1000)
	{   /* no longer able to be king */
	stat->gld += stat->crn * 5000;
	stat->crn = 0;
	stat->typ = abs(stat->typ);
	}
    if (stat->lvl >= 3000 && stat->typ < 20)
	{   /* make a member of the council */
	mvaddstr(6,0,"You have made it to the Council of the Wise.\nGood Luck on your search for the Holy Grail.\n");
	stat->rng.type = 0;
	stat->rng.duration = 3;
	stat->typ = abs(stat->typ) + (stat->typ > 10 ? 10 :20);
	}
}

char	*printloc(x,y)		/* return a pointer to a string specifying location */
double	x,y;	    /* also, set some global flags */
{
reg int size, loc;
reg char    *label;
static	char	res[80],
	*nametable[4][4] =   /* names of places */
	{
	"Anorien",	"Ithilien",	"Rohan",	"Lorien",
	"Gondor",	"Mordor",	"Dunland",	"Rovanion",
	"South Gondor", "Khand",	"Eriador",	"The Iron Hills",
	"Far Harad",	"Near Harad",	"The Northern Waste", "Rhun"
	};

    throne = beyond = marsh = FALSE;
    if (wmhl)
	return (strcpy(res," is in the Wormholes"));
    else if (valhala)
	return (strcpy(res," is in Valhala"));
    else if ((size = circ(x,y)) >= 1000)
	{
	if (max(abs(x),abs(y)) > 1100000)
	    {
	    label = "The Point of No Return";
	    beyond = TRUE;
	    }
	else
	    label = "The Ashen Mountains";
	}
    else if (size >= 55)
	label = "Morannon";
    else if (size >= 35)
	label = "Kennaquahair";
    else if (size >= 20)
	{
	label = "The Dead Marshes";
	marsh = TRUE;
	}
    else if (size >= 9)
	label = "The Outer Waste";
    else if (size >= 5)
	label = "The Moors Adventurous";
    else
	{
	if (x == 0.0 && y == 0.0)
	    {
	    label = "The Lord's Chamber";
	    throne = TRUE;
	    }
	else
	    {
	    loc = ((x > 0.0) ? 1 : 0) + ((y >= 0.0) ? 2 : 0);
	    label = nametable[size-1][loc];
	    }
	}
    sprintf(res," is in %s  (%.0f,%.0f)",label,x,y);
    return (res);
}

void	initchar(stat)		    /* put in some default values */
reg struct  stats   *stat;
{
    stat->x = roll(-125,251);
    stat->y = roll(-125,251);
    stat->exp = stat->lvl = stat->sin = 0;
    stat->crn = stat->psn = 0;
    stat->rng.type = NONE;
    stat->rng.duration = 0;
    stat->blind = stat->vrg = stat->pal = FALSE;
    stat->hw = stat->amu = stat->bls = 0;
    stat->chm = 0;
    stat->gem = 0.1;
    stat->gld = roll(25,50) + roll(0,25) + 0.1;
    stat->quks = stat->swd = stat->shd = 0;
    stat->typ = 0;
    stat->status = stat->tampered = OFF;
    stat->scratch1 = stat->scratch2 = 0.0;
    stat->wormhole = 0;
    stat->age = 0;
    stat->degen = 1;
    stat->istat = 0;
}

void	trade(stat)		/* trading post */
reg struct  stats   *stat;
{
static	struct
	{
	char	*item;
	int cost;
	}   menu[] =
	    {
	    "Mana",1,
	    "Shield",5,
	    "Book",200,
	    "Sword",500,
	    "Charm",1000,
	    "Quiksilver",2500,
	    "Blessing",1000,
	    "Gem",1000	/* this is only to ease changing the value of gems */
	    };
double	temp;
int ch;
reg int size, loop;
bool	cheat = FALSE;

    changed = TRUE;
    clear();
    addstr("You are at a trading post. All purchases must be made with gold.");
    size = sqrt(abs(stat->x/100)) + 1;
    size = min(7,size);
    /* set up cost of blessing */
    menu[6].cost = 1000 * (stat->lvl + 5);
    mvprintw(4,0,"L:Leave  P:Purchase  S:Sell Gems ? ");
    move(6,0);
    for (loop = 0; loop < size; ++loop)
	printw("(%d) %-10s: %6d\n",loop+1,menu[loop].item,menu[loop].cost);
PROMPT: mvprintw(1,0,"Gold:  %9.0f  Gems:  %9.0f  Level:   %6u  Charms: %6d\n",stat->gld,stat->gem,stat->lvl,stat->chm);
    printw("Shield:%9.0f  Sword: %9.0f  Quicksilver:%3d  Blessed: %s",
	stat->shd,stat->swd,stat->quks,(stat->bls ? " True" : "False"));
    move(4,36);
    ch = getans("LPS", FALSE);
    move(15,0);
    clrtobot();
    switch(ch)
	{
	case 'L':
	case '\n':
	    stat->x -= roll(-25, 50);
	    stat->y -= roll(-25, 50);
	    return;
	case 'P':
	    mvaddstr(15,0,"What what would you like to buy ? ");
	    ch = getans(" 1234567", FALSE);
	    move(15,0);
	    clrtoeol();
	    if (ch - '0' > size)
		addstr("Sorry, this merchant doesn't have that.");
	    else
		switch (ch)
		    {
		    case '1':
			printw("Mana is one per %d gold piece.  How many do you want (%.0f max) ? ",menu[0].cost,floor(stat->gld/menu[0].cost));
			temp = inflt();
			if (temp * menu[0].cost > stat->gld || temp < 0)
			    goto CHEAT;
			else
			    {
			    stat->gld -= floor(temp) * menu[0].cost;
			    if (rnd() < 0.02)
				goto DISHON;
			    else
				stat->man += floor(temp);
			    }
			break;
		    case '2':
			printw("Shields are %d per +1.  How many do you want (%.0f max) ? ",menu[1].cost,floor(stat->gld/menu[1].cost));
			temp = inflt();
			if (!temp)
			    break;
			if (temp * menu[1].cost > stat->gld || temp < 0)
			    goto CHEAT;
			else
			    {
			    stat->gld -= floor(temp) * menu[1].cost;
			    if (rnd() < 0.02)
				goto DISHON;
			    else
				stat->shd = floor(temp);
			    }
			break;
		    case '3':
			printw("A book costs %d gp.  How many do you want (%.0f max) ? ",menu[2].cost,floor(stat->gld/menu[2].cost));
			temp = inflt();
			if (temp * menu[2].cost > stat->gld || temp < 0)
			    goto CHEAT;
			else
			    {
			    stat->gld -= floor(temp) * menu[2].cost;
			    if (rnd() < 0.02)
				goto DISHON;
			    else
				if (rnd()*temp > stat->lvl/10 && temp != 1)
				    {
				    printw("\nYou blew your mind!\n");
				    stat->brn /= 5;
				    }
				else
				    stat->brn += floor(temp)*roll(20,8);
			    }
			break;
		    case '4':
			printw("Swords are %d gp per +1.  How many + do you want (%.0f max) ? ",menu[3].cost,floor(stat->gld/menu[3].cost));
			temp = inflt();
			if (!temp)
			    break;
			if (temp * menu[3].cost > stat->gld || temp < 0)
			    goto CHEAT;
			else
			    {
			    stat->gld -= floor(temp) * menu[3].cost;
			    if (rnd() < 0.02)
				goto DISHON;
			    else
				stat->swd = floor(temp);
			    }
			break;
		    case '5':
			printw("A charm costs %d gp.  How many do you want (%.0f max) ? ",menu[4].cost,floor(stat->gld/menu[4].cost));
			temp = inflt();
			if (temp * menu[4].cost > stat->gld || temp < 0)
			    goto CHEAT;
			else
			    {
			    stat->gld -= floor(temp) * menu[4].cost;
			    if (rnd() < 0.02)
				goto DISHON;
			    else
				stat->chm += floor(temp);
			    }
			break;
		    case '6':
			printw("Quicksilver is %d gp per +1.  How many + do you want (%.0f max) ? ",menu[5].cost,floor(stat->gld/menu[5].cost));
			temp = inflt();
			if (!temp)
			    break;
			if (temp * menu[5].cost > stat->gld || temp < 0)
			    goto CHEAT;
			else
			    {
			    stat->gld -= floor(temp) * menu[5].cost;
			    if (rnd() < 0.02)
				goto DISHON;
			    else
				stat->quks = min(99,floor(temp));
			    }
			break;
		    case '7':
			printw("A blessing requires a %d gp donation.  Still want one ? ",menu[6].cost);
			ch = getans("NY", FALSE);
			if (ch == 'Y')
			    if (stat->gld < menu[6].cost)
				goto CHEAT;
			    else
				{
				stat->gld -= menu[6].cost;
				if (rnd() < 0.02)
				    goto DISHON;
				else
				    stat->bls = TRUE;
				}
			break;
		    }
	    break;
	case 'S':
	    mvprintw(15,0,"A gem is worth %d gp.  How many do you want to sell (%.0f max) ? ",menu[7].cost,stat->gem);
	    temp = inflt();
	    if (temp > stat->gem || temp < 0)
		goto CHEAT;
	    else
		{
		stat->gem -= floor(temp);
		stat->gld += floor(temp) * menu[7].cost;
		}
	}
    goto PROMPT;

CHEAT:	move(17,0);
    if (!cheat)
	{
	addstr("Come on, merchants aren't stupid.  Stop cheating.\n");
	cheat = TRUE;
	goto PROMPT;
	}
    else
	{
	addstr("You had your chance.  This merchant happens to be\n");
	printw("a %.0f level magic user, and you made %s mad!\n",roll(size*10,size*20),(rnd() < 0.5) ? "him" : "her");
	stat->x += roll(-250,500)*size;
	stat->y += roll(-250,500)*size;
	stat->nrg = min(size*20,stat->mxn);
	++stat->sin;
	paws(23);
	}
    return;

DISHON: mvaddstr(17,0,"The merchant stole your money!");
    refresh();
    stat->x -= floor(stat->x/10);
    stat->y -= floor(stat->y/10);
    sleep(2);
}

void	printstats(stat)		/* show characteristics */
reg struct  stats   *stat;
{
    mvprintw(0,0,"%s%s\n",stat->name,printloc(stat->x,stat->y));
    mvprintw(1,0,"Level :%7u   Energy  :%9.0f(%9.0f)  Mana :%9.0f  Users:%3d\n",
	stat->lvl,stat->nrg,stat->mxn + stat->shd,stat->man,users);
    mvprintw(2,0,"Quick :%3.0f(%3d)  Strength:%9.0f(%9.0f)  Gold :%9.0f    ",
	speed,stat->quk + stat->quks,strength,stat->str + stat->swd,stat->gld);
    switch (stat->status)
	{
	case PLAYING:
	    if (stat->nrg < 0.2 * (stat->mxn + stat->shd))
		addstr("Low Energy\n");
	    else if (stat->blind)
		addstr("Blind\n");
	    else
		clrtoeol();
	    break;
	case CLOAKED:
	    addstr("Cloaked\n");
	    break;
	case INBATTLE:
	    addstr("In Battle\n");
	    break;
	case OFF:
	    addstr("Off\n");
	}
}

void	showall(stat)		    /* show special items */
reg struct  stats   *stat;
{
static	char	*flags[] =
	    {
	    "False",
	    " True"
	    };

    mvprintw(6,0,"Type: %3d  --  ",stat->typ);
    switch (abs(stat->typ))
	{
	case 1:
	case 11:
	case 21:
	    addstr("Magic User");
	    break;
	case 2:
	case 12:
	case 22:
	    addstr("Fighter");
	    break;
	case 3:
	case 13:
	case 23:
	    addstr("Elf");
	    break;
	case 4:
	case 14:
	case 24:
	    addstr("Dwarf");
	    break;
	case 5:
	case 15:
	case 25:
	    addstr("Halfling");
	    break;
	case 6:
	case 16:
	case 26:
	    addstr("Experimento");
	    break;
	case 90:
	    addstr("Ex-Valar");
	    break;
	case 99:
	    addstr("Valar");
	}
    if (stat->typ > 10 && stat->typ < 90)
	if (stat->typ > 20)
	    addstr(" (Council of Wise)");
	else
	    addstr(" (King)");
	addch('\n');
    mvprintw(8,0,"Experience: %9.0f",stat->exp);
    mvprintw(9,0,"Brains    : %9.0f",stat->brn);
    mvprintw(10,0,"Magic Lvl : %9.0f",stat->mag);
    mvprintw(11,0,"Sin       : %9.5f",stat->sin);
    mvprintw(12,0,"Poison    : %9.5f",stat->psn);
    mvprintw(13,0,"Gems      : %9.0f",stat->gem);
    mvprintw(14,0,"Age       : %9d",stat->age);
    mvprintw(8,40,"Holy Water: %9d",stat->hw);
    mvprintw(9,40,"Amulets   : %9d",stat->amu);
    mvprintw(10,40,"Charms    : %9d",stat->chm);
    mvprintw(11,40,"Crowns    : %9d",stat->crn);
    mvprintw(12,40,"Shield    : %9.0f",stat->shd);
    mvprintw(13,40,"Sword     : %9.0f",stat->swd);
    mvprintw(14,40,"Quickslver: %9d",stat->quks);

    mvprintw(15,0,"Blessing: %s   Ring: %s   Virgin: %s   Palantir: %s",
	flags[stat->bls],flags[stat->rng.type != 0],flags[stat->vrg],flags[stat->pal]);
}

void	neatstuff(stat) 	    /* random things */
reg struct  stats   *stat;
{
double	temp;
int ch;

    switch ((int) roll(0,100))
	{
	case 1:
	case 2:
	    if (stat->psn > 0)
		{
		mvaddstr(4,0,"You've found a medic!  How much will you offer to be cured ? ");
		temp = inflt();
		if (temp < 0 || temp > stat->gld)
		    {
		    mvaddstr(6,0,"He was not amused, and made you worse.\n");
		    ++stat->psn;
		    }
		else if (rnd()/2.0 > (temp + 1)/max(stat->gld,1))
		    mvaddstr(5,0,"Sorry, he wasn't interested.\n");
		else
		    {
		    mvaddstr(5,0,"He accepted.");
		    stat->psn = max(0,stat->psn-1);
		    stat->gld -= floor(temp);
		    }
		}
	    break;
	case 3:
	    mvaddstr(4,0,"You've been caught raping and pillaging!\n");
	    stat->exp += 4000;
	    stat->sin += 0.5;
	    break;
	case 4:
	    temp = roll(6,50);
	    mvprintw(4,0,"You've found %.0f gold pieces, want them ? ",temp);
	    clrtoeol();
	    ch = getans("NY", FALSE);
	    if (ch == 'Y')
		stat->gld += temp;
	    break;
	case 5:
	    if (stat->sin > 1)
		{
		mvaddstr(4,0,"You've found a Holy Orb!\n");
		stat->sin -= 0.25;
		}
	    break;
	case 6:
	    if (stat->psn < 1)
		{
		mvaddstr(4,0,"You've been hit with a plague!\n");
		++stat->psn;
		}
	    break;
	case 7:
	    mvaddstr(4,0,"You've found some holy water.\n");
	    ++stat->hw;
	    break;
	case 8:
	    mvaddstr(4,0,"You've met a Guru. . .");
	    if (rnd()*stat->sin > 1)
		addstr("You disgusted him with your sins!\n");
	    else if (stat->psn > 0)
		{
		addstr("He looked kindly upon you, and cured you.\n");
		stat->psn = 0;
		}
	    else
		{
		addstr("He rewarded you for your virtue.\n");
		stat->man += 50;
		stat->shd += 2;
		}
	    break;
	case 9:
	    mvaddstr(4,0,"You've found an amulet.\n");
	    ++stat->amu;
	    break;
	case 10:
	    if (stat->blind)
		{
		mvaddstr(4,0,"You've regained your sight!\n");
		stat->blind = FALSE;
		}
	    break;
	default:
	    if (stat->psn > 0)
		stat->nrg -= min(stat->psn*stat->mxn/45,0.9*stat->mxn);
	    stat->nrg = max(stat->nrg,floor(stat->mxn/11));
	}
}