Commit | Line | Data |
---|---|---|
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 | */ | |
19 | oaltar() | |
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 | */ | |
101 | static 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 | */ | |
116 | othrone(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 | ||
159 | odeadthrone() | |
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 | */ | |
186 | ochest() | |
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 | ||
242 | ofountain() | |
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 | */ | |
305 | fntchange(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 | */ | |
361 | static 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 | } |