Update default make.conf and its manpage:
[dragonfly.git] / games / larn / moreobj.c
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         }