diff urogue/encumb.c @ 256:c495a4f288c6

Import UltraRogue from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 31 Jan 2017 19:56:04 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/urogue/encumb.c	Tue Jan 31 19:56:04 2017 -0500
@@ -0,0 +1,185 @@
+/*
+    encumb.c - Stuff to do with encumberance
+ 
+    UltraRogue: The Ultimate Adventure in the Dungeons of Doom
+    Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
+    All rights reserved.
+
+    Based on "Advanced Rogue"
+    Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
+    All rights reserved.
+
+    See the file LICENSE.TXT for full copyright and licensing information.
+*/
+
+#include "rogue.h"
+
+/*
+    updpack()
+        Update his pack weight and adjust fooduse accordingly
+*/
+
+void
+updpack(void)
+{
+    int curcarry = packweight();
+
+    pstats.s_carry = totalenc();    /* update max encumb */
+
+    if (is_carrying(TR_PURSE))
+        pstats.s_carry += 1000;
+
+    foodlev = 0;
+
+    switch ((curcarry * 5) / pstats.s_carry)   /* % of total capacity */
+    {
+        case 5:     /* 100 % */
+            foodlev++;
+
+        case 4:     /* 80 % */
+            if (rnd(100) < 80)
+                foodlev++;
+
+        case 3:     /* 60 % */
+            if (rnd(100) < 60)
+                foodlev++;
+
+        case 2:     /* 40 % */
+            if (rnd(100) < 40)
+                foodlev++;
+
+        case 1:     /* 20 % */
+            if (rnd(100) < 20)
+                foodlev++;
+
+        case 0:     /* 0 % */
+            foodlev++;
+    }
+
+    pstats.s_pack = curcarry;   /* update pack weight */
+
+    if (is_carrying(TR_PURSE))  /* makes pack lighter */
+        foodlev--;
+}
+
+
+/*
+    packweight()
+        Get the total weight of the hero's pack
+*/
+
+int
+packweight(void)
+{
+    struct linked_list  *pc;
+    int weight = 0;
+
+    for (pc = pack; pc != NULL; pc = next(pc))
+    {
+        struct object   *obj = OBJPTR(pc);
+
+        weight += itemweight(obj) * obj->o_count;
+    }
+
+    if (weight < 0)     /* caused by artifacts or blessed items */
+        weight = 0;
+
+    return (weight);
+}
+
+
+/*
+    itemweight()
+        Get the weight of an object
+*/
+
+int
+itemweight(struct object *wh)
+{
+    int weight = wh->o_weight;  /* get base weight */
+    int ac;
+
+    switch (wh->o_type)
+    {
+        case ARMOR:  /* 10% for each plus or minus*/
+            ac = armors[wh->o_which].a_class - wh->o_ac;
+            weight *= (10 - ac) / 10;
+            break;
+
+        case WEAPON:
+            if ((wh->o_hplus + wh->o_dplus) > 0)
+                weight /= 2;
+    }
+
+    if (wh->o_flags & ISCURSED)
+        weight += weight / 2;   /* +50% for cursed */
+    else if (wh->o_flags & ISBLESSED)
+        weight -= weight / 5;   /* -20% for blessed */
+
+    if (weight < 0)
+        weight = 0;
+
+    return (weight);
+}
+
+
+/*
+    playenc()
+        Get hero's carrying ability above norm 50 units per point of STR
+        over 10, 300 units per plus on R_CARRYING 1000 units for TR_PURSE
+*/
+
+int
+playenc(void)
+{
+    int ret_val = (pstats.s_str - 10) * 50;
+
+    if (is_wearing(R_CARRYING))
+        ret_val += ring_value(R_CARRYING) * 300;
+
+    return (ret_val);
+}
+
+
+/*
+    totalenc()
+        Get total weight that the hero can carry
+*/
+
+int
+totalenc(void)
+{
+    int wtotal = 1400 + playenc();
+
+    switch (hungry_state)
+    {
+        case F_OK:
+        case F_HUNGRY: /* no change */
+            break;
+
+        case F_WEAK:
+            wtotal -= wtotal / 4;  /* 25% off weak */
+            break;
+
+        case F_FAINT:
+            wtotal /= 2;    /* 50% off faint */
+            break;
+    }
+
+    return (wtotal);
+}
+
+
+/*
+    hitweight()
+        Gets the fighting ability according to current weight This
+        returns a  +2 hit for very light pack weight, +1 hit
+        for light pack weight, 0 hit for medium pack weight, -1 hit for heavy
+        pack weight, -2 hit for very heavy pack weight
+*/
+
+int
+hitweight(void)
+{
+    return(3 - foodlev);
+}