Annotation of early-roguelike/xrogue/potions.c, Revision 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