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