Mercurial > hg > early-roguelike
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 } |