Home | History | Annotate | Line # | Download | only in larn
moreobj.c revision 1.10
      1 /*	$NetBSD: moreobj.c,v 1.10 2008/02/04 01:07:01 dholland Exp $	*/
      2 
      3 /*
      4  * moreobj.c 		Larn is copyrighted 1986 by Noah Morgan.
      5  *
      6  * Routines in this file:
      7  *
      8  * oaltar() othrone() ochest() ofountain()
      9  */
     10 #include <sys/cdefs.h>
     11 #ifndef lint
     12 __RCSID("$NetBSD: moreobj.c,v 1.10 2008/02/04 01:07:01 dholland Exp $");
     13 #endif				/* not lint */
     14 #include <stdlib.h>
     15 #include <unistd.h>
     16 #include "header.h"
     17 #include "extern.h"
     18 
     19 static void ohear(void);
     20 static void fch(int, long *);
     21 
     22 /*
     23  *	subroutine to process an altar object
     24  */
     25 void
     26 oaltar()
     27 {
     28 	long amt;
     29 
     30 	lprcat("\nDo you (p) pray  (d) desecrate");
     31 	iopts();
     32 	while (1) {
     33 		while (1)
     34 			switch (ttgetch()) {
     35 			case 'p':
     36 				lprcat(" pray\nDo you (m) give money or (j) just pray? ");
     37 				while (1)
     38 					switch (ttgetch()) {
     39 					case 'j':
     40 						if (rnd(100) < 75)
     41 							lprcat("\nnothing happens");
     42 						else if (rnd(13) < 4)
     43 							ohear();
     44 						else if (rnd(43) == 10) {
     45 							if (c[WEAR])
     46 								lprcat("\nYou feel your armor vibrate for a moment");
     47 							enchantarmor();
     48 							return;
     49 						} else if (rnd(43) == 10) {
     50 							if (c[WIELD])
     51 								lprcat("\nYou feel your weapon vibrate for a moment");
     52 							enchweapon();
     53 							return;
     54 						} else
     55 							createmonster(makemonst(level + 1));
     56 						return;
     57 
     58 					case 'm':
     59 						lprcat("\n\n");
     60 						cursor(1, 24);
     61 						cltoeoln();
     62 						cursor(1, 23);
     63 						cltoeoln();
     64 						lprcat("how much do you donate? ");
     65 						amt = readnum((long) c[GOLD]);
     66 						if (amt < 0 || c[GOLD] < amt) {
     67 							lprcat("\nYou don't have that much!");
     68 							return;
     69 						}
     70 						c[GOLD] -= amt;
     71 						if (amt < c[GOLD] / 10 || amt < rnd(50)) {
     72 							createmonster(makemonst(level + 1));
     73 							c[AGGRAVATE] += 200;
     74 						} else if (rnd(101) > 50) {
     75 							ohear();
     76 							return;
     77 						} else if (rnd(43) == 5) {
     78 							if (c[WEAR])
     79 								lprcat("\nYou feel your armor vibrate for a moment");
     80 							enchantarmor();
     81 							return;
     82 						} else if (rnd(43) == 8) {
     83 							if (c[WIELD])
     84 								lprcat("\nYou feel your weapon vibrate for a moment");
     85 							enchweapon();
     86 							return;
     87 						} else
     88 							lprcat("\nThank You.");
     89 						bottomline();
     90 						return;
     91 
     92 					case '\33':
     93 						return;
     94 					};
     95 
     96 			case 'd':
     97 				lprcat(" desecrate");
     98 				if (rnd(100) < 60) {
     99 					createmonster(makemonst(level + 2) + 8);
    100 					c[AGGRAVATE] += 2500;
    101 				} else if (rnd(101) < 30) {
    102 					lprcat("\nThe altar crumbles into a pile of dust before your eyes");
    103 					forget();	/* remember to destroy
    104 							 * the altar	 */
    105 				} else
    106 					lprcat("\nnothing happens");
    107 				return;
    108 
    109 			case 'i':
    110 			case '\33':
    111 				ignore();
    112 				if (rnd(100) < 30) {
    113 					createmonster(makemonst(level + 1));
    114 					c[AGGRAVATE] += rnd(450);
    115 				} else
    116 					lprcat("\nnothing happens");
    117 				return;
    118 			};
    119 	}
    120 }
    121 
    122 /*
    123 	function to cast a +3 protection on the player
    124  */
    125 static void
    126 ohear()
    127 {
    128 	lprcat("\nYou have been heard!");
    129 	if (c[ALTPRO] == 0)
    130 		c[MOREDEFENSES] += 3;
    131 	c[ALTPRO] += 500;	/* protection field */
    132 	bottomline();
    133 }
    134 
    135 /*
    136 	subroutine to process a throne object
    137  */
    138 void
    139 othrone(arg)
    140 	int             arg;
    141 {
    142 	int    i, k;
    143 
    144 	lprcat("\nDo you (p) pry off jewels, (s) sit down");
    145 	iopts();
    146 	while (1) {
    147 		while (1)
    148 			switch (ttgetch()) {
    149 			case 'p':
    150 				lprcat(" pry off");
    151 				k = rnd(101);
    152 				if (k < 25) {
    153 					for (i = 0; i < rnd(4); i++)
    154 						creategem();	/* gems pop off the
    155 								 * throne */
    156 					item[playerx][playery] = ODEADTHRONE;
    157 					know[playerx][playery] = 0;
    158 				} else if (k < 40 && arg == 0) {
    159 					createmonster(GNOMEKING);
    160 					item[playerx][playery] = OTHRONE2;
    161 					know[playerx][playery] = 0;
    162 				} else
    163 					lprcat("\nnothing happens");
    164 				return;
    165 
    166 			case 's':
    167 				lprcat(" sit down");
    168 				k = rnd(101);
    169 				if (k < 30 && arg == 0) {
    170 					createmonster(GNOMEKING);
    171 					item[playerx][playery] = OTHRONE2;
    172 					know[playerx][playery] = 0;
    173 				} else if (k < 35) {
    174 					lprcat("\nZaaaappp!  You've been teleported!\n");
    175 					beep();
    176 					oteleport(0);
    177 				} else
    178 					lprcat("\nnothing happens");
    179 				return;
    180 
    181 			case 'i':
    182 			case '\33':
    183 				ignore();
    184 				return;
    185 			};
    186 	}
    187 }
    188 
    189 void
    190 odeadthrone()
    191 {
    192 	int    k;
    193 
    194 	lprcat("\nDo you (s) sit down");
    195 	iopts();
    196 	while (1) {
    197 		while (1)
    198 			switch (ttgetch()) {
    199 			case 's':
    200 				lprcat(" sit down");
    201 				k = rnd(101);
    202 				if (k < 35) {
    203 					lprcat("\nZaaaappp!  You've been teleported!\n");
    204 					beep();
    205 					oteleport(0);
    206 				} else
    207 					lprcat("\nnothing happens");
    208 				return;
    209 
    210 			case 'i':
    211 			case '\33':
    212 				ignore();
    213 				return;
    214 			};
    215 	}
    216 }
    217 
    218 /*
    219 	subroutine to process a throne object
    220  */
    221 void
    222 ochest()
    223 {
    224 	int    i, k;
    225 	lprcat("\nDo you (t) take it, (o) try to open it");
    226 	iopts();
    227 	while (1) {
    228 		while (1)
    229 			switch (ttgetch()) {
    230 			case 'o':
    231 				lprcat(" open it");
    232 				k = rnd(101);
    233 				if (k < 40) {
    234 					lprcat("\nThe chest explodes as you open it");
    235 					beep();
    236 					i = rnd(10);
    237 					lastnum = 281;	/* in case he dies */
    238 					lprintf("\nYou suffer %ld hit points damage!", (long) i);
    239 					checkloss(i);
    240 					switch (rnd(10)) {	/* see if he gets a
    241 								 * curse */
    242 					case 1:
    243 						c[ITCHING] += rnd(1000) + 100;
    244 						lprcat("\nYou feel an irritation spread over your skin!");
    245 						beep();
    246 						break;
    247 
    248 					case 2:
    249 						c[CLUMSINESS] += rnd(1600) + 200;
    250 						lprcat("\nYou begin to lose hand to eye coordination!");
    251 						beep();
    252 						break;
    253 
    254 					case 3:
    255 						c[HALFDAM] += rnd(1600) + 200;
    256 						beep();
    257 						lprcat("\nA sickness engulfs you!");
    258 						break;
    259 					};
    260 					item[playerx][playery] = know[playerx][playery] = 0;
    261 					if (rnd(100) < 69)
    262 						creategem();	/* gems from the chest */
    263 					dropgold(rnd(110 * iarg[playerx][playery] + 200));
    264 					for (i = 0; i < rnd(4); i++)
    265 						something(iarg[playerx][playery] + 2);
    266 				} else
    267 					lprcat("\nnothing happens");
    268 				return;
    269 
    270 			case 't':
    271 				lprcat(" take");
    272 				if (take(OCHEST, iarg[playerx][playery]) == 0)
    273 					item[playerx][playery] = know[playerx][playery] = 0;
    274 				return;
    275 
    276 			case 'i':
    277 			case '\33':
    278 				ignore();
    279 				return;
    280 			};
    281 	}
    282 }
    283 
    284 /*
    285 	process a fountain object
    286  */
    287 void
    288 ofountain()
    289 {
    290 	int    x;
    291 	cursors();
    292 	lprcat("\nDo you (d) drink, (w) wash yourself");
    293 	iopts();
    294 	while (1)
    295 		switch (ttgetch()) {
    296 		case 'd':
    297 			lprcat("drink");
    298 			if (rnd(1501) < 2) {
    299 				lprcat("\nOops!  You seem to have caught the dreadful sleep!");
    300 				beep();
    301 				lflush();
    302 				sleep(3);
    303 				died(280);
    304 				return;
    305 			}
    306 			x = rnd(100);
    307 			if (x < 7) {
    308 				c[HALFDAM] += 200 + rnd(200);
    309 				lprcat("\nYou feel a sickness coming on");
    310 			} else if (x < 13)
    311 				quaffpotion(23);	/* see invisible */
    312 			else if (x < 45)
    313 				lprcat("\nnothing seems to have happened");
    314 			else if (rnd(3) != 2)
    315 				fntchange(1);	/* change char levels upward	 */
    316 			else
    317 				fntchange(-1);	/* change char levels
    318 						 * downward	 */
    319 			if (rnd(12) < 3) {
    320 				lprcat("\nThe fountains bubbling slowly quiets");
    321 				item[playerx][playery] = ODEADFOUNTAIN;	/* dead fountain */
    322 				know[playerx][playery] = 0;
    323 			}
    324 			return;
    325 
    326 		case '\33':
    327 		case 'i':
    328 			ignore();
    329 			return;
    330 
    331 		case 'w':
    332 			lprcat("wash yourself");
    333 			if (rnd(100) < 11) {
    334 				x = rnd((level << 2) + 2);
    335 				lprintf("\nOh no!  The water was foul!  You suffer %ld hit points!", (long) x);
    336 				lastnum = 273;
    337 				losehp(x);
    338 				bottomline();
    339 				cursors();
    340 			} else if (rnd(100) < 29)
    341 				lprcat("\nYou got the dirt off!");
    342 			else if (rnd(100) < 31)
    343 				lprcat("\nThis water seems to be hard water!  The dirt didn't come off!");
    344 			else if (rnd(100) < 34)
    345 				createmonster(WATERLORD);	/* make water lord		 */
    346 			else
    347 				lprcat("\nnothing seems to have happened");
    348 			return;
    349 		}
    350 }
    351 
    352 /*
    353 	***
    354 	FCH
    355 	***
    356 
    357 	subroutine to process an up/down of a character attribute for ofountain
    358  */
    359 static void
    360 fch(how, x)
    361 	int             how;
    362 	long           *x;
    363 {
    364 	if (how < 0) {
    365 		lprcat(" went down by one!");
    366 		--(*x);
    367 	} else {
    368 		lprcat(" went up by one!");
    369 		(*x)++;
    370 	}
    371 	bottomline();
    372 }
    373 
    374 /*
    375 	a subroutine to raise or lower character levels
    376 	if x > 0 they are raised   if x < 0 they are lowered
    377  */
    378 void
    379 fntchange(how)
    380 	int             how;
    381 {
    382 	long   j;
    383 	lprc('\n');
    384 	switch (rnd(9)) {
    385 	case 1:
    386 		lprcat("Your strength");
    387 		fch(how, &c[0]);
    388 		break;
    389 	case 2:
    390 		lprcat("Your intelligence");
    391 		fch(how, &c[1]);
    392 		break;
    393 	case 3:
    394 		lprcat("Your wisdom");
    395 		fch(how, &c[2]);
    396 		break;
    397 	case 4:
    398 		lprcat("Your constitution");
    399 		fch(how, &c[3]);
    400 		break;
    401 	case 5:
    402 		lprcat("Your dexterity");
    403 		fch(how, &c[4]);
    404 		break;
    405 	case 6:
    406 		lprcat("Your charm");
    407 		fch(how, &c[5]);
    408 		break;
    409 	case 7:
    410 		j = rnd(level + 1);
    411 		if (how < 0) {
    412 			lprintf("You lose %ld hit point", (long) j);
    413 			if (j > 1)
    414 				lprcat("s!");
    415 			else
    416 				lprc('!');
    417 			losemhp((int) j);
    418 		} else {
    419 			lprintf("You gain %ld hit point", (long) j);
    420 			if (j > 1)
    421 				lprcat("s!");
    422 			else
    423 				lprc('!');
    424 			raisemhp((int) j);
    425 		}
    426 		bottomline();
    427 		break;
    428 
    429 	case 8:
    430 		j = rnd(level + 1);
    431 		if (how > 0) {
    432 			lprintf("You just gained %ld spell", (long) j);
    433 			raisemspells((int) j);
    434 			if (j > 1)
    435 				lprcat("s!");
    436 			else
    437 				lprc('!');
    438 		} else {
    439 			lprintf("You just lost %ld spell", (long) j);
    440 			losemspells((int) j);
    441 			if (j > 1)
    442 				lprcat("s!");
    443 			else
    444 				lprc('!');
    445 		}
    446 		bottomline();
    447 		break;
    448 
    449 	case 9:
    450 		j = 5 * rnd((level + 1) * (level + 1));
    451 		if (how < 0) {
    452 			lprintf("You just lost %ld experience point", (long) j);
    453 			if (j > 1)
    454 				lprcat("s!");
    455 			else
    456 				lprc('!');
    457 			loseexperience((long) j);
    458 		} else {
    459 			lprintf("You just gained %ld experience point", (long) j);
    460 			if (j > 1)
    461 				lprcat("s!");
    462 			else
    463 				lprc('!');
    464 			raiseexperience((long) j);
    465 		}
    466 		break;
    467 	}
    468 	cursors();
    469 }
    470