comparison arogue7/potions.c @ 125:adfa37e67084

Import Advanced Rogue 7.7 from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Fri, 08 May 2015 15:24:40 -0400
parents
children b786053d2f37
comparison
equal deleted inserted replaced
124:d10fc4a065ac 125:adfa37e67084
1 /*
2 * potions.c - Function(s) for dealing with potions
3 *
4 * Advanced Rogue
5 * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T
6 * All rights reserved.
7 *
8 * Based on "Rogue: Exploring the Dungeons of Doom"
9 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
10 * All rights reserved.
11 *
12 * See the file LICENSE.TXT for full copyright and licensing information.
13 */
14
15 /*
16 * Function(s) for dealing with potions
17 */
18
19 #include "curses.h"
20 #include "rogue.h"
21
22
23 /*
24 * add_abil is an array of functions used to change attributes. It must be
25 * ordered according to the attribute definitions in rogue.h.
26 */
27
28 void (*add_abil[NUMABILITIES])() = {
29 add_intelligence, add_strength, add_wisdom, add_dexterity,
30 add_constitution, add_charisma
31 };
32
33 /*
34 * res_abil is an array of functions used to change attributes. It must be
35 * ordered according to the attribute definitions in rogue.h.
36 */
37
38 void (*res_abil[NUMABILITIES])() = {
39 res_intelligence, res_strength, res_wisdom, res_dexterity,
40 res_constitution, res_charisma
41 };
42
43 /*
44 * Increase player's constitution
45 */
46
47 void
48 add_constitution(change)
49 int change;
50 {
51 /* Do the potion */
52 if (change < 0) {
53 msg("You feel less healthy now.");
54 pstats.s_const += change;
55 if (pstats.s_const <= 0)
56 death(D_CONSTITUTION);
57 }
58 else {
59 msg("You feel healthier now.");
60 pstats.s_const = min(pstats.s_const + change, 25);
61 }
62
63 /* Adjust the maximum */
64 if (max_stats.s_const < pstats.s_const)
65 max_stats.s_const = pstats.s_const;
66 }
67
68 /*
69 * Increase player's charisma
70 */
71
72 void
73 add_charisma(change)
74 int change;
75 {
76 /* Do the potion */
77 if (change < 0) msg("You feel less attractive now.");
78 else msg("You feel more attractive now.");
79
80 pstats.s_charisma += change;
81 if (pstats.s_charisma > 25) pstats.s_charisma = 25;
82 else if (pstats.s_charisma < 3) pstats.s_charisma = 3;
83
84 /* Adjust the maximum */
85 if (max_stats.s_charisma < pstats.s_charisma)
86 max_stats.s_charisma = pstats.s_charisma;
87 }
88
89 /*
90 * Increase player's dexterity
91 */
92
93 void
94 add_dexterity(change)
95 int change;
96 {
97 int ring_str; /* Value of ring strengths */
98
99 /* Undo any ring changes */
100 ring_str = ring_value(R_ADDHIT);
101 pstats.s_dext -= ring_str;
102
103 /* Now do the potion */
104 if (change < 0) msg("You feel less dextrous now.");
105 else msg("You feel more dextrous now. Watch those hands!");
106
107 pstats.s_dext += change;
108 if (pstats.s_dext > 25) pstats.s_dext = 25;
109 else if (pstats.s_dext < 3) pstats.s_dext = 3;
110
111 /* Adjust the maximum */
112 if (max_stats.s_dext < pstats.s_dext)
113 max_stats.s_dext = pstats.s_dext;
114
115 /* Now put back the ring changes */
116 if (ring_str)
117 pstats.s_dext += ring_str;
118 }
119
120 /*
121 * add_haste:
122 * add a haste to the player
123 */
124
125 add_haste(blessed)
126 bool blessed;
127 {
128 int hasttime;
129
130 if (player.t_ctype == C_MONK) { /* monks cannot be slowed or hasted */
131 msg(nothing);
132 return;
133 }
134
135 if (blessed) hasttime = HASTETIME*2;
136 else hasttime = HASTETIME;
137
138 if (on(player, ISSLOW)) { /* Is person slow? */
139 extinguish(noslow);
140 noslow();
141
142 if (blessed) hasttime = HASTETIME/2;
143 else return;
144 }
145
146 if (on(player, ISHASTE)) {
147 msg("You faint from exhaustion.");
148 player.t_no_move += movement(&player) * rnd(hasttime);
149 player.t_action = A_FREEZE;
150 lengthen(nohaste, roll(hasttime,hasttime));
151 }
152 else {
153 msg("You feel yourself moving %sfaster.", blessed ? "much " : "");
154 turn_on(player, ISHASTE);
155 fuse(nohaste, 0, roll(hasttime, hasttime), AFTER);
156 }
157 }
158
159 /*
160 * Increase player's intelligence
161 */
162 void
163 add_intelligence(change)
164 int change;
165 {
166 int ring_str; /* Value of ring strengths */
167
168 /* Undo any ring changes */
169 ring_str = ring_value(R_ADDINTEL);
170 pstats.s_intel -= ring_str;
171
172 /* Now do the potion */
173 if (change < 0) msg("You feel slightly less intelligent now.");
174 else msg("You feel more intelligent now. What a mind!");
175
176 pstats.s_intel += change;
177 if (pstats.s_intel > 25) pstats.s_intel = 25;
178 else if (pstats.s_intel < 3) pstats.s_intel = 3;
179
180 /* Adjust the maximum */
181 if (max_stats.s_intel < pstats.s_intel)
182 max_stats.s_intel = pstats.s_intel;
183
184 /* Now put back the ring changes */
185 if (ring_str)
186 pstats.s_intel += ring_str;
187 }
188
189 /*
190 * this routine makes the hero move slower
191 */
192 add_slow()
193 {
194 /* monks cannot be slowed or hasted */
195 if (player.t_ctype == C_MONK || ISWEARING(R_FREEDOM)) {
196 msg(nothing);
197 return;
198 }
199
200 if (on(player, ISHASTE)) { /* Already sped up */
201 extinguish(nohaste);
202 nohaste();
203 }
204 else {
205 msg("You feel yourself moving %sslower.",
206 on(player, ISSLOW) ? "even " : "");
207 if (on(player, ISSLOW))
208 lengthen(noslow, roll(HASTETIME,HASTETIME));
209 else {
210 turn_on(player, ISSLOW);
211 fuse(noslow, 0, roll(HASTETIME,HASTETIME), AFTER);
212 }
213 }
214 }
215
216 /*
217 * Increase player's strength
218 */
219
220 void
221 add_strength(change)
222 int change;
223 {
224
225 if (change < 0) {
226 msg("You feel slightly weaker now.");
227 chg_str(change);
228 }
229 else {
230 msg("You feel stronger now. What bulging muscles!");
231 chg_str(change);
232 }
233 }
234
235 /*
236 * Increase player's wisdom
237 */
238
239 void
240 add_wisdom(change)
241 int change;
242 {
243 int ring_str; /* Value of ring strengths */
244
245 /* Undo any ring changes */
246 ring_str = ring_value(R_ADDWISDOM);
247 pstats.s_wisdom -= ring_str;
248
249 /* Now do the potion */
250 if (change < 0) msg("You feel slightly less wise now.");
251 else msg("You feel wiser now. What a sage!");
252
253 pstats.s_wisdom += change;
254 if (pstats.s_wisdom > 25) pstats.s_wisdom = 25;
255 else if (pstats.s_wisdom < 3) pstats.s_wisdom = 3;
256
257 /* Adjust the maximum */
258 if (max_stats.s_wisdom < pstats.s_wisdom)
259 max_stats.s_wisdom = pstats.s_wisdom;
260
261 /* Now put back the ring changes */
262 if (ring_str)
263 pstats.s_wisdom += ring_str;
264 }
265
266 quaff(which, kind, flags, is_potion)
267 int which;
268 int kind;
269 int flags;
270 bool is_potion;
271 {
272 register struct object *obj;
273 register struct linked_list *item, *titem;
274 register struct thing *th;
275 bool cursed, blessed;
276
277 blessed = FALSE;
278 cursed = FALSE;
279 item = NULL;
280
281 if (which < 0) { /* figure out which ourselves */
282 /* This is a potion. */
283 if (player.t_action != C_QUAFF) {
284 int units;
285
286 item = get_item(pack, "quaff", QUAFFABLE, FALSE, FALSE);
287
288 /*
289 * Make certain that it is somethings that we want to drink
290 */
291 if (item == NULL)
292 return;
293
294 /* How long does it take to quaff? */
295 units = usage_time(item);
296 if (units < 0) return;
297
298 player.t_using = item; /* Remember what it is */
299 player.t_no_move = units * movement(&player);
300 if ((OBJPTR(item))->o_type == POTION) player.t_action = C_QUAFF;
301 else player.t_action = C_USE;
302 return;
303 }
304
305 /* We have waited our time, let's quaff the potion */
306 item = player.t_using;
307 player.t_using = NULL;
308 player.t_action = A_NIL;
309
310 obj = OBJPTR(item);
311 /* remove it from the pack */
312 inpack--;
313 detach(pack, item);
314
315 flags = obj->o_flags;
316 which = obj->o_which;
317 kind = obj->o_kind;
318 }
319 cursed = flags & ISCURSED;
320 blessed = flags & ISBLESSED;
321
322 switch(which) {
323 case P_CLEAR:
324 if (cursed) {
325 confus_player();
326 }
327 else {
328 if (blessed) { /* Make player immune for the whole game */
329 extinguish(unclrhead); /* If we have a fuse, put it out */
330 msg("A strong blue aura surrounds your head.");
331 }
332 else { /* Just light a fuse for how long player is safe */
333 if (off(player, ISCLEAR)) {
334 fuse(unclrhead, 0, CLRDURATION, AFTER);
335 msg("A faint blue aura surrounds your head.");
336 }
337 else { /* If we have a fuse lengthen it, else we
338 * are permanently clear.
339 */
340 if (find_slot(unclrhead) == 0)
341 msg("Your blue aura continues to glow strongly.");
342 else {
343 lengthen(unclrhead, CLRDURATION);
344 msg("Your blue aura brightens for a moment.");
345 }
346 }
347 }
348 turn_on(player, ISCLEAR);
349 /* If player is confused, unconfuse him */
350 if (on(player, ISHUH)) {
351 extinguish(unconfuse);
352 unconfuse();
353 }
354 }
355 when P_HEALING:
356 if (cursed) {
357 msg("You feel worse now.");
358 pstats.s_hpt -= roll(pstats.s_lvl, char_class[player.t_ctype].hit_pts);
359 if (pstats.s_hpt <= 0)
360 death(D_POISON);
361 }
362 else {
363 if (blessed) {
364 pstats.s_hpt += roll(pstats.s_lvl+1, char_class[player.t_ctype].hit_pts);
365 if (pstats.s_hpt > max_stats.s_hpt)
366 pstats.s_hpt = ++max_stats.s_hpt;
367 if (on(player, ISHUH)) {
368 extinguish(unconfuse);
369 unconfuse();
370 }
371 }
372 else {
373 pstats.s_hpt += roll(pstats.s_lvl+1, char_class[player.t_ctype].hit_pts/2);
374 if (pstats.s_hpt > max_stats.s_hpt)
375 pstats.s_hpt = ++max_stats.s_hpt;
376 }
377 msg("You begin to feel %sbetter.",
378 blessed ? "much " : "");
379 sight();
380 if (is_potion) p_know[P_HEALING] = TRUE;