Mercurial > hg > early-roguelike
diff rogue4/potions.c @ 12:9535a08ddc39
Import Rogue 5.2 from the Roguelike Restoration Project (r1490)
author | edwarj4 |
---|---|
date | Sat, 24 Oct 2009 16:52:52 +0000 |
parents | |
children | 1b73a8641b37 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rogue4/potions.c Sat Oct 24 16:52:52 2009 +0000 @@ -0,0 +1,256 @@ +/* + * Function(s) for dealing with potions + * + * @(#)potions.c 4.24 (Berkeley) 4/6/82 + * + * Rogue: Exploring the Dungeons of Doom + * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman + * All rights reserved. + * + * See the file LICENSE.TXT for full copyright and licensing information. + */ + +#include <curses.h> +#include "rogue.h" + +/* + * quaff: + * Quaff a potion from the pack + */ +quaff() +{ + register THING *obj, *th; + register bool discardit = FALSE; + + obj = get_item("quaff", POTION); + /* + * Make certain that it is somethings that we want to drink + */ + if (obj == NULL) + return; + if (obj->o_type != POTION) + { + if (!terse) + msg("yuk! Why would you want to drink that?"); + else + msg("that's undrinkable"); + return; + } + if (obj == cur_weapon) + cur_weapon = NULL; + + /* + * Calculate the effect it has on the poor guy. + */ + switch (obj->o_which) + { + case P_CONFUSE: + p_know[P_CONFUSE] = TRUE; + if (!on(player, ISHUH)) + { + if (on(player, ISHUH)) + lengthen(unconfuse, rnd(8)+HUHDURATION); + else + fuse(unconfuse, 0, rnd(8)+HUHDURATION, AFTER); + player.t_flags |= ISHUH; + msg("wait, what's going on here. Huh? What? Who?"); + } + when P_POISON: + p_know[P_POISON] = TRUE; + if (!ISWEARING(R_SUSTSTR)) + { + chg_str(-(rnd(3)+1)); + msg("you feel very sick now"); + } + else + msg("you feel momentarily sick"); + when P_HEALING: + p_know[P_HEALING] = TRUE; + if ((pstats.s_hpt += roll(pstats.s_lvl, 4)) > max_hp) + pstats.s_hpt = ++max_hp; + sight(); + msg("you begin to feel better"); + when P_STRENGTH: + p_know[P_STRENGTH] = TRUE; + chg_str(1); + msg("you feel stronger, now. What bulging muscles!"); + when P_MFIND: + player.t_flags |= SEEMONST; + fuse(turn_see, TRUE, HUHDURATION, AFTER); + if (mlist == NULL) + msg("you have a strange feeling for a moment"); + else + p_know[P_MFIND] |= turn_see(FALSE); + when P_TFIND: + /* + * Potion of magic detection. Show the potions and scrolls + */ + if (lvl_obj != NULL) + { + register THING *tp; + register bool show; + + show = FALSE; + wclear(hw); + for (tp = lvl_obj; tp != NULL; tp = next(tp)) + { + if (is_magic(tp)) + { + show = TRUE; + mvwaddch(hw, tp->o_pos.y, tp->o_pos.x, MAGIC); + p_know[P_TFIND] = TRUE; + } + } + for (th = mlist; th != NULL; th = next(th)) + { + for (tp = th->t_pack; tp != NULL; tp = next(tp)) + { + if (is_magic(tp)) + { + show = TRUE; + mvwaddch(hw, th->t_pos.y, th->t_pos.x, MAGIC); + p_know[P_TFIND] = TRUE; + } + } + } + if (show) + { + show_win(hw, + "You sense the presence of magic on this level.--More--"); + break; + } + } + msg("you have a strange feeling for a moment, then it passes"); + when P_PARALYZE: + p_know[P_PARALYZE] = TRUE; + no_command = HOLDTIME; + player.t_flags &= ~ISRUN; + msg("you can't move"); + when P_SEEINVIS: + if (!on(player, CANSEE)) + { + fuse(unsee, 0, SEEDURATION, AFTER); + look(FALSE); + invis_on(); + } + sight(); + msg("this potion tastes like %s juice", fruit); + when P_RAISE: + p_know[P_RAISE] = TRUE; + msg("you suddenly feel much more skillful"); + raise_level(); + when P_XHEAL: + p_know[P_XHEAL] = TRUE; + if ((pstats.s_hpt += roll(pstats.s_lvl, 8)) > max_hp) + { + if (pstats.s_hpt > max_hp + pstats.s_lvl + 1) + ++max_hp; + pstats.s_hpt = ++max_hp; + } + sight(); + msg("you begin to feel much better"); + when P_HASTE: + p_know[P_HASTE] = TRUE; + if (add_haste(TRUE)) + msg("you feel yourself moving much faster"); + when P_RESTORE: + if (ISRING(LEFT, R_ADDSTR)) + add_str(&pstats.s_str, -cur_ring[LEFT]->o_ac); + if (ISRING(RIGHT, R_ADDSTR)) + add_str(&pstats.s_str, -cur_ring[RIGHT]->o_ac); + if (pstats.s_str < max_stats.s_str) + pstats.s_str = max_stats.s_str; + if (ISRING(LEFT, R_ADDSTR)) + add_str(&pstats.s_str, cur_ring[LEFT]->o_ac); + if (ISRING(RIGHT, R_ADDSTR)) + add_str(&pstats.s_str, cur_ring[RIGHT]->o_ac); + msg("hey, this tastes great. It make you feel warm all over"); + when P_BLIND: + p_know[P_BLIND] = TRUE; + if (!on(player, ISBLIND)) + { + player.t_flags |= ISBLIND; + fuse(sight, 0, SEEDURATION, AFTER); + look(FALSE); + } + msg("a cloak of darkness falls around you"); + when P_NOP: + msg("this potion tastes extremely dull"); + otherwise: + msg("what an odd tasting potion!"); + return; + } + status(); + /* + * Throw the item away + */ + inpack--; + if (obj->o_count > 1) + obj->o_count--; + else + { + detach(pack, obj); + discardit = TRUE; + } + + call_it(p_know[obj->o_which], &p_guess[obj->o_which]); + + if (discardit) + discard(obj); +} + +/* + * invis_on: + * Turn on the ability to see invisible + */ +invis_on() +{ + register THING *th; + + player.t_flags |= CANSEE; + for (th = mlist; th != NULL; th = next(th)) + if (on(*th, ISINVIS) && see_monst(th)) + { + move(th->t_pos.y, th->t_pos.x); + addch(th->t_disguise); + } +} + +/* + * see_monst: + * Put on or off seeing monsters on this level + */ +turn_see(turn_off) +register bool turn_off; +{ + register THING *mp; + register bool can_see, add_new; + + add_new = FALSE; + for (mp = mlist; mp != NULL; mp = next(mp)) + { + move(mp->t_pos.y, mp->t_pos.x); + can_see = (see_monst(mp) || inch() == (unsigned char)mp->t_type); + if (turn_off) + { + if (!can_see) + addch(mp->t_oldch); + } + else + { + if (!can_see) + standout(); + addch(mp->t_type); + if (!can_see) + { + standend(); + add_new++; + } + } + } + if (turn_off) + player.t_flags &= ~SEEMONST; + else + player.t_flags |= SEEMONST; + return add_new; +}