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