]> git.cameronkatri.com Git - bsdgames-darwin.git/blob - larn/object.c
gtime -> gltime to avoid conflict in time.h
[bsdgames-darwin.git] / larn / object.c
1 #ifndef lint
2 static char rcsid[] = "$NetBSD: object.c,v 1.7 1997/07/13 20:21:38 christos Exp $";
3 #endif /* not lint */
4
5 /* object.c Larn is copyrighted 1986 by Noah Morgan. */
6 #include "header.h"
7
8 /*
9 ***************
10 LOOK_FOR_OBJECT
11 ***************
12
13 subroutine to look for an object and give the player his options
14 if an object was found.
15 */
16 lookforobject()
17 {
18 register int i,j;
19 if (c[TIMESTOP]) return; /* can't find objects is time is stopped */
20 i=item[playerx][playery]; if (i==0) return;
21 showcell(playerx,playery); cursors(); yrepcount=0;
22 switch(i)
23 {
24 case OGOLDPILE: case OMAXGOLD:
25 case OKGOLD: case ODGOLD: lprcat("\n\nYou have found some gold!"); ogold(i); break;
26
27 case OPOTION: lprcat("\n\nYou have found a magic potion");
28 i = iarg[playerx][playery];
29 if (potionname[i][0]!=0) lprintf(" of%s", potionname[i]);
30 opotion(i); break;
31
32 case OSCROLL: lprcat("\n\nYou have found a magic scroll");
33 i = iarg[playerx][playery];
34 if (scrollname[i][0]!=0) lprintf(" of%s", scrollname[i]);
35 oscroll(i); break;
36
37 case OALTAR: if (nearbymonst()) return;
38 lprcat("\n\nThere is a Holy Altar here!"); oaltar(); break;
39
40 case OBOOK: lprcat("\n\nYou have found a book."); obook(); break;
41
42 case OCOOKIE: lprcat("\n\nYou have found a fortune cookie."); ocookie(); break;
43
44 case OTHRONE: if (nearbymonst()) return;
45 lprintf("\n\nThere is %s here!",objectname[i]); othrone(0); break;
46
47 case OTHRONE2: if (nearbymonst()) return;
48 lprintf("\n\nThere is %s here!",objectname[i]); othrone(1); break;
49
50 case ODEADTHRONE: lprintf("\n\nThere is %s here!",objectname[i]); odeadthrone(); break;
51
52 case OORB: lprcat("\n\nYou have found the Orb!!!!!"); oorb(); break;
53
54 case OPIT: lprcat("\n\nYou're standing at the top of a pit."); opit(); break;
55
56 case OSTAIRSUP: lprcat("\n\nThere is a circular staircase here"); ostairs(1); /* up */ break;
57
58 case OELEVATORUP: lprcat("\n\nYou feel heavy for a moment, but the feeling disappears");
59 oelevator(1); /* up */ break;
60
61 case OFOUNTAIN: if (nearbymonst()) return;
62 lprcat("\n\nThere is a fountain here"); ofountain(); break;
63
64 case OSTATUE: if (nearbymonst()) return;
65 lprcat("\n\nYou are standing in front of a statue"); ostatue(); break;
66
67 case OCHEST: lprcat("\n\nThere is a chest here"); ochest(); break;
68
69 case OIVTELETRAP: if (rnd(11)<6) return;
70 item[playerx][playery] = OTELEPORTER;
71 know[playerx][playery] = 1;
72
73 case OTELEPORTER: lprcat("\nZaaaappp! You've been teleported!\n");
74 beep(); nap(3000); oteleport(0);
75 break;
76
77 case OSCHOOL: if (nearbymonst()) return;
78 lprcat("\n\nYou have found the College of Larn.");
79 lprcat("\nDo you (g) go inside, or (i) stay here? ");
80 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
81 if (i == 'g') { oschool(); /* the college of larn */ }
82 else lprcat(" stay here");
83 break;
84
85 case OMIRROR: if (nearbymonst()) return;
86 lprcat("\n\nThere is a mirror here"); omirror(); break;
87
88 case OBANK2:
89 case OBANK: if (nearbymonst()) return;
90 if (i==OBANK) lprcat("\n\nYou have found the bank of Larn.");
91 else lprcat("\n\nYou have found a branch office of the bank of Larn.");
92 lprcat("\nDo you (g) go inside, or (i) stay here? ");
93 j=0; while ((j!='g') && (j!='i') && (j!='\33')) j=getchar();
94 if (j == 'g') { if (i==OBANK) obank(); else obank2(); /* the bank of larn */ }
95 else lprcat(" stay here");
96 break;
97
98 case ODEADFOUNTAIN: if (nearbymonst()) return;
99 lprcat("\n\nThere is a dead fountain here"); break;
100
101 case ODNDSTORE: if (nearbymonst()) return;
102 lprcat("\n\nThere is a DND store here.");
103 lprcat("\nDo you (g) go inside, or (i) stay here? ");
104 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
105 if (i == 'g')
106 dndstore(); /* the dnd adventurers store */
107 else lprcat(" stay here");
108 break;
109
110 case OSTAIRSDOWN: lprcat("\n\nThere is a circular staircase here"); ostairs(-1); /* down */ break;
111
112 case OELEVATORDOWN: lprcat("\n\nYou feel light for a moment, but the feeling disappears");
113 oelevator(-1); /* down */
114 break;
115
116 case OOPENDOOR: lprintf("\n\nYou have found %s",objectname[i]);
117 lprcat("\nDo you (c) close it"); iopts();
118 i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();
119 if ((i=='\33') || (i=='i')) { ignore(); break; }
120 lprcat("close"); forget();
121 item[playerx][playery]=OCLOSEDDOOR;
122 iarg[playerx][playery]=0;
123 playerx = lastpx; playery = lastpy;
124 break;
125
126 case OCLOSEDDOOR: lprintf("\n\nYou have found %s",objectname[i]);
127 lprcat("\nDo you (o) try to open it"); iopts();
128 i=0; while ((i!='o') && (i!='i') && (i!='\33')) i=getchar();
129 if ((i=='\33') || (i=='i'))
130 { ignore(); playerx = lastpx;
131 playery = lastpy; break; }
132 else
133 {
134 lprcat("open");
135 if (rnd(11)<7)
136 {
137 switch(iarg[playerx][playery])
138 {
139 case 6: c[AGGRAVATE] += rnd(400); break;
140
141 case 7: lprcat("\nYou are jolted by an electric shock ");
142 lastnum=274; losehp(rnd(20)); bottomline(); break;
143
144 case 8: loselevel(); break;
145
146 case 9: lprcat("\nYou suddenly feel weaker ");
147 if (c[STRENGTH]>3) c[STRENGTH]--;
148 bottomline(); break;
149
150 default: break;
151 }
152 playerx = lastpx; playery = lastpy;
153 }
154 else
155 {
156 forget(); item[playerx][playery]=OOPENDOOR;
157 }
158 }
159 break;
160
161 case OENTRANCE: lprcat("\nYou have found "); lprcat(objectname[OENTRANCE]);
162 lprcat("\nDo you (g) go inside"); iopts();
163 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
164 if (i == 'g')
165 {
166 newcavelevel(1); playerx=33; playery=MAXY-2;
167 item[33][MAXY-1]=know[33][MAXY-1]=mitem[33][MAXY-1]=0;
168 draws(0,MAXX,0,MAXY); bot_linex(); return;
169 }
170 else ignore();
171 break;
172
173 case OVOLDOWN: lprcat("\nYou have found "); lprcat(objectname[OVOLDOWN]);
174 lprcat("\nDo you (c) climb down"); iopts();
175 i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();
176 if ((i=='\33') || (i=='i')) { ignore(); break; }
177 if (level!=0) { lprcat("\nThe shaft only extends 5 feet downward!"); return; }
178 if (packweight() > 45+3*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep();
179 lastnum=275; losehp(30+rnd(20)); bottomhp(); }
180
181 else lprcat("climb down"); nap(3000); newcavelevel(MAXLEVEL);
182 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) /* put player near volcano shaft */
183 if (item[j][i]==OVOLUP) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); }
184 draws(0,MAXX,0,MAXY); bot_linex(); return;
185
186 case OVOLUP: lprcat("\nYou have found "); lprcat(objectname[OVOLUP]);
187 lprcat("\nDo you (c) climb up"); iopts();
188 i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();
189 if ((i=='\33') || (i=='i')) { ignore(); break; }
190 if (level!=11) { lprcat("\nThe shaft only extends 8 feet upwards before you find a blockage!"); return; }
191 if (packweight() > 45+5*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep();
192 lastnum=275; losehp(15+rnd(20)); bottomhp(); return; }
193 lprcat("climb up"); lflush(); nap(3000); newcavelevel(0);
194 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) /* put player near volcano shaft */
195 if (item[j][i]==OVOLDOWN) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); }
196 draws(0,MAXX,0,MAXY); bot_linex(); return;
197
198 case OTRAPARROWIV: if (rnd(17)<13) return; /* for an arrow trap */
199 item[playerx][playery] = OTRAPARROW;
200 know[playerx][playery] = 0;
201
202 case OTRAPARROW: lprcat("\nYou are hit by an arrow"); beep(); /* for an arrow trap */
203 lastnum=259; losehp(rnd(10)+level);
204 bottomhp(); return;
205
206 case OIVDARTRAP: if (rnd(17)<13) return; /* for a dart trap */
207 item[playerx][playery] = ODARTRAP;
208 know[playerx][playery] = 0;
209
210 case ODARTRAP: lprcat("\nYou are hit by a dart"); beep(); /* for a dart trap */
211 lastnum=260; losehp(rnd(5));
212 if ((--c[STRENGTH]) < 3) c[STRENGTH] = 3;
213 bottomline(); return;
214
215 case OIVTRAPDOOR: if (rnd(17)<13) return; /* for a trap door */
216 item[playerx][playery] = OTRAPDOOR;
217 know[playerx][playery] = 1;
218
219 case OTRAPDOOR: lastnum = 272; /* a trap door */
220 if ((level==MAXLEVEL-1) || (level==MAXLEVEL+MAXVLEVEL-1))
221 { lprcat("\nYou fell through a bottomless trap door!"); beep(); nap(3000); died(271); }
222 lprcat("\nYou fall through a trap door!"); beep(); /* for a trap door */
223 losehp(rnd(5+level));
224 nap(2000); newcavelevel(level+1); draws(0,MAXX,0,MAXY); bot_linex();
225 return;
226
227
228 case OTRADEPOST: if (nearbymonst()) return;
229 lprcat("\nYou have found the Larn trading Post.");
230 lprcat("\nDo you (g) go inside, or (i) stay here? ");
231 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
232 if (i == 'g') otradepost(); else lprcat("stay here");
233 return;
234
235 case OHOME: if (nearbymonst()) return;
236 lprcat("\nYou have found your way home.");
237 lprcat("\nDo you (g) go inside, or (i) stay here? ");
238 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
239 if (i == 'g') ohome(); else lprcat("stay here");
240 return;
241
242 case OWALL: break;
243
244 case OANNIHILATION: died(283); return; /* annihilated by sphere of annihilation */
245
246 case OLRS: if (nearbymonst()) return;
247 lprcat("\n\nThere is an LRS office here.");
248 lprcat("\nDo you (g) go inside, or (i) stay here? ");
249 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
250 if (i == 'g')
251 olrs(); /* the larn revenue service */
252 else lprcat(" stay here");
253 break;
254
255 default: finditem(i); break;
256 };
257 }
258
259 /*
260 function to say what object we found and ask if player wants to take it
261 */
262 finditem(itm)
263 int itm;
264 {
265 int tmp,i;
266 lprintf("\n\nYou have found %s ",objectname[itm]);
267 tmp=iarg[playerx][playery];
268 switch(itm)
269 {
270 case ODIAMOND: case ORUBY: case OEMERALD:
271 case OSAPPHIRE: case OSPIRITSCARAB: case OORBOFDRAGON:
272 case OCUBEofUNDEAD: case ONOTHEFT: break;
273
274 default:
275 if (tmp>0) lprintf("+ %d",(long)tmp); else if (tmp<0) lprintf(" %d",(long)tmp);
276 }
277 lprcat("\nDo you want to (t) take it"); iopts();
278 i=0; while (i!='t' && i!='i' && i!='\33') i=getchar();
279 if (i == 't')
280 { lprcat("take"); if (take(itm,tmp)==0) forget(); return; }
281 ignore();
282 }
283
284 \f
285 /*
286 *******
287 OSTAIRS
288 *******
289
290 subroutine to process the stair cases
291 if dir > 0 the up else down
292 */
293 ostairs(dir)
294 int dir;
295 {
296 register int k;
297 lprcat("\nDo you (s) stay here ");
298 if (dir > 0) lprcat("(u) go up "); else lprcat("(d) go down ");
299 lprcat("or (f) kick stairs? ");
300
301 while (1) switch(getchar())
302 {
303 case '\33':
304 case 's': case 'i': lprcat("stay here"); return;
305
306 case 'f': lprcat("kick stairs");
307 if (rnd(2) == 1)
308 lprcat("\nI hope you feel better. Showing anger rids you of frustration.");
309 else
310 {
311 k=rnd((level+1)<<1);
312 lprintf("\nYou hurt your foot dumb dumb! You suffer %d hit points",(long)k);
313 lastnum=276; losehp(k); bottomline();
314 }
315 return;
316
317 case 'u': lprcat("go up");
318 if (dir < 0) lprcat("\nThe stairs don't go up!");
319 else
320 if (level>=2 && level!=11)
321 {
322 k = level; newcavelevel(level-1);
323 draws(0,MAXX,0,MAXY); bot_linex();
324 }
325 else lprcat("\nThe stairs lead to a dead end!");
326 return;
327
328 case 'd': lprcat("go down");
329 if (dir > 0) lprcat("\nThe stairs don't go down!");
330 else
331 if (level!=0 && level!=10 && level!=13)
332 {
333 k = level; newcavelevel(level+1);
334 draws(0,MAXX,0,MAXY); bot_linex();
335 }
336 else lprcat("\nThe stairs lead to a dead end!");
337 return;
338 };
339 }
340
341 \f
342 /*
343 *********
344 OTELEPORTER
345 *********
346
347 subroutine to handle a teleport trap +/- 1 level maximum
348 */
349 oteleport(err)
350 int err;
351 {
352 register int tmp;
353 if (err) if (rnd(151)<3) died(264); /* stuck in a rock */
354 c[TELEFLAG]=1; /* show ?? on bottomline if been teleported */
355 if (level==0) tmp=0;
356 else if (level < MAXLEVEL)
357 { tmp=rnd(5)+level-3; if (tmp>=MAXLEVEL) tmp=MAXLEVEL-1;
358 if (tmp<1) tmp=1; }
359 else
360 { tmp=rnd(3)+level-2; if (tmp>=MAXLEVEL+MAXVLEVEL) tmp=MAXLEVEL+MAXVLEVEL-1;
361 if (tmp<MAXLEVEL) tmp=MAXLEVEL; }
362 playerx = rnd(MAXX-2); playery = rnd(MAXY-2);
363 if (level != tmp) newcavelevel(tmp); positionplayer();
364 draws(0,MAXX,0,MAXY); bot_linex();
365 }
366 \f
367 /*
368 *******
369 OPOTION
370 *******
371
372 function to process a potion
373 */
374 opotion(pot)
375 int pot;
376 {
377 lprcat("\nDo you (d) drink it, (t) take it"); iopts();
378 while (1) switch(getchar())
379 {
380 case '\33':
381 case 'i': ignore(); return;
382
383 case 'd': lprcat("drink\n"); forget(); /* destroy potion */
384 quaffpotion(pot); return;
385
386 case 't': lprcat("take\n"); if (take(OPOTION,pot)==0) forget();
387 return;
388 };
389 }
390
391 /*
392 function to drink a potion
393 */
394 quaffpotion(pot)
395 int pot;
396 {
397 register int i,j,k;
398 if (pot<0 || pot>=MAXPOTION) return; /* check for within bounds */
399 potionname[pot] = potionhide[pot];
400 switch(pot)
401 {
402 case 9: lprcat("\nYou feel greedy . . ."); nap(2000);
403 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
404 if ((item[j][i]==OGOLDPILE) || (item[j][i]==OMAXGOLD))
405 {
406 know[j][i]=1; show1cell(j,i);
407 }
408 showplayer(); return;
409
410 case 19: lprcat("\nYou feel greedy . . ."); nap(2000);
411 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
412 {
413 k=item[j][i];
414 if ((k==ODIAMOND) || (k==ORUBY) || (k==OEMERALD) || (k==OMAXGOLD)
415 || (k==OSAPPHIRE) || (k==OLARNEYE) || (k==OGOLDPILE))
416 {
417 know[j][i]=1; show1cell(j,i);
418 }
419 }
420 showplayer(); return;
421
422 case 20: c[HP] = c[HPMAX]; break; /* instant healing */
423
424 case 1: lprcat("\nYou feel better");
425 if (c[HP] == c[HPMAX]) raisemhp(1);
426 else if ((c[HP] += rnd(20)+20+c[LEVEL]) > c[HPMAX]) c[HP]=c[HPMAX]; break;
427
428 case 2: lprcat("\nSuddenly, you feel much more skillful!");
429 raiselevel(); raisemhp(1); return;
430
431 case 3: lprcat("\nYou feel strange for a moment");
432 c[rund(6)]++; break;
433
434 case 4: lprcat("\nYou feel more self confident!");
435 c[WISDOM] += rnd(2); break;
436
437 case 5: lprcat("\nWow! You feel great!");
438 if (c[STRENGTH]<12) c[STRENGTH]=12; else c[STRENGTH]++; break;
439
440 case 6: lprcat("\nYour charm went up by one!"); c[CHARISMA]++; break;
441
442 case 8: lprcat("\nYour intelligence went up by one!");
443 c[INTELLIGENCE]++; break;
444
445 case 10: for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
446 if (mitem[j][i])
447 {
448 know[j][i]=1; show1cell(j,i);
449 }
450 /* monster detection */ return;
451
452 case 12: lprcat("\nThis potion has no taste to it"); return;
453
454 case 15: lprcat("\nWOW!!! You feel Super-fantastic!!!");
455 if (c[HERO]==0) for (i=0; i<6; i++) c[i] += 11;
456 c[HERO] += 250; break;
457
458 case 16: lprcat("\nYou have a greater intestinal constitude!");
459 c[CONSTITUTION]++; break;
460
461 case 17: lprcat("\nYou now have incredibly bulging muscles!!!");
462 if (c[GIANTSTR]==0) c[STREXTRA] += 21;
463 c[GIANTSTR] += 700; break;
464
465 case 18: lprcat("\nYou feel a chill run up your spine!");
466 c[FIRERESISTANCE] += 1000; break;
467
468 case 0: lprcat("\nYou fall asleep. . .");
469 i=rnd(11)-(c[CONSTITUTION]>>2)+2; while(--i>0) { parse2(); nap(1000); }
470 cursors(); lprcat("\nYou woke up!"); return;
471
472 case 7: lprcat("\nYou become dizzy!");
473 if (--c[STRENGTH] < 3) c[STRENGTH]=3; break;
474
475 case 11: lprcat("\nYou stagger for a moment . .");
476 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
477 know[j][i]=0;
478 nap(2000); draws(0,MAXX,0,MAXY); /* potion of forgetfulness */ return;
479
480 case 13: lprcat("\nYou can't see anything!"); /* blindness */
481 c[BLINDCOUNT]+=500; return;
482
483 case 14: lprcat("\nYou feel confused"); c[CONFUSE]+= 20+rnd(9); return;
484
485 case 21: lprcat("\nYou don't seem to be affected"); return; /* cure dianthroritis */
486
487 case 22: lprcat("\nYou feel a sickness engulf you"); /* poison */
488 c[HALFDAM] += 200 + rnd(200); return;
489
490 case 23: lprcat("\nYou feel your vision sharpen"); /* see invisible */
491 c[SEEINVISIBLE] += rnd(1000)+400;
492 monstnamelist[INVISIBLESTALKER] = 'I'; return;
493 };
494 bottomline(); /* show new stats */ return;
495 }
496 \f
497 /*
498 *******
499 OSCROLL
500 *******
501
502 function to process a magic scroll
503 */
504 oscroll(typ)
505 int typ;
506 {
507 lprcat("\nDo you ");
508 if (c[BLINDCOUNT]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
509 while (1) switch(getchar())
510 {
511 case '\33':
512 case 'i': ignore(); return;
513
514 case 'r': if (c[BLINDCOUNT]) break;
515 lprcat("read"); forget();
516 if (typ==2 || typ==15) { show1cell(playerx,playery); cursors(); }
517 /* destroy it */ read_scroll(typ); return;
518
519 case 't': lprcat("take"); if (take(OSCROLL,typ)==0) forget(); /* destroy it */
520 return;
521 };
522 }
523
524 /*
525 data for the function to read a scroll
526 */
527 static int xh,yh,yl,xl;
528 static char curse[] = { BLINDCOUNT, CONFUSE, AGGRAVATE, HASTEMONST, ITCHING,
529 LAUGHING, DRAINSTRENGTH, CLUMSINESS, INFEEBLEMENT, HALFDAM };
530 static char exten[] = { PROTECTIONTIME, DEXCOUNT, STRCOUNT, CHARMCOUNT,
531 INVISIBILITY, CANCELLATION, HASTESELF, GLOBE, SCAREMONST, HOLDMONST, TIMESTOP };
532 char time_change[] = { HASTESELF,HERO,ALTPRO,PROTECTIONTIME,DEXCOUNT,
533 STRCOUNT,GIANTSTR,CHARMCOUNT,INVISIBILITY,CANCELLATION,
534 HASTESELF,AGGRAVATE,SCAREMONST,STEALTH,AWARENESS,HOLDMONST,HASTEMONST,
535 FIRERESISTANCE,GLOBE,SPIRITPRO,UNDEADPRO,HALFDAM,SEEINVISIBLE,
536 ITCHING,CLUMSINESS, WTW };
537 /*
538 * function to adjust time when time warping and taking courses in school
539 */
540 adjtime(tim)
541 register long tim;
542 {
543 register int j;
544 for (j=0; j<26; j++) /* adjust time related parameters */
545 if (c[time_change[j]])
546 if ((c[time_change[j]] -= tim) < 1) c[time_change[j]]=1;
547 regen();
548 }
549
550 /*
551 function to read a scroll
552 */
553 read_scroll(typ)
554 int typ;
555 {
556 register int i,j;
557 if (typ<0 || typ>=MAXSCROLL) return; /* be sure we are within bounds */
558 scrollname[typ] = scrollhide[typ];
559 switch(typ)
560 {
561 case 0: lprcat("\nYour armor glows for a moment"); enchantarmor(); return;
562
563 case 1: lprcat("\nYour weapon glows for a moment"); enchweapon(); return; /* enchant weapon */
564
565 case 2: lprcat("\nYou have been granted enlightenment!");
566 yh = min(playery+7,MAXY); xh = min(playerx+25,MAXX);
567 yl = max(playery-7,0); xl = max(playerx-25,0);
568 for (i=yl; i<yh; i++) for (j=xl; j<xh; j++) know[j][i]=1;
569 nap(2000); draws(xl,xh,yl,yh); return;
570
571 case 3: lprcat("\nThis scroll seems to be blank"); return;
572
573 case 4: createmonster(makemonst(level+1)); return; /* this one creates a monster */
574
575 case 5: something(level); /* create artifact */ return;
576
577 case 6: c[AGGRAVATE]+=800; return; /* aggravate monsters */
578
579 case 7: gltime += (i = rnd(1000) - 850); /* time warp */
580 if (i>=0) lprintf("\nYou went forward in time by %d mobuls",(long)((i+99)/100));
581 else lprintf("\nYou went backward in time by %d mobuls",(long)(-(i+99)/100));
582 adjtime((long)i); /* adjust time for time warping */
583 return;
584
585 case 8: oteleport(0); return; /* teleportation */
586
587 case 9: c[AWARENESS] += 1800; return; /* expanded awareness */
588
589 case 10: c[HASTEMONST] += rnd(55)+12; return; /* haste monster */
590
591 case 11: for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
592 if (mitem[j][i])
593 hitp[j][i] = monster[mitem[j][i]].hitpoints;
594 return; /* monster healing */
595 case 12: c[SPIRITPRO] += 300 + rnd(200); bottomline(); return; /* spirit protection */
596
597 case 13: c[UNDEADPRO] += 300 + rnd(200); bottomline(); return; /* undead protection */
598
599 case 14: c[STEALTH] += 250 + rnd(250); bottomline(); return; /* stealth */
600
601 case 15: lprcat("\nYou have been granted enlightenment!"); /* magic mapping */
602 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) know[j][i]=1;
603 nap(2000); draws(0,MAXX,0,MAXY); return;
604
605 case 16: c[HOLDMONST] += 30; bottomline(); return; /* hold monster */
606
607 case 17: for (i=0; i<26; i++) /* gem perfection */
608 switch(iven[i])
609 {
610 case ODIAMOND: case ORUBY:
611 case OEMERALD: case OSAPPHIRE:
612 j = ivenarg[i]; j &= 255; j <<= 1;
613 if (j > 255) j=255; /* double value */
614 ivenarg[i] = j; break;
615 }
616 break;
617
618 case 18: for (i=0; i<11; i++) c[exten[i]] <<= 1; /* spell extension */
619 break;
620
621 case 19: for (i=0; i<26; i++) /* identify */
622 {
623 if (iven[i]==OPOTION) potionname[ivenarg[i]] = potionhide[ivenarg[i]];
624 if (iven[i]==OSCROLL) scrollname[ivenarg[i]] = scrollhide[ivenarg[i]];
625 }
626 break;
627
628 case 20: for (i=0; i<10; i++) /* remove curse */
629 if (c[curse[i]]) c[curse[i]] = 1;
630 break;
631
632 case 21: annihilate(); break; /* scroll of annihilation */
633
634 case 22: godirect(22,150,"The ray hits the %s",0,' '); /* pulverization */
635 break;
636 case 23: c[LIFEPROT]++; break; /* life protection */
637 };
638 }
639
640 \f
641 oorb()
642 {
643 }
644
645 opit()
646 {
647 register int i;
648 if (rnd(101)<81)
649 if (rnd(70) > 9*c[DEXTERITY]-packweight() || rnd(101)<5)
650 if (level==MAXLEVEL-1) obottomless(); else
651 if (level==MAXLEVEL+MAXVLEVEL-1) obottomless(); else
652 {
653 if (rnd(101)<20)
654 {
655 i=0; lprcat("\nYou fell into a pit! Your fall is cushioned by an unknown force\n");
656 }
657 else
658 {
659 i = rnd(level*3+3);
660 lprintf("\nYou fell into a pit! You suffer %d hit points damage",(long)i);
661 lastnum=261; /* if he dies scoreboard will say so */
662 }
663 losehp(i); nap(2000); newcavelevel(level+1); draws(0,MAXX,0,MAXY);
664 }
665 }
666
667 obottomless()
668 {
669 lprcat("\nYou fell into a bottomless pit!"); beep(); nap(3000); died(262);
670 }
671 oelevator(dir)
672 int dir;
673 {
674 #ifdef lint
675 int x;
676 x=dir;
677 dir=x;
678 #endif lint
679 }
680
681 ostatue()
682 {
683 }
684
685 omirror()
686 {
687 }
688
689 obook()
690 {
691 lprcat("\nDo you ");
692 if (c[BLINDCOUNT]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
693 while (1) switch(getchar())
694 {
695 case '\33':
696 case 'i': ignore(); return;
697
698 case 'r': if (c[BLINDCOUNT]) break;
699 lprcat("read");
700 /* no more book */ readbook(iarg[playerx][playery]); forget(); return;
701
702 case 't': lprcat("take"); if (take(OBOOK,iarg[playerx][playery])==0) forget(); /* no more book */
703 return;
704 };
705 }
706
707 /*
708 function to read a book
709 */
710 readbook(lev)
711 register int lev;
712 {
713 register int i,tmp;
714 if (lev<=3) i = rund((tmp=splev[lev])?tmp:1); else
715 i = rnd((tmp=splev[lev]-9)?tmp:1) + 9;
716 spelknow[i]=1;
717 lprintf("\nSpell \"%s\": %s\n%s",spelcode[i],spelname[i],speldescript[i]);
718 if (rnd(10)==4)
719 { lprcat("\nYour int went up by one!"); c[INTELLIGENCE]++; bottomline(); }
720 }
721
722 ocookie()
723 {
724 char *p;
725 lprcat("\nDo you (e) eat it, (t) take it"); iopts();
726 while (1) switch(getchar())
727 {
728 case '\33':
729 case 'i': ignore(); return;
730
731 case 'e': lprcat("eat\nThe cookie tasted good.");
732 forget(); /* no more cookie */
733 if (c[BLINDCOUNT]) return;
734 if (!(p=fortune())) return;
735 lprcat(" A message inside the cookie reads:\n"); lprcat(p);
736 return;
737
738 case 't': lprcat("take"); if (take(OCOOKIE,0)==0) forget(); /* no more book */
739 return;
740 };
741 }
742
743
744 /* routine to pick up some gold -- if arg==OMAXGOLD then the pile is worth 100* the argument */
745 ogold(arg)
746 int arg;
747 {
748 register long i;
749 i = iarg[playerx][playery];
750 if (arg==OMAXGOLD) i *= 100;
751 else if (arg==OKGOLD) i *= 1000;
752 else if (arg==ODGOLD) i *= 10;
753 lprintf("\nIt is worth %d!",(long)i); c[GOLD] += i; bottomgold();
754 item[playerx][playery] = know[playerx][playery] = 0; /* destroy gold */
755 }
756
757 ohome()
758 {
759 register int i;
760 nosignal = 1; /* disable signals */
761 for (i=0; i<26; i++) if (iven[i]==OPOTION) if (ivenarg[i]==21)
762 {
763 iven[i]=0; /* remove the potion of cure dianthroritis from inventory */
764 clear(); lprcat("Congratulations. You found a potion of cure dianthroritis.\n");
765 lprcat("\nFrankly, No one thought you could do it. Boy! Did you surprise them!\n");
766 if (gltime>TIMELIMIT)
767 {
768 lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
769 lprcat("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n");
770 nap(5000); died(269);
771 }
772 else
773 {
774 lprcat("\nThe doctor is now administering the potion, and in a few moments\n");
775 lprcat("Your daughter should be well on her way to recovery.\n");
776 nap(6000);
777 lprcat("\nThe potion is"); nap(3000); lprcat(" working! The doctor thinks that\n");
778 lprcat("your daughter will recover in a few days. Congratulations!\n");
779 beep(); nap(5000); died(263);
780 }
781 }
782
783 while (1)
784 {
785 clear(); lprintf("Welcome home %s. Latest word from the doctor is not good.\n",logname);
786
787 if (gltime>TIMELIMIT)
788 {
789 lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
790 lprcat("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n");
791 nap(5000); died(269);
792 }
793
794 lprcat("\nThe diagnosis is confirmed as dianthroritis. He guesses that\n");
795 lprintf("your daughter has only %d mobuls left in this world. It's up to you,\n",(long)((TIMELIMIT-gltime+99)/100));
796 lprintf("%s, to find the only hope for your daughter, the very rare\n",logname);
797 lprcat("potion of cure dianthroritis. It is rumored that only deep in the\n");
798 lprcat("depths of the caves can this potion be found.\n\n\n");
799 lprcat("\n ----- press "); standout("return");
800 lprcat(" to continue, "); standout("escape");
801 lprcat(" to leave ----- ");
802 i=getchar(); while (i!='\33' && i!='\n') i=getchar();
803 if (i=='\33') { drawscreen(); nosignal = 0; /* enable signals */ return; }
804 }
805 }
806
807 /* routine to save program space */
808 iopts()
809 { lprcat(", or (i) ignore it? "); }
810 ignore()
811 { lprcat("ignore\n"); }
812