comparison 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
comparison
equal deleted inserted replaced
253:d9badb9c0179 256:c495a4f288c6
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 }