diff arogue5/encumb.c @ 63:0ed67132cf10

Import Advanced Rogue 5.8 from the Roguelike Restoration Project (r1490)
author elwin
date Thu, 09 Aug 2012 22:58:48 +0000
parents
children 56e748983fa8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/arogue5/encumb.c	Thu Aug 09 22:58:48 2012 +0000
@@ -0,0 +1,175 @@
+/*
+ * Stuff to do with encumberence
+ *
+ * Advanced Rogue
+ * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
+ * All rights reserved.
+ *
+ * Based on "Super-Rogue"
+ * Copyright (C) 1984 Robert D. Kindelberger
+ * All rights reserved.
+ *
+ * See the file LICENSE.TXT for full copyright and licensing information.
+ */
+
+#include "curses.h"
+#include "rogue.h"
+
+/*
+ * updpack:
+ *	Update his pack weight and adjust fooduse accordingly
+ */
+updpack(getmax)
+int getmax;
+{
+
+	reg int topcarry, curcarry;
+
+	if (getmax)
+	    pstats.s_carry = totalenc();	/* get total encumb */
+	curcarry = packweight();		/* get pack weight */
+	topcarry = pstats.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 */
+	pstats.s_pack = curcarry;		/* update pack weight */
+}
+
+
+/*
+ * packweight:
+ *	Get the total weight of the hero's pack
+ */
+packweight()
+{
+	reg struct object *obj;
+	reg struct linked_list *pc;
+	reg int weight;
+
+	weight = 0;
+	for(pc = pack ; pc != NULL ; pc = next(pc)) {
+	    obj = OBJPTR(pc);
+	    weight += itemweight(obj);
+	}
+	if(weight < 0)		/* in case of amulet */
+	     weight = 0;
+	if(ISWEARING(R_HEAVY))
+	    weight += 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()
+{
+	return ((str_compute()-8)*50);
+}
+
+
+/*
+ * totalenc:
+ *	Get total weight that the hero can carry
+ */
+totalenc()
+{
+	reg int wtotal;
+
+	wtotal = NORMENCB + playenc();
+	switch(hungry_state) {
+		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 == FALSE) {
+		    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);
+}