Annotation of early-roguelike/xrogue/potions.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: potions.c - Functions for dealing with potions
3:
4: XRogue: Expeditions into the Dungeons of Doom
5: Copyright (C) 1991 Robert Pietkivitch
6: All rights reserved.
7:
8: Based on "Advanced Rogue"
9: Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
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 <stdlib.h>
20: #include <curses.h>
21: #include "rogue.h"
22:
23: int add_charisma(int change);
24: int add_constitution(int change);
25: int add_dexterity(int change);
26: int add_intelligence(int change);
27: int add_strength(int change);
28: int add_wisdom(int change);
29:
30: void res_charisma(int howmuch);
31: void res_constitution(int howmuch);
32: void res_dexterity(int howmuch);
33: void res_intelligence(int howmuch);
34: void res_wisdom(int howmuch);
35:
36: /*
37: * add_abil is an array of functions used to change attributes. It must be
38: * ordered according to the attribute definitions in rogue.h.
39: */
40:
41: int (*add_abil[NUMABILITIES])() = {
42: add_intelligence, add_strength, add_wisdom, add_dexterity,
43: add_constitution, add_charisma
44: };
45:
46: /*
47: * res_abil is an array of functions used to change attributes. It must be
48: * ordered according to the attribute definitions in rogue.h.
49: */
50:
51: void (*res_abil[NUMABILITIES])() = {
52: res_intelligence, res_strength, res_wisdom, res_dexterity,
53: res_constitution, res_charisma
54: };
55:
56: /*
57: * Increase player's constitution
58: */
59:
60: int
61: add_constitution(int change)
62: {
63: /* Do the potion */
64: if (change < 0) {
65: msg("You feel less healthy now.");
66: pstats.s_const += change;
67: if (pstats.s_const < 1) {
68: pstats.s_hpt = -1;
69: msg("You collapse! --More--");
70: wait_for(' ');
71: death(D_CONSTITUTION);
72: }
73: }
74: else {
75: msg("You feel healthier now.");
76: pstats.s_const = min(pstats.s_const + change, MAXATT);
77: }
78:
79: /* Adjust the maximum */
80: if (max_stats.s_const < pstats.s_const)
81: max_stats.s_const = pstats.s_const;
82:
83: return(0);
84: }
85:
86: /*
87: * Increase player's charisma
88: */
89:
90: int
91: add_charisma(int change)
92: {
93: /* Do the potion */
94: if (change < 0) msg("You feel less attractive now.");
95: else msg("You feel more attractive now.");
96:
97: pstats.s_charisma += change;
98: if (pstats.s_charisma > MAXATT) pstats.s_charisma = MAXATT;
99: else if (pstats.s_charisma < 3) pstats.s_charisma = 3;
100:
101: /* Adjust the maximum */
102: if (max_stats.s_charisma < pstats.s_charisma)
103: max_stats.s_charisma = pstats.s_charisma;
104:
105: return(0);
106: }
107:
108: /*
109: * Increase player's dexterity
110: */
111:
112: int
113: add_dexterity(int change)
114: {
115: int ring_str; /* Value of ring strengths */
116:
117: /* Undo any ring changes */
118: ring_str = ring_value(R_ADDHIT);
119: pstats.s_dext -= ring_str;
120:
121: /* Now do the potion */
122: if (change < 0) msg("You feel less dextrous now.");
123: else msg("You feel more dextrous now. Watch those hands!");
124:
125: pstats.s_dext += change;
126: if (pstats.s_dext > MAXATT) pstats.s_dext = MAXATT;
127: else if (pstats.s_dext < 3) pstats.s_dext = 3;
128:
129: /* Adjust the maximum */
130: if (max_stats.s_dext < pstats.s_dext)
131: max_stats.s_dext = pstats.s_dext;
132:
133: /* Now put back the ring changes */
134: if (ring_str)
135: pstats.s_dext += ring_str;
136:
137: return(0);
138: }
139:
140: /*
141: * add_haste:
142: * add a haste to the player
143: */
144:
145: void
146: add_haste(bool blessed)
147: {
148: int hasttime;
149:
150: if (player.t_ctype == C_MONK) { /* monks cannot be slowed or hasted */
151: msg(nothing);
152: return;
153: }
154:
155: if (blessed) hasttime = HASTETIME*2;
156: else hasttime = HASTETIME;
157:
158: if (on(player, ISSLOW)) { /* Is person slow? */
159: extinguish(noslow);
160: noslow();
161:
162: if (blessed) hasttime = HASTETIME/2;
163: else return;
164: }
165:
166: if (on(player, ISHASTE)) {
167: msg("You faint from exhaustion.");
168: player.t_no_move += movement(&player) * rnd(hasttime);
169: player.t_action = A_FREEZE;
170: lengthen(nohaste, roll(hasttime,hasttime));
171: }
172: else {
173: msg("You feel yourself moving %sfaster.", blessed ? "much " : "");
174: turn_on(player, ISHASTE);
175: fuse(nohaste, NULL, roll(hasttime, hasttime), AFTER);
176: }
177: }
178:
179: /*
180: * Increase player's intelligence
181: */
182:
183: int
184: add_intelligence(int change)
185: {
186: int ring_str; /* Value of ring strengths */
187:
188: /* Undo any ring changes */
189: ring_str = ring_value(R_ADDINTEL);
190: pstats.s_intel -= ring_str;
191:
192: /* Now do the potion */
193: if (change < 0) msg("You feel slightly less intelligent now.");
194: else msg("You feel more intelligent now. What a mind!");
195:
196: pstats.s_intel += change;
197: if (pstats.s_intel > MAXATT) pstats.s_intel = MAXATT;
198: else if (pstats.s_intel < 3) pstats.s_intel = 3;
199:
200: /* Adjust the maximum */
201: if (max_stats.s_intel < pstats.s_intel)
202: max_stats.s_intel = pstats.s_intel;
203:
204: /* Now put back the ring changes */
205: if (ring_str)
206: pstats.s_intel += ring_str;
207:
208: return(0);
209: }
210:
211: /*
212: * this routine makes the hero move slower
213: */
214:
215: void
216: add_slow(void)
217: {
218: /* monks cannot be slowed or hasted */
219: if (player.t_ctype == C_MONK || ISWEARING(R_FREEDOM)) {
220: msg(nothing);
221: return;
222: }
223:
224: if (on(player, ISHASTE)) { /* Already sped up */
225: extinguish(nohaste);
226: nohaste();
227: }
228: else {
229: msg("You feel yourself moving %sslower.",
230: on(player, ISSLOW) ? "even " : "");
231: if (on(player, ISSLOW))
232: lengthen(noslow, roll(HASTETIME,HASTETIME));
233: else {
234: turn_on(player, ISSLOW);
235: fuse(noslow, NULL, roll(HASTETIME,HASTETIME), AFTER);
236: }
237: }
238: }
239:
240: /*
241: * Increase player's strength
242: */
243:
244: int
245: add_strength(int change)
246: {
247:
248: if (change < 0) {
249: msg("You feel slightly weaker now.");
250: chg_str(change);
251: }
252: else {
253: msg("You feel stronger now. What bulging muscles!");
254: chg_str(change);
255: }
256: return(0);
257: }
258:
259: /*
260: * Increase player's wisdom
261: */
262:
263: int
264: add_wisdom(int change)
265: {
266: int ring_str; /* Value of ring strengths */
267:
268: /* Undo any ring changes */
269: ring_str = ring_value(R_ADDWISDOM);
270: pstats.s_wisdom -= ring_str;
271:
272: /* Now do the potion */
273: if (change < 0) msg("You feel slightly less wise now.");
274: else msg("You feel wiser now. What a sage!");
275:
276: pstats.s_wisdom += change;
277: if (pstats.s_wisdom > MAXATT) pstats.s_wisdom = MAXATT;
278: else if (pstats.s_wisdom < 3) pstats.s_wisdom = 3;
279:
280: /* Adjust the maximum */
281: if (max_stats.s_wisdom < pstats.s_wisdom)
282: max_stats.s_wisdom = pstats.s_wisdom;
283:
284: /* Now put back the ring changes */
285: if (ring_str)
286: pstats.s_wisdom += ring_str;
287:
288: return(0);
289: }
290:
291: void
292: quaff(int which, int kind, int flags, bool is_potion)
293: {
294: register struct object *obj;
295: register struct linked_list *item, *titem;
296: register struct thing *th;
297: bool cursed, blessed;
298:
299: blessed = FALSE;
300: cursed = FALSE;
301: item = NULL;
302:
303: if (which < 0) { /* figure out which ourselves */
304: /* This is a potion. */
305: if (player.t_action != C_QUAFF) {
306: int units;
307:
308: item = get_item(pack, "quaff", QUAFFABLE, FALSE, FALSE);
309:
310: /*
311: * Make certain that it is somethings that we want to drink
312: */
313: if (item == NULL)
314: return;
315:
316: /* How long does it take to quaff? */
317: units = usage_time(item);
318: if (units < 0) return;
319:
320: player.t_using = item; /* Remember what it is */
321: player.t_no_move = units * movement(&player);
322: if ((OBJPTR(item))->o_type == POTION) player.t_action = C_QUAFF;
323: else player.t_action = C_USE;
324: return;
325: }
326:
327: /* We have waited our time, let's quaff the potion */
328: item = player.t_using;
329: player.t_using = NULL;
330: player.t_action = A_NIL;
331:
332: obj = OBJPTR(item);
333: /* remove it from the pack */
334: inpack--;
335: detach(pack, item);
336:
337: flags = obj->o_flags;
338: which = obj->o_which;
339: kind = obj->o_kind;
340: }
341: cursed = flags & ISCURSED;
342: blessed = flags & ISBLESSED;
343:
344: switch(which) {
345: case P_CLEAR:
346: if (cursed) {
347: confus_player();
348: }
349: else {
350: if (blessed) { /* Make player immune for the whole game */
351: extinguish(unclrhead); /* If we have a fuse, put it out */
352: msg("A strong blue aura surrounds your head.");
353: }
354: else { /* Just light a fuse for how long player is safe */
355: if (off(player, ISCLEAR)) {
356: fuse(unclrhead, NULL, CLRDURATION, AFTER);
357: msg("A faint blue aura surrounds your head.");
358: }
359: else { /* If we have a fuse lengthen it, else we
360: * are permanently clear.
361: */
362: if (find_slot(unclrhead) == 0)
363: msg("Your blue aura continues to glow strongly.");
364: else {
365: lengthen(unclrhead, CLRDURATION);
366: msg("Your blue aura brightens for a moment.");
367: }
368: }
369: }
370: turn_on(player, ISCLEAR);
371: /* If player is confused, unconfuse him */
372: if (on(player, ISHUH)) {
373: extinguish(unconfuse);
374: unconfuse();
375: }
376: }
377: when P_HEALING:
378: if (cursed) {
379: msg("You feel worse now.");
380: pstats.s_hpt -= roll(pstats.s_lvl, char_class[player.t_ctype].hit_pts);
381: if (pstats.s_hpt < 1) {
382: pstats.s_hpt = -1;
383: msg("You're life passes before your eyes.. --More--");
384: wait_for(' ');
385: death(D_POTION);
386: }
387: }
388: else {
389: if (blessed) {
390: pstats.s_hpt += roll(pstats.s_lvl+1, char_class[player.t_ctype].hit_pts);
391: if (pstats.s_hpt > max_stats.s_hpt) {
392: pstats.s_hpt = ++max_stats.s_hpt;
393: pstats.s_hpt = ++max_stats.s_hpt;
394: }
395: if (on(player, ISHUH)) {
396: extinguish(unconfuse);
397: unconfuse();
398: }
399: }
400: else {
401: pstats.s_hpt += roll(pstats.s_lvl+1, char_class[player.t_ctype].hit_pts/2);
402: if (pstats.s_hpt > max_stats.s_hpt)
403: pstats.s_hpt = ++max_stats.s_hpt;
404: }
405: msg("You begin to feel %sbetter.",
406: blessed ? "much " : "");
407: sight();
408: if (is_potion) p_know[P_HEALING] = TRUE;
409: }
410: when P_ABIL:
411: /* If it is cursed, we take a point away */
412: if (cursed) {
413: if (ISWEARING(R_SUSABILITY)) {
414: msg(nothing);
415: break;
416: }
417: else (*add_abil[kind])(-1);
418: }
419:
420: /* Otherwise we add points */
421: else (*add_abil[kind])(blessed ? 3 : 1);
422:
423: if (is_potion) p_know[P_ABIL] = TRUE;
424: when P_MFIND:
425: /*
426: * Potion of monster detection, if there are monters, detect them
427: */
428: if (mlist != NULL)
429: {
430: register struct thing *tp;
431: register struct linked_list *item;
432:
433: wclear(hw);
434: for (item=mlist; item!=NULL; item=next(item)) {
435: tp = THINGPTR(item);
436: if (on(*tp, NODETECT))
437: continue;
438: if (off(*tp, ISRUN))/* turn off only on sleeping ones */
439: turn_off(*tp, CANSURPRISE);
440: mvwaddch(hw, tp->t_pos.y, tp->t_pos.x,
441: monsters[tp->t_index].m_appear);
442: }
443: rmmsg();
444: overlay(hw,cw);
445: draw(cw);
446: msg("You begin to sense the presence of monsters.");
447: if (is_potion) p_know[P_MFIND] = TRUE;
448: }
449: else
450: msg("You have a strange feeling for a moment, then it passes.");
451: when P_TFIND:
452: /*
453: * Potion of magic detection. Show the potions and scrolls
454: */
455: {
456: register struct linked_list *mobj;
457: register struct object *tp;
458: bool show;
459:
460: show = FALSE;
461: wclear(hw);
462: for (mobj = lvl_obj; mobj != NULL; mobj = next(mobj)) {
463: tp = OBJPTR(mobj);
464: if (is_magic(tp)) {
465: char mag_type=MAGIC;
466:
467: /* Mark cursed items or bad weapons */
468: if ((tp->o_flags & ISCURSED) ||
469: (tp->o_type == WEAPON &&
470: (tp->o_hplus < 0 || tp->o_dplus < 0)))
471: mag_type = CMAGIC;
472: else if ((tp->o_flags & ISBLESSED) ||
473: (tp->o_type == WEAPON &&
474: (tp->o_hplus > 0 || tp->o_dplus > 0)))
475: mag_type = BMAGIC;
476: show = TRUE;
477: mvwaddch(hw, tp->o_pos.y, tp->o_pos.x, mag_type);
478: }
479: }
480: for (titem = mlist; titem != NULL; titem = next(titem)) {
481: register struct linked_list *pitem;
482:
483: th = THINGPTR(titem);
484: if (on(*th, NODETECT)) continue;
485: for(pitem = th->t_pack; pitem != NULL; pitem = next(pitem)){
486: tp = OBJPTR(pitem);
487: if (is_magic(tp)) {
488: char mag_type=MAGIC;
489:
490: /* Mark cursed items or bad weapons */
491: if ((tp->o_flags & ISCURSED) ||
492: (tp->o_type == WEAPON &&
493: (tp->o_hplus < 0 || tp->o_dplus < 0)))
494: mag_type = CMAGIC;
495: else if ((tp->o_flags & ISBLESSED) ||
496: (tp->o_type == WEAPON &&
497: (tp->o_hplus > 0 || tp->o_dplus > 0)))
498: mag_type = BMAGIC;
499: show = TRUE;
500: mvwaddch(hw, th->t_pos.y, th->t_pos.x, mag_type);
501: }
502: }
503: }
504: if (show) {
505: if (is_potion) p_know[P_TFIND] = TRUE;
506: rmmsg();
507: overlay(hw,cw);
508: draw(cw);
509: msg("You sense the presence of magic on this level.");
510: break;
511: }
512: else
513: msg("You have a strange feeling for a moment, then it passes.");
514: }
515: when P_SEEINVIS:
516: if (cursed) {
517: if (!find_slot(sight))
518: {
519: msg("A cloak of darkness falls around you.");
520: turn_on(player, ISBLIND);
521: fuse(sight, NULL, SEEDURATION, AFTER);
522: light(&hero);
523: }
524: else {
525: msg("The darkness around you thickens. ");
526: lengthen(sight, SEEDURATION);
527: }
528: }
529: else {
530: if (off(player, CANSEE)) {
531: turn_on(player, CANSEE);
532: msg("Your eyes begin to tingle.");
533: fuse(unsee, NULL, blessed ? SEEDURATION*3 :SEEDURATION, AFTER);
534: light(&hero);
535: }
536: else if (find_slot(unsee) != 0) {
537: msg("You eyes continue to tingle.");
538: lengthen(unsee, blessed ? SEEDURATION*3 : SEEDURATION);
539: }
540: sight();
541: }
542: when P_PHASE:
543: if (cursed) {
544: msg("You can't move.");
545: player.t_no_move = movement(&player) * FREEZETIME;
546: player.t_action = A_FREEZE;
547: }
548: else {
549: int duration;
550:
551: if (blessed) duration = 3;
552: else duration = 1;
553:
554: if (on(player, CANINWALL))
555: lengthen(unphase, duration*PHASEDURATION);
556: else {
557: fuse(unphase, NULL, duration*PHASEDURATION, AFTER);
558: turn_on(player, CANINWALL);
559: }
560: msg("You feel %slight-headed!",
561: blessed ? "very " : "");
562: }
563: when P_FLY: {
564: int duration;
565: bool say_message;
566:
567: say_message = TRUE;
568:
569: if (blessed) duration = 3;
570: else duration = 1;
571:
572: if (on(player, ISFLY)) {
573: if (find_slot(land))
574: lengthen(land, duration*FLYTIME);
575: else {
576: msg("Nothing happens."); /* Flying by cloak */
577: say_message = FALSE;
578: }
579: }
580: else {
581: fuse(land, NULL, duration*FLYTIME, AFTER);
582: turn_on(player, ISFLY);
583: }
584: if (say_message) {
585: if (is_potion) p_know[P_FLY] = TRUE;
586: msg("You feel %slighter than air!", blessed ? "much " : "");
587: }
588: }
589: when P_RAISE:
590: if (cursed) lower_level(D_POTION);
591: else {
592: msg("You suddenly feel %smore skillful",
593: blessed ? "much " : "");
594: p_know[P_RAISE] = TRUE;
595: raise_level();
596: do_panic(0); /* this startles them */
597: if (blessed) raise_level();
598: }
599: when P_HASTE:
600: if (cursed) { /* Slow player down */
601: add_slow();
602: }
603: else {
604: add_haste(blessed);
605: if (is_potion) p_know[P_HASTE] = TRUE;
606: }
607: when P_RESTORE: {
608: register int i, howmuch, strength_tally;
609:
610: msg("Hey, this tastes great. It make you feel %swarm all over.",
611: blessed ? "really " : "");
612: howmuch = blessed ? 3 : 1;
613:
614: for (i=0; i<NUMABILITIES; i++) {
615: if (i == A_STRENGTH) {
616: if (lost_str) {
617: if (lost_str > howmuch) {
618: lost_str -= howmuch;
619:
620: /*
621: * Save the lost strength. We have to set
622: * temporarilty set it to 0 so that res_strength
623: * will not restore it.
624: */
625: strength_tally = lost_str;
626: lost_str = 0;
627: res_strength(howmuch);
628: lost_str = strength_tally;
629: }
630: else {
631: lost_str = 0;
632: extinguish(res_strength);
633: res_strength(howmuch);
634: }
635: }
636: else res_strength(howmuch);
637: }
638: else (*res_abil[i])(howmuch);
639: }
640: }
641: when P_INVIS:
642: if (off(player, ISINVIS)) {
643: turn_on(player, ISINVIS);
644: msg("You have a tingling feeling all over your body");
645: fuse(appear, NULL, blessed ? GONETIME*3 : GONETIME, AFTER);
646: PLAYER = IPLAYER;
647: light(&hero);
648: }
649: else {
650: if (find_slot(appear)) {
651: msg("Your tingling feeling surges.");
652: lengthen(appear, blessed ? GONETIME*3 : GONETIME);
653: }
654: else msg("Nothing happens."); /* Using cloak */
655: }
656:
657: when P_FFIND:
658: {
659: register struct linked_list *nitem;
660: register struct object *nobj;
661: bool show;
662:
663: show = FALSE;
664: wclear(hw);
665: for (nitem = lvl_obj; nitem != NULL; nitem = next(nitem)) {
666: nobj = OBJPTR(nitem);
667: if (nobj->o_type == FOOD) {
668: show = TRUE;
669: mvwaddch(hw, nobj->o_pos.y, nobj->o_pos.x, FOOD);
670: }
671: }
672: for (nitem = mlist; nitem != NULL; nitem = next(nitem)) {
673: register struct linked_list *pitem;
674: register struct thing *th;
675:
676: th = THINGPTR(nitem);
677: if (on(*th, NODETECT)) continue;
678: for(pitem = th->t_pack; pitem != NULL; pitem = next(pitem)){
679: nobj = OBJPTR(pitem);
680: if (nobj->o_type == FOOD) {
681: show = TRUE;
682: mvwaddch(hw, th->t_pos.y, th->t_pos.x, FOOD);
683: }
684: }
685: }
686: if (is_potion) p_know[P_FFIND] = TRUE;
687: if (show) {
688: rmmsg();
689: msg("Your nose tingles.");
690: rmmsg();
691: overlay(hw,cw);
692: draw(cw);
693: msg("You sense the presence of food on this level.");
694: }
695: else
696: msg("You have a strange feeling for a moment, then it passes.");
697: }
698:
699: when P_SKILL:
700: if (cursed) {
701: msg("You feel less skillful.");
702:
703: /* Does he currently have an artifical skill? */
704: if (!find_slot(unskill)) { /* No skill */
705: pstats.s_lvladj = -2;
706: pstats.s_lvl += pstats.s_lvladj;
707: fuse(unskill, NULL, SKILLDURATION, AFTER);
708: }
709: else { /* Has an artifical skill */
710: /* Is the skill beneficial? */
711: if (pstats.s_lvladj > 0) {
712: /* Decrease the previous skill advantage */
713: pstats.s_lvl -= 2;
714: pstats.s_lvladj -= 2;
715:
716: /* If there is now a negative skill, lengthen time */
717: if (pstats.s_lvladj < 0)
718: lengthen(unskill, SKILLDURATION);
719:
720: /* If there is no skill advantage, unfuse us */
721: else if (pstats.s_lvladj == 0) extinguish(unskill);
722: }
723: else { /* Already bad */
724: /* Make it a little worse, and lengthen it */
725: pstats.s_lvl--;
726: pstats.s_lvladj--;
727: lengthen(unskill, SKILLDURATION);
728: }
729: }
730:
731: /* Is our level too low now? */
732: if (pstats.s_lvl < 1) {
733: pstats.s_hpt = -1;
734: msg("You cough, choke, and finally die. --More--");
735: wait_for(' ');
736: death(D_POTION);
737: }
738: }
739: else {
740: int adjust;
741:
742: msg("You feel more skillful.");
743: max_stats.s_hpt++;
744: pstats.s_hpt++;
745:
746: /* Get the adjustment */
747: if (blessed)
748: adjust = rnd(4) + 2;
749: else
750: adjust = rnd(2) + 1;
751:
752: /* The Fighter likes this */
753: if (player.t_ctype == C_FIGHTER) {
754: max_stats.s_hpt++;
755: pstats.s_hpt++;
756: adjust = rnd(2) + 1;
757: }
758:
759: /* Does he currently have an artifical skill? */
760: if (!find_slot(unskill)) {
761: pstats.s_lvladj = adjust;
762: pstats.s_lvl += pstats.s_lvladj;
763: fuse(unskill, NULL,
764: blessed ? SKILLDURATION*2 : SKILLDURATION, AFTER);
765: }
766: else { /* Has an artifical skill */
767: /* Is the skill detrimental? */
768: if (pstats.s_lvladj < 0) {
769: /* Decrease the previous skill advantage */
770: pstats.s_lvl += adjust;
771: pstats.s_lvladj += adjust;
772:
773: /* If there is now a positive skill, lengthen time */
774: if (pstats.s_lvladj < 0)
775: lengthen(unskill, SKILLDURATION);
776:
777: /* If there is no skill advantage, unfuse us */
778: else if (pstats.s_lvladj == 0) extinguish(unskill);
779: }
780: else { /* Already good */
781: /*
782: * Make the skill the maximum of the current good
783: * skill and what the adjust would give him.
784: */
785: pstats.s_lvl -= pstats.s_lvladj;
786: pstats.s_lvladj = max(pstats.s_lvladj, adjust);
787: pstats.s_lvl += pstats.s_lvladj;
788: lengthen(unskill,
789: blessed ? SKILLDURATION*2 : SKILLDURATION);
790: }
791: }
792: }
793:
794: when P_FIRE: {
795: int duration;
796: bool say_message;
797:
798: say_message = TRUE;
799:
800: if (blessed) duration = 8;
801: else duration = 3;
802:
803: if (on(player, NOFIRE)) {
804: if (cursed) {
805: msg("You quench your thirst. ");
806: say_message = FALSE;
807: }
808: else if (find_slot(nofire)) {
809: lengthen(nofire, duration*FIRETIME);
810: msg("Your feeling of fire resistance increases. ");
811: say_message = FALSE;
812: }
813: else {
814: msg("You experience heat waves. "); /* has on a ring */
815: say_message = FALSE;
816: }
817: }
818: else if (cursed) {
819: msg("You quench your thirst. ");
820: say_message = FALSE;
821: }
822: else {
823: fuse(nofire, NULL, duration*FIRETIME, AFTER);
824: turn_on(player, NOFIRE);
825: }
826: if (say_message) {
827: if (is_potion) p_know[P_FIRE] = TRUE;
828: msg("You feel %sfire resistant", blessed ? "very " : "");
829: }
830: }
831: when P_COLD: {
832: int duration;
833: bool say_message;
834:
835: say_message = TRUE;
836:
837: if (blessed) duration = 8;
838: else duration = 3;
839:
840: if (on(player, NOCOLD)) {
841: if (cursed) {
842: msg("You quench your thirst. ");
843: say_message = FALSE;
844: }
845: else if (find_slot(nocold)) {
846: lengthen(nocold, duration*COLDTIME);
847: msg("Your feeling of cold resistance increases. ");
848: say_message = FALSE;
849: }
850: else {
851: msg("You feel a cold chill. "); /* has on a ring */
852: say_message = FALSE;
853: }
854: }
855: else if (cursed) {
856: msg("You quench your thirst. ");
857: say_message = FALSE;
858: }
859: else {
860: fuse(nocold, NULL, duration*COLDTIME, AFTER);
861: turn_on(player, NOCOLD);
862: }
863: if (say_message) {
864: if (is_potion) p_know[P_COLD] = TRUE;
865: msg("You feel %scold resistant", blessed ? "very " : "");
866: }
867: }
868: when P_LIGHTNING: {
869: int duration;
870: bool say_message;
871:
872: say_message = TRUE;
873:
874: if (blessed) duration = 8;
875: else duration = 3;
876:
877: if (on(player, NOBOLT)) {
878: if (cursed) {
879: msg("You quench your thirst. ");
880: say_message = FALSE;
881: }
882: else if (find_slot(nobolt)) {
883: lengthen(nobolt, duration*BOLTTIME);
884: msg("Your blue skin deepens in hue. ");
885: say_message = FALSE;
886: }
887: else msg(nothing);
888: }
889: else if (cursed) {
890: msg("You quench your thirst. ");
891: say_message = FALSE;
892: }
893: else {
894: fuse(nobolt, NULL, duration*BOLTTIME, AFTER);
895: turn_on(player, NOBOLT);
896: }
897: if (say_message) {
898: if (is_potion) p_know[P_LIGHTNING] = TRUE;
899: msg("Your skin turns %sblue!", blessed ? "very " : "");
900: }
901: }
902: when P_POISON:
903: if (!save(VS_POISON, &player, -2)) {
904: msg("You feel very sick now.");
905: pstats.s_hpt /= 2;
906: if (!ISWEARING(R_SUSABILITY))
907: pstats.s_const--;
908: }
909: else {
910: msg("You feel sick now.");
911: pstats.s_hpt -= (pstats.s_hpt / 3);
912: }
913: if (pstats.s_const < 1 || pstats.s_hpt < 1) {
914: pstats.s_hpt = -1;
915: msg("You didn't survive! --More--");
916: wait_for(' ');
917: death(D_POISON);
918: }
919: otherwise:
920: msg("What an odd tasting potion!");
921: return;
922: }
923: status(FALSE);
924: if (is_potion && item && p_know[which] && p_guess[which])
925: {
926: free(p_guess[which]);
927: p_guess[which] = NULL;
928: }
929: else if (is_potion &&
930: !p_know[which] &&
931: item &&
932: askme &&
933: (flags & ISKNOW) == 0 &&
934: (flags & ISPOST) == 0 &&
935: p_guess[which] == NULL) {
936: nameitem(item, FALSE);
937: }
938: if (item != NULL) o_discard(item);
939: updpack(TRUE, &player);
940: }
941:
942:
943: /*
944: * res_dexterity:
945: * Restore player's dexterity
946: * if called with zero the restore fully
947: */
948:
949: void
950: res_dexterity(int howmuch)
951: {
952: short save_max;
953: int ring_str;
954:
955: if (howmuch < 0) return;
956:
957: /* Discount the ring value */
958: ring_str = ring_value(R_ADDHIT);
959: pstats.s_dext -= ring_str;
960:
961: if (pstats.s_dext < max_stats.s_dext ) {
962: if (howmuch == 0)
963: pstats.s_dext = max_stats.s_dext;
964: else
965: pstats.s_dext = min(pstats.s_dext+howmuch, max_stats.s_dext);
966: }
967:
968: /* Redo the rings */
969: if (ring_str) {
970: save_max = max_stats.s_dext;
971: pstats.s_dext += ring_str;
972: max_stats.s_dext = save_max;
973: }
974: return;
975: }
976:
977: /*
978: * res_intelligence:
979: * Restore player's intelligence
980: */
981:
982: void
983: res_intelligence(int howmuch)
984: {
985: short save_max;
986: int ring_str;
987:
988: if (howmuch <= 0) return;
989:
990: /* Discount the ring value */
991: ring_str = ring_value(R_ADDINTEL);
992: pstats.s_intel -= ring_str;
993:
994: pstats.s_intel = min(pstats.s_intel + howmuch, max_stats.s_intel);
995:
996: /* Redo the rings */
997: if (ring_str) {
998: save_max = max_stats.s_intel;
999: pstats.s_intel += ring_str;
1000: max_stats.s_intel = save_max;
1001: }
1002: return;
1003: }
1004:
1005: /*
1006: * res_wisdom:
1007: * Restore player's wisdom
1008: */
1009:
1010: void
1011: res_wisdom(int howmuch)
1012: {
1013: short save_max;
1014: int ring_str;
1015:
1016: if (howmuch <= 0) return;
1017:
1018: /* Discount the ring value */
1019: ring_str = ring_value(R_ADDWISDOM);
1020: pstats.s_wisdom -= ring_str;
1021:
1022: pstats.s_wisdom = min(pstats.s_wisdom + howmuch, max_stats.s_wisdom);
1023:
1024: /* Redo the rings */
1025: if (ring_str) {
1026: save_max = max_stats.s_wisdom;
1027: pstats.s_wisdom += ring_str;
1028: max_stats.s_wisdom = save_max;
1029: }
1030: return;
1031: }
1032:
1033: /*
1034: * res_constitution:
1035: * Restore the players constitution.
1036: */
1037:
1038: void
1039: res_constitution(int howmuch)
1040: {
1041: if (howmuch > 0)
1042: pstats.s_const = min(pstats.s_const + howmuch, max_stats.s_const);
1043:
1044: return;
1045: }
1046:
1047: /*
1048: * res_charisma:
1049: * Restore the players charisma.
1050: */
1051:
1052: void
1053: res_charisma(int howmuch)
1054: {
1055: if (howmuch > 0)
1056: pstats.s_charisma =
1057: min(pstats.s_charisma + howmuch, max_stats.s_charisma);
1058:
1059: return;
1060: }
CVSweb