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