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