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 }