… | |
… | |
160 | * The args are num D size (ie 4d6) [garbled 20010916] |
160 | * The args are num D size (ie 4d6) [garbled 20010916] |
161 | */ |
161 | */ |
162 | int |
162 | int |
163 | die_roll (int num, int size, const object *op, int goodbad) |
163 | die_roll (int num, int size, const object *op, int goodbad) |
164 | { |
164 | { |
165 | int min, luck, total, i, gotlucky; |
165 | int min_roll, luck, total, i, gotlucky; |
166 | |
166 | |
167 | int diff = size; |
167 | int diff = size; |
168 | min = 1; |
168 | min_roll = 1; |
169 | luck = total = gotlucky = 0; |
169 | luck = total = gotlucky = 0; |
170 | int base = diff > 2 ? 20 : 50; /* d2 and d3 are corner cases */ |
170 | int base = diff > 2 ? 20 : 50; /* d2 and d3 are corner cases */ |
171 | |
171 | |
172 | if (size < 2 || diff < 1) |
172 | if (size < 2 || diff < 1) |
173 | { |
173 | { |
… | |
… | |
178 | if (op->type == PLAYER) |
178 | if (op->type == PLAYER) |
179 | luck = op->stats.luck; |
179 | luck = op->stats.luck; |
180 | |
180 | |
181 | for (i = 0; i < num; i++) |
181 | for (i = 0; i < num; i++) |
182 | { |
182 | { |
183 | if (rndm (base) < MIN (10, abs (luck)) && !gotlucky) |
183 | if (rndm (base) < min (10, abs (luck)) && !gotlucky) |
184 | { |
184 | { |
185 | /* we have a winner */ |
185 | /* we have a winner */ |
186 | gotlucky++; |
186 | gotlucky++; |
187 | ((luck > 0) ? (luck = 1) : (luck = -1)); |
187 | ((luck > 0) ? (luck = 1) : (luck = -1)); |
188 | diff -= luck; |
188 | diff -= luck; |
189 | if (diff < 1) |
189 | if (diff < 1) |
190 | return (num); /*check again */ |
190 | return (num); /*check again */ |
191 | ((goodbad) ? (min += luck) : (diff)); |
191 | ((goodbad) ? (min_roll += luck) : (diff)); |
192 | total += MAX (1, MIN (size, rndm (diff) + min)); |
192 | total += max (1, min (size, rndm (diff) + min_roll)); |
193 | } |
193 | } |
194 | else |
194 | else |
195 | total += rndm (size) + 1; |
195 | total += rndm (size) + 1; |
196 | } |
196 | } |
197 | |
197 | |