diff srogue/pstats.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 94a0d9dd5ce1
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srogue/pstats.c	Thu Nov 25 12:21:41 2010 +0000
@@ -0,0 +1,377 @@
+/*
+ * Players status routines
+ *
+ * @(#)pstats.c	9.0	(rdk)	 7/17/84
+ *
+ * Super-Rogue
+ * Copyright (C) 1984 Robert D. Kindelberger
+ * All rights reserved.
+ *
+ * See the file LICENSE.TXT for full copyright and licensing information.
+ */
+
+#include "rogue.h"
+#include "rogue.ext"
+
+
+/*
+ * chg_hpt:
+ *	Changes players hit points
+ */
+chg_hpt(howmany, alsomax, what)
+int howmany;
+bool alsomax;
+char what;
+{
+	nochange = FALSE;
+	if(alsomax)
+		him->s_maxhp += howmany;
+	him->s_hpt += howmany;
+	if (him->s_hpt < 1) {
+		msg(" ");
+		death(what);
+	}
+}
+
+
+/*
+ * rchg_str:
+ *	Update the players real strength 
+ */
+rchg_str(amt)
+int amt;
+{
+	chg_abil(STR,amt,TRUE);
+}
+
+/*
+ * chg_abil:
+ *	Used to modify the hero's abilities
+ */
+chg_abil(what,amt,how)
+int amt, what, how;
+{
+	if (amt == 0)
+		return;
+	if (how == TRUE) {			/* real (must be 1st) */
+		updabil(what,amt,&pstats.s_re,TRUE);
+		how = FALSE;
+	}
+	updabil(what,amt,&pstats.s_ef,how);	/* effective */
+	updpack();
+	wghtchk(FALSE);
+}
+
+/*
+ * updabil:
+ *	Do the actual abilities updating
+ */
+updabil(what, amt, pst, how)
+struct real *pst;
+int what, amt, how;
+{
+	register int *wh, *mx, *mr;
+	struct real *mst, *msr;
+	bool is_str = FALSE;
+	int rtype;
+
+	msr = &him->s_re;
+	if (how == TRUE)				/* max real abilities */
+		mst = &max_stats.s_re;
+	else							/* max effective abil */
+		mst = &max_stats.s_ef;
+	switch (what) {
+		case STR:
+			is_str = TRUE;
+			wh = &pst->a_str;
+			mx = &mst->a_str;
+			mr = &msr->a_str;
+			rtype = R_ADDSTR;
+		when DEX:
+			wh = &pst->a_dex;
+			mx = &mst->a_dex;
+			mr = &msr->a_dex;
+			rtype = R_DEX;
+		when CON:
+			wh = &pst->a_con;
+			mx = &mst->a_con;
+			mr = &msr->a_con;
+			rtype = R_CONST;
+		when WIS:
+			wh = &pst->a_wis;
+			mx = &mst->a_wis;
+			mr = &msr->a_wis;
+			rtype = R_KNOW;
+		otherwise:
+			return;
+	}
+	*wh += amt;						/* update by amt */
+	if (amt < 0) {					/* if decrement */
+		if (*wh < MINABIL)			/* minimum = 3 */
+			*wh = MINABIL;
+		if (how == FALSE) {
+			if (*wh < *mr)			/* if less than real abil */
+				*wh = *mr;			/* make equal to real */
+		}
+	}
+	else {							/* increment */
+		int themax;
+
+		themax = MAXOTHER;				/* default maximum */
+		if (is_str)
+			themax = MAXSTR;			/* strength maximum */
+		if (how != TRUE)
+			themax += ringex(rtype);	/* get ring extra */
+		if (*wh > themax) {				/* see if > max (if real) */
+			*wh = themax;				/* max = 18  (24 if str) */
+		}
+		/*
+		 * Check for updating the max player stats.
+		 */
+		if (*wh > *mx)
+			*mx = *wh;
+	}
+}
+
+
+/*
+ * add_haste:
+ *	add a haste to the player
+ */
+add_haste(potion)
+bool potion;
+{
+	if (pl_on(ISHASTE)) {
+		msg("You faint from exhaustion.");
+		player.t_nocmd += rnd(8);
+		player.t_flags &= ~ISHASTE;
+		extinguish(nohaste);
+	}
+	else {
+		player.t_flags |= ISHASTE;
+		if (potion)
+			fuse(nohaste, TRUE, roll(10,10));
+		else
+			fuse(nohaste, TRUE, roll(40,20));
+	}
+}
+
+/*
+ * getpdex:
+ *	Gets players added dexterity for fighting
+ */
+getpdex(who, heave)
+struct stats *who;
+bool heave;
+{
+	reg int edex;
+
+	edex = who->s_ef.a_dex;
+	if (heave) {				/* an object was thrown here */
+		if (edex > 18)
+			return (edex - 15);
+		switch(edex) {
+			case 18: return 3;
+			case 17: return 2;
+			case 16: return 1;
+			case 15:
+			case 14:
+			case 13:
+			case 12:
+			case 11:
+			case 10:
+			case 9:
+			case 8:
+			case 7:
+			case 6: return 0;
+			case 5: return -1;
+			case 4: return -2;
+			default: return -3;
+		}
+	}
+	else {		/* object NOT thrown here (affects armor class) */
+		if (edex > 18)
+			return (14 - edex);
+		switch(edex) {
+			case 18: return -4;
+			case 17: return -3;
+			case 16: return -2;
+			case 15: return -1;
+			case 14:
+			case 13:
+			case 12:
+			case 11:
+			case 10:
+			case 9:
+			case 8: 
+			case 7: return 0;
+			case 6: return 1;
+			case 5: return 2;
+			case 4: return 3;
+			default: return 4;
+		}
+	}
+}
+
+/*
+ * getpwis:
+ *	Get a players wisdom for fighting
+ */
+getpwis(who)
+struct stats *who;
+{
+	reg int ewis;
+
+	ewis = who->s_ef.a_wis;
+	if (ewis > 18)
+		return (ewis - 14);
+	switch(ewis) {
+		case 18: return 4;
+		case 17: return 3;
+		case 16: return 2;
+		case 15: return 1;
+		case 14:
+		case 13:
+		case 12:
+		case 11:
+		case 10:
+		case 9:
+		case 8: return 0;
+		case 7:
+		case 6: return -1;
+		case 5:
+		case 4: return -2;
+		default: return -3;
+	}
+}
+
+/*
+ * getpcon:
+ *	Get added hit points from players constitution
+ */
+getpcon(who)
+struct stats *who;
+{
+	reg int econ;
+
+	econ = who->s_ef.a_con;
+	if (econ > 18)
+		return (econ - 14);
+	switch(econ) {
+		case 18: return 4;
+		case 17: return 3;
+		case 16: return 2;
+		case 15: return 1;
+		case 14:
+		case 13:
+		case 12:
+		case 11:
+		case 10:
+		case 9:
+		case 8:
+		case 7: return 0;
+		case 6:
+		case 5:
+		case 4: return -1;
+		default: return -2;
+	}
+}
+
+
+/*
+ * str_plus:
+ *	compute bonus/penalties for strength on the "to hit" roll
+ */
+str_plus(who)
+struct stats *who;
+{
+	reg int hitplus, str;
+
+	hitplus = 0;
+	str = who->s_ef.a_str;
+	if (str > 24)			/* > 24 */
+		hitplus = str - 21;
+	else if (str == 24)		/* 24 */
+		hitplus = 3;
+	else if (str > 20)		/* 21 to 23 */
+		hitplus = 2;
+	else if(str >= 17)		/* 17 to 20 */
+		hitplus = 1;
+	else if(str > 7)		/* 8 to 16 */
+		hitplus = 0;
+	else if(str > 5)		/* 6 to 7 */
+		hitplus = -1;
+	else if(str > 3)		/* 4 to 5 */
+		hitplus = -2;
+	else
+		hitplus = -3;		/* < 4 */
+	if (who == him)			/* add pack weight if hero */
+		hitplus += hitweight();
+	return hitplus;
+}
+
+
+/*
+ * add_dam:
+ *	Compute additional damage done depending on strength
+ */
+add_dam(who)
+struct stats *who;
+{
+	reg int exdam, str;
+
+	exdam = 0;
+	str = who->s_ef.a_str;
+	if (str > 24)			/* > 24 */
+		exdam = str - 18;
+	else if (str == 24)		/* 24 */
+		exdam = 6;
+	else if (str == 23)		/* 23 */
+		exdam = 5;
+	else if (str > 20)		/* 21 to 22 */
+		exdam = 4;
+	else if (str > 18)		/* 19 to 20 */
+		exdam = 3;
+	else if (str == 18)		/* 18 */
+		exdam = 2;
+	else if (str > 15)		/* 16 to 17 */
+		exdam = 1;
+	else if (str > 6)		/* 7 to 14 */
+		exdam = 0;
+	else
+		exdam = -1;			/* 3 to 6 */
+	if (who == him)
+		exdam += hungdam();		/* add hungry state if hero */
+	return exdam;
+}
+
+
+/*
+ * hungdam:
+ *	Calculate damage depending on players hungry state
+ */
+hungdam()
+{
+	switch (hungry_state) {
+		case F_OKAY:
+		case F_HUNGRY:	return 0;
+		when F_WEAK:	return -1;
+		when F_FAINT:	return -2;
+	}
+}
+
+/*
+ * heal_self:
+ *	Heal the hero.
+ */
+heal_self(factor, updmaxhp)
+int factor;
+bool updmaxhp;
+{
+	him->s_hpt += roll(him->s_lvl + getpcon(him), factor);
+	if (updmaxhp)
+		him->s_maxhp += 1;
+	if (him->s_hpt > him->s_maxhp)
+		him->s_hpt = him->s_maxhp;
+	nochange = FALSE;
+}