diff arogue7/encumb.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 f9ef86cf22b2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/arogue7/encumb.c	Fri May 08 15:24:40 2015 -0400
@@ -0,0 +1,207 @@
+/*
+ * encumb.c  -  Stuff to do with encumberence
+ *
+ * Advanced Rogue
+ * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T
+ * 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.
+ */
+
+/*
+ * Stuff to do with encumberence
+ *
+ */
+
+#include "curses.h"
+#include "rogue.h"
+
+/*
+ * updpack:
+ *	Update his pack weight and adjust fooduse accordingly
+ */
+updpack(getmax, tp)
+int getmax;
+struct thing *tp;
+{
+
+	reg int topcarry, curcarry;
+
+	if (getmax)
+	    tp->t_stats.s_carry = totalenc(tp);	/* get total encumb */
+	curcarry = packweight(tp);		/* get pack weight */
+
+	/* Only update food use for the player (for now) */
+	if (tp == &player) {
+	    topcarry = tp->t_stats.s_carry / 5;	/* 20% of total carry */
+	    if(curcarry > 4 * topcarry) {
+		if(rnd(100) < 80)
+		    foodlev = 3;			/* > 80% of pack */
+	    } else if(curcarry > 3 * topcarry) {
+		if(rnd(100) < 60)
+		    foodlev = 2;			/* > 60% of pack */
+	    } else
+		foodlev = 1;			/* <= 60% of pack */
+	}
+	tp->t_stats.s_pack = curcarry;		/* update pack weight */
+}
+
+
+/*
+ * packweight:
+ *	Get the total weight of the hero's pack
+ */
+packweight(tp)
+register struct thing *tp;
+{
+	reg struct object *obj;
+	reg struct linked_list *pc;
+	reg int weight;
+
+	weight = 0;
+	for (pc = tp->t_pack ; pc != NULL ; pc = next(pc)) {
+	    obj = OBJPTR(pc);
+	    weight += itemweight(obj);
+	}
+	if (weight < 0)		/* in case of amulet */
+	     weight = 0;
+
+	/* If this is the player, is he wearing a ring of carrying? */
+	if (tp == &player && ISWEARING(R_CARRY)) {
+	    register int temp, i;
+
+	    temp = 0;
+	    for (i=0; i<NUM_FINGERS; i++) {
+		if (cur_ring[i]->o_which == R_CARRY) {
+		    if (cur_ring[i]->o_flags & ISCURSED) temp--;
+		    else temp++;
+		}
+	    }
+	    weight -= (temp * weight) / 4;
+	}
+
+	return(weight);
+}
+
+
+/*
+ * itemweight:
+ *	Get the weight of an object
+ */
+itemweight(wh)
+reg struct object *wh;
+{
+	reg int weight;
+	reg int ac;
+
+	weight = wh->o_weight;		/* get base weight */
+	switch(wh->o_type) {
+	    case ARMOR:
+		/*
+		 * subtract 10% for each enchantment
+		 * this will add weight for negative items
+		 */
+		ac = armors[wh->o_which].a_class - wh->o_ac;
+		weight = ((weight*10) - (weight*ac)) / 10;
+		if (weight < 0) weight = 0;
+	    when WEAPON:
+		if ((wh->o_hplus + wh->o_dplus) > 0)
+			weight /= 2;
+	}
+	if(wh->o_flags & ISCURSED)
+		weight += weight / 5;	/* 20% more for cursed */
+        weight *= wh->o_count;
+	return(weight);
+}
+
+
+/*
+ * playenc:
+ *	Get hero's carrying ability above norm
+ */
+playenc(tp)
+register struct thing *tp;
+{
+	register int strength;
+
+	if (tp == &player) strength = str_compute();
+	else strength = tp->t_stats.s_str;
+
+	return ((strength-8)*50);
+}
+
+
+/*
+ * totalenc:
+ *	Get total weight that the hero can carry
+ */
+totalenc(tp)
+register struct thing *tp;
+{
+	reg int wtotal;
+
+	wtotal = NORMENCB + playenc(tp);
+	if (tp == &player) switch(hungry_state) {
+		case F_SATIATED:
+		case F_OKAY:
+		case F_HUNGRY:	;			/* no change */
+		when F_WEAK:	wtotal -= wtotal / 10;	/* 10% off weak */
+		when F_FAINT:	wtotal /= 2;		/* 50% off faint */
+	}
+	return(wtotal);
+}
+
+
+
+/*
+ * whgtchk:
+ *	See if the hero can carry his pack
+ */
+
+wghtchk()
+{
+	reg int dropchk, err = TRUE;
+	reg char ch;
+	int wghtchk();
+
+	inwhgt = TRUE;
+	if (pstats.s_pack > pstats.s_carry) {
+	    ch = CCHAR( mvwinch(stdscr, hero.y, hero.x) );
+	    if((ch != FLOOR && ch != PASSAGE)) {
+		extinguish(wghtchk);
+		fuse(wghtchk,TRUE,1,AFTER);
+		inwhgt = FALSE;
+		return;
+	    }
+	    extinguish(wghtchk);
+	    msg("Your pack is too heavy for you");
+	    do {
+		dropchk = drop(NULL);
+		if(dropchk == 0) {
+		    mpos = 0;
+		    msg("You must drop something");
+		}
+		if(dropchk == TRUE)
+		    err = FALSE;
+	    } while(err);
+	}
+	inwhgt = FALSE;
+}
+
+
+/*
+ * hitweight:
+ *	Gets the fighting ability according to current weight
+ * 	This returns a  +1 hit for light pack weight
+ * 			 0 hit for medium pack weight
+ *			-1 hit for heavy pack weight
+ */
+
+hitweight()
+{
+	return(2 - foodlev);
+}