Mercurial > hg > early-roguelike
comparison 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 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:527e2150eaf0 |
|---|---|
| 1 /* | |
| 2 * @(#)potions.c 3.1 3.1 5/7/81 | |
| 3 * Function(s) for dealing with potions | |
| 4 * | |
| 5 * Rogue: Exploring the Dungeons of Doom | |
| 6 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
| 7 * All rights reserved. | |
| 8 * | |
| 9 * See the file LICENSE.TXT for full copyright and licensing information. | |
| 10 */ | |
| 11 | |
| 12 #include "curses.h" | |
| 13 #include <stdlib.h> | |
| 14 #include <string.h> | |
| 15 #include "rogue.h" | |
| 16 | |
| 17 void | |
| 18 quaff() | |
| 19 { | |
| 20 struct object *obj; | |
| 21 struct linked_list *item, *titem; | |
| 22 struct thing *th; | |
| 23 char buf[80]; | |
| 24 | |
| 25 item = get_item("quaff", POTION); | |
| 26 /* | |
| 27 * Make certain that it is somethings that we want to drink | |
| 28 */ | |
| 29 if (item == NULL) | |
| 30 return; | |
| 31 obj = (struct object *) ldata(item); | |
| 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 if (off(player, ISHUH)) | |
| 50 msg("Wait, what's going on here. Huh? What? Who?"); | |
| 51 | |
| 52 if (on(player, ISHUH)) | |
| 53 lengthen(unconfuse, rnd(8)+HUHDURATION); | |
| 54 else | |
| 55 fuse(unconfuse, 0, rnd(8)+HUHDURATION, AFTER); | |
| 56 | |
| 57 player.t_flags |= ISHUH; | |
| 58 p_know[P_CONFUSE] = TRUE; | |
| 59 when P_POISON: | |
| 60 if (!ISWEARING(R_SUSTSTR)) | |
| 61 { | |
| 62 chg_str(-(rnd(3)+1)); | |
| 63 msg("You feel very sick now."); | |
| 64 } | |
| 65 else | |
| 66 msg("You feel momentarily sick"); | |
| 67 p_know[P_POISON] = TRUE; | |
| 68 when P_HEALING: | |
| 69 if ((pstats.s_hpt += roll(pstats.s_lvl, 4)) > max_hp) | |
| 70 pstats.s_hpt = ++max_hp; | |
| 71 msg("You begin to feel better."); | |
| 72 sight(); | |
| 73 p_know[P_HEALING] = TRUE; | |
| 74 when P_STRENGTH: | |
| 75 msg("You feel stronger, now. What bulging muscles!"); | |
| 76 chg_str(1); | |
| 77 p_know[P_STRENGTH] = TRUE; | |
| 78 when P_MFIND: | |
| 79 /* | |
| 80 * Potion of monster detection, if there are monters, detect them | |
| 81 */ | |
| 82 if (mlist != NULL) | |
| 83 { | |
| 84 wclear(hw); | |
| 85 overwrite(mw, hw); | |
| 86 show_win(hw, | |
| 87 "You begin to sense the presence of monsters.--More--"); | |
| 88 p_know[P_MFIND] = TRUE; | |
| 89 } | |
| 90 else | |
| 91 msg("You have a strange feeling for a moment, then it passes."); | |
| 92 when P_TFIND: | |
| 93 /* | |
| 94 * Potion of magic detection. Show the potions and scrolls | |
| 95 */ | |
| 96 if (lvl_obj != NULL) | |
| 97 { | |
| 98 struct linked_list *mobj; | |
| 99 struct object *tp; | |
| 100 int show; | |
| 101 | |
| 102 show = FALSE; | |
| 103 wclear(hw); | |
| 104 for (mobj = lvl_obj; mobj != NULL; mobj = next(mobj)) | |
| 105 { | |
| 106 tp = (struct object *) ldata(mobj); | |
| 107 if (is_magic(tp)) | |
| 108 { | |
| 109 show = TRUE; | |
| 110 mvwaddch(hw, tp->o_pos.y, tp->o_pos.x, MAGIC); | |
| 111 } | |
| 112 p_know[P_TFIND] = TRUE; | |
| 113 } | |
| 114 for (titem = mlist; titem != NULL; titem = next(titem)) | |
| 115 { | |
| 116 struct linked_list *pitem; | |
| 117 | |
| 118 th = (struct thing *) ldata(titem); | |
| 119 for (pitem = th->t_pack; pitem != NULL; pitem = next(pitem)) | |
| 120 { | |
| 121 if (is_magic(OBJPTR(pitem))) | |
| 122 { | |
| 123 show = TRUE; | |
| 124 mvwaddch(hw, th->t_pos.y, th->t_pos.x, MAGIC); | |
| 125 } | |
| 126 p_know[P_TFIND] = TRUE; | |
| 127 } | |
| 128 } | |
| 129 if (show) | |
| 130 { | |
| 131 show_win(hw, | |
| 132 "You sense the presence of magic on this level.--More--"); | |
| 133 break; | |
| 134 } | |
| 135 } | |
| 136 msg("You have a strange feeling for a moment, then it passes."); | |
| 137 when P_PARALYZE: | |
| 138 msg("You can't move."); | |
| 139 no_command = HOLDTIME; | |
| 140 p_know[P_PARALYZE] = TRUE; | |
| 141 when P_SEEINVIS: | |
| 142 msg("This potion tastes like %s juice.", fruit); | |
| 143 if (off(player, CANSEE)) | |
| 144 { | |
| 145 player.t_flags |= CANSEE; | |
| 146 fuse(unsee, 0, SEEDURATION, AFTER); | |
| 147 light(&hero); | |
| 148 } | |
| 149 sight(); | |
| 150 when P_RAISE: | |
| 151 msg("You suddenly feel much more skillful"); | |
| 152 p_know[P_RAISE] = TRUE; | |
| 153 raise_level(); | |
| 154 when P_XHEAL: | |
| 155 if ((pstats.s_hpt += roll(pstats.s_lvl, 8)) > max_hp) | |
| 156 pstats.s_hpt = ++max_hp; | |
| 157 msg("You begin to feel much better."); | |
| 158 p_know[P_XHEAL] = TRUE; | |
| 159 sight(); | |
| 160 when P_HASTE: | |
| 161 add_haste(TRUE); | |
| 162 msg("You feel yourself moving much faster."); | |
| 163 p_know[P_HASTE] = TRUE; | |
| 164 when P_RESTORE: | |
| 165 msg("Hey, this tastes great. It make you feel warm all over."); | |
| 166 if (pstats.s_str.st_str < max_stats.s_str.st_str || | |
| 167 (pstats.s_str.st_str == 18 && | |
| 168 pstats.s_str.st_add < max_stats.s_str.st_add)) | |
| 169 pstats.s_str = max_stats.s_str; | |
| 170 when P_BLIND: | |
| 171 msg("A cloak of darkness falls around you."); | |
| 172 if (off(player, ISBLIND)) | |
| 173 { | |
| 174 player.t_flags |= ISBLIND; | |
| 175 fuse(sight, 0, SEEDURATION, AFTER); | |
| 176 look(FALSE); | |
| 177 } | |
| 178 p_know[P_BLIND] = TRUE; | |
| 179 when P_NOP: | |
| 180 msg("This potion tastes extremely dull."); | |
| 181 otherwise: | |
| 182 msg("What an odd tasting potion!"); | |
| 183 return; | |
| 184 } | |
| 185 status(); | |
| 186 if (p_know[obj->o_which] && p_guess[obj->o_which]) | |
| 187 { | |
| 188 free(p_guess[obj->o_which]); | |
| 189 p_guess[obj->o_which] = NULL; | |
| 190 } | |
| 191 else if (!p_know[obj->o_which] && askme && p_guess[obj->o_which] == NULL) | |
| 192 { | |
| 193 msg(terse ? "Call it: " : "What do you want to call it? "); | |
| 194 if (get_str(buf, cw) == NORM) | |
| 195 { | |
| 196 p_guess[obj->o_which] = malloc((unsigned int) strlen(buf) + 1); | |
| 197 if (p_guess[obj->o_which] != NULL) | |
| 198 strcpy(p_guess[obj->o_which], buf); | |
| 199 } | |
| 200 } | |
| 201 /* | |
| 202 * Throw the item away | |
| 203 */ | |
| 204 inpack--; | |
| 205 if (obj->o_count > 1) | |
| 206 obj->o_count--; | |
| 207 else | |
| 208 { | |
| 209 detach(pack, item); | |
| 210 discard(item); | |
| 211 } | |
| 212 } |
