Annotation of early-roguelike/urogue/encumb.c, Revision 1.1.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