freebsd-dev/games/larn/moreobj.c
jkh 057afceb86 Bring in the 4.4 Lite games directory, modulo man page changes and segregation
of the x11 based games.  I'm not going to tag the originals with bsd_44_lite
and do this in two stages since it's just not worth it for this collection,
and I've got directory renames to deal with that way.  Bleah.
Submitted by:	jkh
1994-09-04 04:03:31 +00:00

373 lines
8.8 KiB
C

/* moreobj.c Larn is copyrighted 1986 by Noah Morgan.
*
* Routines in this file:
*
* oaltar()
* othrone()
* ochest()
* ofountain()
*/
#include "header.h"
static void ohear();
/*
* ******
* OALTAR
* ******
*
* subroutine to process an altar object
*/
oaltar()
{
unsigned long k;
lprcat("\nDo you (p) pray (d) desecrate"); iopts();
while (1)
{
while (1) switch(getchar())
{
case 'p': lprcat(" pray\nDo you (m) give money or (j) just pray? ");
while (1) switch(getchar())
{
case 'j': if (rnd(100)<75)
lprcat("\nnothing happens");
else if (rnd(13)<4) ohear();
else if (rnd(43) == 10)
{
if (c[WEAR]) lprcat("\nYou feel your armor vibrate for a moment");
enchantarmor(); return;
}
else if (rnd(43) == 10)
{
if (c[WIELD]) lprcat("\nYou feel your weapon vibrate for a moment");
enchweapon(); return;
}
else createmonster(makemonst(level+1));
return;
case 'm': lprcat("\n\n"); cursor(1,24); cltoeoln();
cursor(1,23); cltoeoln();
lprcat("how much do you donate? ");
k = readnum((long)c[GOLD]);
if (c[GOLD]<k)
{
lprcat("\nYou don't have that much!");
return;
}
c[GOLD] -= k;
if (k < c[GOLD]/10 || k<rnd(50))
{ createmonster(makemonst(level+1)); c[AGGRAVATE] += 200; }
else if (rnd(101) > 50) { ohear(); return; }
else if (rnd(43) == 5)
{
if (c[WEAR]) lprcat("\nYou feel your armor vibrate for a moment");
enchantarmor(); return;
}
else if (rnd(43) == 8)
{
if (c[WIELD]) lprcat("\nYou feel your weapon vibrate for a moment");
enchweapon(); return;
}
else lprcat("\nThank You.");
bottomline(); return;
case '\33': return;
};
case 'd': lprcat(" desecrate");
if (rnd(100)<60)
{ createmonster(makemonst(level+2)+8); c[AGGRAVATE] += 2500; }
else
if (rnd(101)<30)
{
lprcat("\nThe altar crumbles into a pile of dust before your eyes");
forget(); /* remember to destroy the altar */
}
else
lprcat("\nnothing happens");
return;
case 'i':
case '\33': ignore();
if (rnd(100)<30) { createmonster(makemonst(level+1)); c[AGGRAVATE] += rnd(450); }
else lprcat("\nnothing happens");
return;
};
}
}
/*
function to cast a +3 protection on the player
*/
static void
ohear()
{
lprcat("\nYou have been heard!");
if (c[ALTPRO]==0) c[MOREDEFENSES]+=3;
c[ALTPRO] += 500; /* protection field */
bottomline();
}
/*
*******
OTHRONE
*******
subroutine to process a throne object
*/
othrone(arg)
int arg;
{
register int i,k;
lprcat("\nDo you (p) pry off jewels, (s) sit down"); iopts();
while (1)
{
while (1) switch(getchar())
{
case 'p': lprcat(" pry off"); k=rnd(101);
if (k<25)
{
for (i=0; i<rnd(4); i++) creategem(); /* gems pop off the throne */
item[playerx][playery]=ODEADTHRONE;
know[playerx][playery]=0;
}
else if (k<40 && arg==0)
{
createmonster(GNOMEKING);
item[playerx][playery]=OTHRONE2;
know[playerx][playery]=0;
}
else lprcat("\nnothing happens");
return;
case 's': lprcat(" sit down"); k=rnd(101);
if (k<30 && arg==0)
{
createmonster(GNOMEKING);
item[playerx][playery]=OTHRONE2;
know[playerx][playery]=0;
}
else if (k<35) { lprcat("\nZaaaappp! You've been teleported!\n"); beep(); oteleport(0); }
else lprcat("\nnothing happens");
return;
case 'i':
case '\33': ignore(); return;
};
}
}
odeadthrone()
{
register int k;
lprcat("\nDo you (s) sit down"); iopts();
while (1)
{
while (1) switch(getchar())
{
case 's': lprcat(" sit down"); k=rnd(101);
if (k<35) { lprcat("\nZaaaappp! You've been teleported!\n"); beep(); oteleport(0); }
else lprcat("\nnothing happens");
return;
case 'i':
case '\33': ignore(); return;
};
}
}
/*
******
OCHEST
******
subroutine to process a throne object
*/
ochest()
{
register int i,k;
lprcat("\nDo you (t) take it, (o) try to open it"); iopts();
while (1)
{
while (1) switch(getchar())
{
case 'o': lprcat(" open it"); k=rnd(101);
if (k<40)
{
lprcat("\nThe chest explodes as you open it"); beep();
i = rnd(10); lastnum=281; /* in case he dies */
lprintf("\nYou suffer %d hit points damage!",(long)i);
checkloss(i);
switch(rnd(10)) /* see if he gets a curse */
{
case 1: c[ITCHING]+= rnd(1000)+100;
lprcat("\nYou feel an irritation spread over your skin!");
beep();
break;
case 2: c[CLUMSINESS]+= rnd(1600)+200;
lprcat("\nYou begin to lose hand to eye coordination!");
beep();
break;
case 3: c[HALFDAM]+= rnd(1600)+200;
beep();
lprcat("\nA sickness engulfs you!"); break;
};
item[playerx][playery]=know[playerx][playery]=0;
if (rnd(100)<69) creategem(); /* gems from the chest */
dropgold(rnd(110*iarg[playerx][playery]+200));
for (i=0; i<rnd(4); i++) something(iarg[playerx][playery]+2);
}
else lprcat("\nnothing happens");
return;
case 't': lprcat(" take");
if (take(OCHEST,iarg[playerx][playery])==0)
item[playerx][playery]=know[playerx][playery]=0;
return;
case 'i':
case '\33': ignore(); return;
};
}
}
/*
*********
OFOUNTAIN
*********
*/
ofountain()
{
register int x;
cursors();
lprcat("\nDo you (d) drink, (w) wash yourself"); iopts();
while (1) switch(getchar())
{
case 'd': lprcat("drink");
if (rnd(1501)<2)
{
lprcat("\nOops! You seem to have caught the dreadful sleep!");
beep(); lflush(); sleep(3); died(280); return;
}
x = rnd(100);
if (x<7)
{
c[HALFDAM] += 200+rnd(200);
lprcat("\nYou feel a sickness coming on");
}
else if (x<13) quaffpotion(23); /* see invisible */
else if (x < 45)
lprcat("\nnothing seems to have happened");
else if (rnd(3) != 2)
fntchange(1); /* change char levels upward */
else
fntchange(-1); /* change char levels downward */
if (rnd(12)<3)
{
lprcat("\nThe fountains bubbling slowly quiets");
item[playerx][playery]=ODEADFOUNTAIN; /* dead fountain */
know[playerx][playery]=0;
}
return;
case '\33':
case 'i': ignore(); return;
case 'w': lprcat("wash yourself");
if (rnd(100) < 11)
{
x=rnd((level<<2)+2);
lprintf("\nOh no! The water was foul! You suffer %d hit points!",(long)x);
lastnum=273; losehp(x); bottomline(); cursors();
}
else
if (rnd(100) < 29)
lprcat("\nYou got the dirt off!");
else
if (rnd(100) < 31)
lprcat("\nThis water seems to be hard water! The dirt didn't come off!");
else
if (rnd(100) < 34)
createmonster(WATERLORD); /* make water lord */
else
lprcat("\nnothing seems to have happened");
return;
}
}
/*
***
FCH
***
subroutine to process an up/down of a character attribute for ofountain
*/
static void
fch(how,x)
int how;
long *x;
{
if (how < 0) { lprcat(" went down by one!"); --(*x); }
else { lprcat(" went up by one!"); (*x)++; }
bottomline();
}
/*
a subroutine to raise or lower character levels
if x > 0 they are raised if x < 0 they are lowered
*/
fntchange(how)
int how;
{
register long j;
lprc('\n');
switch(rnd(9))
{
case 1: lprcat("Your strength"); fch(how,&c[0]); break;
case 2: lprcat("Your intelligence"); fch(how,&c[1]); break;
case 3: lprcat("Your wisdom"); fch(how,&c[2]); break;
case 4: lprcat("Your constitution"); fch(how,&c[3]); break;
case 5: lprcat("Your dexterity"); fch(how,&c[4]); break;
case 6: lprcat("Your charm"); fch(how,&c[5]); break;
case 7: j=rnd(level+1);
if (how < 0)
{ lprintf("You lose %d hit point",(long)j); if (j>1) lprcat("s!"); else lprc('!'); losemhp((int)j); }
else
{ lprintf("You gain %d hit point",(long)j); if (j>1) lprcat("s!"); else lprc('!'); raisemhp((int)j); }
bottomline(); break;
case 8: j=rnd(level+1);
if (how > 0)
{
lprintf("You just gained %d spell",(long)j); raisemspells((int)j);
if (j>1) lprcat("s!"); else lprc('!');
}
else
{
lprintf("You just lost %d spell",(long)j); losemspells((int)j);
if (j>1) lprcat("s!"); else lprc('!');
}
bottomline(); break;
case 9: j = 5*rnd((level+1)*(level+1));
if (how < 0)
{
lprintf("You just lost %d experience point",(long)j);
if (j>1) lprcat("s!"); else lprc('!'); loseexperience((long)j);
}
else
{
lprintf("You just gained %d experience point",(long)j);
if (j>1) lprcat("s!"); else lprc('!'); raiseexperience((long)j);
}
break;
}
cursors();
}