Mercurial > hg > early-roguelike
diff rogue3/potions.c @ 0:527e2150eaf0
Import Rogue 3.6 from the Roguelike Restoration Project (r1490)
author | edwarj4 |
---|---|
date | Tue, 13 Oct 2009 13:33:34 +0000 |
parents | |
children | e7862a021609 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rogue3/potions.c Tue Oct 13 13:33:34 2009 +0000 @@ -0,0 +1,212 @@ +/* + * @(#)potions.c 3.1 3.1 5/7/81 + * Function(s) for dealing with potions + * + * Rogue: Exploring the Dungeons of Doom + * Copyright (C) 1980, 1981 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 <stdlib.h> +#include <string.h> +#include "rogue.h" + +void +quaff() +{ + struct object *obj; + struct linked_list *item, *titem; + struct thing *th; + char buf[80]; + + item = get_item("quaff", POTION); + /* + * Make certain that it is somethings that we want to drink + */ + if (item == NULL) + return; + obj = (struct object *) ldata(item); + 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: + if (off(player, ISHUH)) + msg("Wait, what's going on here. Huh? What? Who?"); + + if (on(player, ISHUH)) + lengthen(unconfuse, rnd(8)+HUHDURATION); + else + fuse(unconfuse, 0, rnd(8)+HUHDURATION, AFTER); + + player.t_flags |= ISHUH; + p_know[P_CONFUSE] = TRUE; + when P_POISON: + if (!ISWEARING(R_SUSTSTR)) + { + chg_str(-(rnd(3)+1)); + msg("You feel very sick now."); + } + else + msg("You feel momentarily sick"); + p_know[P_POISON] = TRUE; + when P_HEALING: + if ((pstats.s_hpt += roll(pstats.s_lvl, 4)) > max_hp) + pstats.s_hpt = ++max_hp; + msg("You begin to feel better."); + sight(); + p_know[P_HEALING] = TRUE; + when P_STRENGTH: + msg("You feel stronger, now. What bulging muscles!"); + chg_str(1); + p_know[P_STRENGTH] = TRUE; + when P_MFIND: + /* + * Potion of monster detection, if there are monters, detect them + */ + if (mlist != NULL) + { + wclear(hw); + overwrite(mw, hw); + show_win(hw, + "You begin to sense the presence of monsters.--More--"); + p_know[P_MFIND] = TRUE; + } + else + msg("You have a strange feeling for a moment, then it passes."); + when P_TFIND: + /* + * Potion of magic detection. Show the potions and scrolls + */ + if (lvl_obj != NULL) + { + struct linked_list *mobj; + struct object *tp; + int show; + + show = FALSE; + wclear(hw); + for (mobj = lvl_obj; mobj != NULL; mobj = next(mobj)) + { + tp = (struct object *) ldata(mobj); + if (is_magic(tp)) + { + show = TRUE; + mvwaddch(hw, tp->o_pos.y, tp->o_pos.x, MAGIC); + } + p_know[P_TFIND] = TRUE; + } + for (titem = mlist; titem != NULL; titem = next(titem)) + { + struct linked_list *pitem; + + th = (struct thing *) ldata(titem); + for (pitem = th->t_pack; pitem != NULL; pitem = next(pitem)) + { + if (is_magic(OBJPTR(pitem))) + { + 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: + msg("You can't move."); + no_command = HOLDTIME; + p_know[P_PARALYZE] = TRUE; + when P_SEEINVIS: + msg("This potion tastes like %s juice.", fruit); + if (off(player, CANSEE)) + { + player.t_flags |= CANSEE; + fuse(unsee, 0, SEEDURATION, AFTER); + light(&hero); + } + sight(); + when P_RAISE: + msg("You suddenly feel much more skillful"); + p_know[P_RAISE] = TRUE; + raise_level(); + when P_XHEAL: + if ((pstats.s_hpt += roll(pstats.s_lvl, 8)) > max_hp) + pstats.s_hpt = ++max_hp; + msg("You begin to feel much better."); + p_know[P_XHEAL] = TRUE; + sight(); + when P_HASTE: + add_haste(TRUE); + msg("You feel yourself moving much faster."); + p_know[P_HASTE] = TRUE; + when P_RESTORE: + msg("Hey, this tastes great. It make you feel warm all over."); + if (pstats.s_str.st_str < max_stats.s_str.st_str || + (pstats.s_str.st_str == 18 && + pstats.s_str.st_add < max_stats.s_str.st_add)) + pstats.s_str = max_stats.s_str; + when P_BLIND: + msg("A cloak of darkness falls around you."); + if (off(player, ISBLIND)) + { + player.t_flags |= ISBLIND; + fuse(sight, 0, SEEDURATION, AFTER); + look(FALSE); + } + p_know[P_BLIND] = TRUE; + when P_NOP: + msg("This potion tastes extremely dull."); + otherwise: + msg("What an odd tasting potion!"); + return; + } + status(); + if (p_know[obj->o_which] && p_guess[obj->o_which]) + { + free(p_guess[obj->o_which]); + p_guess[obj->o_which] = NULL; + } + else if (!p_know[obj->o_which] && askme && p_guess[obj->o_which] == NULL) + { + msg(terse ? "Call it: " : "What do you want to call it? "); + if (get_str(buf, cw) == NORM) + { + p_guess[obj->o_which] = malloc((unsigned int) strlen(buf) + 1); + if (p_guess[obj->o_which] != NULL) + strcpy(p_guess[obj->o_which], buf); + } + } + /* + * Throw the item away + */ + inpack--; + if (obj->o_count > 1) + obj->o_count--; + else + { + detach(pack, item); + discard(item); + } +}