Home | History | Annotate | Line # | Download | only in larn
      1 /*	$NetBSD: moreobj.c,v 1.13 2021/05/02 12:50:45 rillig 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.13 2021/05/02 12:50:45 rillig 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 fch(int, long *);
     20 
     21 /*
     22  *	subroutine to process an altar object
     23  */
     24 void
     25 oaltar(void)
     26 {
     27 
     28 	lprcat("\nDo you (p) pray  (d) desecrate");
     29 	iopts();
     30 	while (1) {
     31 		while (1)
     32 			switch (ttgetch()) {
     33 			case 'p':
     34 				lprcat(" pray\nDo you (m) give money or (j) just pray? ");
     35 				while (1)
     36 					switch (ttgetch()) {
     37 					case 'j':
     38 						act_just_pray();
     39 						return;
     40 
     41 					case 'm':
     42 						act_donation_pray();
     43 						return;
     44 
     45 					case '\33':
     46 						return;
     47 					};
     48 
     49 			case 'd':
     50 				lprcat(" desecrate");
     51 				act_desecrate_altar();
     52 				return;
     53 
     54 			case 'i':
     55 			case '\33':
     56 				ignore();
     57 				act_ignore_altar();
     58 				return;
     59 			};
     60 	}
     61 }
     62 
     63 /*
     64 	subroutine to process a throne object
     65  */
     66 void
     67 othrone(int arg)
     68 {
     69 
     70 	lprcat("\nDo you (p) pry off jewels, (s) sit down");
     71 	iopts();
     72 	while (1) {
     73 		while (1)
     74 			switch (ttgetch()) {
     75 			case 'p':
     76 				lprcat(" pry off");
     77 				act_remove_gems(arg);
     78 				return;
     79 
     80 			case 's':
     81 				lprcat(" sit down");
     82 				act_sit_throne(arg);
     83 				return;
     84 
     85 			case 'i':
     86 			case '\33':
     87 				ignore();
     88 				return;
     89 			};
     90 	}
     91 }
     92 
     93 void
     94 odeadthrone(void)
     95 {
     96 	int    k;
     97 
     98 	lprcat("\nDo you (s) sit down");
     99 	iopts();
    100 	while (1) {
    101 		while (1)
    102 			switch (ttgetch()) {
    103 			case 's':
    104 				lprcat(" sit down");
    105 				k = rnd(101);
    106 				if (k < 35) {
    107 					lprcat("\nZaaaappp!  You've been teleported!\n");
    108 					beep();
    109 					oteleport(0);
    110 				} else
    111 					lprcat("\nnothing happens");
    112 				return;
    113 
    114 			case 'i':
    115 			case '\33':
    116 				ignore();
    117 				return;
    118 			};
    119 	}
    120 }
    121 
    122 /*
    123 	subroutine to process a throne object
    124  */
    125 void
    126 ochest(void)
    127 {
    128 
    129 	lprcat("\nDo you (t) take it, (o) try to open it");
    130 	iopts();
    131 	while (1) {
    132 		while (1)
    133 			switch (ttgetch()) {
    134 			case 'o':
    135 				lprcat(" open it");
    136 				act_open_chest(playerx, playery);
    137 				return;
    138 
    139 			case 't':
    140 				lprcat(" take");
    141 				if (take(OCHEST, iarg[playerx][playery]) == 0)
    142 					item[playerx][playery] = know[playerx][playery] = 0;
    143 				return;
    144 
    145 			case 'i':
    146 			case '\33':
    147 				ignore();
    148 				return;
    149 			};
    150 	}
    151 }
    152 
    153 /*
    154 	process a fountain object
    155  */
    156 void
    157 ofountain(void)
    158 {
    159 
    160 	cursors();
    161 	lprcat("\nDo you (d) drink, (w) wash yourself");
    162 	iopts();
    163 	while (1)
    164 		switch (ttgetch()) {
    165 		case 'd':
    166 			lprcat("drink");
    167 			act_drink_fountain();
    168 			return;
    169 
    170 		case '\33':
    171 		case 'i':
    172 			ignore();
    173 			return;
    174 
    175 		case 'w':
    176 			lprcat("wash yourself");
    177 			act_wash_fountain();
    178 			return;
    179 		}
    180 }
    181 
    182 /*
    183 	***
    184 	FCH
    185 	***
    186 
    187 	subroutine to process an up/down of a character attribute for ofountain
    188  */
    189 static void
    190 fch(int how, long *x)
    191 {
    192 	if (how < 0) {
    193 		lprcat(" went down by one!");
    194 		--(*x);
    195 	} else {
    196 		lprcat(" went up by one!");
    197 		(*x)++;
    198 	}
    199 	bottomline();
    200 }
    201 
    202 /*
    203 	a subroutine to raise or lower character levels
    204 	if x > 0 they are raised   if x < 0 they are lowered
    205  */
    206 void
    207 fntchange(int how)
    208 {
    209 	long   j;
    210 	lprc('\n');
    211 	switch (rnd(9)) {
    212 	case 1:
    213 		lprcat("Your strength");
    214 		fch(how, &c[0]);
    215 		break;
    216 	case 2:
    217 		lprcat("Your intelligence");
    218 		fch(how, &c[1]);
    219 		break;
    220 	case 3:
    221 		lprcat("Your wisdom");
    222 		fch(how, &c[2]);
    223 		break;
    224 	case 4:
    225 		lprcat("Your constitution");
    226 		fch(how, &c[3]);
    227 		break;
    228 	case 5:
    229 		lprcat("Your dexterity");
    230 		fch(how, &c[4]);
    231 		break;
    232 	case 6:
    233 		lprcat("Your charm");
    234 		fch(how, &c[5]);
    235 		break;
    236 	case 7:
    237 		j = rnd(level + 1);
    238 		if (how < 0) {
    239 			lprintf("You lose %ld hit point", (long) j);
    240 			if (j > 1)
    241 				lprcat("s!");
    242 			else
    243 				lprc('!');
    244 			losemhp((int) j);
    245 		} else {
    246 			lprintf("You gain %ld hit point", (long) j);
    247 			if (j > 1)
    248 				lprcat("s!");
    249 			else
    250 				lprc('!');
    251 			raisemhp((int) j);
    252 		}
    253 		bottomline();
    254 		break;
    255 
    256 	case 8:
    257 		j = rnd(level + 1);
    258 		if (how > 0) {
    259 			lprintf("You just gained %ld spell", (long) j);
    260 			raisemspells((int) j);
    261 			if (j > 1)
    262 				lprcat("s!");
    263 			else
    264 				lprc('!');
    265 		} else {
    266 			lprintf("You just lost %ld spell", (long) j);
    267 			losemspells((int) j);
    268 			if (j > 1)
    269 				lprcat("s!");
    270 			else
    271 				lprc('!');
    272 		}
    273 		bottomline();
    274 		break;
    275 
    276 	case 9:
    277 		j = 5 * rnd((level + 1) * (level + 1));
    278 		if (how < 0) {
    279 			lprintf("You just lost %ld experience point", (long) j);
    280 			if (j > 1)
    281 				lprcat("s!");
    282 			else
    283 				lprc('!');
    284 			loseexperience((long) j);
    285 		} else {
    286 			lprintf("You just gained %ld experience point", (long) j);
    287 			if (j > 1)
    288 				lprcat("s!");
    289 			else
    290 				lprc('!');
    291 			raiseexperience((long) j);
    292 		}
    293 		break;
    294 	}
    295 	cursors();
    296 }
    297