Annotation of early-roguelike/rogue4/potions.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Function(s) for dealing with potions
! 3: *
! 4: * @(#)potions.c 4.24 (Berkeley) 4/6/82
! 5: *
! 6: * Rogue: Exploring the Dungeons of Doom
! 7: * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman
! 8: * All rights reserved.
! 9: *
! 10: * See the file LICENSE.TXT for full copyright and licensing information.
! 11: */
! 12:
! 13: #include <curses.h>
! 14: #include "rogue.h"
! 15:
! 16: /*
! 17: * quaff:
! 18: * Quaff a potion from the pack
! 19: */
! 20: void
! 21: quaff(void)
! 22: {
! 23: register THING *obj, *th;
! 24: register bool discardit = FALSE;
! 25:
! 26: obj = get_item("quaff", POTION);
! 27: /*
! 28: * Make certain that it is somethings that we want to drink
! 29: */
! 30: if (obj == NULL)
! 31: return;
! 32: if (obj->o_type != POTION)
! 33: {
! 34: if (!terse)
! 35: msg("yuk! Why would you want to drink that?");
! 36: else
! 37: msg("that's undrinkable");
! 38: return;
! 39: }
! 40: if (obj == cur_weapon)
! 41: cur_weapon = NULL;
! 42:
! 43: /*
! 44: * Calculate the effect it has on the poor guy.
! 45: */
! 46: switch (obj->o_which)
! 47: {
! 48: case P_CONFUSE:
! 49: p_know[P_CONFUSE] = TRUE;
! 50: if (!on(player, ISHUH))
! 51: {
! 52: if (on(player, ISHUH))
! 53: lengthen(unconfuse, rnd(8)+HUHDURATION);
! 54: else
! 55: fuse(unconfuse, 0, rnd(8)+HUHDURATION, AFTER);
! 56: player.t_flags |= ISHUH;
! 57: msg("wait, what's going on here. Huh? What? Who?");
! 58: }
! 59: when P_POISON:
! 60: p_know[P_POISON] = TRUE;
! 61: if (!ISWEARING(R_SUSTSTR))
! 62: {
! 63: chg_str(-(rnd(3)+1));
! 64: msg("you feel very sick now");
! 65: }
! 66: else
! 67: msg("you feel momentarily sick");
! 68: when P_HEALING:
! 69: p_know[P_HEALING] = TRUE;
! 70: if ((pstats.s_hpt += roll(pstats.s_lvl, 4)) > max_hp)
! 71: pstats.s_hpt = ++max_hp;
! 72: sight();
! 73: msg("you begin to feel better");
! 74: when P_STRENGTH:
! 75: p_know[P_STRENGTH] = TRUE;
! 76: chg_str(1);
! 77: msg("you feel stronger, now. What bulging muscles!");
! 78: when P_MFIND:
! 79: player.t_flags |= SEEMONST;
! 80: fuse(turn_see_off, TRUE, HUHDURATION, AFTER);
! 81: if (mlist == NULL)
! 82: msg("you have a strange feeling for a moment");
! 83: else
! 84: p_know[P_MFIND] |= turn_see(FALSE);
! 85: when P_TFIND:
! 86: /*
! 87: * Potion of magic detection. Show the potions and scrolls
! 88: */
! 89: if (lvl_obj != NULL)
! 90: {
! 91: register THING *tp;
! 92: register bool show;
! 93:
! 94: show = FALSE;
! 95: wclear(hw);
! 96: for (tp = lvl_obj; tp != NULL; tp = next(tp))
! 97: {
! 98: if (is_magic(tp))
! 99: {
! 100: show = TRUE;
! 101: mvwaddch(hw, tp->o_pos.y, tp->o_pos.x, MAGIC);
! 102: p_know[P_TFIND] = TRUE;
! 103: }
! 104: }
! 105: for (th = mlist; th != NULL; th = next(th))
! 106: {
! 107: for (tp = th->t_pack; tp != NULL; tp = next(tp))
! 108: {
! 109: if (is_magic(tp))
! 110: {
! 111: show = TRUE;
! 112: mvwaddch(hw, th->t_pos.y, th->t_pos.x, MAGIC);
! 113: p_know[P_TFIND] = TRUE;
! 114: }
! 115: }
! 116: }
! 117: if (show)
! 118: {
! 119: show_win(hw,
! 120: "You sense the presence of magic on this level.--More--");
! 121: break;
! 122: }
! 123: }
! 124: msg("you have a strange feeling for a moment, then it passes");
! 125: when P_PARALYZE:
! 126: p_know[P_PARALYZE] = TRUE;
! 127: no_command = HOLDTIME;
! 128: player.t_flags &= ~ISRUN;
! 129: msg("you can't move");
! 130: when P_SEEINVIS:
! 131: if (!on(player, CANSEE))
! 132: {
! 133: fuse(unsee, 0, SEEDURATION, AFTER);
! 134: look(FALSE);
! 135: invis_on();
! 136: }
! 137: sight();
! 138: msg("this potion tastes like %s juice", fruit);
! 139: when P_RAISE:
! 140: p_know[P_RAISE] = TRUE;
! 141: msg("you suddenly feel much more skillful");
! 142: raise_level();
! 143: when P_XHEAL:
! 144: p_know[P_XHEAL] = TRUE;
! 145: if ((pstats.s_hpt += roll(pstats.s_lvl, 8)) > max_hp)
! 146: {
! 147: if (pstats.s_hpt > max_hp + pstats.s_lvl + 1)
! 148: ++max_hp;
! 149: pstats.s_hpt = ++max_hp;
! 150: }
! 151: sight();
! 152: msg("you begin to feel much better");
! 153: when P_HASTE:
! 154: p_know[P_HASTE] = TRUE;
! 155: if (add_haste(TRUE))
! 156: msg("you feel yourself moving much faster");
! 157: when P_RESTORE:
! 158: if (ISRING(LEFT, R_ADDSTR))
! 159: add_str(&pstats.s_str, -cur_ring[LEFT]->o_ac);
! 160: if (ISRING(RIGHT, R_ADDSTR))
! 161: add_str(&pstats.s_str, -cur_ring[RIGHT]->o_ac);
! 162: if (pstats.s_str < max_stats.s_str)
! 163: pstats.s_str = max_stats.s_str;
! 164: if (ISRING(LEFT, R_ADDSTR))
! 165: add_str(&pstats.s_str, cur_ring[LEFT]->o_ac);
! 166: if (ISRING(RIGHT, R_ADDSTR))
! 167: add_str(&pstats.s_str, cur_ring[RIGHT]->o_ac);
! 168: msg("hey, this tastes great. It make you feel warm all over");
! 169: when P_BLIND:
! 170: p_know[P_BLIND] = TRUE;
! 171: if (!on(player, ISBLIND))
! 172: {
! 173: player.t_flags |= ISBLIND;
! 174: fuse(sight, 0, SEEDURATION, AFTER);
! 175: look(FALSE);
! 176: }
! 177: msg("a cloak of darkness falls around you");
! 178: when P_NOP:
! 179: msg("this potion tastes extremely dull");
! 180: otherwise:
! 181: msg("what an odd tasting potion!");
! 182: return;
! 183: }
! 184: status();
! 185: /*
! 186: * Throw the item away
! 187: */
! 188: inpack--;
! 189: if (obj->o_count > 1)
! 190: obj->o_count--;
! 191: else
! 192: {
! 193: detach(pack, obj);
! 194: discardit = TRUE;
! 195: }
! 196:
! 197: call_it(p_know[obj->o_which], &p_guess[obj->o_which]);
! 198:
! 199: if (discardit)
! 200: discard(obj);
! 201: }
! 202:
! 203: /*
! 204: * invis_on:
! 205: * Turn on the ability to see invisible
! 206: */
! 207: void
! 208: invis_on(void)
! 209: {
! 210: register THING *th;
! 211:
! 212: player.t_flags |= CANSEE;
! 213: for (th = mlist; th != NULL; th = next(th))
! 214: if (on(*th, ISINVIS) && see_monst(th))
! 215: {
! 216: move(th->t_pos.y, th->t_pos.x);
! 217: addch(th->t_disguise);
! 218: }
! 219: }
! 220:
! 221: /*
! 222: * see_monst:
! 223: * Put on or off seeing monsters on this level
! 224: */
! 225: bool
! 226: turn_see(bool turn_off)
! 227: {
! 228: register THING *mp;
! 229: register bool can_see, add_new;
! 230:
! 231: add_new = FALSE;
! 232: for (mp = mlist; mp != NULL; mp = next(mp))
! 233: {
! 234: move(mp->t_pos.y, mp->t_pos.x);
! 235: can_see = (see_monst(mp) || inch() == (unsigned char)mp->t_type);
! 236: if (turn_off)
! 237: {
! 238: if (!can_see)
! 239: addch(mp->t_oldch);
! 240: }
! 241: else
! 242: {
! 243: if (!can_see)
! 244: standout();
! 245: addch(mp->t_type);
! 246: if (!can_see)
! 247: {
! 248: standend();
! 249: add_new++;
! 250: }
! 251: }
! 252: }
! 253: if (turn_off)
! 254: player.t_flags &= ~SEEMONST;
! 255: else
! 256: player.t_flags |= SEEMONST;
! 257: return add_new;
! 258: }
! 259:
! 260: /*
! 261: * A wrapper for turn_see(TRUE), to be used as a fuse.
! 262: */
! 263: void
! 264: turn_see_off(void)
! 265: {
! 266: turn_see(TRUE);
! 267: }
CVSweb