Annotation of early-roguelike/urogue/potions.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: potions.c - Functions for dealing with potions
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 <string.h>
20: #include <stdlib.h>
21: #include "rogue.h"
22:
23: /*
24: quaff - drink a potion (or effect a potion-like spell)
25:
26: quaffer: who does it
27: which: which P_POTION (-1 means ask from pack)
28: flags: ISBLESSED, ISCURSED
29: */
30:
31: void
32: quaff(struct thing *quaffer, int which, int flags)
33: {
34: struct object *obj;
35: struct thing *th;
36: struct stats *curp = &(quaffer->t_stats);
37: struct stats *maxp = &(quaffer->maxstats);
38: int blessed = flags & ISBLESSED;
39: int cursed = flags & ISCURSED;
40: int is_potion = (which < 0 ? TRUE : FALSE);
41:
42: struct linked_list *item, *titem;
43: char buf[2 * LINELEN];
44:
45: if (quaffer != &player)
46: {
47: monquaff(quaffer, which, flags);
48: return;
49: }
50:
51: if (is_potion) /* A regular potion */
52: {
53: if ((item = get_item("quaff", POTION)) == NULL)
54: return;
55:
56: obj = OBJPTR(item);
57:
58: if (obj->o_type != POTION)
59: {
60: msg("You can't drink that!");
61: return;
62: }
63:
64: /* Calculate its effect */
65:
66: flags = obj->o_flags;
67: cursed = obj->o_flags & ISCURSED;
68: blessed = obj->o_flags & ISBLESSED;
69: which = obj->o_which;
70:
71: /* remove it from the pack */
72:
73: rem_pack(obj);
74: discard(item);
75: updpack();
76: }
77:
78: switch(which)
79: {
80: case P_CLEAR:
81: if (cursed)
82: {
83: if (off(player, ISCLEAR))
84: {
85: msg("Wait, what's going on here. Huh? What? Who?");
86:
87: if (on(player, ISHUH))
88: lengthen_fuse(FUSE_UNCONFUSE, rnd(8) + HUHDURATION);
89: else
90: light_fuse(FUSE_UNCONFUSE, 0, rnd(8) + HUHDURATION, AFTER);
91:
92: turn_on(player, ISHUH);
93: }
94: else
95: msg("You feel dizzy for a moment, but it passes.");
96: }
97: else
98: {
99: if (blessed) /* Make player immune for the whole game */
100: {
101: extinguish_fuse(FUSE_UNCLRHEAD); /* If we have a fuse, put it out */
102: msg("A strong blue aura surrounds your head.");
103: }
104: else /* Just light a fuse for how long player is safe */
105: {
106: if (off(player, ISCLEAR))
107: {
108: light_fuse(FUSE_UNCLRHEAD, 0, CLRDURATION, AFTER);
109: msg("A faint blue aura surrounds your head.");
110: }
111: else /* If have fuse lengthen, else permanently clear */
112: {
113: if (find_slot(FUSE_UNCLRHEAD,FUSE) == NULL)
114: msg("Your blue aura continues to glow strongly.");
115: else
116: {
117: lengthen_fuse(FUSE_UNCLRHEAD, CLRDURATION);
118: msg("Your blue aura brightens for a moment.");
119: }
120: }
121: }
122:
123: turn_on(player, ISCLEAR);
124:
125: /* If player is confused, unconfuse him */
126:
127: if (on(player, ISHUH))
128: {
129: extinguish_fuse(FUSE_UNCONFUSE);
130: unconfuse(NULL);
131: }
132: }
133: break;
134:
135: case P_HEALING:
136: if (cursed)
137: {
138: if (player.t_ctype != C_PALADIN
139: && !(player.t_ctype == C_NINJA
140: && curp->s_lvl > 12)
141: && !save(VS_POISON))
142: {
143: feel_message();
144: curp->s_hpt /= 2;
145: curp->s_power /= 2;
146:
147: if ((curp->s_hpt -= 1) <= 0)
148: {
149: death(D_POISON);
150: return;
151: }
152: }
153: else
154: msg("You feel momentarily sick.");
155: }
156: else
157: {
158: int nsides = (blessed ? 8 : 4);
159: int hpt_gain = roll(curp->s_lvl, nsides);
160: int power_gain = roll(curp->s_lvl, nsides);
161:
162: if (blessed && on(player, ISHUH))
163: {
164: extinguish_fuse(FUSE_UNCONFUSE);
165: unconfuse(NULL);
166: }
167:
168: curp->s_hpt = min(curp->s_hpt + hpt_gain, maxp->s_hpt);
169:
170: if (is_potion) /* Do not bump power or maximums if spell */
171: {
172: know_items[TYP_POTION][P_HEALING] = TRUE;
173: curp->s_power = min(curp->s_power + power_gain, maxp->s_power);
174:
175: if (maxp->s_hpt == curp->s_hpt)
176: maxp->s_hpt = curp->s_hpt += roll(1, nsides);
177:
178: if (maxp->s_power == curp->s_power)
179: maxp->s_power = curp->s_power += roll(1, nsides);
180: }
181:
182: msg("You begin to feel %sbetter.", blessed ? "much " : "");
183:
184: if (off(player, PERMBLIND))
185: sight(NULL);
186: }
187: break;
188:
189: case P_GAINABIL:
190: {
191: int ctype;
192:
193: if (!is_potion || pstats.s_arm <= 0)
194: feel_message();
195: else
196: {
197: if (blessed) /* add to all attributes */
198: {
199: add_intelligence(FALSE);
200: add_dexterity(FALSE);
201: add_strength(FALSE);
202: add_wisdom(FALSE);
203: add_const(FALSE);
204: }
205: else
206: {
207: if (rnd(100) < 70)
208: /* probably change own ability */
209: ctype = player.t_ctype;
210: else
211: switch(rnd(4))
212: {
213: case 0: ctype = C_FIGHTER; break;
214: case 1: ctype = C_MAGICIAN; break;
215: case 2: ctype = C_CLERIC; break;
216: case 3: ctype = C_THIEF; break;
217: }
218: switch (ctype)
219: {
220: case C_FIGHTER:add_strength(cursed); break;
221: case C_PALADIN:add_strength(cursed); break;
222: case C_RANGER:add_strength(cursed); break;
223: case C_MAGICIAN:add_intelligence(cursed); break;
224: case C_ILLUSION:add_intelligence(cursed); break;
225: case C_CLERIC:add_wisdom(cursed); break;
226: case C_DRUID:add_wisdom(cursed); break;
227: case C_THIEF:add_dexterity(cursed); break;
228: case C_ASSASIN:add_dexterity(cursed); break;
229: case C_NINJA:add_dexterity(cursed); break;
230: default: msg("You're a strange type!"); break;
231: }
232: }
233:
234: if (rnd(100) < 10)
235: add_const(cursed);
236:
237: if (rnd(100) < 60)
238: curp->s_arm += (cursed ? 1 : -1);
239:
240: if (!cursed)
241: know_items[TYP_POTION][P_GAINABIL] = TRUE;
242: }
243: }
244: break;
245:
246: case P_MONSTDET:
247:
248: /*
249: * Potion of monster detection, if there are monsters,
250: * detect them
251: */
252:
253: if (is_potion)
254: know_items[TYP_POTION][P_MONSTDET] = TRUE;
255:
256: if (cursed)
257: {
258: int nm = roll(3, 6);
259: int i;
260: char ch;
261: struct room *rp;
262: coord pos;
263:
264: msg("You begin to sense the presence of monsters.");
265: wclear(hw);
266:
267: for (i = 1; i < nm; i++)
268: {
269: rp = &rooms[rnd_room()];
270: rnd_pos(rp, &pos);
271:
272: if (rnd(2))
273: ch = 'a' + ucrnd(26);
274: else
275: ch = 'A' + ucrnd(26);
276:
277: mvwaddch(hw, pos.y, pos.x, ch);
278: }
279: waddstr(cw, morestr);
280: overlay(hw, cw);
281: wrefresh(cw);
282: wait_for(' ');
283: msg("");
284: }
285: else if (mlist != NULL)
286: {
287: msg("You begin to sense the presence of monsters.");
288: waddstr(cw, morestr);
289: overlay(mw, cw);
290: wrefresh(cw);
291: wait_for(' ');
292: msg("");
293:
294: if (blessed)
295: turn_on(player, BLESSMONS);
296: }
297: else
298: nothing_message(flags);
299: break;
300:
301: case P_TREASDET:
302:
303: /* Potion of magic detection. Show the potions and scrolls */
304:
305: if (cursed)
306: {
307: int nm = roll(3, 3);
308: int i;
309: char ch;
310: struct room *rp;
311: coord pos;
312:
313: msg("You sense the presence of magic on this level.");
314: wclear(hw);
315:
316: for (i = 1; i < nm; i++)
317: {
318: rp = &rooms[rnd_room()];
319: rnd_pos(rp, &pos);
320:
321: if (rnd(9) == 0)
322: ch = BMAGIC;
323: else if (rnd(9) == 0)
324: ch = CMAGIC;
325: else
326: ch = MAGIC;
327:
328: mvwaddch(hw, pos.y, pos.x, ch);
329: }
330: waddstr(cw, morestr);
331:
332: overlay(hw, cw);
333: wrefresh(cw);
334: wait_for(' ');
335: msg("");
336:
337: if (is_potion)
338: know_items[TYP_POTION][P_TREASDET] = TRUE;
339:
340: break;
341: }
342:
343: if (blessed)
344: turn_on(player, BLESSMAGIC);
345:
346: if (lvl_obj != NULL)
347: {
348: struct linked_list *mobj;
349: struct object *tp;
350: int showit;
351:
352: showit = FALSE;
353: wclear(hw);
354:
355: for (mobj = lvl_obj; mobj != NULL; mobj = next(mobj))
356: {
357: tp = OBJPTR(mobj);
358:
359: if (is_magic(tp))
360: {
361: char mag_type = MAGIC;
362:
363: if (blessed)
364: if (tp->o_flags & ISCURSED)
365: mag_type = CMAGIC;
366: else if (tp->o_flags & ISBLESSED)
367: mag_type = BMAGIC;
368:
369: showit = TRUE;
370: mvwaddch(hw, tp->o_pos.y, tp->o_pos.x, mag_type);
371: }
372: }
373:
374: for (titem = mlist; titem != NULL; titem = next(titem))
375: {
376: struct linked_list *pitem;
377:
378: th = THINGPTR(titem);
379:
380: for (pitem = th->t_pack; pitem != NULL; pitem = next(pitem))
381: {
382: if (is_magic(OBJPTR(pitem)))
383: {
384: showit = TRUE;
385: mvwaddch(hw, th->t_pos.y, th->t_pos.x,MAGIC);
386: }
387: }
388: }
389:
390: if (showit)
391: {
392: msg("You sense the presence of magic on this level.");
393:
394: if (is_potion)
395: know_items[TYP_POTION][P_TREASDET] = TRUE;
396:
397: waddstr(cw, morestr);
398: overlay(hw, cw);
399: wrefresh(cw);
400: wait_for(' ');
401: msg("");
402: break;
403: }
404: }
405: nothing_message(flags);
406: break;
407:
408: case P_SEEINVIS:
409: if (cursed)
410: {
411: if (off(player, ISBLIND) && !is_wearing(R_SEEINVIS))
412: {
413: msg("A cloak of darkness falls around you.");
414: turn_on(player, ISBLIND);
415: light_fuse(FUSE_SIGHT, 0, SEEDURATION, AFTER);
416: look(FALSE);
417: }
418: else
419: msg("Your eyes stop tingling for a moment.");
420: }
421: else if (off(player, PERMBLIND))
422: {
423: if (is_potion)
424: know_items[TYP_POTION][P_SEEINVIS] = TRUE;
425:
426: if (off(player, CANSEE))
427: {
428: turn_on(player, CANSEE);
429: msg("Your eyes begin to tingle.");
430: light_fuse(FUSE_UNSEE, 0, blessed ? SEEDURATION * 3 : SEEDURATION, AFTER);
431: light(&hero);
432: }
433: else if (find_slot(FUSE_UNSEE,FUSE) != NULL)
434: {
435: nothing_message(ISNORMAL);
436: lengthen_fuse(FUSE_UNSEE, blessed ? SEEDURATION * 3 : SEEDURATION);
437: }
438: sight(NULL);
439: }
440: break;
441:
442: case P_PHASE:
443:
444: if (cursed)
445: {
446: msg("You can't move.");
447: no_command = HOLDTIME;
448: }
449: else
450: {
451: short duration = (blessed ? 3 : 1);
452:
453: if (is_potion)
454: know_items[TYP_POTION][P_PHASE] = TRUE;
455:
456: if (on(player, CANINWALL))
457: lengthen_fuse(FUSE_UNPHASE, duration * PHASEDURATION);
458: else
459: {
460: light_fuse(FUSE_UNPHASE, 0, duration * PHASEDURATION, AFTER);
461: turn_on(player, CANINWALL);
462: }
463: msg("You feel %slight-headed!", blessed ? "very " : "");
464: }
465: break;
466:
467: case P_RAISELEVEL:
468:
469: if (cursed || (!is_potion && pstats.s_lvl > 20))
470: lower_level(D_POTION);
471: else
472: {
473: msg("You suddenly feel %smore skillful.", blessed ? "much " : "");
474: know_items[TYP_POTION][P_RAISELEVEL] = TRUE;
475: raise_level();
476:
477: if (blessed)
478: raise_level();
479: }
480: break;
481:
482: case P_HASTE:
483: if (cursed) /* Slow player down */
484: {
485: if (on(player, ISHASTE))
486: {
487: extinguish_fuse(FUSE_NOHASTE);
488: nohaste(NULL);
489: }
490: else
491: {
492: msg("You feel yourself moving %sslower.",
493: on(player, ISSLOW) ? "even " : "");
494:
495: if (on(player, ISSLOW))
496: lengthen_fuse(FUSE_NOSLOW, rnd(4) + 4);
497: else if (!is_wearing(R_FREEDOM))
498: {
499: turn_on(player, ISSLOW);
500: player.t_turn = TRUE;
501: light_fuse(FUSE_NOSLOW, 0, rnd(4) + 4, AFTER);
502: }
503: }
504: }
505: else
506: {
507: if (off(player, ISSLOW))
508: msg("You feel yourself moving %sfaster.",
509: blessed ? "much " : "");
510:
511: add_haste(blessed);
512:
513: if (is_potion)
514: know_items[TYP_POTION][P_HASTE] = TRUE;
515: }
516: break;
517:
518: case P_RESTORE:
519: {
520: int i;
521:
522: msg("You are surrounded by an orange mist.");
523:
524: if (is_potion)
525: know_items[TYP_POTION][P_RESTORE] = TRUE;
526:
527: if (lost_str)
528: {
529: for (i = 0; i < lost_str; i++)
530: extinguish_fuse(FUSE_RES_STRENGTH);
531:
532: lost_str = 0;
533: }
534: res_strength(NULL);
535:
536: if (lost_dext)
537: {
538: for (i = 0; i < lost_dext; i++)
539: extinguish_fuse(FUSE_UNITCH);
540:
541: lost_dext = 0;
542: }
543:
544: res_dexterity();
545: res_wisdom();
546: res_intelligence();
547: curp->s_const = maxp->s_const;
548: }
549: break;
550:
551: case P_INVIS:
552:
553: if (cursed)
554: {
555: msg("You feel very noticable.");
556: quaff(&player, P_SHIELD, ISCURSED);
557: }
558: else if (off(player, ISINVIS))
559: {
560: turn_on(player, ISINVIS);
561:
562: if (on(player, ISDISGUISE))
563: {
564: turn_off(player, ISDISGUISE);
565: extinguish_fuse(FUSE_UNDISGUISE);
566: msg("Your skin feels itchy for a moment.");
567: }
568: msg("You have a tingling feeling all over your body.");
569: light_fuse(FUSE_APPEAR, 0, blessed ? WANDERTIME * 3 : WANDERTIME, AFTER);
570: PLAYER = IPLAYER;
571: light(&hero);
572:
573: if (is_potion)
574: know_items[TYP_POTION][P_INVIS] = TRUE;
575: }
576: else
577: lengthen_fuse(FUSE_APPEAR, blessed ? WANDERTIME * 3 : WANDERTIME);
578:
579: break;
580:
581: case P_SMELL:
582:
583: if (cursed)
584: {
585: if (on(player, CANSCENT))
586: {
587: turn_off(player, CANSCENT);
588: extinguish_fuse(FUSE_UNSCENT);
589: msg("You no longer smell monsters around you.");
590: }
591: else if (on(player, ISUNSMELL))
592: {
593: lengthen_fuse(FUSE_UNSCENT, PHASEDURATION);
594: msg("You feel your nose tingle.");
595: }
596: else
597: {
598: turn_on(player, ISUNSMELL);
599: light_fuse(FUSE_SCENT, 0, PHASEDURATION, AFTER);
600: msg("You can't smell anything now.");
601: }
602: }
603: else
604: {
605: short duration = (blessed ? 3 : 1);
606:
607: if (is_potion)
608: know_items[TYP_POTION][P_SMELL] = TRUE;
609:
610: if (on(player, CANSCENT))
611: lengthen_fuse(FUSE_UNSCENT, duration * PHASEDURATION);
612: else
613: {
614: light_fuse(FUSE_UNSCENT, 0, duration * PHASEDURATION, AFTER);
615: turn_on(player, CANSCENT);
616: }
617: msg("You begin to smell monsters all around you.");
618: }
619: break;
620:
621: case P_HEAR:
622:
623: if (cursed)
624: {
625: if (on(player, CANHEAR))
626: {
627: turn_off(player, CANHEAR);
628: extinguish_fuse(FUSE_HEAR);
629: msg("You no longer hear monsters around you.");
630: }
631: else if (on(player, ISDEAF))
632: {
633: lengthen_fuse(FUSE_HEAR, PHASEDURATION);
634: msg("You feel your ears burn.");
635: }
636: else
637: {
638: light_fuse(FUSE_HEAR, 0, PHASEDURATION, AFTER);
639: turn_on(player, ISDEAF);
640: msg("You are surrounded by a sudden silence.");
641: }
642: }
643: else
644: {
645: short duration = (blessed ? 3 : 1);
646:
647: if (is_potion)
648: know_items[TYP_POTION][P_HEAR] = TRUE;
649:
650: if (on(player, CANHEAR))
651: lengthen_fuse(FUSE_UNHEAR, duration * PHASEDURATION);
652: else
653: {
654: light_fuse(FUSE_UNHEAR, 0, duration * PHASEDURATION, AFTER);
655: turn_on(player, CANHEAR);
656: }
657: msg("You begin to hear monsters all around you.");
658: }
659: break;
660:
661: case P_SHERO:
662: if (cursed)
663: {
664: if (on(player, SUPERHERO))
665: {
666: msg("You feel ordinary again.");
667: turn_off(player, SUPERHERO);
668: extinguish_fuse(FUSE_UNSHERO);
669: extinguish_fuse(FUSE_UNBHERO);
670: }
671: else if (on(player, ISUNHERO))
672: {
673: msg("Your feeling of vulnerability increases.");
674: lengthen_fuse(FUSE_SHERO, 5 + rnd(5));
675: }
676: else
677: {
678: msg("You feel suddenly vulnerable.");
679:
680: if (curp->s_hpt == 1)
681: {
682: death(D_POTION);
683: return;
684: }
685:
686: curp->s_hpt /= 2;
687: chg_str(-2, FALSE, TRUE);
688: chg_dext(-2, FALSE, TRUE);
689: no_command = 3 + rnd(HEROTIME);
690: turn_on(player, ISUNHERO);
691: light_fuse(FUSE_SHERO, 0, HEROTIME + rnd(HEROTIME), AFTER);
692: }
693: }
694: else
695: {
696: if (on(player, ISFLEE))
697: {
698: turn_off(player, ISFLEE);
699: msg("You regain your composure.");
700: }
701:
702: if (on(player, ISUNHERO))
703: {
704: extinguish_fuse(FUSE_SHERO);
705: shero(NULL);
706: }
707: else if (on(player, SUPERHERO))
708: {
709: if (find_slot(FUSE_UNBHERO,FUSE))
710: lengthen_fuse(FUSE_UNBHERO, HEROTIME+2*rnd(HEROTIME));
711: else if (find_slot(FUSE_UNSHERO,FUSE) && !blessed)
712: lengthen_fuse(FUSE_UNSHERO,HEROTIME+2*rnd(HEROTIME));
713: else
714: {
715: extinguish_fuse(FUSE_UNSHERO);
716: unshero(NULL);
717: light_fuse(FUSE_UNBHERO,0, 2 * (HEROTIME + rnd(HEROTIME)), AFTER);
718: }
719: msg("Your feeling of invulnerablity grows stronger.");
720: }
721: else
722: {
723: turn_on(player, SUPERHERO);
724: chg_str(10, FALSE, FALSE);
725: chg_dext(5, FALSE, FALSE);
726: quaff(quaffer, P_HASTE, ISBLESSED);
727: quaff(quaffer, P_CLEAR, ISNORMAL);
728:
729: if (blessed)
730: {
731: light_fuse(FUSE_UNBHERO, 0, HEROTIME + rnd(HEROTIME), AFTER);
732: msg("You suddenly feel invincible.");
733: }
734: else
735: {
736: light_fuse(FUSE_UNSHERO, 0, HEROTIME + rnd(HEROTIME), AFTER);
737: msg("You suddenly feel invulnerable.");
738: }
739:
740: if (is_potion)
741: know_items[TYP_POTION][P_SHERO] = TRUE;
742: }
743: }
744: break;
745:
746: case P_DISGUISE:
747: if (off(player, ISDISGUISE) && off(player, ISINVIS))
748: {
749: turn_on(player, ISDISGUISE);
750: msg("Your body shimmers a moment and then changes.");
751: light_fuse(FUSE_UNDISGUISE, 0, blessed ? GONETIME * 3 : GONETIME, AFTER);
752:
753: if (rnd(2))
754: PLAYER = 'a' + ucrnd(26);
755: else
756: PLAYER = 'A' + ucrnd(26);
757:
758: light(&hero);
759:
760: if (is_potion)
761: know_items[TYP_POTION][P_DISGUISE] = TRUE;
762: }
763: else if (off(player, ISINVIS))
764: lengthen_fuse(FUSE_UNDISGUISE,blessed?GONETIME * 3 : GONETIME);
765: else
766: msg("You have an itchy feeling under your skin.");
767:
768: break;
769:
770: case P_FIRERESIST:
771: if (cursed)
772: {
773: if (!is_wearing(R_FIRERESIST))
774: {
775: msg("Your teeth start clattering.");
776:
777: if (on(player, ISHASTE))
778: {
779: extinguish_fuse(FUSE_NOHASTE);
780: nohaste(NULL);
781: }
782: else
783: {
784: msg("You feel yourself moving %sslower.",
785: on(player, ISSLOW) ? "even " : "");
786:
787: if (on(player, ISSLOW))
788: lengthen_fuse(FUSE_NOSLOW, rnd(4) + 4);
789: else if (!is_wearing(R_FREEDOM))
790: {
791: turn_on(player, ISSLOW);
792: player.t_turn = TRUE;
793: light_fuse(FUSE_NOSLOW, 0, rnd(4) + 4, AFTER);
794: }
795: }
796: }
797: else
798: msg("You feel a brief chill.");
799: }
800: else
801: {
802: if (is_potion)
803: know_items[TYP_POTION][P_FIRERESIST] = TRUE;
804:
805: if (blessed)
806: {
807: extinguish_fuse(FUSE_UNHOT);
808: msg("You feel a strong continuous warm glow.");
809: }
810: else
811: {
812: if (off(player, NOFIRE))
813: {
814: light_fuse(FUSE_UNHOT, 0, PHASEDURATION, AFTER);
815: msg("You feel a warm glow.");
816: }
817: else
818: {
819: if (find_slot(FUSE_UNHOT,FUSE) == NULL)
820: msg("Your warm glow continues.");
821: else
822: {
823: lengthen_fuse(FUSE_UNHOT, PHASEDURATION);
824: msg("Your feel a hot flush.");
825: }
826: }
827: }
828:
829: turn_on(player, NOFIRE);
830:
831: if (on(player, NOCOLD))
832: {
833: turn_off(player, NOCOLD);
834: extinguish_fuse(FUSE_UNCOLD);
835: }
836: }
837: break;
838:
839: case P_COLDRESIST:
840: if (cursed)
841: {
842: if (!is_wearing(R_COLDRESIST))
843: {
844: msg("Your feel feverishly hot.");
845:
846: if (on(player, ISHASTE))
847: {
848: extinguish_fuse(FUSE_NOHASTE);
849: nohaste(NULL);
850: }
851: else
852: {
853: msg("You feel yourself moving %sslower.",
854: on(player, ISSLOW) ? "even " : "");
855:
856: if (on(player, ISSLOW))
857: lengthen_fuse(FUSE_NOSLOW, rnd(4) + 4);
858: else if (!is_wearing(R_FREEDOM))
859: {
860: turn_on(player, ISSLOW);
861: player.t_turn = TRUE;
862: light_fuse(FUSE_NOSLOW, 0, rnd(4) + 4, AFTER);
863: }
864: }
865: }
866: else
867: msg("You feel a brief touch of heat rash.");
868: }
869: else
870: {
871: if (is_potion)
872: know_items[TYP_POTION][P_COLDRESIST] = TRUE;
873:
874: if (blessed)
875: {
876: extinguish_fuse(FUSE_UNCOLD);
877: msg("You feel a strong continuous cool breeze.");
878: }
879: else
880: {
881: if (off(player, NOCOLD))
882: {
883: light_fuse(FUSE_UNCOLD, 0, PHASEDURATION, AFTER);
884: msg("You feel a cool breeze.");
885: }
886: else
887: {
888: if (find_slot(FUSE_UNCOLD,FUSE) == NULL)
889: msg("Your cool feeling continues.");
890: else
891: {
892: lengthen_fuse(FUSE_UNCOLD, PHASEDURATION);
893: msg("The cool breeze blows more strongly.");
894: }
895: }
896: }
897:
898: turn_on(player, NOCOLD);
899:
900: if (on(player, NOFIRE))
901: {
902: extinguish_fuse(FUSE_UNHOT);
903: turn_off(player, NOFIRE);
904: }
905: }
906: break;
907:
908: case P_HASOXYGEN:
909: if (cursed)
910: {
911: if (!is_wearing(R_BREATHE))
912: {
913: msg("You can't breathe.");
914: no_command = HOLDTIME;
915: }
916: else
917: {
918: msg("You feel a momentary shortness of breath.");
919: }
920: }
921: else
922: {
923: short duration = (blessed ? 3 : 1);
924:
925: if (is_potion)
926: know_items[TYP_POTION][P_HASOXYGEN] = TRUE;
927:
928: if (on(player, HASOXYGEN))
929: lengthen_fuse(FUSE_UNBREATHE, duration * PHASEDURATION);
930: else
931: {
932: light_fuse(FUSE_UNBREATHE, 0, duration * PHASEDURATION, AFTER);
933: turn_on(player, HASOXYGEN);
934: }
935:
936: if (!is_wearing(R_BREATHE))
937: msg("The air seems %sless polluted.",
938: blessed ? "much " : "");
939: }
940: break;
941:
942: case P_LEVITATION:
943: if (cursed)
944: {
945: msg("You can't move.");
946: no_command = HOLDTIME;
947: }
948: else
949: {
950: short duration = (blessed ? 3 : 1);
951:
952: if (is_potion)
953: know_items[TYP_POTION][P_LEVITATION] = TRUE;
954:
955: if (on(player, CANFLY))
956: lengthen_fuse(FUSE_UNFLY, duration * WANDERTIME);
957: else
958: {
959: light_fuse(FUSE_UNFLY, 0, duration * WANDERTIME, AFTER);
960: turn_on(player, CANFLY);
961: }
962:
963: if (!is_wearing(R_LEVITATION))
964: msg("You %sbegin to float in the air!",
965: blessed ? "quickly " : "");
966: }
967: break;
968:
969: case P_REGENERATE:
970: if (cursed)
971: {
972: quaff(quaffer, P_HEALING, ISCURSED);
973: quaff(quaffer, P_HASTE, ISCURSED);
974: }
975: else
976: {
977: short duration = (blessed ? 3 : 1) * HUHDURATION;
978:
979: if (is_potion)
980: know_items[TYP_POTION][P_REGENERATE] = TRUE;
981:
982: if (on(player, SUPEREAT))
983: lengthen_fuse(FUSE_UNSUPEREAT, duration);
984: else
985: {
986: light_fuse(FUSE_UNSUPEREAT, 0, duration, AFTER);
987: turn_on(player, SUPEREAT);
988: }
989:
990: if (on(player, ISREGEN))
991: lengthen_fuse(FUSE_UNREGEN, duration);
992: else
993: {
994: light_fuse(FUSE_UNREGEN, 0, duration, AFTER);
995: turn_on(player, ISREGEN);
996: }
997:
998: if (!is_wearing(R_REGEN))
999: msg("You feel %shealthier!", blessed ? "much " : "");
1000: }
1001:
1002: case P_SHIELD:
1003: {
1004: int adjustment = 0;
1005:
1006: if (on(player, HASSHIELD)) /* cancel old spell */
1007: {
1008: extinguish_fuse(FUSE_UNSHIELD);
1009: unshield(NULL);
1010: }
1011:
1012: if (cursed)
1013: adjustment = 2;
1014: else if (blessed)
1015: {
1016: msg("Your skin feels very rigid.");
1017:
1018: switch (player.t_ctype)
1019: {
1020: case C_FIGHTER:
1021: case C_PALADIN:
1022: case C_RANGER:
1023: adjustment = -3;
1024: break;
1025: default:
1026: adjustment = -5;
1027: }
1028: }
1029: else
1030: {
1031: msg("Your skin hardens.");
1032: adjustment = -2;
1033: }
1034:
1035: pstats.s_arm += adjustment;
1036: pstats.s_acmod += adjustment;
1037: turn_on(player, HASSHIELD);
1038: light_fuse(FUSE_UNSHIELD,0,(blessed ? 3 : 1) * SEEDURATION, AFTER);
1039:
1040: if (is_potion)
1041: know_items[TYP_POTION][P_SHIELD] = TRUE;
1042: }
1043: break;
1044:
1045: case P_TRUESEE:
1046: if (cursed)
1047: {
1048: turn_on(player, PERMBLIND);
1049:
1050: if (on(player, ISBLIND))
1051: {
1052: msg("The gloom around you thickens.");
1053: lengthen_fuse(FUSE_SIGHT, SEEDURATION);
1054: }
1055: else
1056: {
1057: msg("A mantle of darkness falls around you.");
1058: turn_on(player, ISBLIND);
1059: light_fuse(FUSE_SIGHT, 0, SEEDURATION, AFTER);
1060: look(FALSE);
1061: }
1062: look(FALSE);
1063: }
1064: else if (on(player, PERMBLIND))
1065: {
1066: if (blessed || is_potion)
1067: {
1068: turn_off(player, PERMBLIND);
1069: sight(NULL);
1070: goto let_there_be_light;
1071: }
1072: else
1073: nothing_message(ISBLESSED);
1074: }
1075: else
1076: let_there_be_light:
1077: if (off(player, CANSEE))
1078: {
1079: turn_on(player, CANSEE);
1080: msg("You feel especially perceptive.");
1081: light_fuse(FUSE_UNTRUESEE, 0, blessed ? SEEDURATION * 3
1082: : SEEDURATION, AFTER);
1083: light(&hero);
1084: }
1085: else if (find_slot(FUSE_UNSEE,FUSE) != NULL)
1086: {
1087: nothing_message(ISNORMAL);
1088: lengthen_fuse(FUSE_UNTRUESEE, blessed ? SEEDURATION * 3
1089: : SEEDURATION);
1090: }
1091:
1092: break;
1093:
1094: default:
1095: msg("What an odd tasting potion!");
1096: return;
1097: }
1098:
1099: status(FALSE);
1100:
1101: if (is_potion)
1102: {
1103: if (!cursed && know_items[TYP_POTION][which] &&
1104: guess_items[TYP_POTION][which])
1105: {
1106: ur_free(guess_items[TYP_POTION][which]);
1107: guess_items[TYP_POTION][which] = NULL;
1108: }
1109: else if (askme && !know_items[TYP_POTION][which] &&
1110: guess_items[TYP_POTION][which] == NULL)
1111: {
1112: msg(terse ? "Call it: " : "What do you want to call it? ");
1113:
1114: if (get_string(buf, cw) == NORM)
1115: {
1116: guess_items[TYP_POTION][which] =
1117: new_alloc(strlen(buf) + 1);
1118: strcpy(guess_items[TYP_POTION][which], buf);
1119: }
1120: }
1121: food_left += (blessed ? rnd(100) : (cursed ? -rnd(100) : rnd(50)));
1122: }
1123: }
1124:
1125: /*
1126: lower_level()
1127: Lower a level of experience
1128: */
1129:
1130: void
1131: lower_level(int who)
1132: {
1133: int fewer, nsides = 0, i;
1134:
1135: if (--pstats.s_lvl == 0)
1136: {
1137: death(who); /* All levels gone */
1138: return;
1139: }
1140:
1141: msg("You suddenly feel less skillful.");
1142: pstats.s_exp = 1L;
1143: init_exp();
1144:
1145: for (i = 2; i <= pstats.s_lvl; i++)
1146: {
1147: if (max_stats.s_exp < 0x3fffffffL) /* 2^30 - 1 */
1148: max_stats.s_exp *= 2L; /* twice as many for next */
1149: }
1150:
1151: switch (player.t_ctype)
1152: {
1153: case C_FIGHTER: nsides = 12;break;
1154: case C_PALADIN: nsides = 12;break;
1155: case C_RANGER: nsides = 12; break;
1156: case C_MAGICIAN: nsides = 4;break;
1157: case C_ILLUSION: nsides = 4;break;
1158: case C_CLERIC: nsides = 8; break;
1159: case C_DRUID: nsides = 8; break;
1160: case C_THIEF: nsides = 6; break;
1161: case C_ASSASIN: nsides = 6; break;
1162: case C_NINJA: nsides = 6; break;
1163: }
1164:
1165: fewer = max(1, roll(1, 16 - nsides) + int_wis_bonus());
1166: pstats.s_power -= fewer;
1167: max_stats.s_power -= fewer;
1168:
1169: fewer = max(1, roll(1, nsides) + const_bonus());
1170: pstats.s_hpt -= fewer;
1171: max_stats.s_hpt -= fewer;
1172:
1173: if (pstats.s_hpt < 1)
1174: pstats.s_hpt = 1;
1175:
1176: if (max_stats.s_hpt < 1)
1177: {
1178: death(who);
1179: return;
1180: }
1181: }
1182:
1183: void
1184: res_dexterity(void)
1185: {
1186: if (lost_dext)
1187: {
1188: chg_dext(lost_dext, FALSE, FALSE);
1189: lost_dext = 0;
1190: }
1191: else
1192: {
1193: pstats.s_dext = max_stats.s_dext + ring_value(R_ADDHIT) +
1194: (on(player, POWERDEXT) ? 10 : 0) +
1195: (on(player, SUPERHERO) ? 5 : 0);
1196: }
1197:
1198: }
1199:
1200:
1201: /*
1202: res_wisdom()
1203: Restore player's wisdom
1204: */
1205:
1206: void
1207: res_wisdom(void)
1208: {
1209: int ring_str;
1210:
1211: /* Discount the ring value */
1212:
1213: ring_str = ring_value(R_ADDWISDOM) + (on(player, POWERWISDOM) ? 10 : 0);
1214: pstats.s_wisdom -= ring_str;
1215:
1216: if (pstats.s_wisdom < max_stats.s_wisdom)
1217: pstats.s_wisdom = max_stats.s_wisdom;
1218:
1219: /* Redo the rings */
1220:
1221: pstats.s_wisdom += ring_str;
1222: }
1223:
1224: /*
1225: res_intelligence()
1226: Restore player's intelligence
1227: */
1228:
1229: void
1230: res_intelligence(void)
1231: {
1232: int ring_str;
1233:
1234: /* Discount the ring value */
1235:
1236: ring_str = ring_value(R_ADDINTEL) + (on(player, POWERINTEL) ? 10 : 0);
1237: pstats.s_intel -= ring_str;
1238:
1239: if (pstats.s_intel < max_stats.s_intel)
1240: pstats.s_intel = max_stats.s_intel;
1241:
1242: /* Redo the rings */
1243:
1244: pstats.s_intel += ring_str;
1245: }
1246:
1247:
1248: /*
1249: add_strength()
1250: Increase player's strength
1251: */
1252:
1253: void
1254: add_strength(int cursed)
1255: {
1256:
1257: if (cursed)
1258: {
1259: msg("You feel slightly weaker now.");
1260: chg_str(-1, FALSE, FALSE);
1261: }
1262: else
1263: {
1264: msg("You feel stronger now. What bulging muscles!");
1265:
1266: if (lost_str != 0)
1267: {
1268: lost_str--;
1269: chg_str(1, FALSE, FALSE);
1270: }
1271: else
1272: chg_str(1, TRUE, FALSE);
1273: }
1274: }
1275:
1276:
1277: /*
1278: add_intelligence()
1279: Increase player's intelligence
1280: */
1281:
1282: void
1283: add_intelligence(int cursed)
1284: {
1285: int ring_str; /* Value of ring strengths */
1286:
1287: /* Undo any ring changes */
1288:
1289: ring_str = ring_value(R_ADDINTEL) + (on(player, POWERINTEL) ? 10 : 0);
1290: pstats.s_intel -= ring_str;
1291:
1292: /* Now do the potion */
1293:
1294: if (cursed)
1295: {
1296: msg("You feel slightly less intelligent now.");
1297: pstats.s_intel = max(pstats.s_intel - 1, 3);
1298: }
1299: else
1300: {
1301: msg("You feel more intelligent now. What a mind!");
1302: pstats.s_intel = min(pstats.s_intel + 1, 25);
1303: }
1304:
1305: /* Adjust the maximum */
1306:
1307: if (max_stats.s_intel < pstats.s_intel)
1308: max_stats.s_intel = pstats.s_intel;
1309:
1310: /* Now put back the ring changes */
1311: pstats.s_intel += ring_str;
1312: }
1313:
1314:
1315: /*
1316: add_wisdom()
1317: Increase player's wisdom
1318: */
1319:
1320: void
1321: add_wisdom(int cursed)
1322: {
1323: int ring_str; /* Value of ring strengths */
1324:
1325: /* Undo any ring changes */
1326:
1327: ring_str = ring_value(R_ADDWISDOM) + (on(player, POWERWISDOM) ? 10 : 0);
1328: pstats.s_wisdom -= ring_str;
1329:
1330: /* Now do the potion */
1331:
1332: if (cursed)
1333: {
1334: msg("You feel slightly less wise now.");
1335: pstats.s_wisdom = max(pstats.s_wisdom - 1, 3);
1336: }
1337: else
1338: {
1339: msg("You feel wiser now. What a sage!");
1340: pstats.s_wisdom = min(pstats.s_wisdom + 1, 25);
1341: }
1342:
1343: /* Adjust the maximum */
1344:
1345: if (max_stats.s_wisdom < pstats.s_wisdom)
1346: max_stats.s_wisdom = pstats.s_wisdom;
1347:
1348: /* Now put back the ring changes */
1349: pstats.s_wisdom += ring_str;
1350: }
1351:
1352:
1353: /*
1354: add_dexterity()
1355: Increase player's dexterity
1356: */
1357:
1358: void
1359: add_dexterity(int cursed)
1360: {
1361: /* Now do the potion */
1362:
1363: if (cursed)
1364: {
1365: msg("You feel less dextrous now.");
1366: chg_dext(-1, FALSE, TRUE);
1367: }
1368: else
1369: {
1370: msg("You feel more dextrous now. Watch those hands!");
1371:
1372: if (lost_dext != 0)
1373: {
1374: lost_dext--;
1375: chg_dext(1, FALSE, FALSE);
1376: }
1377: else
1378: chg_dext(1, TRUE, FALSE);
1379: }
1380: }
1381:
1382:
1383: /*
1384: Increase player's constitution
1385: */
1386:
1387: void
1388: add_const(int cursed)
1389: {
1390: /* Do the potion */
1391:
1392: if (cursed)
1393: {
1394: msg("You feel slightly less healthy now.");
1395: pstats.s_const = max(pstats.s_const - 1, 3) +
1396: (on(player, POWERCONST) ? 10 : 0);
1397: }
1398: else
1399: {
1400: msg("You feel healthier now.");
1401: pstats.s_const = min(pstats.s_const + 1, 25) +
1402: (on(player, POWERCONST) ? 10 : 0);
1403: }
1404:
1405: /* Adjust the maximum */
1406:
1407: if (max_stats.s_const < pstats.s_const - (on(player, POWERCONST) ? 10 : 0))
1408: max_stats.s_const = pstats.s_const;
1409: }
1410:
1411: /*
1412: monquaff()
1413: monster gets the effect
1414: */
1415:
1416: void
1417: monquaff(struct thing *quaffer, int which, int flags)
1418: {
1419: struct stats *curp = &(quaffer->t_stats);
1420: struct stats *maxp = &(quaffer->maxstats);
1421: int blessed = flags & ISBLESSED;
1422: int cursed = flags & ISCURSED;
1423:
1424: switch(which)
1425: {
1426: case P_SEEINVIS:
1427: if (cursed)
1428: turn_on(*quaffer, ISHUH);
1429: else
1430: turn_on(*quaffer, CANSEE);
1431: break;
1432:
1433: case P_GAINABIL:
1434: if (cursed)
1435: curp->s_intel /= 2;
1436: else
1437: curp->s_power = maxp->s_power;
1438: break;
1439:
1440: case P_CLEAR:
1441: if (cursed)
1442: turn_on(*quaffer, ISHUH);
1443: else
1444: turn_on(*quaffer, ISHUH);
1445: break;
1446:
1447: case P_HEALING:
1448: if (cursed)
1449: {
1450: curp->s_hpt /= 2;
1451: curp->s_power /= 2;
1452: }
1453: else
1454: {
1455: int nsides = (blessed ? 8 : 4);
1456: int hpt_gain = roll(curp->s_lvl, nsides);
1457: int power_gain = roll(curp->s_lvl, nsides);
1458:
1459: curp->s_hpt = min(curp->s_hpt + hpt_gain, maxp->s_hpt);
1460: curp->s_power = min(curp->s_power + power_gain, maxp->s_power);
1461: }
1462: break;
1463:
1464: case P_HASTE:
1465: if (cursed)
1466: {
1467: if (on(*quaffer, ISHASTE))
1468: turn_off(*quaffer, ISHASTE);
1469: else
1470: turn_on(*quaffer, ISSLOW);
1471: }
1472: else
1473: turn_on(*quaffer, ISHASTE);
1474: break;
1475:
1476: case P_INVIS:
1477: turn_on(*quaffer, ISINVIS);
1478:
1479: if (cansee(quaffer->t_pos.y, quaffer->t_pos.x))
1480: seemsg("The monster dissappears!");
1481:
1482: break;
1483:
1484: case P_REGENERATE:
1485: if (cursed)
1486: {
1487: quaff(quaffer, P_HEALING, ISCURSED);
1488: quaff(quaffer, P_HASTE, ISCURSED);
1489: }
1490: else
1491: turn_on(*quaffer, ISREGEN);
1492: break;
1493:
1494: case P_SHERO:
1495: if (on(*quaffer, ISFLEE))
1496: turn_off(*quaffer, ISFLEE);
1497: else
1498: {
1499: turn_on(*quaffer, SUPERHERO);
1500: quaff(quaffer, P_HASTE, ISBLESSED);
1501: quaff(quaffer, P_CLEAR, ISNORMAL);
1502: }
1503: break;
1504:
1505: case P_PHASE:
1506: if (cursed)
1507: quaffer->t_no_move += HOLDTIME;
1508: else
1509: turn_on(*quaffer, CANINWALL);
1510: break;
1511:
1512: default:
1513: debug("'%s' is a strange potion for a monster to quaff!",
1514: p_magic[which].mi_name);
1515: }
1516: }
CVSweb