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