Annotation of early-roguelike/urogue/encumb.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: encumb.c - Stuff to do with encumberance
! 3:
! 4: UltraRogue: The Ultimate Adventure in the Dungeons of Doom
! 5: Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
! 6: All rights reserved.
! 7:
! 8: Based on "Advanced Rogue"
! 9: Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
! 10: All rights reserved.
! 11:
! 12: See the file LICENSE.TXT for full copyright and licensing information.
! 13: */
! 14:
! 15: #include "rogue.h"
! 16:
! 17: /*
! 18: updpack()
! 19: Update his pack weight and adjust fooduse accordingly
! 20: */
! 21:
! 22: void
! 23: updpack(void)
! 24: {
! 25: int curcarry = packweight();
! 26:
! 27: pstats.s_carry = totalenc(); /* update max encumb */
! 28:
! 29: if (is_carrying(TR_PURSE))
! 30: pstats.s_carry += 1000;
! 31:
! 32: foodlev = 0;
! 33:
! 34: switch ((curcarry * 5) / pstats.s_carry) /* % of total capacity */
! 35: {
! 36: case 5: /* 100 % */
! 37: foodlev++;
! 38:
! 39: case 4: /* 80 % */
! 40: if (rnd(100) < 80)
! 41: foodlev++;
! 42:
! 43: case 3: /* 60 % */
! 44: if (rnd(100) < 60)
! 45: foodlev++;
! 46:
! 47: case 2: /* 40 % */
! 48: if (rnd(100) < 40)
! 49: foodlev++;
! 50:
! 51: case 1: /* 20 % */
! 52: if (rnd(100) < 20)
! 53: foodlev++;
! 54:
! 55: case 0: /* 0 % */
! 56: foodlev++;
! 57: }
! 58:
! 59: pstats.s_pack = curcarry; /* update pack weight */
! 60:
! 61: if (is_carrying(TR_PURSE)) /* makes pack lighter */
! 62: foodlev--;
! 63: }
! 64:
! 65:
! 66: /*
! 67: packweight()
! 68: Get the total weight of the hero's pack
! 69: */
! 70:
! 71: int
! 72: packweight(void)
! 73: {
! 74: struct linked_list *pc;
! 75: int weight = 0;
! 76:
! 77: for (pc = pack; pc != NULL; pc = next(pc))
! 78: {
! 79: struct object *obj = OBJPTR(pc);
! 80:
! 81: weight += itemweight(obj) * obj->o_count;
! 82: }
! 83:
! 84: if (weight < 0) /* caused by artifacts or blessed items */
! 85: weight = 0;
! 86:
! 87: return (weight);
! 88: }
! 89:
! 90:
! 91: /*
! 92: itemweight()
! 93: Get the weight of an object
! 94: */
! 95:
! 96: int
! 97: itemweight(struct object *wh)
! 98: {
! 99: int weight = wh->o_weight; /* get base weight */
! 100: int ac;
! 101:
! 102: switch (wh->o_type)
! 103: {
! 104: case ARMOR: /* 10% for each plus or minus*/
! 105: ac = armors[wh->o_which].a_class - wh->o_ac;
! 106: weight *= (10 - ac) / 10;
! 107: break;
! 108:
! 109: case WEAPON:
! 110: if ((wh->o_hplus + wh->o_dplus) > 0)
! 111: weight /= 2;
! 112: }
! 113:
! 114: if (wh->o_flags & ISCURSED)
! 115: weight += weight / 2; /* +50% for cursed */
! 116: else if (wh->o_flags & ISBLESSED)
! 117: weight -= weight / 5; /* -20% for blessed */
! 118:
! 119: if (weight < 0)
! 120: weight = 0;
! 121:
! 122: return (weight);
! 123: }
! 124:
! 125:
! 126: /*
! 127: playenc()
! 128: Get hero's carrying ability above norm 50 units per point of STR
! 129: over 10, 300 units per plus on R_CARRYING 1000 units for TR_PURSE
! 130: */
! 131:
! 132: int
! 133: playenc(void)
! 134: {
! 135: int ret_val = (pstats.s_str - 10) * 50;
! 136:
! 137: if (is_wearing(R_CARRYING))
! 138: ret_val += ring_value(R_CARRYING) * 300;
! 139:
! 140: return (ret_val);
! 141: }
! 142:
! 143:
! 144: /*
! 145: totalenc()
! 146: Get total weight that the hero can carry
! 147: */
! 148:
! 149: int
! 150: totalenc(void)
! 151: {
! 152: int wtotal = 1400 + playenc();
! 153:
! 154: switch (hungry_state)
! 155: {
! 156: case F_OK:
! 157: case F_HUNGRY: /* no change */
! 158: break;
! 159:
! 160: case F_WEAK:
! 161: wtotal -= wtotal / 4; /* 25% off weak */
! 162: break;
! 163:
! 164: case F_FAINT:
! 165: wtotal /= 2; /* 50% off faint */
! 166: break;
! 167: }
! 168:
! 169: return (wtotal);
! 170: }
! 171:
! 172:
! 173: /*
! 174: hitweight()
! 175: Gets the fighting ability according to current weight This
! 176: returns a +2 hit for very light pack weight, +1 hit
! 177: for light pack weight, 0 hit for medium pack weight, -1 hit for heavy
! 178: pack weight, -2 hit for very heavy pack weight
! 179: */
! 180:
! 181: int
! 182: hitweight(void)
! 183: {
! 184: return(3 - foodlev);
! 185: }
CVSweb