diff srogue/potions.c @ 36:2128c7dc8a40

Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author elwin
date Thu, 25 Nov 2010 12:21:41 +0000
parents
children 3aa87373c908
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srogue/potions.c	Thu Nov 25 12:21:41 2010 +0000
@@ -0,0 +1,323 @@
+/*
+ * Functions for dealing with potions
+ *
+ * @(#)potions.c	9.0	(rdk)	 7/17/84
+ *
+ * Super-Rogue
+ * Copyright (C) 1984 Robert D. Kindelberger
+ * All rights reserved.
+ *
+ * Based on "Rogue: Exploring the Dungeons of Doom"
+ * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
+ * All rights reserved.
+ *
+ * See the file LICENSE.TXT for full copyright and licensing information.
+ */
+
+#include "rogue.h"
+#include "rogue.ext"
+
+/*
+ * quaff:
+ *	Let the hero drink a potion
+ */
+quaff()
+{
+	reg struct object *obj;
+	reg struct linked_list *item, *titem;
+	reg struct thing *th;
+	reg int wh;
+	char buf[LINLEN];
+	bool bless, curse;
+
+	/*
+	 * Make certain that it is somethings that we want to drink
+	 */
+	if ((item = get_item("quaff", POTION)) == NULL)
+		return;
+	obj = OBJPTR(item);
+	if (obj->o_type != POTION) {
+		msg("That's undrinkable!");
+		after = FALSE;
+		return;
+	}
+	wh = obj->o_which;
+	bless = o_on(obj, ISBLESS);
+	curse = o_on(obj, ISCURSED);
+	del_pack(item);		/* get rid of it */
+
+	/*
+	 * Calculate the effect it has on the poor guy.
+	 */
+	switch(wh) {
+	case P_CONFUSE:
+		if (!bless) {
+			if (pl_on(ISINVINC))
+				msg("You remain level-headed.");
+			else {
+				chg_abil(WIS,-1,TRUE);		/* confuse his mind */
+				if (pl_off(ISHUH)) {
+					msg("Wait, what's going on here. Huh? What? Who?");
+					if (pl_on(ISHUH))
+						lengthen(unconfuse,rnd(8)+HUHDURATION);
+					else
+						fuse(unconfuse,TRUE,rnd(8)+HUHDURATION);
+					player.t_flags |= ISHUH;
+				}
+			}
+			p_know[P_CONFUSE] = TRUE;
+		}
+	when P_POISON:
+		if (!bless) {
+			if (pl_off(ISINVINC) && !iswearing(R_SUSTSTR) &&
+			  !iswearing(R_SUSAB)) {
+				chg_abil(CON,-1,TRUE);		
+				chg_abil(STR,-(rnd(3)+1),TRUE);
+				msg("You feel very sick now.");
+			}
+			else
+				msg("You feel momentarily sick.");
+			p_know[P_POISON] = TRUE;
+		}
+	when P_HEALING:
+		if (!curse) {
+			heal_self(4, TRUE);
+			msg("You begin to feel better.");
+			if (!iswearing(R_SLOW))
+				notslow(FALSE);
+			sight(FALSE);
+			p_know[P_HEALING] = TRUE;
+		}
+	when P_STRENGTH:
+		if (!curse) {
+			msg("You feel stronger, now.  What bulging muscles!");
+			chg_abil(STR,1,TRUE);
+			p_know[P_STRENGTH] = TRUE;
+		}
+	when P_MFIND:
+		/*
+		 * Potion of monster detection - find all monsters
+		 */
+		if (mlist != NULL && !curse) {
+			dispmons();
+			mpos = 0;
+			msg("You begin to sense the presence of monsters--More--");
+			p_know[P_MFIND] = TRUE;
+			wait_for(cw,' ');
+			msg("");		/* clear line */
+		}
+		else
+			msg("You have a strange feeling for a moment, then it passes.");
+	when P_TFIND:
+		/*
+		 * Potion of magic detection.  Show the potions and scrolls
+		 */
+		if (lvl_obj != NULL && !curse) {
+			struct linked_list *mobj;
+			struct object *tp;
+			bool show;
+
+			show = FALSE;
+			wclear(hw);
+			for (mobj = lvl_obj; mobj != NULL; mobj = next(mobj)) {
+				tp = OBJPTR(mobj);
+				if (is_magic(tp)) {
+					show = TRUE;
+					mvwaddch(hw, tp->o_pos.y, tp->o_pos.x, MAGIC);
+				}
+			}
+			for(titem = mlist; titem != NULL; titem = next(titem)) {
+				reg struct linked_list *pitem;
+
+				th = THINGPTR(titem);
+				for(pitem=th->t_pack;pitem!=NULL;pitem=next(pitem)) {
+					if (is_magic(ldata(pitem))) {
+						show = TRUE;
+						mvwaddch(hw,th->t_pos.y, th->t_pos.x, MAGIC);
+					}
+				}
+			}
+			if (show) {
+				msg("You begin to sense the presence of magic.");
+				overlay(hw,cw);
+				p_know[P_TFIND] = TRUE;
+				break;
+			}
+		}
+		msg("You have a strange feeling for a moment, then it passes.");
+	when P_PARALYZE:
+		if (!bless) {
+			if (pl_on(ISINVINC))
+				msg("You feel numb for a moment.");
+			else {
+				msg("You can't move.");
+				player.t_nocmd = HOLDTIME;
+			}
+			p_know[P_PARALYZE] = TRUE;
+		}
+	when P_SEEINVIS:
+		if (!curse) {
+			int invlen = roll(40,20);
+
+			msg("This potion tastes like %s juice.", fruit);
+			if (pl_off(CANSEE)) {
+				player.t_flags |= CANSEE;
+				fuse(unsee, TRUE, invlen);
+				light(&hero);
+			}
+			else
+				lengthen(unsee, invlen);
+			sight(FALSE);
+		}
+	when P_RAISE:
+		if (!curse) {
+			msg("You suddenly feel much more skillful.");
+			p_know[P_RAISE] = TRUE;
+			chg_abil(DEX,1,TRUE);
+			chg_abil(WIS,1,TRUE);
+			chg_abil(CON,1,TRUE);
+			raise_level();
+		}
+	when P_XHEAL:
+		if (!curse) {
+			heal_self(8, TRUE);
+			if (rnd(100) < 50)
+				chg_abil(CON,1,TRUE);
+			msg("You begin to feel much better.");
+			p_know[P_XHEAL] = TRUE;
+			if (!iswearing(R_SLOW))
+				notslow(FALSE);
+			unconfuse();
+			extinguish(unconfuse);
+			sight(FALSE);
+		}
+	when P_HASTE:
+		if (!curse) {
+			add_haste(TRUE);
+			msg("You feel yourself moving much faster.");
+			p_know[P_HASTE] = TRUE;
+		}
+	when P_INVINC:
+		if (!curse) {
+			int time = rnd(400) + 350;
+
+			msg("You feel invincible.");
+			if (player.t_flags & ISINVINC)
+				lengthen(notinvinc,time);
+			else
+				fuse(notinvinc,TRUE,time);
+			player.t_flags |= ISINVINC;
+			p_know[P_INVINC] = TRUE;
+		}
+	when P_SMART:
+		if (!curse) {
+			msg("You feel more perceptive.");
+			p_know[P_SMART] = TRUE;
+			chg_abil(WIS,1,TRUE);
+		}
+	when P_RESTORE:
+		if (!curse) {
+			msg("Hey, this tastes great. You feel warm all over.");
+			him->s_re = max_stats.s_re;
+			him->s_ef = max_stats.s_re;
+			ringabil();				/* add in rings */
+			updpack();				/* update weight */
+			p_know[P_RESTORE] = TRUE;
+			extinguish(rchg_str);	/* kill restore in from ulodyte */
+		}
+	when P_BLIND:
+		if (!bless) {
+			if (pl_on(ISINVINC))
+				msg("The light dims for a moment.");
+			else {
+				chg_abil(WIS,-1,TRUE);
+				msg("A cloak of darkness falls around you.");
+				if (pl_off(ISBLIND)) {
+					player.t_flags |= ISBLIND;
+					fuse(sight, TRUE, rnd(400) + 450);
+					light(&hero);
+				}
+			}
+			p_know[P_BLIND] = TRUE;
+		}
+	when P_ETH:
+		if (!curse) {
+			int ethlen = roll(40,20);
+
+			msg("You feel more vaporous.");
+			if (pl_on(ISETHER))
+				lengthen(noteth,ethlen);
+			else
+				fuse(noteth,TRUE,ethlen);
+			player.t_flags |= ISETHER;
+			p_know[P_ETH] = TRUE;
+		}
+	when P_NOP:
+		msg("This potion tastes extremely dull.");
+	when P_DEX:
+		if (!curse) {
+			chg_abil(DEX,1,TRUE);		/* increase dexterity */
+			p_know[P_DEX] = TRUE;
+			msg("You feel much more agile.");
+		}
+	when P_REGEN:
+		if (!curse) {
+			int reglen = rnd(450) + 450;
+
+			if (pl_on(ISREGEN))
+				lengthen(notregen, reglen);
+			else
+				fuse(notregen, TRUE, reglen);
+			player.t_flags |= ISREGEN;
+			msg("You feel yourself improved.");
+			p_know[P_REGEN] = TRUE;
+		}
+	when P_DECREP:
+	case P_SUPHERO: {
+		int howmuch = rnd(3) + 1;
+
+		if (wh == P_DECREP) {
+			if (!bless) {
+				if (iswearing(R_SUSAB) || pl_on(ISINVINC)) {
+					msg("You feel momentarily woozy.");
+					howmuch = 0;
+				}
+				else {
+					msg("You feel crippled.");
+					howmuch = -howmuch;
+					if (!iswearing(R_SUSTSTR))
+						chg_abil(STR,howmuch,TRUE);
+				}
+			}
+			else
+				howmuch = 0;
+		}
+		else {			/* potion of superhero */
+			if (curse)
+				howmuch = 0;
+			msg("You feel invigorated.");
+			chg_abil(STR,howmuch,TRUE);
+		}
+		chg_abil(CON,howmuch,TRUE);
+		chg_abil(DEX,howmuch,TRUE);
+		chg_abil(WIS,howmuch,TRUE);		/* change abilities */
+		p_know[wh] = TRUE;
+	}
+	otherwise:
+		msg("What an odd tasting potion!");
+		return;
+	}
+	nochange = FALSE;
+	if (p_know[wh] && p_guess[wh]) {
+		free(p_guess[wh]);
+		p_guess[wh] = NULL;
+	}
+	else if(!p_know[wh] && p_guess[wh] == NULL) {
+		strcpy(buf, p_colors[wh]);
+		msg(callit);
+		if (get_str(buf, cw) == NORM) {
+			p_guess[wh] = new(strlen(buf) + 1);
+			strcpy(p_guess[wh], buf);
+		}
+	}
+}