diff srogue/encumb.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/encumb.c	Thu Nov 25 12:21:41 2010 +0000
@@ -0,0 +1,237 @@
+/*
+ * Stuff to do with encumberence
+ *
+ * @(#)encumb.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"
+
+/*
+ * updpack:
+ *	Update his pack weight and adjust fooduse accordingly
+ */
+updpack()
+{
+	reg int topcarry, curcarry;
+
+	him->s_carry = totalenc();			/* get total encumb */
+	curcarry = packweight();			/* get pack weight */
+	topcarry = him->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 */
+	him->s_pack = curcarry;				/* update pack weight */
+	packvol = pack_vol();				/* update pack volume */
+	nochange = FALSE;					/* also change display */
+}
+
+
+/*
+ * packweight:
+ *	Get the total weight of the hero's pack
+ */
+packweight()
+{
+	reg struct object *obj;
+	reg struct linked_list *pc;
+	reg int weight, i;
+
+	weight = 0;
+	for (pc = pack ; pc != NULL ; pc = next(pc)) {
+		obj = OBJPTR(pc);
+		weight += itemweight(obj) * obj->o_count;
+	}
+	if (weight < 0)		/* in case of amulet */
+		 weight = 0;
+	for (i = LEFT; i <= RIGHT; i += 1) {
+		obj = cur_ring[i];
+		if (obj != NULL) {
+			if (obj->o_type == R_HEAVY && o_off(obj, ISBLESS))
+				weight += weight / 4;
+		}
+	}
+	return weight;
+}
+
+
+/*
+ * itemweight:
+ *	Get the weight of an object
+ */
+itemweight(wh)
+struct object *wh;
+{
+	reg int weight;
+
+	weight = wh->o_weight;		/* get base weight */
+	switch (wh->o_type) {
+		case ARMOR:
+			if ((armors[wh->o_which].a_class - wh->o_ac) > 0)
+				weight /= 2;
+		when WEAPON:
+			if ((wh->o_hplus + wh->o_dplus) > 0)
+				weight /= 2;
+	}
+	if (o_on(wh,ISCURSED))
+		weight += weight / 5;	/* 20% more for cursed */
+	if (o_on(wh, ISBLESS))
+		weight -= weight / 5;	/* 20% less for blessed */
+	return weight;
+}
+
+/*
+ * pack_vol:
+ *	Get the total volume of the hero's pack
+ */
+pack_vol()
+{
+	reg struct object *obj;
+	reg struct linked_list *pc;
+	reg int volume;
+
+	volume = 0;
+	for (pc = pack ; pc != NULL ; pc = next(pc)) {
+		obj = OBJPTR(pc);
+		volume += itemvol(obj);
+	}
+	return volume;
+}
+
+/*
+ * itemvol:
+ *	Get the volume of an object
+ */
+itemvol(wh)
+struct object *wh;
+{
+	reg int volume, what, extra;
+
+	extra = 0;
+	what = getindex(wh->o_type);
+	switch (wh->o_type) {
+		case ARMOR:		extra = armors[wh->o_which].a_vol;
+		when WEAPON:	extra = weaps[wh->o_which].w_vol;
+		when STICK:		if (strcmp(ws_stuff[wh->o_which].ws_type,"staff") == 0)
+							extra = V_WS_STAFF;
+						else
+							extra = V_WS_WAND;
+	}
+	volume = thnginfo[what].mf_vol + extra;
+	volume *= wh->o_count;
+	return volume;
+}
+
+/*
+ * playenc:
+ *	Get hero's carrying ability above norm
+ */
+playenc()
+{
+	reg estr = him->s_ef.a_str;
+	if (estr >= 24)
+		return 3000;
+	switch(him->s_ef.a_str) {
+		case 23: return 2000;
+		case 22: return 1500;
+		case 21: return 1250;
+		case 20: return 1100;
+		case 19: return 1000;
+		case 18: return 700;
+		case 17: return 500;
+		case 16: return 350;
+		case 15:
+		case 14: return 200;
+		case 13:
+		case 12: return 100;
+		case 11:
+		case 10:
+		case  9:
+		case  8: return 0;
+		case  7:
+		case  6: return -150;
+		case  5:
+		case  4: return -250;
+	}
+	return -350;
+}
+
+
+/*
+ * 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(fromfuse)
+int fromfuse;
+{
+	reg int dropchk, err = TRUE;
+	reg char ch;
+
+	inwhgt = TRUE;
+	if (him->s_pack > him->s_carry) {
+		ch = player.t_oldch;
+		extinguish(wghtchk);
+		if ((ch != FLOOR && ch != PASSAGE) || isfight) {
+			fuse(wghtchk, TRUE, 1);
+			inwhgt = FALSE;
+			return;
+		}
+		msg("Your pack is too heavy for you.");
+		do {
+			dropchk = drop(NULL);
+			if (dropchk == SOMTHERE)
+				err = FALSE;
+			else 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);
+}