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