]> git.cameronkatri.com Git - bsdgames-darwin.git/blob - larn/object.c
Add braces to make the new egcs happy.
[bsdgames-darwin.git] / larn / object.c
1 /* $NetBSD: object.c,v 1.9 1998/08/30 09:19:38 veego Exp $ */
2
3 /* object.c Larn is copyrighted 1986 by Noah Morgan. */
4
5 #include <sys/cdefs.h>
6 #ifndef lint
7 __RCSID("$NetBSD: object.c,v 1.9 1998/08/30 09:19:38 veego Exp $");
8 #endif /* not lint */
9 #include "header.h"
10 #include "extern.h"
11
12 /*
13 ***************
14 LOOK_FOR_OBJECT
15 ***************
16
17 subroutine to look for an object and give the player his options
18 if an object was found.
19 */
20 void
21 lookforobject()
22 {
23 int i, j;
24 if (c[TIMESTOP])
25 return; /* can't find objects is time is stopped */
26 i = item[playerx][playery];
27 if (i == 0)
28 return;
29 showcell(playerx, playery);
30 cursors();
31 yrepcount = 0;
32 switch (i) {
33 case OGOLDPILE:
34 case OMAXGOLD:
35 case OKGOLD:
36 case ODGOLD:
37 lprcat("\n\nYou have found some gold!");
38 ogold(i);
39 break;
40
41 case OPOTION:
42 lprcat("\n\nYou have found a magic potion");
43 i = iarg[playerx][playery];
44 if (potionname[i][0] != 0)
45 lprintf(" of%s", potionname[i]);
46 opotion(i);
47 break;
48
49 case OSCROLL:
50 lprcat("\n\nYou have found a magic scroll");
51 i = iarg[playerx][playery];
52 if (scrollname[i][0] != 0)
53 lprintf(" of%s", scrollname[i]);
54 oscroll(i);
55 break;
56
57 case OALTAR:
58 if (nearbymonst())
59 return;
60 lprcat("\n\nThere is a Holy Altar here!");
61 oaltar();
62 break;
63
64 case OBOOK:
65 lprcat("\n\nYou have found a book.");
66 obook();
67 break;
68
69 case OCOOKIE:
70 lprcat("\n\nYou have found a fortune cookie.");
71 ocookie();
72 break;
73
74 case OTHRONE:
75 if (nearbymonst())
76 return;
77 lprintf("\n\nThere is %s here!", objectname[i]);
78 othrone(0);
79 break;
80
81 case OTHRONE2:
82 if (nearbymonst())
83 return;
84 lprintf("\n\nThere is %s here!", objectname[i]);
85 othrone(1);
86 break;
87
88 case ODEADTHRONE:
89 lprintf("\n\nThere is %s here!", objectname[i]);
90 odeadthrone();
91 break;
92
93 case OORB:
94 lprcat("\n\nYou have found the Orb!!!!!");
95 oorb();
96 break;
97
98 case OPIT:
99 lprcat("\n\nYou're standing at the top of a pit.");
100 opit();
101 break;
102
103 case OSTAIRSUP:
104 lprcat("\n\nThere is a circular staircase here");
105 ostairs(1); /* up */
106 break;
107
108 case OELEVATORUP:
109 lprcat("\n\nYou feel heavy for a moment, but the feeling disappears");
110 oelevator(1); /* up */
111 break;
112
113 case OFOUNTAIN:
114 if (nearbymonst())
115 return;
116 lprcat("\n\nThere is a fountain here");
117 ofountain();
118 break;
119
120 case OSTATUE:
121 if (nearbymonst())
122 return;
123 lprcat("\n\nYou are standing in front of a statue");
124 ostatue();
125 break;
126
127 case OCHEST:
128 lprcat("\n\nThere is a chest here");
129 ochest();
130 break;
131
132 case OIVTELETRAP:
133 if (rnd(11) < 6)
134 return;
135 item[playerx][playery] = OTELEPORTER;
136 know[playerx][playery] = 1;
137
138 case OTELEPORTER:
139 lprcat("\nZaaaappp! You've been teleported!\n");
140 beep();
141 nap(3000);
142 oteleport(0);
143 break;
144
145 case OSCHOOL:
146 if (nearbymonst())
147 return;
148 lprcat("\n\nYou have found the College of Larn.");
149 lprcat("\nDo you (g) go inside, or (i) stay here? ");
150 i = 0;
151 while ((i != 'g') && (i != 'i') && (i != '\33'))
152 i = getchar();
153 if (i == 'g') {
154 oschool(); /* the college of larn */
155 } else
156 lprcat(" stay here");
157 break;
158
159 case OMIRROR:
160 if (nearbymonst())
161 return;
162 lprcat("\n\nThere is a mirror here");
163 omirror();
164 break;
165
166 case OBANK2:
167 case OBANK:
168 if (nearbymonst())
169 return;
170 if (i == OBANK)
171 lprcat("\n\nYou have found the bank of Larn.");
172 else
173 lprcat("\n\nYou have found a branch office of the bank of Larn.");
174 lprcat("\nDo you (g) go inside, or (i) stay here? ");
175 j = 0;
176 while ((j != 'g') && (j != 'i') && (j != '\33'))
177 j = getchar();
178 if (j == 'g') {
179 if (i == OBANK)
180 obank();
181 else
182 obank2(); /* the bank of larn */
183 } else
184 lprcat(" stay here");
185 break;
186
187 case ODEADFOUNTAIN:
188 if (nearbymonst())
189 return;
190 lprcat("\n\nThere is a dead fountain here");
191 break;
192
193 case ODNDSTORE:
194 if (nearbymonst())
195 return;
196 lprcat("\n\nThere is a DND store here.");
197 lprcat("\nDo you (g) go inside, or (i) stay here? ");
198 i = 0;
199 while ((i != 'g') && (i != 'i') && (i != '\33'))
200 i = getchar();
201 if (i == 'g')
202 dndstore(); /* the dnd adventurers store */
203 else
204 lprcat(" stay here");
205 break;
206
207 case OSTAIRSDOWN:
208 lprcat("\n\nThere is a circular staircase here");
209 ostairs(-1); /* down */
210 break;
211
212 case OELEVATORDOWN:
213 lprcat("\n\nYou feel light for a moment, but the feeling disappears");
214 oelevator(-1); /* down */
215 break;
216
217 case OOPENDOOR:
218 lprintf("\n\nYou have found %s", objectname[i]);
219 lprcat("\nDo you (c) close it");
220 iopts();
221 i = 0;
222 while ((i != 'c') && (i != 'i') && (i != '\33'))
223 i = getchar();
224 if ((i == '\33') || (i == 'i')) {
225 ignore();
226 break;
227 }
228 lprcat("close");
229 forget();
230 item[playerx][playery] = OCLOSEDDOOR;
231 iarg[playerx][playery] = 0;
232 playerx = lastpx;
233 playery = lastpy;
234 break;
235
236 case OCLOSEDDOOR:
237 lprintf("\n\nYou have found %s", objectname[i]);
238 lprcat("\nDo you (o) try to open it");
239 iopts();
240 i = 0;
241 while ((i != 'o') && (i != 'i') && (i != '\33'))
242 i = getchar();
243 if ((i == '\33') || (i == 'i')) {
244 ignore();
245 playerx = lastpx;
246 playery = lastpy;
247 break;
248 } else {
249 lprcat("open");
250 if (rnd(11) < 7) {
251 switch (iarg[playerx][playery]) {
252 case 6:
253 c[AGGRAVATE] += rnd(400);
254 break;
255
256 case 7:
257 lprcat("\nYou are jolted by an electric shock ");
258 lastnum = 274;
259 losehp(rnd(20));
260 bottomline();
261 break;
262
263 case 8:
264 loselevel();
265 break;
266
267 case 9:
268 lprcat("\nYou suddenly feel weaker ");
269 if (c[STRENGTH] > 3)
270 c[STRENGTH]--;
271 bottomline();
272 break;
273
274 default:
275 break;
276 }
277 playerx = lastpx;
278 playery = lastpy;
279 } else {
280 forget();
281 item[playerx][playery] = OOPENDOOR;
282 }
283 }
284 break;
285
286 case OENTRANCE:
287 lprcat("\nYou have found ");
288 lprcat(objectname[OENTRANCE]);
289 lprcat("\nDo you (g) go inside");
290 iopts();
291 i = 0;
292 while ((i != 'g') && (i != 'i') && (i != '\33'))
293 i = getchar();
294 if (i == 'g') {
295 newcavelevel(1);
296 playerx = 33;
297 playery = MAXY - 2;
298 item[33][MAXY - 1] = know[33][MAXY - 1] = mitem[33][MAXY - 1] = 0;
299 draws(0, MAXX, 0, MAXY);
300 bot_linex();
301 return;
302 } else
303 ignore();
304 break;
305
306 case OVOLDOWN:
307 lprcat("\nYou have found ");
308 lprcat(objectname[OVOLDOWN]);
309 lprcat("\nDo you (c) climb down");
310 iopts();
311 i = 0;
312 while ((i != 'c') && (i != 'i') && (i != '\33'))
313 i = getchar();
314 if ((i == '\33') || (i == 'i')) {
315 ignore();
316 break;
317 }
318 if (level != 0) {
319 lprcat("\nThe shaft only extends 5 feet downward!");
320 return;
321 }
322 if (packweight() > 45 + 3 * (c[STRENGTH] + c[STREXTRA])) {
323 lprcat("\nYou slip and fall down the shaft");
324 beep();
325 lastnum = 275;
326 losehp(30 + rnd(20));
327 bottomhp();
328 } else
329 lprcat("climb down");
330 nap(3000);
331 newcavelevel(MAXLEVEL);
332 for (i = 0; i < MAXY; i++)
333 for (j = 0; j < MAXX; j++) /* put player near
334 * volcano shaft */
335 if (item[j][i] == OVOLUP) {
336 playerx = j;
337 playery = i;
338 j = MAXX;
339 i = MAXY;
340 positionplayer();
341 }
342 draws(0, MAXX, 0, MAXY);
343 bot_linex();
344 return;
345
346 case OVOLUP:
347 lprcat("\nYou have found ");
348 lprcat(objectname[OVOLUP]);
349 lprcat("\nDo you (c) climb up");
350 iopts();
351 i = 0;
352 while ((i != 'c') && (i != 'i') && (i != '\33'))
353 i = getchar();
354 if ((i == '\33') || (i == 'i')) {
355 ignore();
356 break;
357 }
358 if (level != 11) {
359 lprcat("\nThe shaft only extends 8 feet upwards before you find a blockage!");
360 return;
361 }
362 if (packweight() > 45 + 5 * (c[STRENGTH] + c[STREXTRA])) {
363 lprcat("\nYou slip and fall down the shaft");
364 beep();
365 lastnum = 275;
366 losehp(15 + rnd(20));
367 bottomhp();
368 return;
369 }
370 lprcat("climb up");
371 lflush();
372 nap(3000);
373 newcavelevel(0);
374 for (i = 0; i < MAXY; i++)
375 for (j = 0; j < MAXX; j++) /* put player near
376 * volcano shaft */
377 if (item[j][i] == OVOLDOWN) {
378 playerx = j;
379 playery = i;
380 j = MAXX;
381 i = MAXY;
382 positionplayer();
383 }
384 draws(0, MAXX, 0, MAXY);
385 bot_linex();
386 return;
387
388 case OTRAPARROWIV:
389 if (rnd(17) < 13)
390 return; /* for an arrow trap */
391 item[playerx][playery] = OTRAPARROW;
392 know[playerx][playery] = 0;
393
394 case OTRAPARROW:
395 lprcat("\nYou are hit by an arrow");
396 beep(); /* for an arrow trap */
397 lastnum = 259;
398 losehp(rnd(10) + level);
399 bottomhp();
400 return;
401
402 case OIVDARTRAP:
403 if (rnd(17) < 13)
404 return; /* for a dart trap */
405 item[playerx][playery] = ODARTRAP;
406 know[playerx][playery] = 0;
407
408 case ODARTRAP:
409 lprcat("\nYou are hit by a dart");
410 beep(); /* for a dart trap */
411 lastnum = 260;
412 losehp(rnd(5));
413 if ((--c[STRENGTH]) < 3)
414 c[STRENGTH] = 3;
415 bottomline();
416 return;
417
418 case OIVTRAPDOOR:
419 if (rnd(17) < 13)
420 return; /* for a trap door */
421 item[playerx][playery] = OTRAPDOOR;
422 know[playerx][playery] = 1;
423
424 case OTRAPDOOR:
425 lastnum = 272; /* a trap door */
426 if ((level == MAXLEVEL - 1) || (level == MAXLEVEL + MAXVLEVEL - 1)) {
427 lprcat("\nYou fell through a bottomless trap door!");
428 beep();
429 nap(3000);
430 died(271);
431 }
432 lprcat("\nYou fall through a trap door!");
433 beep(); /* for a trap door */
434 losehp(rnd(5 + level));
435 nap(2000);
436 newcavelevel(level + 1);
437 draws(0, MAXX, 0, MAXY);
438 bot_linex();
439 return;
440
441
442 case OTRADEPOST:
443 if (nearbymonst())
444 return;
445 lprcat("\nYou have found the Larn trading Post.");
446 lprcat("\nDo you (g) go inside, or (i) stay here? ");
447 i = 0;
448 while ((i != 'g') && (i != 'i') && (i != '\33'))
449 i = getchar();
450 if (i == 'g')
451 otradepost();
452 else
453 lprcat("stay here");
454 return;
455
456 case OHOME:
457 if (nearbymonst())
458 return;
459 lprcat("\nYou have found your way home.");
460 lprcat("\nDo you (g) go inside, or (i) stay here? ");
461 i = 0;
462 while ((i != 'g') && (i != 'i') && (i != '\33'))
463 i = getchar();
464 if (i == 'g')
465 ohome();
466 else
467 lprcat("stay here");
468 return;
469
470 case OWALL:
471 break;
472
473 case OANNIHILATION:
474 died(283);
475 return; /* annihilated by sphere of annihilation */
476
477 case OLRS:
478 if (nearbymonst())
479 return;
480 lprcat("\n\nThere is an LRS office here.");
481 lprcat("\nDo you (g) go inside, or (i) stay here? ");
482 i = 0;
483 while ((i != 'g') && (i != 'i') && (i != '\33'))
484 i = getchar();
485 if (i == 'g')
486 olrs(); /* the larn revenue service */
487 else
488 lprcat(" stay here");
489 break;
490
491 default:
492 finditem(i);
493 break;
494 };
495 }
496
497 /*
498 function to say what object we found and ask if player wants to take it
499 */
500 void
501 finditem(itm)
502 int itm;
503 {
504 int tmp, i;
505 lprintf("\n\nYou have found %s ", objectname[itm]);
506 tmp = iarg[playerx][playery];
507 switch (itm) {
508 case ODIAMOND:
509 case ORUBY:
510 case OEMERALD:
511 case OSAPPHIRE:
512 case OSPIRITSCARAB:
513 case OORBOFDRAGON:
514 case OCUBEofUNDEAD:
515 case ONOTHEFT:
516 break;
517
518 default:
519 if (tmp > 0)
520 lprintf("+ %d", (long) tmp);
521 else if (tmp < 0)
522 lprintf(" %d", (long) tmp);
523 }
524 lprcat("\nDo you want to (t) take it");
525 iopts();
526 i = 0;
527 while (i != 't' && i != 'i' && i != '\33')
528 i = getchar();
529 if (i == 't') {
530 lprcat("take");
531 if (take(itm, tmp) == 0)
532 forget();
533 return;
534 }
535 ignore();
536 }
537
538
539
540 /*
541 *******
542 OSTAIRS
543 *******
544
545 subroutine to process the stair cases
546 if dir > 0 the up else down
547 */
548 void
549 ostairs(dir)
550 int dir;
551 {
552 int k;
553 lprcat("\nDo you (s) stay here ");
554 if (dir > 0)
555 lprcat("(u) go up ");
556 else
557 lprcat("(d) go down ");
558 lprcat("or (f) kick stairs? ");
559
560 while (1)
561 switch (getchar()) {
562 case '\33':
563 case 's':
564 case 'i':
565 lprcat("stay here");
566 return;
567
568 case 'f':
569 lprcat("kick stairs");
570 if (rnd(2) == 1)
571 lprcat("\nI hope you feel better. Showing anger rids you of frustration.");
572 else {
573 k = rnd((level + 1) << 1);
574 lprintf("\nYou hurt your foot dumb dumb! You suffer %d hit points", (long) k);
575 lastnum = 276;
576 losehp(k);
577 bottomline();
578 }
579 return;
580
581 case 'u':
582 lprcat("go up");
583 if (dir < 0)
584 lprcat("\nThe stairs don't go up!");
585 else if (level >= 2 && level != 11) {
586 k = level;
587 newcavelevel(level - 1);
588 draws(0, MAXX, 0, MAXY);
589 bot_linex();
590 } else
591 lprcat("\nThe stairs lead to a dead end!");
592 return;
593
594 case 'd':
595 lprcat("go down");
596 if (dir > 0)
597 lprcat("\nThe stairs don't go down!");
598 else if (level != 0 && level != 10 && level != 13) {
599 k = level;
600 newcavelevel(level + 1);
601 draws(0, MAXX, 0, MAXY);
602 bot_linex();
603 } else
604 lprcat("\nThe stairs lead to a dead end!");
605 return;
606 };
607 }
608
609
610
611 /*
612 *********
613 OTELEPORTER
614 *********
615
616 subroutine to handle a teleport trap +/- 1 level maximum
617 */
618 void
619 oteleport(err)
620 int err;
621 {
622 int tmp;
623 if (err)
624 if (rnd(151) < 3)
625 died(264); /* stuck in a rock */
626 c[TELEFLAG] = 1; /* show ?? on bottomline if been teleported */
627 if (level == 0)
628 tmp = 0;
629 else if (level < MAXLEVEL) {
630 tmp = rnd(5) + level - 3;
631 if (tmp >= MAXLEVEL)
632 tmp = MAXLEVEL - 1;
633 if (tmp < 1)
634 tmp = 1;
635 } else {
636 tmp = rnd(3) + level - 2;
637 if (tmp >= MAXLEVEL + MAXVLEVEL)
638 tmp = MAXLEVEL + MAXVLEVEL - 1;
639 if (tmp < MAXLEVEL)
640 tmp = MAXLEVEL;
641 }
642 playerx = rnd(MAXX - 2);
643 playery = rnd(MAXY - 2);
644 if (level != tmp)
645 newcavelevel(tmp);
646 positionplayer();
647 draws(0, MAXX, 0, MAXY);
648 bot_linex();
649 }
650
651
652 /*
653 *******
654 OPOTION
655 *******
656
657 function to process a potion
658 */
659 void
660 opotion(pot)
661 int pot;
662 {
663 lprcat("\nDo you (d) drink it, (t) take it");
664 iopts();
665 while (1)
666 switch (getchar()) {
667 case '\33':
668 case 'i':
669 ignore();
670 return;
671
672 case 'd':
673 lprcat("drink\n");
674 forget(); /* destroy potion */
675 quaffpotion(pot);
676 return;
677
678 case 't':
679 lprcat("take\n");
680 if (take(OPOTION, pot) == 0)
681 forget();
682 return;
683 };
684 }
685
686 /*
687 function to drink a potion
688 */
689 void
690 quaffpotion(pot)
691 int pot;
692 {
693 int i, j, k;
694 if (pot < 0 || pot >= MAXPOTION)
695 return; /* check for within bounds */
696 potionname[pot] = potionhide[pot];
697 switch (pot) {
698 case 9:
699 lprcat("\nYou feel greedy . . .");
700 nap(2000);
701 for (i = 0; i < MAXY; i++)
702 for (j = 0; j < MAXX; j++)
703 if ((item[j][i] == OGOLDPILE) || (item[j][i] == OMAXGOLD)) {
704 know[j][i] = 1;
705 show1cell(j, i);
706 }
707 showplayer();
708 return;
709
710 case 19:
711 lprcat("\nYou feel greedy . . .");
712 nap(2000);
713 for (i = 0; i < MAXY; i++)
714 for (j = 0; j < MAXX; j++) {
715 k = item[j][i];
716 if ((k == ODIAMOND) || (k == ORUBY) || (k == OEMERALD) || (k == OMAXGOLD)
717 || (k == OSAPPHIRE) || (k == OLARNEYE) || (k == OGOLDPILE)) {
718 know[j][i] = 1;
719 show1cell(j, i);
720 }
721 }
722 showplayer();
723 return;
724
725 case 20:
726 c[HP] = c[HPMAX];
727 break; /* instant healing */
728
729 case 1:
730 lprcat("\nYou feel better");
731 if (c[HP] == c[HPMAX])
732 raisemhp(1);
733 else if ((c[HP] += rnd(20) + 20 + c[LEVEL]) > c[HPMAX])
734 c[HP] = c[HPMAX];
735 break;
736
737 case 2:
738 lprcat("\nSuddenly, you feel much more skillful!");
739 raiselevel();
740 raisemhp(1);
741 return;
742
743 case 3:
744 lprcat("\nYou feel strange for a moment");
745 c[rund(6)]++;
746 break;
747
748 case 4:
749 lprcat("\nYou feel more self confident!");
750 c[WISDOM] += rnd(2);
751 break;
752
753 case 5:
754 lprcat("\nWow! You feel great!");
755 if (c[STRENGTH] < 12)
756 c[STRENGTH] = 12;
757 else
758 c[STRENGTH]++;
759 break;
760
761 case 6:
762 lprcat("\nYour charm went up by one!");
763 c[CHARISMA]++;
764 break;
765
766 case 8:
767 lprcat("\nYour intelligence went up by one!");
768 c[INTELLIGENCE]++;
769 break;
770
771 case 10:
772 for (i = 0; i < MAXY; i++)
773 for (j = 0; j < MAXX; j++)
774 if (mitem[j][i]) {
775 know[j][i] = 1;
776 show1cell(j, i);
777 }
778 /* monster detection */ return;
779
780 case 12:
781 lprcat("\nThis potion has no taste to it");
782 return;
783
784 case 15:
785 lprcat("\nWOW!!! You feel Super-fantastic!!!");
786 if (c[HERO] == 0)
787 for (i = 0; i < 6; i++)
788 c[i] += 11;
789 c[HERO] += 250;
790 break;
791
792 case 16:
793 lprcat("\nYou have a greater intestinal constitude!");
794 c[CONSTITUTION]++;
795 break;
796
797 case 17:
798 lprcat("\nYou now have incredibly bulging muscles!!!");
799 if (c[GIANTSTR] == 0)
800 c[STREXTRA] += 21;
801 c[GIANTSTR] += 700;
802 break;
803
804 case 18:
805 lprcat("\nYou feel a chill run up your spine!");
806 c[FIRERESISTANCE] += 1000;
807 break;
808
809 case 0:
810 lprcat("\nYou fall asleep. . .");
811 i = rnd(11) - (c[CONSTITUTION] >> 2) + 2;
812 while (--i > 0) {
813 parse2();
814 nap(1000);
815 }
816 cursors();
817 lprcat("\nYou woke up!");
818 return;
819
820 case 7:
821 lprcat("\nYou become dizzy!");
822 if (--c[STRENGTH] < 3)
823 c[STRENGTH] = 3;
824 break;
825
826 case 11:
827 lprcat("\nYou stagger for a moment . .");
828 for (i = 0; i < MAXY; i++)
829 for (j = 0; j < MAXX; j++)
830 know[j][i] = 0;
831 nap(2000);
832 draws(0, MAXX, 0, MAXY); /* potion of forgetfulness */
833 return;
834
835 case 13:
836 lprcat("\nYou can't see anything!"); /* blindness */
837 c[BLINDCOUNT] += 500;
838 return;
839
840 case 14:
841 lprcat("\nYou feel confused");
842 c[CONFUSE] += 20 + rnd(9);
843 return;
844
845 case 21:
846 lprcat("\nYou don't seem to be affected");
847 return; /* cure dianthroritis */
848
849 case 22:
850 lprcat("\nYou feel a sickness engulf you"); /* poison */
851 c[HALFDAM] += 200 + rnd(200);
852 return;
853
854 case 23:
855 lprcat("\nYou feel your vision sharpen"); /* see invisible */
856 c[SEEINVISIBLE] += rnd(1000) + 400;
857 monstnamelist[INVISIBLESTALKER] = 'I';
858 return;
859 };
860 bottomline(); /* show new stats */
861 return;
862 }
863
864
865 /*
866 *******
867 OSCROLL
868 *******
869
870 function to process a magic scroll
871 */
872 void
873 oscroll(typ)
874 int typ;
875 {
876 lprcat("\nDo you ");
877 if (c[BLINDCOUNT] == 0)
878 lprcat("(r) read it, ");
879 lprcat("(t) take it");
880 iopts();
881 while (1)
882 switch (getchar()) {
883 case '\33':
884 case 'i':
885 ignore();
886 return;
887
888 case 'r':
889 if (c[BLINDCOUNT])
890 break;
891 lprcat("read");
892 forget();
893 if (typ == 2 || typ == 15) {
894 show1cell(playerx, playery);
895 cursors();
896 }
897 /* destroy it */ read_scroll(typ);
898 return;
899
900 case 't':
901 lprcat("take");
902 if (take(OSCROLL, typ) == 0)
903 forget(); /* destroy it */
904 return;
905 };
906 }
907
908 /*
909 data for the function to read a scroll
910 */
911 static int xh, yh, yl, xl;
912 static u_char curse[] = {
913 BLINDCOUNT, CONFUSE, AGGRAVATE, HASTEMONST, ITCHING,
914 LAUGHING, DRAINSTRENGTH, CLUMSINESS, INFEEBLEMENT, HALFDAM
915 };
916
917 static u_char exten[] = {
918 PROTECTIONTIME, DEXCOUNT, STRCOUNT, CHARMCOUNT, INVISIBILITY,
919 CANCELLATION, HASTESELF, GLOBE, SCAREMONST, HOLDMONST, TIMESTOP
920 };
921
922 u_char time_change[] = {
923 HASTESELF, HERO, ALTPRO, PROTECTIONTIME, DEXCOUNT, STRCOUNT,
924 GIANTSTR, CHARMCOUNT, INVISIBILITY, CANCELLATION, HASTESELF,
925 AGGRAVATE, SCAREMONST, STEALTH, AWARENESS, HOLDMONST,
926 HASTEMONST, FIRERESISTANCE, GLOBE, SPIRITPRO, UNDEADPRO,
927 HALFDAM, SEEINVISIBLE, ITCHING, CLUMSINESS, WTW
928 };
929
930 /*
931 * function to adjust time when time warping and taking courses in school
932 */
933 void
934 adjusttime(tim)
935 long tim;
936 {
937 int j;
938 for (j = 0; j < 26; j++)/* adjust time related parameters */
939 if (c[time_change[j]])
940 if ((c[time_change[j]] -= tim) < 1)
941 c[time_change[j]] = 1;
942 regen();
943 }
944
945 /*
946 function to read a scroll
947 */
948 void
949 read_scroll(typ)
950 int typ;
951 {
952 int i, j;
953 if (typ < 0 || typ >= MAXSCROLL)
954 return; /* be sure we are within bounds */
955 scrollname[typ] = scrollhide[typ];
956 switch (typ) {
957 case 0:
958 lprcat("\nYour armor glows for a moment");
959 enchantarmor();
960 return;
961
962 case 1:
963 lprcat("\nYour weapon glows for a moment");
964 enchweapon();
965 return; /* enchant weapon */
966
967 case 2:
968 lprcat("\nYou have been granted enlightenment!");
969 yh = min(playery + 7, MAXY);
970 xh = min(playerx + 25, MAXX);
971 yl = max(playery - 7, 0);
972 xl = max(playerx - 25, 0);
973 for (i = yl; i < yh; i++)
974 for (j = xl; j < xh; j++)
975 know[j][i] = 1;
976 nap(2000);
977 draws(xl, xh, yl, yh);
978 return;
979
980 case 3:
981 lprcat("\nThis scroll seems to be blank");
982 return;
983
984 case 4:
985 createmonster(makemonst(level + 1));
986 return; /* this one creates a monster */
987
988 case 5:
989 something(level); /* create artifact */
990 return;
991
992 case 6:
993 c[AGGRAVATE] += 800;
994 return; /* aggravate monsters */
995
996 case 7:
997 gltime += (i = rnd(1000) - 850); /* time warp */
998 if (i >= 0)
999 lprintf("\nYou went forward in time by %d mobuls", (long) ((i + 99) / 100));
1000 else
1001 lprintf("\nYou went backward in time by %d mobuls", (long) (-(i + 99) / 100));
1002 adjusttime((long) i); /* adjust time for time warping */
1003 return;
1004
1005 case 8:
1006 oteleport(0);
1007 return; /* teleportation */
1008
1009 case 9:
1010 c[AWARENESS] += 1800;
1011 return; /* expanded awareness */
1012
1013 case 10:
1014 c[HASTEMONST] += rnd(55) + 12;
1015 return; /* haste monster */
1016
1017 case 11:
1018 for (i = 0; i < MAXY; i++)
1019 for (j = 0; j < MAXX; j++)
1020 if (mitem[j][i])
1021 hitp[j][i] = monster[mitem[j][i]].hitpoints;
1022 return; /* monster healing */
1023 case 12:
1024 c[SPIRITPRO] += 300 + rnd(200);
1025 bottomline();
1026 return; /* spirit protection */
1027
1028 case 13:
1029 c[UNDEADPRO] += 300 + rnd(200);
1030 bottomline();
1031 return; /* undead protection */
1032
1033 case 14:
1034 c[STEALTH] += 250 + rnd(250);
1035 bottomline();
1036 return; /* stealth */
1037
1038 case 15:
1039 lprcat("\nYou have been granted enlightenment!"); /* magic mapping */
1040 for (i = 0; i < MAXY; i++)
1041 for (j = 0; j < MAXX; j++)
1042 know[j][i] = 1;
1043 nap(2000);
1044 draws(0, MAXX, 0, MAXY);
1045 return;
1046
1047 case 16:
1048 c[HOLDMONST] += 30;
1049 bottomline();
1050 return; /* hold monster */
1051
1052 case 17:
1053 for (i = 0; i < 26; i++) /* gem perfection */
1054 switch (iven[i]) {
1055 case ODIAMOND:
1056 case ORUBY:
1057 case OEMERALD:
1058 case OSAPPHIRE:
1059 j = ivenarg[i];
1060 j &= 255;
1061 j <<= 1;
1062 if (j > 255)
1063 j = 255; /* double value */
1064 ivenarg[i] = j;
1065 break;
1066 }
1067 break;
1068
1069 case 18:
1070 for (i = 0; i < 11; i++)
1071 c[exten[i]] <<= 1; /* spell extension */
1072 break;
1073
1074 case 19:
1075 for (i = 0; i < 26; i++) { /* identify */
1076 if (iven[i] == OPOTION)
1077 potionname[ivenarg[i]] = potionhide[ivenarg[i]];
1078 if (iven[i] == OSCROLL)
1079 scrollname[ivenarg[i]] = scrollhide[ivenarg[i]];
1080 }
1081 break;
1082
1083 case 20:
1084 for (i = 0; i < 10; i++) /* remove curse */
1085 if (c[curse[i]])
1086 c[curse[i]] = 1;
1087 break;
1088
1089 case 21:
1090 annihilate();
1091 break; /* scroll of annihilation */
1092
1093 case 22:
1094 godirect(22, 150, "The ray hits the %s", 0, ' '); /* pulverization */
1095 break;
1096 case 23:
1097 c[LIFEPROT]++;
1098 break; /* life protection */
1099 };
1100 }
1101
1102
1103
1104 void
1105 oorb()
1106 {
1107 }
1108
1109 void
1110 opit()
1111 {
1112 int i;
1113 if (rnd(101) < 81) {
1114 if (rnd(70) > 9 * c[DEXTERITY] - packweight() || rnd(101) < 5) {
1115 if (level == MAXLEVEL - 1)
1116 obottomless();
1117 else if (level == MAXLEVEL + MAXVLEVEL - 1)
1118 obottomless();
1119 else {
1120 if (rnd(101) < 20) {
1121 i = 0;
1122 lprcat("\nYou fell into a pit! Your fall is cushioned by an unknown force\n");
1123 } else {
1124 i = rnd(level * 3 + 3);
1125 lprintf("\nYou fell into a pit! You suffer %d hit points damage", (long) i);
1126 lastnum = 261; /* if he dies scoreboard
1127 * will say so */
1128 }
1129 losehp(i);
1130 nap(2000);
1131 newcavelevel(level + 1);
1132 draws(0, MAXX, 0, MAXY);
1133 }
1134 }
1135 }
1136 }
1137
1138 void
1139 obottomless()
1140 {
1141 lprcat("\nYou fell into a bottomless pit!");
1142 beep();
1143 nap(3000);
1144 died(262);
1145 }
1146 void
1147 oelevator(dir)
1148 int dir;
1149 {
1150 #ifdef lint
1151 int x;
1152 x = dir;
1153 dir = x;
1154 #endif /* lint */
1155 }
1156
1157 void
1158 ostatue()
1159 {
1160 }
1161
1162 void
1163 omirror()
1164 {
1165 }
1166
1167 void
1168 obook()
1169 {
1170 lprcat("\nDo you ");
1171 if (c[BLINDCOUNT] == 0)
1172 lprcat("(r) read it, ");
1173 lprcat("(t) take it");
1174 iopts();
1175 while (1)
1176 switch (getchar()) {
1177 case '\33':
1178 case 'i':
1179 ignore();
1180 return;
1181
1182 case 'r':
1183 if (c[BLINDCOUNT])
1184 break;
1185 lprcat("read");
1186 /* no more book */ readbook(iarg[playerx][playery]);
1187 forget();
1188 return;
1189
1190 case 't':
1191 lprcat("take");
1192 if (take(OBOOK, iarg[playerx][playery]) == 0)
1193 forget(); /* no more book */
1194 return;
1195 };
1196 }
1197
1198 /*
1199 function to read a book
1200 */
1201 void
1202 readbook(lev)
1203 int lev;
1204 {
1205 int i, tmp;
1206 if (lev <= 3)
1207 i = rund((tmp = splev[lev]) ? tmp : 1);
1208 else
1209 i = rnd((tmp = splev[lev] - 9) ? tmp : 1) + 9;
1210 spelknow[i] = 1;
1211 lprintf("\nSpell \"%s\": %s\n%s", spelcode[i], spelname[i], speldescript[i]);
1212 if (rnd(10) == 4) {
1213 lprcat("\nYour int went up by one!");
1214 c[INTELLIGENCE]++;
1215 bottomline();
1216 }
1217 }
1218
1219 void
1220 ocookie()
1221 {
1222 char *p;
1223 lprcat("\nDo you (e) eat it, (t) take it");
1224 iopts();
1225 while (1)
1226 switch (getchar()) {
1227 case '\33':
1228 case 'i':
1229 ignore();
1230 return;
1231
1232 case 'e':
1233 lprcat("eat\nThe cookie tasted good.");
1234 forget(); /* no more cookie */
1235 if (c[BLINDCOUNT])
1236 return;
1237 if (!(p = fortune()))
1238 return;
1239 lprcat(" A message inside the cookie reads:\n");
1240 lprcat(p);
1241 return;
1242
1243 case 't':
1244 lprcat("take");
1245 if (take(OCOOKIE, 0) == 0)
1246 forget(); /* no more book */
1247 return;
1248 };
1249 }
1250
1251
1252 /*
1253 * routine to pick up some gold -- if arg==OMAXGOLD then the pile is worth
1254 * 100* the argument
1255 */
1256 void
1257 ogold(arg)
1258 int arg;
1259 {
1260 long i;
1261 i = iarg[playerx][playery];
1262 if (arg == OMAXGOLD)
1263 i *= 100;
1264 else if (arg == OKGOLD)
1265 i *= 1000;
1266 else if (arg == ODGOLD)
1267 i *= 10;
1268 lprintf("\nIt is worth %d!", (long) i);
1269 c[GOLD] += i;
1270 bottomgold();
1271 item[playerx][playery] = know[playerx][playery] = 0; /* destroy gold */
1272 }
1273
1274 void
1275 ohome()
1276 {
1277 int i;
1278 nosignal = 1; /* disable signals */
1279 for (i = 0; i < 26; i++)
1280 if (iven[i] == OPOTION)
1281 if (ivenarg[i] == 21) {
1282 iven[i] = 0; /* remove the potion of cure
1283 * dianthroritis from
1284 * inventory */
1285 clear();
1286 lprcat("Congratulations. You found a potion of cure dianthroritis.\n");
1287 lprcat("\nFrankly, No one thought you could do it. Boy! Did you surprise them!\n");
1288 if (gltime > TIMELIMIT) {
1289 lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
1290 lprcat("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n");
1291 nap(5000);
1292 died(269);
1293 } else {
1294 lprcat("\nThe doctor is now administering the potion, and in a few moments\n");
1295 lprcat("Your daughter should be well on her way to recovery.\n");
1296 nap(6000);
1297 lprcat("\nThe potion is");
1298 nap(3000);
1299 lprcat(" working! The doctor thinks that\n");
1300 lprcat("your daughter will recover in a few days. Congratulations!\n");
1301 beep();
1302 nap(5000);
1303 died(263);
1304 }
1305 }
1306 while (1) {
1307 clear();
1308 lprintf("Welcome home %s. Latest word from the doctor is not good.\n", logname);
1309
1310 if (gltime > TIMELIMIT) {
1311 lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
1312 lprcat("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n");
1313 nap(5000);
1314 died(269);
1315 }
1316 lprcat("\nThe diagnosis is confirmed as dianthroritis. He guesses that\n");
1317 lprintf("your daughter has only %d mobuls left in this world. It's up to you,\n", (long) ((TIMELIMIT - gltime + 99) / 100));
1318 lprintf("%s, to find the only hope for your daughter, the very rare\n", logname);
1319 lprcat("potion of cure dianthroritis. It is rumored that only deep in the\n");
1320 lprcat("depths of the caves can this potion be found.\n\n\n");
1321 lprcat("\n ----- press ");
1322 standout("return");
1323 lprcat(" to continue, ");
1324 standout("escape");
1325 lprcat(" to leave ----- ");
1326 i = getchar();
1327 while (i != '\33' && i != '\n')
1328 i = getchar();
1329 if (i == '\33') {
1330 drawscreen();
1331 nosignal = 0; /* enable signals */
1332 return;
1333 }
1334 }
1335 }
1336
1337 /* routine to save program space */
1338 void
1339 iopts()
1340 {
1341 lprcat(", or (i) ignore it? ");
1342 }
1343
1344 void
1345 ignore()
1346 {
1347 lprcat("ignore\n");
1348 }