Annotation of early-roguelike/urogue/daemons.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: daemons.c - All the daemon and fuse functions are in here
3:
4: UltraRogue: The Ultimate Adventure in the Dungeons of Doom
5: Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
6: All rights reserved.
7:
8: Based on "Advanced Rogue"
9: Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
10: All rights reserved.
11:
12: Based on "Rogue: Exploring the Dungeons of Doom"
13: Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
14: All rights reserved.
15:
16: See the file LICENSE.TXT for full copyright and licensing information.
17: */
18:
19: #include "rogue.h"
20:
21: /*
22: doctor()
23: A healing daemon that restors spell and hit points after rest
24: */
25:
26: void
27: doctor(daemon_arg *who)
28: {
29: struct thing *tp = who->thingptr;
30: long ohp; /* turn off ISFLEE? */
31: struct stats *curp; /* current stats pointer */
32: struct stats *maxp; /* max stats pointer */
33: int turns_quiet, new_points;
34:
35: curp = &(tp->t_stats);
36: maxp = &(tp->maxstats);
37:
38: if (on(*tp, ISINWALL))
39: {
40: tp->t_rest_hpt = 0;
41: return;
42: }
43:
44: /* Check for regenerating spell points first */
45:
46: doctor_spell_points(tp);
47:
48: if (curp->s_hpt == maxp->s_hpt)
49: {
50: tp->t_rest_hpt = 0;
51: return;
52: }
53:
54: tp->t_rest_hpt++;
55:
56: switch (tp->t_ctype)
57: {
58: case C_MAGICIAN:
59: case C_ILLUSION:
60: turns_quiet = 24 - curp->s_lvl;
61: new_points = curp->s_lvl / 2 - 4;
62: break;
63:
64: case C_THIEF:
65: case C_ASSASIN:
66: case C_NINJA:
67: turns_quiet = 16 - curp->s_lvl;
68: new_points = curp->s_lvl / 2 - 1;
69: break;
70:
71: case C_CLERIC:
72: case C_DRUID:
73: turns_quiet = 16 - curp->s_lvl;
74: new_points = curp->s_lvl / 2 - 2;
75: break;
76:
77: case C_FIGHTER:
78: case C_RANGER:
79: case C_PALADIN:
80: turns_quiet = 8 - curp->s_lvl / 2;
81: new_points = curp->s_lvl / 2 - 1;
82: break;
83:
84: case C_MONSTER:
85: turns_quiet = 16 - curp->s_lvl;
86: new_points = curp->s_lvl / 2 - 6;
87: break;
88:
89: default:
90: debug("What a strange character you are!");
91: return;
92: }
93:
94: ohp = curp->s_hpt;
95:
96: if (off(*tp, HASDISEASE))
97: {
98: if (curp->s_lvl < 8)
99: {
100: if (tp->t_rest_hpt > turns_quiet)
101: curp->s_hpt++;
102: }
103: else if (tp->t_rest_hpt >= 15)
104: curp->s_hpt += rnd(new_points) + 1;
105: }
106:
107: if (tp == &player)
108: {
109: if (curp->s_lvl > 10)
110: turns_quiet = 2;
111: else
112: turns_quiet = rnd(turns_quiet / 6) + 1;
113:
114: if (is_wearing(R_REGEN))
115: curp->s_hpt += ring_value(R_REGEN);
116: }
117:
118: if (on(*tp, ISREGEN))
119: curp->s_hpt += curp->s_lvl / 5 + 1;
120:
121: if (ohp != curp->s_hpt)
122: {
123: if (curp->s_hpt >= maxp->s_hpt)
124: {
125: curp->s_hpt = maxp->s_hpt;
126:
127: if (off(*tp, WASTURNED) && on(*tp, ISFLEE)
128: && tp != &player)
129: {
130: turn_off(*tp, ISFLEE);
131: tp->t_oldpos = tp->t_pos;
132: /* Start our trek over */
133: }
134: }
135: tp->t_rest_hpt = 0;
136: }
137:
138: return;
139: }
140:
141:
142: /*
143: doctor_spell_points()
144: A healing daemon that restors spell points
145: */
146:
147: void
148: doctor_spell_points(struct thing *tp)
149: {
150: int turns_quiet, new_points;
151: struct stats *curp; /* current stats pointer */
152: struct stats *maxp; /* max stats pointer */
153: int opower; /* current power */
154:
155: curp = &(tp->t_stats);
156: maxp = &(tp->maxstats);
157: opower = curp->s_power;
158:
159: /* The right ring will let you regenerate while wearing bad armor */
160:
161: if (off(*tp, CANCAST) ||
162: ((tp == &player) &&
163: (cur_armor && wear_ok(tp, cur_armor, NOMESSAGE) == FALSE) &&
164: !(is_wearing(R_WIZARD) || is_wearing(R_PIETY))))
165: {
166: tp->t_rest_pow = 0;
167: return;
168: }
169:
170: tp->t_rest_pow++;
171:
172: switch (tp->t_ctype)
173: {
174: case C_MAGICIAN:
175: case C_ILLUSION:
176: turns_quiet = 18 - curp->s_lvl / 2;
177: new_points = curp->s_lvl / 2;
178: break;
179: case C_CLERIC:
180: case C_DRUID:
181: turns_quiet = 24 - curp->s_lvl;
182: new_points = curp->s_lvl / 2 - 2;
183: break;
184: case C_THIEF:
185: case C_ASSASIN:
186: case C_NINJA:
187: turns_quiet = 32 - curp->s_lvl;
188: new_points = curp->s_lvl / 3 - 3;
189: break;
190: case C_FIGHTER:
191: case C_RANGER:
192: case C_PALADIN:
193: turns_quiet = 32 - curp->s_lvl;
194: new_points = curp->s_lvl / 3 - 4;
195: break;
196: case C_MONSTER:
197: turns_quiet = 24 - curp->s_lvl;
198: new_points = curp->s_lvl - 6;
199: break;
200: default:
201: return;
202: }
203:
204: if (curp->s_lvl < 8)
205: {
206: if (tp->t_rest_pow > turns_quiet)
207: curp->s_power++;
208: }
209: else if (tp->t_rest_pow >= 15)
210: curp->s_power += rnd(new_points) + 1;
211:
212: if (tp == &player && (is_wearing(R_WIZARD) || is_wearing(R_PIETY)))
213: curp->s_power += ring_value(R_WIZARD) + ring_value(R_PIETY);
214:
215: curp->s_power = min(max(0, curp->s_power), maxp->s_power);
216:
217: if (curp->s_power != opower)
218: tp->t_rest_pow = 0;
219:
220: return;
221: }
222:
223: /*
224: rollwand()
225: called to roll to see if a wandering monster starts up
226: */
227:
228: void
229: rollwand(daemon_arg *arg)
230: {
231: NOOP(arg);
232:
233: if ((rnd(6) == 0) && (player.t_ctype != C_THIEF ||
234: (rnd(30) >= pstats.s_dext)))
235: {
236: wanderer();
237: kill_daemon(DAEMON_ROLLWAND);
238: light_fuse(FUSE_SWANDER, 0, WANDERTIME, BEFORE);
239: }
240:
241: return;
242: }
243:
244: /*
245: stomach()
246: digest the hero's food
247: */
248:
249: void
250: stomach(daemon_arg *arg)
251: {
252: int oldfood, old_hunger;
253: int amount;
254: int power_scale;
255:
256: NOOP(arg);
257:
258: old_hunger = hungry_state;
259:
260: if (food_left <= 0)
261: {
262: /* the hero is fainting */
263:
264: if (no_command || rnd(100) > 20)
265: return;
266:
267: no_command = rnd(8) + 4;
268: running = FALSE;
269: count = 0;
270: hungry_state = F_FAINT;
271: feed_me(hungry_state);
272: }
273: else
274: {
275: oldfood = food_left;
276:
277: amount = ring_eat(LEFT_1) + ring_eat(LEFT_2) +
278: ring_eat(LEFT_3) + ring_eat(LEFT_4) +
279: ring_eat(RIGHT_1) + ring_eat(RIGHT_2) +
280: ring_eat(RIGHT_3) + ring_eat(RIGHT_4) +
281: foodlev;
282:
283: if (on(player, SUPEREAT)) /* artifact or regeneration munchies */
284: amount *= 2;
285:
286: if (on(player, POWEREAT)) /* Used an artifact power */
287: {
288: amount += 40;
289: turn_off(player, POWEREAT);
290: }
291:
292: power_scale = (on(player, POWERDEXT) + on(player, POWERSTR) +
293: on(player, POWERWISDOM) + on(player, POWERINTEL) +
294: on(player, POWERCONST) + 1);
295:
296: food_left -= amount * power_scale;
297:
298: if (food_left < MORETIME && oldfood >= MORETIME)
299: {
300: hungry_state = F_WEAK;
301: running = FALSE;
302: feed_me(hungry_state);
303: }
304: else if (food_left < 2 * MORETIME && oldfood >= 2 * MORETIME)
305: {
306: hungry_state = F_HUNGRY;
307: running = FALSE;
308: feed_me(hungry_state);
309: }
310: }
311:
312: if (old_hunger != hungry_state)
313: updpack();
314:
315: wghtchk(NULL);
316: }
317:
318:
319: /*
320: runners()
321: Make all the running monsters move. with monsters now fighting
322: each other, this routine have been enhanced and may need more work yet
323: */
324:
325: void
326: runners(daemon_arg *arg)
327: {
328: struct linked_list *item;
329: struct thing *tp;
330:
331: NOOP(arg);
332:
333: for (item = mlist; item != NULL; item = next_mons)
334: {
335: curr_mons = item;
336: next_mons = next(curr_mons);
337: tp = THINGPTR(item);
338:
339: if (on(*tp, ISHELD) && rnd(tp->t_stats.s_str +
340: tp->t_stats.s_lvl) > 10 + rnd(50))
341: {
342: turn_off(*tp, ISHELD);
343: turn_off(*tp, ISDISGUISE);
344: turn_on(*tp, ISRUN);
345: tp->t_ischasing = TRUE;
346: tp->t_chasee = &player;
347: tp->t_horde = NULL;
348:
349: if (tp->t_stats.s_hpt < rnd(tp->maxstats.s_hpt))
350: turn_on(*tp, ISFLEE);
351:
352: if (cansee(tp->t_pos.y, tp->t_pos.x))
353: msg("The %s breaks free!", monsters[tp->t_index].m_name);
354: }
355:
356: if (off(*tp, ISHELD) && on(*tp, ISRUN))
357: {
358: int flee = FALSE;
359:
360: flee = on(*tp, ISFLEE) ||
361: ( (tp->t_chasee == &player) &&
362: on(player, ISINWALL) &&
363: off(*tp, CANINWALL) && off(*tp, ISFAMILIAR) );
364:
365: if (off(*tp, ISSLOW) || tp->t_turn)
366: {
367: daemon_arg targ;
368:
369: targ.thingptr = tp;
370: doctor(&targ);
371: do_chase(tp, flee);
372: }
373:
374: if (curr_mons && (on(*tp, ISHASTE) ||
375: ((on(*tp, CANFLY) || on(*tp, ISFAST)) &&
376: DISTANCE(hero, tp->t_pos) >= 4)))
377: {
378: daemon_arg targ;
379:
380: targ.thingptr = tp;
381: doctor(&targ);
382: do_chase(tp, flee);
383: }
384:
385: if (curr_mons)
386: {
387: tp->t_turn ^= TRUE;
388: tp->t_wasshot ^= FALSE; /* Not shot anymore */
389: }
390:
391: }
392: }
393:
394: curr_mons = next_mons = NULL;
395:
396: return;
397: }
398:
399: /*
400: swander()
401: called when it is time to start rolling for wandering monsters
402: */
403:
404: fuse
405: swander(fuse_arg *arg)
406: {
407: NOOP(arg);
408:
409: start_daemon(DAEMON_ROLLWAND, 0, BEFORE);
410: return;
411: }
412:
413: /*
414: unconfuse
415: release the poor player from his confusion
416: */
417:
418: fuse
419: unconfuse(fuse_arg *arg)
420: {
421: NOOP(arg);
422:
423: turn_off(player, ISHUH);
424: msg("You feel less confused now.");
425: return;
426: }
427:
428: /*
429: unscent()
430: turn of extra smelling ability
431: */
432:
433: fuse
434: unscent(fuse_arg *arg)
435: {
436: NOOP(arg);
437:
438: turn_off(player, CANSCENT);
439: msg("The smell of monsters goes away.");
440: }
441:
442: /*
443: scent
444: give back the players sense of smell
445: */
446:
447: fuse
448: scent(fuse_arg *arg)
449: {
450: NOOP(arg);
451:
452: turn_off(player, ISUNSMELL);
453: msg("You begin to smell the damp dungeon air again.");
454: }
455:
456:
457: /*
458: unhear
459: player doesn't have extra hearing any more
460: */
461:
462: fuse
463: unhear(fuse_arg *arg)
464: {
465: NOOP(arg);
466:
467: turn_off(player, CANHEAR);
468: msg("The sounds of monsters fades away.");
469: }
470:
471: /*
472: hear()
473: return the players sense of hearing
474: */
475:
476: fuse
477: hear(fuse_arg *arg)
478: {
479: NOOP(arg);
480:
481: turn_off(player, ISDEAF);
482: msg("You can hear again.");
483: }
484:
485:
486: /*
487: unsee
488: He lost his see invisible power
489:
490: Need to make monsters invisible again? This
491: was done in Rogue 5.2
492:
493: for (th = mlist; th != NULL; th = next(th))
494: if (on(*th, ISINVIS) && see_monst(th))
495: {
496: move(th->t_pos.y, th->t_pos.x);
497: addch(th->t_oldch);
498: }
499: */
500:
501: fuse
502: unsee(fuse_arg *arg)
503: {
504: NOOP(arg);
505:
506: if (!is_wearing(R_SEEINVIS))
507: {
508: turn_off(player, CANSEE);
509: msg("The tingling feeling leaves your eyes.");
510: }
511: }
512:
513: /*
514: unstink()
515: Remove to-hit handicap from player
516: */
517:
518: fuse
519: unstink(fuse_arg *arg)
520: {
521: NOOP(arg);
522:
523: turn_off(player, HASSTINK);
524: }
525:
526: /*
527: unclrhead
528: Player is no longer immune to confusion
529: */
530:
531: fuse
532: unclrhead(fuse_arg *arg)
533: {
534: NOOP(arg);
535:
536: turn_off(player, ISCLEAR);
537: msg("The blue aura about your head fades away.");
538: }
539:
540: /*
541: unphase()
542: Player can no longer walk through walls
543: */
544:
545: fuse
546: unphase(fuse_arg *arg)
547: {
548: NOOP(arg);
549:
550: turn_off(player, CANINWALL);
551:
552: msg("Your dizzy feeling leaves you.");
553:
554: if (!step_ok(hero.y, hero.x, NOMONST, &player))
555: death(D_PETRIFY);
556: }
557:
558: /*
559: sight()
560: He gets his sight back
561: */
562:
563: fuse
564: sight(fuse_arg *arg)
565: {
566: NOOP(arg);
567:
568: if (on(player, ISBLIND))
569: {
570: extinguish_fuse(FUSE_SIGHT);
571: turn_off(player, ISBLIND);
572: light(&hero);
573: msg("The veil of darkness lifts.");
574: }
575: }
576:
577: /*
578: res_strength()
579: Restore player's strength
580: */
581:
582: fuse
583: res_strength(fuse_arg *arg)
584: {
585: NOOP(arg);
586:
587: if (lost_str)
588: {
589: chg_str(lost_str, FALSE, FALSE);
590: lost_str = 0;
591: }
592: else
593: pstats.s_str = max_stats.s_str + ring_value(R_ADDSTR) +
594: (on(player, POWERSTR) ? 10 : 0) +
595: (on(player, SUPERHERO) ? 10 : 0);
596:
597: updpack();
598: }
599:
600: /*
601: nohaste()
602: End the hasting
603: */
604:
605: fuse
606: nohaste(fuse_arg *arg)
607: {
608: NOOP(arg);
609:
610: turn_off(player, ISHASTE);
611: msg("You feel yourself slowing down.");
612: }
613:
614: /*
615: noslow()
616: End the slowing
617: */
618:
619: fuse
620: noslow(fuse_arg *arg)
621: {
622: NOOP(arg);
623:
624: turn_off(player, ISSLOW);
625: msg("You feel yourself speeding up.");
626: }
627:
628: /*
629: suffocate()
630: If this gets called, the player has suffocated
631: */
632:
633: fuse
634: suffocate(fuse_arg *arg)
635: {
636: NOOP(arg);
637:
638: death(D_SUFFOCATION);
639: }
640:
641: /*
642: cure_disease()
643: daemon for curing the diseased
644: */
645:
646: fuse
647: cure_disease(fuse_arg *arg)
648: {
649: NOOP(arg);
650:
651: turn_off(player, HASDISEASE);
652:
653: if (off(player, HASINFEST))
654: msg("You begin to feel yourself improving again.");
655: }
656:
657: /*
658: un_itch()
659: daemon for adding back dexterity
660: */
661:
662: fuse
663: un_itch(fuse_arg *arg)
664: {
665: NOOP(arg);
666:
667: if (lost_dext)
668: {
669: chg_dext(lost_dext, FALSE, FALSE);
670: lost_dext = 0;
671: turn_off(player, HASITCH);
672: }
673: }
674:
675: /*
676: appear()
677: Become visible again
678: */
679:
680: fuse
681: appear(fuse_arg *arg)
682: {
683: NOOP(arg);
684:
685: turn_off(player, ISINVIS);
686: PLAYER = VPLAYER;
687: msg("The tingling feeling leaves your body.");
688: light(&hero);
689: }
690:
691: /*
692: unelectrify()
693: stop shooting off sparks
694: */
695:
696: fuse
697: unelectrify(fuse_arg *arg)
698: {
699: NOOP(arg);
700:
701: turn_off(player, ISELECTRIC);
702: msg("The sparks and violet glow from your body fade away.");
703: light(&hero);
704: }
705:
706: /*
707: unshero()
708: super heroism wears off, now do nasty effects
709: */
710:
711: fuse
712: unshero(fuse_arg *arg)
713: {
714: NOOP(arg);
715:
716: msg("Your feeling of invulnerability goes away.");
717: turn_off(player, SUPERHERO);
718: chg_str(-11, FALSE, FALSE);
719: chg_dext(-6, FALSE, FALSE);
720: food_left -= HEROTIME + rnd(HEROTIME);
721: no_command += 5 + rnd(5);
722: msg("You fall asleep.");
723: }
724:
725: /*
726: unbhero()
727: blessed super heroism wears off, no bad effects
728: */
729:
730: fuse
731: unbhero(fuse_arg *arg)
732: {
733: NOOP(arg);
734:
735: msg("Your feeling of invincibility goes away.");
736: turn_off(player, SUPERHERO);
737: chg_str(-10, FALSE, FALSE);
738: chg_dext(-5, FALSE, FALSE);
739: }
740:
741: /*
742: undisguise()
743: player stops looking like a monster
744: */
745:
746: fuse
747: undisguise(fuse_arg *arg)
748: {
749: NOOP(arg);
750:
751: msg("Your skin feels itchy for a moment.");
752: turn_off(player, ISDISGUISE);
753: PLAYER = VPLAYER;
754: light(&hero);
755: }
756:
757: /*
758: unsummon()
759: Unsummon a monster
760: */
761:
762: void
763: unsummon(fuse_arg *monny)
764: {
765: struct linked_list *monst = monny->ll;
766: struct linked_list *sum_monst = (struct linked_list *) monst;
767: struct thing *tp = THINGPTR(sum_monst);
768: char *mname = monsters[tp->t_index].m_name;
769:
770: turn_off(*tp, WASSUMMONED);
771: turn_off(player, HASSUMMONED);
772: msg("Goodbye, master.");
773: msg("The summoned %s phases out of existence", mname);
774: killed(NULL, sum_monst, NOMESSAGE, NOPOINTS);
775: mons_summoned--;
776: }
777:
778: /*
779: ungaze()
780: Turn off gaze reflection
781: */
782:
783: fuse
784: ungaze(fuse_arg *arg)
785: {
786: NOOP(arg);
787:
788: msg("The shiny particles swirl to the floor.");
789: turn_off(player, CANREFLECT);
790: }
791:
792: /*
793: shero()
794: restore lost abilities from cursed potion of shero
795: */
796:
797: fuse
798: shero(fuse_arg *arg)
799: {
800: NOOP(arg);
801:
802: msg("You feel normal again.");
803: chg_str(2, FALSE, TRUE);
804: chg_dext(2, FALSE, TRUE);
805: turn_off(player, ISUNHERO);
806: }
807:
808: /*
809: wghtchk()
810: check that the pack weight is OK
811: */
812:
813: fuse
814: wghtchk(fuse_arg *arg)
815: {
816: int dropchk, err = TRUE;
817: char ch;
818:
819: NOOP(arg);
820:
821: inwhgt = TRUE;
822:
823: if (pstats.s_pack > pstats.s_carry)
824: {
825: ch = CCHAR( mvwinch(stdscr, hero.y, hero.x) );
826:
827: if ((ch != FLOOR && ch != PASSAGE))
828: {
829: extinguish_fuse(FUSE_WGHTCHK);
830: light_fuse(FUSE_WGHTCHK, (void *)TRUE, 1, AFTER);
831: inwhgt = FALSE;
832: return;
833: }
834:
835: extinguish_fuse(FUSE_WGHTCHK);
836: msg("Your pack is too heavy for you.");
837:
838: do
839: {
840: dropchk = drop(NULL);
841:
842: if (dropchk == FALSE)
843: {
844: mpos = 0;
845: msg("You must drop something.");
846: }
847:
848: if (dropchk == TRUE)
849: err = FALSE;
850:
851: }
852: while (err);
853:
854: }
855:
856: inwhgt = FALSE;
857: }
858:
859:
860: /*
861: uncold()
862: He lost his cold resistance power
863: */
864:
865: fuse
866: uncold(fuse_arg *arg)
867: {
868: NOOP(arg);
869:
870: turn_off(player, NOCOLD);
871:
872: if (!is_wearing(R_COLDRESIST))
873: msg("You feel a slight chill in the air.");
874: }
875:
876: /*
877: unhot()
878: He lost his fire resistance power
879: */
880:
881: fuse
882: unhot(fuse_arg *arg)
883: {
884: NOOP(arg);
885:
886: turn_off(player, NOFIRE);
887:
888: if (!is_wearing(R_FIRERESIST))
889: msg("You feel a flush of warmth.");
890: }
891:
892: /*
893: unfly()
894: He stopped flying
895: */
896:
897: fuse
898: unfly(fuse_arg *arg)
899: {
900: NOOP(arg);
901:
902: turn_off(player, CANFLY);
903:
904: if (!is_wearing(R_LEVITATION))
905: msg("You float gently to the ground.");
906: }
907:
908: /*
909: unbreathe()
910: He started needing oxygen
911: */
912:
913: fuse
914: unbreathe(fuse_arg *arg)
915: {
916: NOOP(arg);
917:
918: turn_off(player, HASOXYGEN);
919:
920: if (!is_wearing(R_BREATHE))
921: msg("You start huffing and puffing.");
922: }
923:
924: /*
925: unregen()
926: He stops being regenerative
927: */
928:
929: fuse
930: unregen(fuse_arg *arg)
931: {
932: NOOP(arg);
933:
934: turn_off(player, ISREGEN);
935:
936: if (!is_wearing(R_REGEN))
937: msg("Your metabolism slows down.");
938: }
939:
940: /*
941: unsupereat()
942: He stops being excessively hungry
943: */
944:
945: fuse
946: unsupereat(fuse_arg *arg)
947: {
948: NOOP(arg);
949:
950: turn_off(player, SUPEREAT);
951: msg("You stop feeling so hungry.");
952: }
953:
954: /*
955: unshield()
956: He stops having his AC helped by magic
957: */
958:
959: fuse
960: unshield(fuse_arg *arg)
961: {
962: NOOP(arg);
963:
964: turn_off(player, HASSHIELD);
965: pstats.s_arm -= pstats.s_acmod;
966: pstats.s_acmod = 0;
967: msg("Your skin feels normal.");
968: }
969:
970: /*
971: unmshield()
972: He stops ignoring thrown weapons
973: */
974:
975: fuse
976: unmshield(fuse_arg *arg)
977: {
978: NOOP(arg);
979:
980: turn_off(player, HASMSHIELD);
981: msg("The fog dissapates.");
982: }
983:
984: /*
985: untrue()
986: He lost his true sight power
987: */
988:
989: void
990: untruesee(fuse_arg *arg)
991: {
992: NOOP(arg);
993:
994: if (!is_wearing(R_TRUESEE))
995: {
996: turn_off(player, CANTRUESEE);
997: msg("Your sensory perceptions return to normal.");
998: }
999: }
CVSweb