Annotation of early-roguelike/arogue5/potions.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: * Function(s) for dealing with potions
3: *
4: * Advanced Rogue
5: * Copyright (C) 1984, 1985 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: #include "curses.h"
16: #include "rogue.h"
17: #include <stdlib.h>
18: #include <string.h>
19:
20: void res_intelligence(void);
21: void res_wisdom(void);
22:
23:
24: /*
25: * Increase player's constitution
26: */
27:
28: void
29: add_const(bool cursed)
30: {
31: /* Do the potion */
32: if (cursed) {
33: msg("You feel less healthy now.");
34: pstats.s_const--;
35: if (pstats.s_const <= 0)
36: death(D_CONSTITUTION);
37: }
38: else {
39: msg("You feel healthier now.");
40: pstats.s_const = min(pstats.s_const + 1, 25);
41: }
42:
43: /* Adjust the maximum */
44: if (max_stats.s_const < pstats.s_const)
45: max_stats.s_const = pstats.s_const;
46: }
47:
48: /*
49: * Increase player's dexterity
50: */
51:
52: void
53: add_dexterity(bool cursed)
54: {
55: int ring_str; /* Value of ring strengths */
56:
57: /* Undo any ring changes */
58: ring_str = ring_value(R_ADDHIT);
59: pstats.s_dext -= ring_str;
60:
61: /* Now do the potion */
62: if (cursed) {
63: msg("You feel less dextrous now.");
64: pstats.s_dext--;
65: }
66: else {
67: msg("You feel more dextrous now. Watch those hands!");
68: pstats.s_dext = min(pstats.s_dext + 1, 25);
69: }
70:
71: /* Adjust the maximum */
72: if (max_stats.s_dext < pstats.s_dext)
73: max_stats.s_dext = pstats.s_dext;
74:
75: /* Now put back the ring changes */
76: if (ring_str)
77: pstats.s_dext += ring_str;
78: }
79:
80: /*
81: * add_haste:
82: * add a haste to the player
83: */
84:
85: void
86: add_haste(bool blessed)
87: {
88: int hasttime;
89:
90: if (blessed) hasttime = HASTETIME*2;
91: else hasttime = HASTETIME;
92:
93: if (on(player, ISSLOW)) { /* Is person slow? */
94: extinguish(noslow);
95: noslow();
96:
97: if (blessed) hasttime = HASTETIME/2;
98: else return;
99: }
100:
101: if (on(player, ISHASTE)) {
102: msg("You faint from exhaustion.");
103: no_command += rnd(hasttime);
104: lengthen(nohaste, roll(hasttime,hasttime));
105: }
106: else {
107: turn_on(player, ISHASTE);
108: fuse(nohaste, 0, roll(hasttime, hasttime), AFTER);
109: }
110: }
111:
112: /*
113: * Increase player's intelligence
114: */
115: void
116: add_intelligence(bool cursed)
117: {
118: int ring_str; /* Value of ring strengths */
119:
120: /* Undo any ring changes */
121: ring_str = ring_value(R_ADDINTEL);
122: pstats.s_intel -= ring_str;
123:
124: /* Now do the potion */
125: if (cursed) {
126: msg("You feel slightly less intelligent now.");
127: pstats.s_intel--;
128: }
129: else {
130: msg("You feel more intelligent now. What a mind!");
131: pstats.s_intel = min(pstats.s_intel + 1, 25);
132: }
133:
134: /* Adjust the maximum */
135: if (max_stats.s_intel < pstats.s_intel)
136: max_stats.s_intel = pstats.s_intel;
137:
138: /* Now put back the ring changes */
139: if (ring_str)
140: pstats.s_intel += ring_str;
141: }
142:
143: /*
144: * this routine makes the hero move slower
145: */
146: void
147: add_slow(void)
148: {
149: if (on(player, ISHASTE)) { /* Already sped up */
150: extinguish(nohaste);
151: nohaste();
152: }
153: else {
154: msg("You feel yourself moving %sslower.",
155: on(player, ISSLOW) ? "even " : "");
156: if (on(player, ISSLOW))
157: lengthen(noslow, roll(HASTETIME,HASTETIME));
158: else {
159: turn_on(player, ISSLOW);
160: player.t_turn = TRUE;
161: fuse(noslow, 0, roll(HASTETIME,HASTETIME), AFTER);
162: }
163: }
164: }
165:
166: /*
167: * Increase player's strength
168: */
169:
170: void
171: add_strength(bool cursed)
172: {
173:
174: if (cursed) {
175: msg("You feel slightly weaker now.");
176: chg_str(-1);
177: }
178: else {
179: msg("You feel stronger now. What bulging muscles!");
180: chg_str(1);
181: }
182: }
183:
184: /*
185: * Increase player's wisdom
186: */
187:
188: void
189: add_wisdom(bool cursed)
190: {
191: int ring_str; /* Value of ring strengths */
192:
193: /* Undo any ring changes */
194: ring_str = ring_value(R_ADDWISDOM);
195: pstats.s_wisdom -= ring_str;
196:
197: /* Now do the potion */
198: if (cursed) {
199: msg("You feel slightly less wise now.");
200: pstats.s_wisdom--;
201: }
202: else {
203: msg("You feel wiser now. What a sage!");
204: pstats.s_wisdom = min(pstats.s_wisdom + 1, 25);
205: }
206:
207: /* Adjust the maximum */
208: if (max_stats.s_wisdom < pstats.s_wisdom)
209: max_stats.s_wisdom = pstats.s_wisdom;
210:
211: /* Now put back the ring changes */
212: if (ring_str)
213: pstats.s_wisdom += ring_str;
214: }
215:
216:
217: /*
218: * Lower a level of experience
219: */
220:
221: void
222: lower_level(short who)
223: {
224: int fewer, nsides = 0;
225:
226: if (--pstats.s_lvl == 0)
227: death(who); /* All levels gone */
228: msg("You suddenly feel less skillful.");
229: pstats.s_exp /= 2;
230: switch (player.t_ctype) {
231: case C_FIGHTER: nsides = HIT_FIGHTER;
232: when C_MAGICIAN:nsides = HIT_MAGICIAN;
233: when C_CLERIC: nsides = HIT_CLERIC;
234: when C_THIEF: nsides = HIT_THIEF;
235: }
236: fewer = max(1, roll(1,nsides) + const_bonus());
237: pstats.s_hpt -= fewer;
238: max_stats.s_hpt -= fewer;
239: if (pstats.s_hpt < 1)
240: pstats.s_hpt = 1;
241: if (max_stats.s_hpt < 1)
242: death(who);
243: }
244:
245: void
246: quaff(int which, int flag, bool is_potion)
247: {
248: register struct object *obj = NULL;
249: register struct linked_list *item, *titem;
250: register struct thing *th;
251: bool cursed, blessed;
252: char buf[LINELEN];
253:
254: blessed = FALSE;
255: cursed = FALSE;
256: item = NULL;
257:
258: if (which < 0) { /* figure out which ourselves */
259: item = get_item(pack, "quaff", POTION);
260: /*
261: * Make certain that it is somethings that we want to drink
262: */
263: if (item == NULL)
264: return;
265:
266: obj = OBJPTR(item);
267: /* remove it from the pack */
268: inpack--;
269: detach(pack, item);
270:
271: /*
272: * Calculate the effect it has on the poor guy.
273: */
274: cursed = (obj->o_flags & ISCURSED) != 0;
275: blessed = (obj->o_flags & ISBLESSED) != 0;
276:
277: which = obj->o_which;
278: }
279: else {
280: cursed = flag & ISCURSED;
281: blessed = flag & ISBLESSED;
282: }
283:
284: switch(which)
285: {
286: case P_CLEAR:
287: if (cursed) {
288: if (off(player, ISCLEAR))
289: {
290: msg("Wait, what's going on here. Huh? What? Who?");
291: if (find_slot(unconfuse))
292: lengthen(unconfuse, rnd(8)+HUHDURATION);
293: else
294: fuse(unconfuse, 0, rnd(8)+HUHDURATION, AFTER);
295: turn_on(player, ISHUH);
296: }
297: else msg("You feel dizzy for a moment, but it quickly passes.");
298: }
299: else {
300: if (blessed) { /* Make player immune for the whole game */
301: extinguish(unclrhead); /* If we have a fuse, put it out */
302: msg("A strong blue aura surrounds your head.");
303: }
304: else { /* Just light a fuse for how long player is safe */
305: if (off(player, ISCLEAR)) {
306: fuse(unclrhead, 0, CLRDURATION, AFTER);
307: msg("A faint blue aura surrounds your head.");
308: }
309: else { /* If we have a fuse lengthen it, else we
310: * are permanently clear.
311: */
312: if (find_slot(unclrhead) == FALSE)
313: msg("Your blue aura continues to glow strongly.");
314: else {
315: lengthen(unclrhead, CLRDURATION);
316: msg("Your blue aura brightens for a moment.");
317: }
318: }
319: }
320: turn_on(player, ISCLEAR);
321: /* If player is confused, unconfuse him */
322: if (on(player, ISHUH)) {
323: extinguish(unconfuse);
324: unconfuse();
325: }
326: }
327: when P_HEALING:
328: if (cursed) {
329: if (!save(VS_POISON, &player, 0)) {
330: msg("You feel very sick now.");
331: pstats.s_hpt /= 2;
332: pstats.s_const--;
333: if (pstats.s_const <= 0 || pstats.s_hpt <= 0)
334: death(D_POISON);
335: }
336: else msg("You feel momentarily sick.");
337: }
338: else {
339: if (blessed) {
340: if ((pstats.s_hpt += roll(pstats.s_lvl, 8)) > max_stats.s_hpt)
341: pstats.s_hpt = ++max_stats.s_hpt;
342: if (on(player, ISHUH)) {
343: extinguish(unconfuse);
344: unconfuse();
345: }
346: }
347: else {
348: if ((pstats.s_hpt += roll(pstats.s_lvl, 4)) > max_stats.s_hpt)
349: pstats.s_hpt = ++max_stats.s_hpt;
350: }
351: msg("You begin to feel %sbetter.",
352: blessed ? "much " : "");
353: sight();
354: if (is_potion) p_know[P_HEALING] = TRUE;
355: }
356: when P_ABIL:
357: {
358: int ctype;
359:
360: /*
361: * if blessed then fix all attributes
362: */
363: if (blessed) {
364: add_intelligence(FALSE);
365: add_dexterity(FALSE);
366: add_strength(FALSE);
367: add_wisdom(FALSE);
368: add_const(FALSE);
369: }
370: /* probably will be own ability */
371: else {
372: if (rnd(100) < 70)
373: ctype = player.t_ctype;
374: else do {
375: ctype = rnd(4);
376: } while (ctype == player.t_ctype);
377:
378: /* Small chance of doing constitution instead */
379: if (rnd(100) < 10)
380: add_const(cursed);
381: else switch (ctype) {
382: case C_FIGHTER: add_strength(cursed);
383: when C_MAGICIAN: add_intelligence(cursed);
384: when C_CLERIC: add_wisdom(cursed);
385: when C_THIEF: add_dexterity(cursed);
386: otherwise: msg("You're a strange type!");
387: }
388: }
389: if (is_potion) p_know[P_ABIL] = TRUE;
390: }
391: when P_MFIND:
392: /*
393: * Potion of monster detection, if there are monters, detect them
394: */
395: if (mlist != NULL)
396: {
397: overlay(mw, cw);
398: draw(cw);
399: msg("You begin to sense the presence of monsters.%s", morestr);
400: draw(msgw);
401: wait_for(cw,' ');
402: msg("");
403: if (is_potion) p_know[P_MFIND] = TRUE;
404: }
405: else
406: msg("You have a strange feeling for a moment, then it passes.");
407: when P_TFIND:
408: /*
409: * Potion of magic detection. Show the potions and scrolls
410: */
411: if (lvl_obj != NULL)
412: {
413: register struct linked_list *mobj;
414: register struct object *tp;
415: bool show;
416:
417: show = FALSE;
418: wclear(hw);
419: for (mobj = lvl_obj; mobj != NULL; mobj = next(mobj)) {
420: tp = OBJPTR(mobj);
421: if (is_magic(tp)) {
422: char mag_type=MAGIC;
423:
424: /* Mark cursed items or bad weapons */
425: if ((tp->o_flags & ISCURSED) ||
426: (tp->o_type == WEAPON &&
427: (tp->o_hplus < 0 || tp->o_dplus < 0)))
428: mag_type = CMAGIC;
429: else if ((tp->o_flags & ISBLESSED) ||
430: (tp->o_type == WEAPON &&
431: (tp->o_hplus > 0 || tp->o_dplus > 0)))
432: mag_type = BMAGIC;
433: show = TRUE;
434: mvwaddch(hw, tp->o_pos.y, tp->o_pos.x, mag_type);
435: }
436: if (is_potion) p_know[P_TFIND] = TRUE;
437: }
438: for (titem = mlist; titem != NULL; titem = next(titem)) {
439: register struct linked_list *pitem;
440:
441: th = THINGPTR(titem);
442: for(pitem = th->t_pack; pitem != NULL; pitem = next(pitem)){
443: tp = OBJPTR(pitem);
444: if (is_magic(tp)) {
445: char mag_type=MAGIC;
446:
447: /* Mark cursed items or bad weapons */
448: if ((tp->o_flags & ISCURSED) ||
449: (tp->o_type == WEAPON &&
450: (tp->o_hplus < 0 || tp->o_dplus < 0)))
451: mag_type = CMAGIC;
452: else if ((tp->o_flags & ISBLESSED) ||
453: (tp->o_type == WEAPON &&
454: (tp->o_hplus > 0 || tp->o_dplus > 0)))
455: mag_type = BMAGIC;
456: show = TRUE;
457: mvwaddch(hw, th->t_pos.y, th->t_pos.x, mag_type);
458: }
459: if (is_potion) p_know[P_TFIND] = TRUE;
460: }
461: }
462: if (show) {
463: overlay(hw,cw);
464: draw(cw);
465: msg("You sense the presence of magic on this level.%s",
466: morestr);
467: draw(msgw);
468: wait_for(cw,' ');
469: msg("");
470: break;
471: }
472: }
473: msg("You have a strange feeling for a moment, then it passes.");
474: when P_SEEINVIS:
475: if (cursed) {
476: if (!find_slot(sight))
477: {
478: msg("A cloak of darkness falls around you.");
479: turn_on(player, ISBLIND);
480: fuse(sight, 0, SEEDURATION, AFTER);
481: light(&hero);
482: }
483: else
484: lengthen(sight, SEEDURATION);
485: }
486: else {
487: if (off(player, CANSEE)) {
488: turn_on(player, CANSEE);
489: msg("Your eyes begin to tingle.");
490: fuse(unsee, 0, blessed ? SEEDURATION*3 :SEEDURATION, AFTER);
491: light(&hero);
492: }
493: else if (find_slot(unsee) != FALSE)
494: lengthen(unsee, blessed ? SEEDURATION*3 : SEEDURATION);
495: sight();
496: }
497: when P_PHASE:
498: if (cursed) {
499: msg("You can't move.");
500: no_command = FREEZETIME;
501: }
502: else {
503: int duration;
504:
505: if (blessed) duration = 3;
506: else duration = 1;
507:
508: if (on(player, CANINWALL))
509: lengthen(unphase, duration*PHASEDURATION);
510: else {
511: fuse(unphase, 0, duration*PHASEDURATION, AFTER);
512: turn_on(player, CANINWALL);
513: }
514: msg("You feel %slight-headed!",
515: blessed ? "very " : "");
516: }
517: when P_FLY: {
518: int duration;
519: bool say_message;
520:
521: say_message = TRUE;
522:
523: if (blessed) duration = 3;
524: else duration = 1;
525:
526: if (on(player, ISFLY)) {
527: if (find_slot(land))
528: lengthen(land, duration*FLYTIME);
529: else {
530: msg("Nothing happens."); /* Flying by cloak */
531: say_message = FALSE;
532: }
533: }
534: else {
535: fuse(land, 0, duration*FLYTIME, AFTER);
536: turn_on(player, ISFLY);
537: }
538: if (say_message)
539: msg("You feel %slighter than air!", blessed ? "much " : "");
540: }
541: when P_RAISE:
542: if (cursed) lower_level(D_POTION);
543: else {
544: msg("You suddenly feel %smore skillful",
545: blessed ? "much " : "");
546: p_know[P_RAISE] = TRUE;
547: raise_level(TRUE);
548: if (blessed) raise_level(TRUE);
549: }
550: when P_HASTE:
551: if (cursed) { /* Slow player down */
552: add_slow();
553: }
554: else {
555: if (off(player, ISSLOW))
556: msg("You feel yourself moving %sfaster.",
557: blessed ? "much " : "");
558: add_haste(blessed);
559: if (is_potion) p_know[P_HASTE] = TRUE;
560: }
561: when P_RESTORE: {
562: register int i;
563:
564: msg("Hey, this tastes great. It make you feel warm all over.");
565: if (lost_str) {
566: extinguish(res_strength);
567: lost_str = 0;
568: }
569: for (i=0; i<lost_dext; i++)
570: extinguish(un_itch);
571: lost_dext = 0;
572: res_strength();
573: res_wisdom();
574: res_dexterity(0);
575: res_intelligence();
576: pstats.s_const = max_stats.s_const;
577: }
578: when P_INVIS:
579: if (off(player, ISINVIS)) {
580: turn_on(player, ISINVIS);
581: msg("You have a tingling feeling all over your body");
582: fuse(appear, 0, blessed ? GONETIME*3 : GONETIME, AFTER);
583: PLAYER = IPLAYER;
584: light(&hero);
585: }
586: else {
587: if (find_slot(appear)) {
588: msg("Your tingling feeling surges.");
589: lengthen(appear, blessed ? GONETIME*3 : GONETIME);
590: }
591: else msg("Nothing happens."); /* Using cloak */
592: }
593:
594: otherwise:
595: msg("What an odd tasting potion!");
596: return;
597: }
598: status(FALSE);
599: if (is_potion && p_know[which] && p_guess[which])
600: {
601: free(p_guess[which]);
602: p_guess[which] = NULL;
603: }
604: else if (is_potion &&
605: !p_know[which] &&
606: askme &&
607: (obj->o_flags & ISKNOW) == 0 &&
608: (obj->o_flags & ISPOST) == 0 &&
609: p_guess[which] == NULL)
610: {
611: msg(terse ? "Call it: " : "What do you want to call it? ");
612: if (get_str(buf, msgw) == NORM)
613: {
614: p_guess[which] = new((unsigned int) strlen(buf) + 1);
615: strcpy(p_guess[which], buf);
616: }
617: }
618: if (item != NULL) o_discard(item);
619: updpack(TRUE);
620: }
621:
622:
623: /*
624: * res_dexterity:
625: * Restore player's dexterity
626: * if called with zero the restore fully
627: */
628:
629: void
630: res_dexterity(int howmuch)
631: {
632: short save_max;
633: int ring_str;
634:
635: /* Discount the ring value */
636: ring_str = ring_value(R_ADDHIT);
637: pstats.s_dext -= ring_str;
638:
639: if (pstats.s_dext < max_stats.s_dext ) {
640: if (howmuch == 0)
641: pstats.s_dext = max_stats.s_dext;
642: else
643: pstats.s_dext = min(pstats.s_dext+howmuch, max_stats.s_dext);
644: }
645:
646: /* Redo the rings */
647: if (ring_str) {
648: save_max = max_stats.s_dext;
649: pstats.s_dext += ring_str;
650: max_stats.s_dext = save_max;
651: }
652: }
653:
654:
655: /*
656: * res_intelligence:
657: * Restore player's intelligence
658: */
659:
660: void
661: res_intelligence(void)
662: {
663: short save_max;
664: int ring_str;
665:
666: /* Discount the ring value */
667: ring_str = ring_value(R_ADDINTEL);
668: pstats.s_intel -= ring_str;
669:
670: if (pstats.s_intel < max_stats.s_intel ) pstats.s_intel = max_stats.s_intel;
671:
672: /* Redo the rings */
673: if (ring_str) {
674: save_max = max_stats.s_intel;
675: pstats.s_intel += ring_str;
676: max_stats.s_intel = save_max;
677: }
678: }
679:
680: /*
681: * res_wisdom:
682: * Restore player's wisdom
683: */
684:
685: void
686: res_wisdom(void)
687: {
688: short save_max;
689: int ring_str;
690:
691: /* Discount the ring value */
692: ring_str = ring_value(R_ADDWISDOM);
693: pstats.s_wisdom -= ring_str;
694:
695: if (pstats.s_wisdom < max_stats.s_wisdom )
696: pstats.s_wisdom = max_stats.s_wisdom;
697:
698: /* Redo the rings */
699: if (ring_str) {
700: save_max = max_stats.s_wisdom;
701: pstats.s_wisdom += ring_str;
702: max_stats.s_wisdom = save_max;
703: }
704: }
CVSweb