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 } |