1 /* $Id$ */
2 /* File: randart.c */
3
4 /*
5 * Purpose: Random artifacts
6 * Adapted from Greg Wooledge's artifact randomiser.
7 */
8
9 /*
10 * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
11 *
12 * This software may be copied and distributed for educational, research, and
13 * not for profit purposes provided that this copyright and statement are
14 * included in all such copies.
15 */
16
17 /*
18 * Things using the similar method as randarts are also
19 * put in here, eg. ego-items (and randunis). - Jir -
20 */
21
22 /* added this for consistency in some (unrelated) header-inclusion,
23 it IS a server file, isn't it? */
24 #define SERVER
25
26 #include "angband.h"
27
28
29 /* Allow ego 'of slaying' weapons of top 2h types (SoS,MoD,TA) to gain dice or sides at all? */
30 #define EGO_TOP_WEAP_SLAY
31
32 /* Allow randart weapons of top 2h types (SoS,MoD,TA) to gain dice or sides at all?
33 NOTE: Such randart weapons could surpass Grond even in the hands of the 6-base-bpr class 'Warrior'.
34 If this is disabled, then Grond will surpass randarts even for 5-base-bpr classes.
35 It is probably most sensible to keep this disabled. */
36 //#define RANDART_TOP_WEAP_SLAY
37
38
39 #ifndef EGO_TOP_WEAP_SLAY
40 /* 42 cut executioner's sword some slack: allow 6d6/5d7. 45 allows 5d8 too. */
41 #define slay_limit_ego(a_ptr, k_ptr)\
42 (((k_ptr)->flags4 & TR4_MUST2H) ? ((a_ptr)->tval == TV_SWORD ? 42 : 54) : (((k_ptr)->flags4 & TR4_SHOULD2H) ? 42 : 30))
43 #else
44 /* 55 allows 11d4 scythe of slicing, 60 allows 6d9 TA/MoD, 63 allows 7d8 TA/MoD */
45 #define slay_limit_ego(a_ptr, k_ptr) \
46 (((k_ptr)->flags4 & TR4_MUST2H) ? ((a_ptr)->tval == TV_SWORD ? 45 : 63) : (((k_ptr)->flags4 & TR4_SHOULD2H) ? 42 : 30))
47 #endif
48
49 #ifndef RANDART_TOP_WEAP_SLAY
50 /* 42 cut executioner's sword some slack: allow 6d6/5d7. 45 allows 5d8 too. */
51 #define slay_limit_randart(a_ptr, k_ptr)\
52 (((k_ptr)->flags4 & TR4_MUST2H) ? ((a_ptr)->tval == TV_SWORD ? 42 : 54) : (((k_ptr)->flags4 & TR4_SHOULD2H) ? 42 : 30))
53 #else
54 /* 55 allows 11d4 scythe of slicing, 60 allows 6d9 TA/MoD, 63 allows 7d8 TA/MoD */
55 #define slay_limit_randart(a_ptr, k_ptr) \
56 (((k_ptr)->flags4 & TR4_MUST2H) ? ((a_ptr)->tval == TV_SWORD ? 45 : 63) : (((k_ptr)->flags4 & TR4_SHOULD2H) ? 42 : 30))
57 #endif
58
59
60 /* How much power/curses is/are assigned to randarts.
61 With [40] default value, randarts can have up to
62 130 power ((40+79)*11/10), wich means even the top
63 randarts still have a slim chance (10 out of 99)
64 to not get AGGRAVATE - C. Blue */
65 #define RANDART_QUALITY 40
66
67 /* How many attempts to add abilities */
68 #define MAX_TRIES 200
69
70
71 #define abs(x) ((x) > 0 ? (x) : (-(x)))
72 #define sign(x) ((x) > 0 ? 1 : ((x) < 0 ? -1 : 0))
73
74
75 /* Artifact/ego item return structure */
76 static artifact_type randart;
77
78 #if 0 /*unused*/
79 /*
80 * Calculate the multiplier we'll get with a given bow type.
81 * This is done differently in 2.8.2 than it was in 2.8.1.
82 */
83 static int bow_multiplier (int sval) {
84 switch (sval) {
85 case SV_SLING: case SV_SHORT_BOW: return 2;
86 case SV_LONG_BOW: case SV_LIGHT_XBOW: return 3;
87 case SV_HEAVY_XBOW: return 4;
88 /* default: msg_format ("Illegal bow sval %s\n", sval); */
89 }
90 return 0;
91 }
92 #endif
93
94 /*
95 * We've just added an ability which uses the pval bonus.
96 * Make sure it's not zero. If it's currently negative, leave
97 * it negative (heh heh).
98 */
do_pval(artifact_type * a_ptr)99 static void do_pval (artifact_type *a_ptr)
100 {
101 /* Add some pval */
102 if (a_ptr->pval == 0)
103 a_ptr->pval = 1 + rand_int (3);
104 /* Cursed -- make it worse! */
105 else if (a_ptr->pval < 0) {
106 if (rand_int (2) == 0) a_ptr->pval--;
107 }
108 /* Bump up an existing pval */
109 else if (rand_int (3) > 0)
110 a_ptr->pval++;
111 /* Done */
112 return;
113 }
114
115
116 /*
117 * Make it bad, or if it's already bad, make it worse!
118 */
do_curse(artifact_type * a_ptr)119 static void do_curse (artifact_type *a_ptr)
120 {
121 /* Some chance of picking up these flags */
122 if (rand_int (3) == 0) a_ptr->flags3 |= TR3_AGGRAVATE;
123 if (!is_ammo(a_ptr->tval)) {
124 if (rand_int (5) == 0) a_ptr->flags3 |= TR3_DRAIN_EXP;
125 if (rand_int (8) == 0) a_ptr->flags5 |= TR5_DRAIN_MANA;
126 if (rand_int (11) == 0) a_ptr->flags5 |= TR5_DRAIN_HP;
127 if (rand_int (7) == 0) a_ptr->flags3 |= TR3_TELEPORT;
128 }
129
130 /* Some chance or reversing good bonuses */
131 if (!is_ammo(a_ptr->tval) && (a_ptr->pval > 0) && (rand_int (2) == 0)) a_ptr->pval = -a_ptr->pval;
132 if ((a_ptr->to_a > 0) && (rand_int (2) == 0)) a_ptr->to_a = -a_ptr->to_a;
133 if ((a_ptr->to_h > 0) && (rand_int (2) == 0)) a_ptr->to_h = -a_ptr->to_h;
134 if ((a_ptr->to_d > 0) && (rand_int (4) == 0)) a_ptr->to_d = -a_ptr->to_d;
135
136 /* Some chance of making bad bonuses worse */
137 if (!is_ammo(a_ptr->tval) && (a_ptr->pval < 0) && (rand_int (2) == 0)) a_ptr->pval -= rand_int(2);
138 if ((a_ptr->to_a < 0) && (rand_int (2) == 0)) a_ptr->to_a -= 3 + rand_int(10);
139 if ((a_ptr->to_h < 0) && (rand_int (2) == 0)) a_ptr->to_h -= 3 + rand_int(6);
140 if ((a_ptr->to_d < 0) && (rand_int (4) == 0)) a_ptr->to_d -= 3 + rand_int(6);
141
142 /* If it is cursed, we can heavily curse it */
143 if (a_ptr->flags3 & TR3_CURSED)
144 {
145 if (rand_int (2) == 0) a_ptr->flags3 |= TR3_HEAVY_CURSE;
146 if (rand_int (15) == 0) a_ptr->flags4 |= TR4_CURSE_NO_DROP;
147 return;
148 }
149
150 /* Always light curse the item */
151 a_ptr->flags3 |= TR3_CURSED;
152 }
153
154 /*
155 * Evaluate the artifact's overall power level.
156 */
157 #define AP_JEWELRY_COMBAT /* helps +dam/+hit/+ac rings/amulets a bit, causing those values to not factor in. - C. Blue */
artifact_power(artifact_type * a_ptr)158 s32b artifact_power(artifact_type *a_ptr) { //Kurzel
159 object_kind *k_ptr = &k_info[lookup_kind(a_ptr->tval, a_ptr->sval)];
160 s32b p = 1;
161 int immunities = 0, i;//, mult;
162
163
164 /* Evaluate certain abilities based on type of object. */
165 switch (a_ptr->tval) {
166 case TV_BOW:
167 //mult = bow_multiplier (a_ptr->sval);
168 if (a_ptr->flags3 & TR3_XTRA_MIGHT) p += 30;
169 if (a_ptr->flags3 & TR3_XTRA_SHOTS) p += 20;
170
171 p += (a_ptr->to_h + 3 * sign(a_ptr->to_h)) / 4;
172 p += (a_ptr->to_d + sign(a_ptr->to_d)) / 2;
173
174 if (a_ptr->weight < k_ptr->weight) p++;
175 break;
176 case TV_DIGGING: //not possible atm
177 p += 40;
178 /* fall through! */
179 case TV_BOOMERANG:
180 if (a_ptr->flags3 & TR3_XTRA_SHOTS) p += 20;
181 /* fall through! */
182 case TV_BLUNT:
183 case TV_POLEARM:
184 case TV_SWORD:
185 case TV_AXE:
186 if (a_ptr->flags1 & TR1_KILL_DRAGON) p += 4;
187 if (a_ptr->flags1 & TR1_KILL_DEMON) p += 4;
188 if (a_ptr->flags1 & TR1_KILL_UNDEAD) p += 4;
189
190 if (a_ptr->flags1 & TR1_SLAY_EVIL) p += 4;
191 if (a_ptr->flags1 & TR1_SLAY_ANIMAL) p += 2;
192 if (a_ptr->flags1 & TR1_SLAY_UNDEAD) p += 3;
193 if (a_ptr->flags1 & TR1_SLAY_DRAGON) p += 3;
194 if (a_ptr->flags1 & TR1_SLAY_DEMON) p += 3;
195 if (a_ptr->flags1 & TR1_SLAY_TROLL) p += 1;
196 if (a_ptr->flags1 & TR1_SLAY_ORC) p += 1;
197 if (a_ptr->flags1 & TR1_SLAY_GIANT) p += 1;
198
199 if (a_ptr->flags1 & TR1_BRAND_ACID) p += 4;
200 if (a_ptr->flags1 & TR1_BRAND_ELEC) p += 4;
201 if (a_ptr->flags1 & TR1_BRAND_FIRE) p += 3;
202 if (a_ptr->flags1 & TR1_BRAND_COLD) p += 3;
203
204 if (a_ptr->flags1 & TR1_BLOWS) p += (a_ptr->pval) * 6;
205 if (a_ptr->flags1 & TR1_LIFE) p += (a_ptr->pval) * 7;
206
207 if ((a_ptr->flags1 & TR1_TUNNEL) &&
208 (a_ptr->tval != TV_DIGGING))
209 p += a_ptr->pval * 3;
210
211 /* Instead of formerly base dd/ds, only increased dd/ds add to ap now.
212 This is less penalizing on 2h-weapons, making it fairer - C. Blue */
213 // p += ((a_ptr->dd - k_ptr->dd + 1) * (a_ptr->ds - k_ptr->ds + 1) - 1) * 2;
214 p += (a_ptr->dd * (a_ptr->ds + 1) - k_ptr->dd * (k_ptr->ds + 1)) * 1;
215
216 /* Remember, weight is in 0.1 lb. units. */
217 if (a_ptr->weight != k_ptr->weight)
218 p += (k_ptr->weight - a_ptr->weight) / 20;
219
220 #ifndef AP_JEWELRY_COMBAT
221 /* fall through! */
222 case TV_RING:
223 case TV_AMULET:
224 #endif
225 p += (a_ptr->to_d + 2 * sign (a_ptr->to_d)) / 3;
226 if (a_ptr->to_d > 15) p += (a_ptr->to_d - 14) / 2;
227
228 p += (a_ptr->to_h + 3 * sign (a_ptr->to_h)) / 4;
229
230 break;
231 case TV_MSTAFF: // maybe this needs another entry
232 if (a_ptr->flags1 & TR1_LIFE) p += (a_ptr->pval) * 7;
233
234 /* Remember, weight is in 0.1 lb. units. */
235 if (a_ptr->weight != k_ptr->weight)
236 p += (k_ptr->weight - a_ptr->weight) / 20;
237 break;
238 case TV_BOOTS:
239 case TV_GLOVES:
240 case TV_HELM:
241 case TV_CROWN:
242 case TV_SHIELD:
243 case TV_CLOAK:
244 case TV_SOFT_ARMOR:
245 case TV_HARD_ARMOR:
246 case TV_DRAG_ARMOR:
247 if (a_ptr->flags1 & TR1_BLOWS) p += (a_ptr->pval) * 8;
248 if (a_ptr->flags1 & TR1_LIFE) p += (a_ptr->pval) * 10;
249
250 if (a_ptr->flags1 & TR1_SLAY_EVIL) p += 15;
251 if (a_ptr->flags1 & TR1_SLAY_ANIMAL) p += 10;
252 if (a_ptr->flags1 & TR1_SLAY_UNDEAD) p += 13;
253 if (a_ptr->flags1 & TR1_SLAY_DRAGON) p += 15;
254 if (a_ptr->flags1 & TR1_SLAY_DEMON) p += 15;
255 if (a_ptr->flags1 & TR1_SLAY_TROLL) p += 10;
256 if (a_ptr->flags1 & TR1_SLAY_ORC) p += 8;
257 if (a_ptr->flags1 & TR1_SLAY_GIANT) p += 6;
258
259 if (a_ptr->flags1 & TR1_BRAND_ACID) p += 15;
260 if (a_ptr->flags1 & TR1_BRAND_ELEC) p += 13;
261 if (a_ptr->flags1 & TR1_BRAND_FIRE) p += 11;
262 if (a_ptr->flags1 & TR1_BRAND_COLD) p += 10;
263
264 #if 0 /* hurts heavy armour */
265 /* allow base ac to factor in somewhat */
266 p += (a_ptr->ac + 4 * sign (a_ptr->ac)) / 5;
267 #endif
268 p += (a_ptr->to_h + sign(a_ptr->to_h)) / 2;
269 p += (a_ptr->to_d + sign(a_ptr->to_d)) / 2;
270 if (a_ptr->weight != k_ptr->weight)
271 p += (k_ptr->weight - a_ptr->weight) / 30;
272 break;
273 case TV_LITE:
274 // p += 35;
275 p += 25;
276 if (!(a_ptr->flags4 & TR4_FUEL_LITE) &&
277 (k_ptr->flags4 & TR4_FUEL_LITE))
278 p += 10;
279 break;
280 case TV_RING:
281 case TV_AMULET:
282 p += 20;
283 /* hack -- Nazgul rings */
284 if (a_ptr->sval == SV_RING_SPECIAL) p += 20;
285 break;
286 }
287
288 /* Other abilities are evaluated independent of the object type. */
289
290 /* Two notes regarding jewelry, which might be improved but aren't really important:
291 1) +AC is counted even for rings/amulets, although those retain their +AC as randarts.
292 2) We don't take into account +hit/+dam here for rings/amulets (see above, end of weapons), although we do for their +AC.
293 - C. Blue */
294 #ifdef AP_JEWELRY_COMBAT
295 if (a_ptr->tval != TV_RING && a_ptr->tval != TV_AMULET
296 #ifdef NEW_SHIELDS_NO_AC
297 && a_ptr->tval != TV_SHIELD
298 #endif
299 ) {
300 i = a_ptr->to_a - 10 - k_ptr->to_a / 2 - k_ptr->level / 15;
301 p += (i + 3 * sign(i)) / 4;
302 if (i > 20) p += (i - 20) / 2;
303 #ifndef TO_AC_CAP_30
304 if (a_ptr->to_a > 30) p += (a_ptr->to_a - 30) / 2; /* always costly */
305 if (a_ptr->to_a > 35) p += 20000; /* inhibit */
306 #else
307 if (a_ptr->to_a > 25) p += (a_ptr->to_a - 25) / 2; /* always costly */
308 if (a_ptr->to_a > 30) p += 20000; /* inhibit */
309 #endif
310 }
311 #endif
312
313 if (a_ptr->pval > 0) {
314 if (a_ptr->flags1 & TR1_STR) p += a_ptr->pval * 2;
315 if (a_ptr->flags1 & TR1_INT) p += a_ptr->pval * 2;
316 if (a_ptr->flags1 & TR1_WIS) p += a_ptr->pval * 2;
317 if (a_ptr->flags1 & TR1_DEX) p += a_ptr->pval * 2;
318 if (a_ptr->flags1 & TR1_CON) p += a_ptr->pval * 2;
319 if (a_ptr->flags1 & TR1_STEALTH) p += a_ptr->pval * 4;
320 if (a_ptr->flags1 & TR1_SEARCH) p += a_ptr->pval * 2;
321 } else if (a_ptr->pval < 0) { /* hack: don't give large negatives */
322 if (a_ptr->flags1 & TR1_STR) p += a_ptr->pval;
323 if (a_ptr->flags1 & TR1_INT) p += a_ptr->pval;
324 if (a_ptr->flags1 & TR1_WIS) p += a_ptr->pval;
325 if (a_ptr->flags1 & TR1_DEX) p += a_ptr->pval;
326 if (a_ptr->flags1 & TR1_CON) p += a_ptr->pval;
327 if (a_ptr->flags1 & TR1_STEALTH) p += a_ptr->pval;
328 if (a_ptr->flags1 & TR1_SEARCH) p += a_ptr->pval;
329 }
330 if (a_ptr->flags1 & TR1_CHR) p += a_ptr->pval;
331 if (a_ptr->flags1 & TR1_INFRA) p += (a_ptr->pval + sign (a_ptr->pval)) / 2;
332
333 i = ((a_ptr->pval + 6) / 3);
334 // i = i * i;
335 // i = (i * 5) / 2;
336 #if 0 /* although 62/133 looks reasonable on paper, it produced mostly verylow..low pvals, and alot aggr boots */
337 if (a_ptr->flags1 & TR1_SPEED) p += i * 12;
338 if (a_ptr->flags1 & TR1_MANA) p += i * 10;
339 if (a_ptr->flags5 & TR5_CRIT) p += i * 8;
340 #else
341 if (a_ptr->flags1 & TR1_SPEED) p += i * 10;
342 if (a_ptr->flags1 & TR1_MANA) p += i * 9;
343 if (a_ptr->flags5 & TR5_CRIT) p += i * 8;
344 #endif
345
346 #if 0 //enable me? :/
347 if (a_ptr->flags5 & TR5_LUCK) p += a_ptr->pval + 5;
348 #endif
349
350 if (a_ptr->flags2 & TR2_SUST_STR) p += 5;
351 if (a_ptr->flags2 & TR2_SUST_INT) p += 4;
352 if (a_ptr->flags2 & TR2_SUST_WIS) p += 4;
353 if (a_ptr->flags2 & TR2_SUST_DEX) p += 4;
354 if (a_ptr->flags2 & TR2_SUST_CON) p += 5;
355 if (a_ptr->flags2 & TR2_SUST_CHR) p += 1;
356
357 if (a_ptr->flags2 & TR2_IM_ACID) {
358 p += 26;
359 immunities++;
360 }
361 if (a_ptr->flags2 & TR2_IM_ELEC) {
362 p += 20;
363 immunities++;
364 }
365 if (a_ptr->flags2 & TR2_IM_FIRE) {
366 p += 28;
367 immunities++;
368 }
369 if (a_ptr->flags2 & TR2_IM_COLD) {
370 p += 23;
371 immunities++;
372 }
373 if (a_ptr->flags5 & TR5_IM_POISON) { //currently not possible on randarts
374 p += 20;
375 immunities++;
376 }
377 if (immunities > 1) p += 10;
378 if (immunities > 2) p += 20000; /* inhibit */
379
380 if (a_ptr->flags2 & TR2_RES_FEAR) p += 4;
381 if (a_ptr->flags2 & TR2_FREE_ACT) p += 8;
382 if (a_ptr->flags2 & TR2_HOLD_LIFE) p += 10;
383 if (a_ptr->flags2 & TR2_RES_ACID) p += 6;
384 if (a_ptr->flags2 & TR2_RES_ELEC) p += 6;
385 if (a_ptr->flags2 & TR2_RES_FIRE) p += 6;
386 if (a_ptr->flags2 & TR2_RES_COLD) p += 6;
387 if (a_ptr->flags2 & TR2_RES_POIS) p += 12;
388 if (a_ptr->flags2 & TR2_RES_LITE) p += 8;
389 if (a_ptr->flags2 & TR2_RES_DARK) p += 10;
390 if (a_ptr->flags2 & TR2_RES_BLIND) p += 10;
391 if (a_ptr->flags2 & TR2_RES_CONF) p += 8;
392 if (a_ptr->flags2 & TR2_RES_SOUND) p += 10;
393 if (a_ptr->flags2 & TR2_RES_SHARDS) p += 8;
394 if (a_ptr->flags2 & TR2_RES_NETHER) p += 12;
395 if (a_ptr->flags2 & TR2_RES_NEXUS) p += 10;
396 if (a_ptr->flags2 & TR2_RES_CHAOS) p += 12;
397 if (a_ptr->flags2 & TR2_RES_DISEN) p += 13;
398
399 if (a_ptr->flags3 & TR3_FEATHER) p += 2;
400 if (a_ptr->flags3 & TR3_LITE1) p += 2;
401 if (a_ptr->flags4 & TR4_LITE2) p += 4;
402 if (a_ptr->flags4 & TR4_LITE3) p += 8;
403 if (a_ptr->flags4 & TR4_FUEL_LITE) p -= 10;//20
404 if (a_ptr->flags3 & TR3_SEE_INVIS) p += 8;
405 // if (a_ptr->flags3 & TR3_TELEPATHY) p += 20;
406 if (a_ptr->esp & (ESP_ORC)) p += 1;
407 if (a_ptr->esp & (ESP_TROLL)) p += 1;
408 if (a_ptr->esp & (ESP_DRAGON)) p += 4;
409 if (a_ptr->esp & (ESP_GIANT)) p += 2;
410 if (a_ptr->esp & (ESP_DEMON)) p += 3;
411 if (a_ptr->esp & (ESP_UNDEAD)) p += 3;
412 if (a_ptr->esp & (ESP_EVIL)) p += 16; //p += 14; p += 18;
413 if (a_ptr->esp & (ESP_ANIMAL)) p += 4;
414 if (a_ptr->esp & (ESP_DRAGONRIDER)) p += 2;
415 if (a_ptr->esp & (ESP_GOOD)) p += 4;
416 if (a_ptr->esp & (ESP_NONLIVING)) p += 2;
417 if (a_ptr->esp & (ESP_UNIQUE)) p += 8;
418 if (a_ptr->esp & (ESP_SPIDER)) p += 2;
419 if (a_ptr->esp & ESP_ALL) p += 40; //note: this should probably be even higher, maybe 50
420 if (a_ptr->flags4 & TR4_AUTO_ID) p += 20;//maybe even higher, like 30
421 if (a_ptr->flags3 & TR3_SLOW_DIGEST) p += 4;
422 if (a_ptr->flags3 & TR3_REGEN) p += 8;
423 if (a_ptr->flags5 & TR5_REGEN_MANA) p += 8;
424 if ((a_ptr->flags3 & TR3_TELEPORT) && (a_ptr->flags3 & TR3_CURSED)) p -= 20;
425 if (a_ptr->flags3 & TR3_DRAIN_EXP) p -= 16;
426 if (a_ptr->flags3 & TR3_AGGRAVATE) p -= 8;
427 if (a_ptr->flags3 & TR3_BLESSED) p += 4;
428 if (a_ptr->flags3 & TR3_CURSED) p -= 4;
429 if (a_ptr->flags3 & TR3_HEAVY_CURSE) p -= 20;
430 /* if (a_ptr->flags3 & TR3_PERMA_CURSE) p -= 40; */
431 /* if (a_ptr->flags4 & TR4_ANTIMAGIC_10) p += 8; */
432 if (a_ptr->flags5 & TR5_INVIS) p += 20;
433
434 if (a_ptr->flags1 & TR1_VAMPIRIC) p += 15;
435 if (a_ptr->flags5 & TR5_REFLECT) p += 15;
436 if (a_ptr->flags4 & TR4_LEVITATE) p += 15;
437 if (a_ptr->flags4 & TR4_CLIMB) p += 15;
438 if (a_ptr->flags3 & TR3_SH_FIRE) p += 5;
439 if (a_ptr->flags5 & TR5_SH_COLD) p += 5;
440 if (a_ptr->flags3 & TR3_SH_ELEC) p += 5;
441
442 /* only for Ethereal DSM basically.. */
443 if (a_ptr->flags3 & TR3_WRAITH) p += 20;
444 /* only for WINNERS_ONLY heavy armour basically :-o (note: nice vs Zu-Aon) */
445 if (a_ptr->flags5 & TR5_RES_MANA) p += 20;
446 return p;
447 }
448
449
450
remove_contradictory(artifact_type * a_ptr,bool aggravate_me)451 static void remove_contradictory (artifact_type *a_ptr, bool aggravate_me) //Kurzel
452 {
453 /* If the item is predestined to be aggravating, already get free
454 its ap from useless mods that won't make it onto the final item */
455 if (aggravate_me) {
456 a_ptr->flags1 &= ~(TR1_STEALTH);
457 a_ptr->flags5 &= ~(TR5_INVIS);
458 }
459
460 /* Remove redundante resistances */
461 if (a_ptr->flags2 & TR2_IM_ACID) a_ptr->flags2 &= ~(TR2_RES_ACID);
462 if (a_ptr->flags2 & TR2_IM_ELEC) a_ptr->flags2 &= ~(TR2_RES_ELEC);
463 if (a_ptr->flags2 & TR2_IM_FIRE) a_ptr->flags2 &= ~(TR2_RES_FIRE);
464 if (a_ptr->flags2 & TR2_IM_COLD) a_ptr->flags2 &= ~(TR2_RES_COLD);
465
466 /* Remove redundant slay mods */
467 if (a_ptr->flags1 & TR1_KILL_DRAGON) a_ptr->flags1 &= ~(TR1_SLAY_DRAGON);
468 if (a_ptr->flags1 & TR1_KILL_UNDEAD) a_ptr->flags1 &= ~(TR1_SLAY_UNDEAD);
469 if (a_ptr->flags1 & TR1_KILL_DEMON) a_ptr->flags1 &= ~(TR1_SLAY_DEMON);
470
471 /* Remove redundant resistances */
472 if (a_ptr->flags2 & TR2_RES_CHAOS) a_ptr->flags2 &= ~(TR2_RES_CONF);
473
474 /* Remove accidentally given good mods on cursed object */
475 if (a_ptr->pval < 0) {
476 if (a_ptr->flags1 & TR1_STR) a_ptr->flags2 &= ~(TR2_SUST_STR);
477 if (a_ptr->flags1 & TR1_INT) a_ptr->flags2 &= ~(TR2_SUST_INT);
478 if (a_ptr->flags1 & TR1_WIS) a_ptr->flags2 &= ~(TR2_SUST_WIS);
479 if (a_ptr->flags1 & TR1_DEX) a_ptr->flags2 &= ~(TR2_SUST_DEX);
480 if (a_ptr->flags1 & TR1_CON) a_ptr->flags2 &= ~(TR2_SUST_CON);
481 if (a_ptr->flags1 & TR1_CHR) a_ptr->flags2 &= ~(TR2_SUST_CHR);
482 /*a_ptr->flags1 &= ~(TR1_BLOWS);*/
483 }
484 if (a_ptr->flags3 & TR3_CURSED) a_ptr->flags3 &= ~(TR3_BLESSED);
485 if (a_ptr->flags3 & TR3_DRAIN_EXP) a_ptr->flags2 &= ~(TR2_HOLD_LIFE);
486 }
487
remove_redundant_esp(artifact_type * a_ptr)488 static void remove_redundant_esp(artifact_type *a_ptr)
489 {
490 if (a_ptr->esp & ESP_DRAGON) a_ptr->esp &= (~ESP_DRAGONRIDER);
491 if (a_ptr->esp & ESP_EVIL) a_ptr->esp &= (~(ESP_ORC | ESP_TROLL | ESP_GIANT | ESP_DEMON | ESP_UNDEAD));
492 if (a_ptr->esp & ESP_ALL) a_ptr->esp = ESP_ALL;
493 }
494
495
496
497 /*
498 * Randomly select an extra ability to be added to the artifact in question.
499 * This function is way too large.
500 */
add_ability(artifact_type * a_ptr)501 static void add_ability (artifact_type *a_ptr) {
502 int r = rand_int(100);
503 bool type_dependant_mod = FALSE;
504
505 switch (a_ptr->tval) {
506 case TV_BOOMERANG:
507 case TV_BOW:
508 if (r < 48) type_dependant_mod = TRUE; /* lolwut? */
509 break;
510 case TV_SHOT:
511 case TV_ARROW:
512 case TV_BOLT:
513 type_dependant_mod = TRUE;
514 break;
515 case TV_DRAG_ARMOR:
516 if (r < 67) type_dependant_mod = TRUE;
517 break;
518 default: /* usually 50%-50% whether a mod is type-dependant or general */
519 if (r < 50) type_dependant_mod = TRUE;
520 }
521
522 if (type_dependant_mod) {
523 r = rand_int(100);
524
525 switch (a_ptr->tval) {
526 case TV_BOW:
527 if (r < 25) {
528 if (a_ptr->flags3 & TR3_XTRA_SHOTS) a_ptr->flags3 |= TR3_XTRA_MIGHT;
529 a_ptr->flags3 |= TR3_XTRA_SHOTS;
530 } else if (r < 50) {
531 if (a_ptr->flags3 & TR3_XTRA_MIGHT) a_ptr->flags3 |= TR3_XTRA_SHOTS;
532 a_ptr->flags3 |= TR3_XTRA_MIGHT;
533 } else if (r < 70) a_ptr->to_h += 4 + rand_int(4);
534 else if (r < 90) a_ptr->to_d += 4 + rand_int(4);
535 else {
536 a_ptr->to_h += 4 + rand_int(4);
537 a_ptr->to_d += 4 + rand_int(4);
538 }
539 break;
540 case TV_DIGGING: /* can this actually be arted at all? */
541 case TV_BLUNT:
542 case TV_POLEARM:
543 case TV_SWORD:
544 case TV_AXE:
545 case TV_BOOMERANG:
546 if (r < 1) { /* SPLIT FLAG: see r < 68 -_- */
547 a_ptr->flags1 |= TR1_BRAND_POIS;
548 if (rand_int (4) > 0) a_ptr->flags2 |= TR2_RES_POIS;
549 } else if (r < 4) {
550 a_ptr->flags1 |= TR1_WIS;
551 do_pval (a_ptr);
552 if (rand_int (2) == 0) a_ptr->flags2 |= TR2_SUST_WIS;
553 /* chaotic and blessed are exclusive atm */
554 if (!(a_ptr->flags5 & TR5_CHAOTIC) &&
555 is_weapon(a_ptr->tval))
556 a_ptr->flags3 |= TR3_BLESSED;
557 } else if (r < 7) {
558 a_ptr->flags1 |= TR1_BRAND_ACID;
559 if (rand_int (4) > 0) a_ptr->flags2 |= TR2_RES_ACID;
560 } else if (r < 10) {
561 a_ptr->flags1 |= TR1_BRAND_ELEC;
562 if (rand_int (4) > 0) a_ptr->flags2 |= TR2_RES_ELEC;
563 } else if (r < 14) {
564 a_ptr->flags1 |= TR1_BRAND_FIRE;
565 if (rand_int (4) > 0) a_ptr->flags2 |= TR2_RES_FIRE;
566 } else if (r < 18) {
567 a_ptr->flags1 |= TR1_BRAND_COLD;
568 if (rand_int (4) > 0) a_ptr->flags2 |= TR2_RES_COLD;
569 } else if (r < 21) {
570 a_ptr->ds += 1 + rand_int(2) + rand_int(2);
571 } else if (r < 25) {
572 a_ptr->dd += 1 + rand_int(2) + rand_int(2);
573 } else if (r < 27) {
574 a_ptr->flags1 |= TR1_KILL_DRAGON;
575 a_ptr->esp |= (ESP_DRAGON);
576 } else if (r < 29) {
577 a_ptr->flags1 |= TR1_KILL_DEMON;
578 a_ptr->esp |= (ESP_DEMON);
579 } else if (r < 31) {
580 a_ptr->flags1 |= TR1_KILL_UNDEAD;
581 a_ptr->esp |= (ESP_UNDEAD);
582 } else if (r < 35) {
583 a_ptr->flags1 |= TR1_SLAY_DRAGON;
584 if (magik(80)) a_ptr->esp |= (ESP_DRAGON);
585 } else if (r < 39) {
586 a_ptr->flags1 |= TR1_SLAY_EVIL;
587 if (magik(80)) a_ptr->esp |= (ESP_EVIL);
588 } else if (r < 43) {
589 a_ptr->flags1 |= TR1_SLAY_ANIMAL;
590 if (magik(80)) a_ptr->esp |= (ESP_EVIL);
591 } else if (r < 47) {
592 a_ptr->flags1 |= TR1_SLAY_UNDEAD;
593 if (magik(80)) a_ptr->esp |= (ESP_UNDEAD);
594 if (rand_int (2) == 0) {
595 a_ptr->flags1 |= TR1_SLAY_DEMON;
596 if (magik(80)) a_ptr->esp |= (ESP_DEMON);
597 }
598 } else if (r < 51) {
599 a_ptr->flags1 |= TR1_SLAY_DEMON;
600 if (magik(80)) a_ptr->esp |= (ESP_DEMON);
601 if (rand_int (2) == 0) {
602 a_ptr->flags1 |= TR1_SLAY_UNDEAD;
603 if (magik(80)) a_ptr->esp |= (ESP_UNDEAD);
604 }
605 } else if (r < 55) {
606 a_ptr->flags1 |= TR1_SLAY_ORC;
607 if (magik(80)) a_ptr->esp |= (ESP_ORC);
608 if (rand_int (2) == 0) {
609 a_ptr->flags1 |= TR1_SLAY_TROLL;
610 if (magik(80)) a_ptr->esp |= (ESP_TROLL);
611 }
612 if (rand_int (2) == 0) {
613 a_ptr->flags1 |= TR1_SLAY_GIANT;
614 if (magik(80)) a_ptr->esp |= (ESP_GIANT);
615 }
616 } else if (r < 59) {
617 a_ptr->flags1 |= TR1_SLAY_TROLL;
618 if (magik(80)) a_ptr->esp |= (ESP_TROLL);
619 if (rand_int (2) == 0) {
620 a_ptr->flags1 |= TR1_SLAY_ORC;
621 if (magik(80)) a_ptr->esp |= (ESP_ORC);
622 }
623 if (rand_int (2) == 0) {
624 a_ptr->flags1 |= TR1_SLAY_GIANT;
625 if (magik(80)) a_ptr->esp |= (ESP_GIANT);
626 }
627 } else if (r < 63) {
628 a_ptr->flags1 |= TR1_SLAY_GIANT;
629 if (magik(80)) a_ptr->esp |= (ESP_GIANT);
630 if (rand_int (2) == 0) {
631 a_ptr->flags1 |= TR1_SLAY_ORC;
632 if (magik(80)) a_ptr->esp |= (ESP_ORC);
633 }
634 if (rand_int (2) == 0) {
635 a_ptr->flags1 |= TR1_SLAY_TROLL;
636 if (magik(80)) a_ptr->esp |= (ESP_TROLL);
637 }
638 } else if (r < 66) a_ptr->flags3 |= TR3_SEE_INVIS;
639 else if (r < 68) { /* SPLIT FLAG: see r < 1 -_- */
640 a_ptr->flags1 |= TR1_BRAND_POIS;
641 if (rand_int (4) > 0) a_ptr->flags2 |= TR2_RES_POIS;
642 } else if (r < 72) {
643 /* +EA turns into xshots on boomies */
644 if (a_ptr->tval == TV_BOOMERANG) a_ptr->flags3 |= TR3_XTRA_SHOTS;
645 else {
646 a_ptr->flags1 |= TR1_BLOWS;
647 do_pval (a_ptr);
648 if (a_ptr->pval > 3) a_ptr->pval = 3;
649 }
650 } else if (r < 74) {
651 /* no +LIFE on boomerangs! turn into xshots instead */
652 if (a_ptr->tval == TV_BOOMERANG) {
653 a_ptr->flags3 |= TR3_XTRA_SHOTS;
654 } else if (a_ptr->tval != TV_DIGGING) { /* no +LIFE on diggers! */
655 a_ptr->flags1 |= TR1_LIFE;
656 do_pval (a_ptr);
657 if (a_ptr->pval > 3) a_ptr->pval = 3;
658 }
659 } else if (r < 87) {
660 a_ptr->to_d += 2 + rand_int (10);
661 a_ptr->to_h += 2 + rand_int (10);
662 } else if (r < 90) {
663 a_ptr->to_a += 3 + rand_int (3);
664 } else if (r < 93) {
665 a_ptr->flags5 |= TR5_CRIT;
666 if (a_ptr->pval < 0) break;
667 if (a_ptr->pval == 0) a_ptr->pval = 3 + rand_int (8);
668 else if (rand_int (2) == 0) a_ptr->pval++;
669 } else if (r < 97) {
670 switch(a_ptr->tval) {
671 case TV_DIGGING:
672 a_ptr->pval++;
673 break;
674 case TV_MSTAFF:
675 a_ptr->pval++;
676 break;
677 default: /* normal weapons */
678 a_ptr->flags1 |= TR1_VAMPIRIC;
679 }
680 }
681 #if 1 /* activate any time you like :) - note: REMOVE THE "-2" at the start of add_ability() then! */
682 else if (r < 98 && a_ptr->tval != TV_DIGGING) {
683 /* chaotic and blessed are exclusive atm */
684 if (!(a_ptr->flags3 & TR3_BLESSED)) {
685 a_ptr->flags5 |= TR5_CHAOTIC;
686 a_ptr->flags2 |= TR2_RES_CHAOS;
687 }
688 }
689 #endif
690 else a_ptr->weight = (a_ptr->weight * 9) / 10;
691 break;
692 case TV_MSTAFF:
693 if (r < 5) a_ptr->flags2 |= TR2_SUST_WIS;
694 else if (r < 15) a_ptr->flags2 |= TR2_SUST_INT;
695 else if (r < 25) a_ptr->flags3 |= TR3_SEE_INVIS;
696 else if (r < 35) {
697 a_ptr->to_d += 2 + rand_int(10);
698 a_ptr->to_h += 2 + rand_int(10);
699 }
700 else if (r < 40) {
701 int rr = rand_int (29);
702 if (rr < 1) a_ptr->esp |= (ESP_ORC);
703 else if (rr < 2) a_ptr->esp |= (ESP_TROLL);
704 else if (rr < 3) a_ptr->esp |= (ESP_DRAGON);
705 else if (rr < 4) a_ptr->esp |= (ESP_GIANT);
706 else if (rr < 5) a_ptr->esp |= (ESP_DEMON);
707 else if (rr < 8) a_ptr->esp |= (ESP_UNDEAD);
708 else if (rr < 12) a_ptr->esp |= (ESP_EVIL);
709 else if (rr < 14) a_ptr->esp |= (ESP_ANIMAL);
710 else if (rr < 16) a_ptr->esp |= (ESP_DRAGONRIDER);
711 else if (rr < 19) a_ptr->esp |= (ESP_GOOD);
712 else if (rr < 21) a_ptr->esp |= (ESP_NONLIVING);
713 else if (rr < 24) a_ptr->esp |= (ESP_UNIQUE);
714 else if (rr < 26) a_ptr->esp |= (ESP_SPIDER);
715 else a_ptr->esp |= (ESP_ALL);
716 }
717 else a_ptr->pval += randint(5);
718 break;
719 case TV_SHOT:
720 case TV_ARROW:
721 case TV_BOLT:
722 if (r < 4) a_ptr->flags1 |= TR1_BRAND_ACID;
723 else if (r < 8) a_ptr->flags1 |= TR1_BRAND_ELEC;
724 else if (r < 12) a_ptr->flags1 |= TR1_BRAND_FIRE;
725 else if (r < 16) a_ptr->flags1 |= TR1_BRAND_COLD;
726 else if (r < 20) a_ptr->flags1 |= TR1_BRAND_POIS;
727 else if (r < 24) a_ptr->flags1 |= TR1_KILL_DRAGON;
728 else if (r < 28) a_ptr->flags1 |= TR1_KILL_DEMON;
729 else if (r < 32) a_ptr->flags1 |= TR1_KILL_UNDEAD;
730 else if (r < 40) a_ptr->flags1 |= TR1_SLAY_DRAGON;
731 else if (r < 44) a_ptr->flags1 |= TR1_SLAY_EVIL;
732 else if (r < 52) a_ptr->flags1 |= TR1_SLAY_ANIMAL;
733 else if (r < 60) a_ptr->flags1 |= TR1_SLAY_UNDEAD;
734 else if (r < 68) a_ptr->flags1 |= TR1_SLAY_DEMON;
735 else if (r < 72) a_ptr->flags1 |= TR1_SLAY_ORC;
736 else if (r < 80) a_ptr->flags1 |= TR1_SLAY_TROLL;
737 else if (r < 88) a_ptr->flags1 |= TR1_SLAY_GIANT;
738 else if (r < 92) a_ptr->flags1 |= TR1_VAMPIRIC;
739 else
740 {
741 /* bad luck */
742 }
743 break;
744 case TV_BOOTS:
745 if (r < 10) a_ptr->flags3 |= TR3_FEATHER;
746 else if (r < 30) a_ptr->to_a += 3 + rand_int (5);
747 else if (r < 40) a_ptr->flags4 |= TR4_LEVITATE;
748 else if (r < 50) a_ptr->flags4 |= TR4_CLIMB;
749 else if (r < 65) {
750 a_ptr->flags1 |= TR1_STEALTH;
751 do_pval (a_ptr);
752 } else if (r < 95) {
753 a_ptr->flags1 |= TR1_SPEED;
754 if (a_ptr->pval < 0) break;
755 if (a_ptr->pval == 0) a_ptr->pval = 3 + rand_int (8);
756 else {
757 a_ptr->pval++;
758 if (!rand_int(2)) a_ptr->pval++;
759 if (!rand_int(2)) a_ptr->pval++;
760 }
761 }
762 else a_ptr->weight = (a_ptr->weight * 9) / 10;
763 break;
764 case TV_GLOVES:
765 if (r < 13) a_ptr->flags2 |= TR2_FREE_ACT;
766 else if (r < 21)
767 {
768 a_ptr->flags1 |= TR1_MANA;
769 if (a_ptr->pval == 0) a_ptr->pval = 5 + rand_int (6);
770 else do_pval (a_ptr);
771 if (a_ptr->pval < 0) a_ptr->pval = 2;
772 } else if (r < 26) a_ptr->flags4 |= TR4_AUTO_ID;
773 else if (r < 36) {
774 a_ptr->flags1 |= TR1_DEX;
775 do_pval (a_ptr);
776 } else if (r < 46) {
777 a_ptr->flags1 |= TR1_STR;
778 do_pval (a_ptr);
779 } else if (r < 51) {
780 a_ptr->flags1 |= TR1_BLOWS;
781 if (rand_int(3)) a_ptr->pval = 1;
782 else a_ptr->pval = 2;
783 } else if (r < 53) {
784 a_ptr->flags1 |= TR1_LIFE;
785 do_pval (a_ptr);
786 if (a_ptr->pval > 3) a_ptr->pval = 3;
787 } else if (r < 58) {
788 a_ptr->flags5 |= TR5_CRIT;
789 if (a_ptr->pval < 0) break;
790 if (a_ptr->pval == 0) a_ptr->pval = 3 + rand_int (8);
791 else if (rand_int (2) == 0) a_ptr->pval++;
792 }
793 else if (r < 73) {
794 int rsub = rand_int(24);
795 if ((rsub < 2) && !(a_ptr->flags1 & TR1_MULTMASK))
796 a_ptr->flags1 |= TR1_BRAND_ACID;
797 else if ((rsub < 4) && !(a_ptr->flags1 & TR1_MULTMASK))
798 a_ptr->flags1 |= TR1_BRAND_ELEC;
799 else if ((rsub < 6) && !(a_ptr->flags1 & TR1_MULTMASK))
800 a_ptr->flags1 |= TR1_BRAND_FIRE;
801 else if ((rsub < 8) && !(a_ptr->flags1 & TR1_MULTMASK))
802 a_ptr->flags1 |= TR1_BRAND_COLD;
803 else if ((rsub < 10) && !(a_ptr->flags1 & TR1_MULTMASK))
804 a_ptr->flags1 |= TR1_BRAND_POIS;
805 else if ((rsub < 12) && !(a_ptr->flags1 & TR1_MULTMASK))
806 a_ptr->flags1 |= TR1_SLAY_DRAGON;
807 else if ((rsub < 14) && !(a_ptr->flags1 & TR1_MULTMASK))
808 a_ptr->flags1 |= TR1_SLAY_ANIMAL;
809 else if ((rsub < 16) && !(a_ptr->flags1 & TR1_MULTMASK))
810 a_ptr->flags1 |= TR1_SLAY_UNDEAD;
811 else if ((rsub < 18) && !(a_ptr->flags1 & TR1_MULTMASK))
812 a_ptr->flags1 |= TR1_SLAY_DEMON;
813 else if ((rsub < 20) && !(a_ptr->flags1 & TR1_MULTMASK))
814 a_ptr->flags1 |= TR1_SLAY_ORC;
815 else if ((rsub < 22) && !(a_ptr->flags1 & TR1_MULTMASK))
816 a_ptr->flags1 |= TR1_SLAY_TROLL;
817 else if ((rsub < 24) && !(a_ptr->flags1 & TR1_MULTMASK))
818 a_ptr->flags1 |= TR1_SLAY_GIANT;
819 #if 0 /*too powerful on gloves - Art Gloves 'soul cure' can help.*/
820 else if (r < 25) && !(a_ptr->flags1 & TR1_MULTMASK))
821 a_ptr->flags1 |= TR1_KILL_DRAGON;
822 else if (r < 26) && !(a_ptr->flags1 & TR1_MULTMASK))
823 a_ptr->flags1 |= TR1_KILL_UNDEAD;
824 else if (r < 27) && !(a_ptr->flags1 & TR1_MULTMASK))
825 a_ptr->flags1 |= TR1_KILL_DEMON;
826 else if (r < 28) && !(a_ptr->flags1 & TR1_MULTMASK))
827 a_ptr->flags1 |= TR1_SLAY_EVIL;
828 #endif
829 } else if (r < 77) a_ptr->flags1 |= TR1_VAMPIRIC;
830 else if (r < 95) a_ptr->to_a += 3 + rand_int (5);
831 else {
832 a_ptr->to_h = 2 + rand_int(7);
833 a_ptr->to_d = 2 + rand_int(7);
834 a_ptr->flags3 |= TR3_SHOW_MODS;
835 }
836 break;
837 case TV_HELM:
838 if (r < 2) {
839 a_ptr->flags1 |= TR1_LIFE;
840 do_pval (a_ptr);
841 if (a_ptr->pval > 3) a_ptr->pval = 3;
842 } else if (r < 12) a_ptr->flags2 |= TR2_RES_BLIND;
843 else if (r < 17) {
844 a_ptr->flags1 |= TR1_INFRA;
845 if (a_ptr->pval == 0) a_ptr->pval = randint(2);
846 } else if (r < 25) a_ptr->flags4 |= TR4_AUTO_ID;
847 else if (r < 30) {
848 a_ptr->flags1 |= TR1_WIS;
849 do_pval (a_ptr);
850 }
851 // else if (r < 45) a_ptr->flags3 |= TR3_TELEPATHY;
852 // else if (r < 45) a_ptr->esp |= (ESP_ALL);
853 else if (r < 31) a_ptr->esp |= (ESP_ORC);
854 else if (r < 32) a_ptr->esp |= (ESP_TROLL);
855 else if (r < 33) a_ptr->esp |= (ESP_DRAGON);
856 else if (r < 34) a_ptr->esp |= (ESP_GIANT);
857 else if (r < 35) a_ptr->esp |= (ESP_DEMON);
858 else if (r < 36) a_ptr->esp |= (ESP_UNDEAD);
859 else if (r < 37) a_ptr->esp |= (ESP_EVIL);
860 else if (r < 38) a_ptr->esp |= (ESP_ANIMAL);
861 else if (r < 39) a_ptr->esp |= (ESP_DRAGONRIDER);
862 else if (r < 40) a_ptr->esp |= (ESP_GOOD);
863 else if (r < 41) a_ptr->esp |= (ESP_NONLIVING);
864 else if (r < 42) a_ptr->esp |= (ESP_UNIQUE);
865 else if (r < 43) a_ptr->esp |= (ESP_SPIDER);
866 else if (r < 44) a_ptr->esp |= (ESP_ALL);
867 else if (r < 54) a_ptr->flags3 |= TR3_SEE_INVIS;
868 else if (r < 63) {
869 a_ptr->flags1 |= TR1_INT;
870 do_pval (a_ptr);
871 }
872 else if (r < 70) a_ptr->flags2 |= TR2_RES_CONF;
873 else if (r < 75) a_ptr->flags2 |= TR2_RES_FEAR;
874 else a_ptr->to_a += 3 + rand_int (5);
875 break;
876 case TV_CROWN:
877 if (r < 2) {
878 a_ptr->flags1 |= TR1_LIFE;
879 do_pval (a_ptr);
880 if (a_ptr->pval > 3) a_ptr->pval = 3;
881 } else if (r < 14) a_ptr->flags2 |= TR2_RES_BLIND;
882 else if (r < 17) {
883 a_ptr->flags1 |= TR1_INFRA;
884 if (a_ptr->pval == 0) a_ptr->pval = randint(2);
885 } else if (r < 20) a_ptr->flags5 |= TR5_REGEN_MANA;
886 else if (r < 22) {
887 a_ptr->flags1 |= TR1_MANA;
888 if (a_ptr->pval == 0) a_ptr->pval = randint(5);
889 } else if (r < 30) a_ptr->flags4 |= TR4_AUTO_ID;
890 // else if (r < 45) a_ptr->flags3 |= TR3_TELEPATHY;
891 // else if (r < 45) a_ptr->esp |= (ESP_ALL);
892 else if (r < 31) a_ptr->esp |= (ESP_ORC);
893 else if (r < 32) a_ptr->esp |= (ESP_TROLL);
894 else if (r < 33) a_ptr->esp |= (ESP_DRAGON);
895 else if (r < 34) a_ptr->esp |= (ESP_GIANT);
896 else if (r < 35) a_ptr->esp |= (ESP_DEMON);
897 else if (r < 36) a_ptr->esp |= (ESP_UNDEAD);
898 else if (r < 37) a_ptr->esp |= (ESP_EVIL);
899 else if (r < 38) a_ptr->esp |= (ESP_ANIMAL);
900 else if (r < 39) a_ptr->esp |= (ESP_DRAGONRIDER);
901 else if (r < 40) a_ptr->esp |= (ESP_GOOD);
902 else if (r < 41) a_ptr->esp |= (ESP_NONLIVING);
903 else if (r < 42) a_ptr->esp |= (ESP_UNIQUE);
904 else if (r < 43) a_ptr->esp |= (ESP_SPIDER);
905 else if (r < 44) a_ptr->esp |= (ESP_ALL);
906 else if (r < 53) a_ptr->flags3 |= TR3_SEE_INVIS;
907 else if (r < 62) {
908 a_ptr->flags1 |= TR1_WIS;
909 do_pval (a_ptr);
910 } else if (r < 71) {
911 a_ptr->flags1 |= TR1_INT;
912 do_pval (a_ptr);
913 } else if (r < 77) a_ptr->flags2 |= TR2_RES_CONF;
914 else if (r < 81) a_ptr->flags2 |= TR2_RES_FEAR;
915 else a_ptr->to_a += 3 + rand_int (5);
916 break;
917 case TV_SHIELD:
918 #ifndef USE_NEW_SHIELDS
919 if (r < 18) a_ptr->flags2 |= TR2_RES_ACID;
920 else if (r < 36) a_ptr->flags2 |= TR2_RES_ELEC;
921 else if (r < 54) a_ptr->flags2 |= TR2_RES_FIRE;
922 else if (r < 72) a_ptr->flags2 |= TR2_RES_COLD;
923 else if (r < 80) a_ptr->flags5 |= TR5_REFLECT;
924 else a_ptr->to_a += 3 + rand_int (5);
925 #else
926 if (r < 20) a_ptr->flags2 |= TR2_RES_ACID;
927 else if (r < 40) a_ptr->flags2 |= TR2_RES_ELEC;
928 else if (r < 60) a_ptr->flags2 |= TR2_RES_FIRE;
929 else if (r < 80) a_ptr->flags2 |= TR2_RES_COLD;
930 else if (r < 90) a_ptr->flags5 |= TR5_REFLECT;
931 else a_ptr->weight = (a_ptr->weight * 9) / 10;
932 #endif
933 break;
934 case TV_CLOAK:
935 if (r < 5) {
936 a_ptr->flags3 |= TR3_FEATHER;
937 do_pval (a_ptr);
938 } else if (r < 10) { //30
939 if (!(a_ptr->flags3 & TR3_SH_FIRE ||
940 a_ptr->flags5 & TR5_SH_COLD ||
941 a_ptr->flags3 & TR3_SH_ELEC)) {
942 switch(rand_int(3)) {
943 case 0: a_ptr->flags3 |= TR3_SH_FIRE;
944 a_ptr->flags2 |= TR2_RES_FIRE;
945 break;
946 case 1: a_ptr->flags3 |= TR3_SH_ELEC;
947 a_ptr->flags2 |= TR2_RES_ELEC;
948 break;
949 case 2: a_ptr->flags5 |= TR5_SH_COLD;
950 a_ptr->flags2 |= TR2_RES_COLD;
951 break;
952 }
953 }
954 } else if (r < 20) a_ptr->flags5 |= TR5_INVIS;//33
955 else if (r < 34) { //55
956 a_ptr->flags1 |= TR1_STEALTH;
957 do_pval (a_ptr);
958 } else if (r < 45) a_ptr->flags2 |= TR2_RES_SHARDS;
959 else if (r < 50) a_ptr->flags4 |= TR4_LEVITATE;
960 else if (r < 55) a_ptr->flags2 |= TR2_HOLD_LIFE;
961 else if (r < 61) a_ptr->flags2 |= TR2_RES_FIRE;
962 else if (r < 68) a_ptr->flags2 |= TR2_RES_COLD;
963 else if (r < 71) a_ptr->flags2 |= TR2_RES_ACID;
964 else if (r < 75) a_ptr->flags2 |= TR2_RES_ELEC;
965 else a_ptr->to_a += 3 + rand_int(3);
966 break;
967 case TV_DRAG_ARMOR:
968 /* if (r < 55) ; --changed into 67% hack above */
969 if (r < 15) a_ptr->flags2 |= TR2_HOLD_LIFE;
970 else if (r < 30) {
971 a_ptr->flags1 |= TR1_CON;
972 do_pval (a_ptr);
973 if (rand_int (2) == 0)
974 a_ptr->flags2 |= TR2_SUST_CON;
975 } else if (r < 45) {
976 a_ptr->flags1 |= TR1_STR;
977 do_pval (a_ptr);
978 if (rand_int (2) == 0)
979 a_ptr->flags2 |= TR2_SUST_STR;
980 } else if (r < 50) {
981 a_ptr->flags1 |= TR1_LIFE;
982 do_pval (a_ptr);
983 if (a_ptr->pval > 3) a_ptr->pval = 3;
984 } else a_ptr->to_a += 1 + rand_int (4);
985 break;
986 case TV_HARD_ARMOR:
987 /* extra mods for royal armour */
988 if ((a_ptr->flags5 & TR5_WINNERS_ONLY) && !rand_int(10)) {
989 if (r < 20) a_ptr->flags5 |= TR5_REFLECT;
990 else if (r < 30) {
991 a_ptr->flags5 |= TR5_RES_MANA;
992 a_ptr->flags5 |= TR5_IGNORE_DISEN;
993 } else if (r < 50) a_ptr->flags2 |= TR2_IM_FIRE;
994 else if (r < 65) a_ptr->flags2 |= TR2_IM_ELEC;
995 else if (r < 80) a_ptr->flags2 |= TR2_IM_ACID;
996 else if (r < 95) a_ptr->flags2 |= TR2_IM_COLD;
997 else {
998 a_ptr->flags1 |= TR1_LIFE;
999 do_pval (a_ptr);
1000 if (a_ptr->pval > 3) a_ptr->pval = 3;
1001 }
1002 break;
1003 }
1004 /* fall through! */
1005 case TV_SOFT_ARMOR:
1006 if (r < 8) {
1007 a_ptr->flags1 |= TR1_STEALTH;
1008 do_pval (a_ptr);
1009 } else if (r < 16) a_ptr->flags2 |= TR2_HOLD_LIFE;
1010 else if (r < 22) {
1011 a_ptr->flags1 |= TR1_CON;
1012 do_pval (a_ptr);
1013 if (rand_int (2) == 0)
1014 a_ptr->flags2 |= TR2_SUST_CON;
1015 } else if (r < 34) a_ptr->flags2 |= TR2_RES_ACID;
1016 else if (r < 46) a_ptr->flags2 |= TR2_RES_ELEC;
1017 else if (r < 58) a_ptr->flags2 |= TR2_RES_FIRE;
1018 else if (r < 70) a_ptr->flags2 |= TR2_RES_COLD;
1019 else if (r < 72) {
1020 a_ptr->flags1 |= TR1_LIFE;
1021 do_pval (a_ptr);
1022 if (a_ptr->pval > 3) a_ptr->pval = 3;
1023 } else if (r < 80) a_ptr->weight = (a_ptr->weight * 9) / 10;
1024 else a_ptr->to_a += 3 + rand_int (8);
1025 break;
1026 case TV_LITE:
1027 if (r < 50) a_ptr->flags3 |= TR3_LITE1;
1028 else if (r < 80) a_ptr->flags4 |= TR4_LITE2;
1029 else a_ptr->flags4 |= TR4_LITE3;
1030 // if (r % 2) a_ptr->flags4 &= ~TR4_FUEL_LITE;
1031 if (!(r % 5)) a_ptr->flags4 &= ~TR4_FUEL_LITE;
1032 break;
1033 default:
1034 break;
1035 }
1036 } else { /* Pick something universally useful. */
1037 switch (a_ptr->tval) {
1038 case TV_BOOMERANG:
1039 case TV_BOW:
1040 /* if (magik(33)) break;*/
1041 default:
1042 r = rand_int(44);
1043
1044 switch (r) {
1045 case 0:
1046 a_ptr->flags1 |= TR1_STR;
1047 do_pval (a_ptr);
1048 if (rand_int (2) == 0) a_ptr->flags2 |= TR2_SUST_STR;
1049 break;
1050 case 1:
1051 a_ptr->flags1 |= TR1_INT;
1052 do_pval (a_ptr);
1053 if (rand_int (2) == 0) a_ptr->flags2 |= TR2_SUST_INT;
1054 break;
1055 case 2:
1056 a_ptr->flags1 |= TR1_WIS;
1057 do_pval (a_ptr);
1058 if (rand_int (2) == 0) a_ptr->flags2 |= TR2_SUST_WIS;
1059 if (a_ptr->tval == TV_SWORD || a_ptr->tval == TV_POLEARM)
1060 a_ptr->flags3 |= TR3_BLESSED;
1061 break;
1062 case 3:
1063 a_ptr->flags1 |= TR1_DEX;
1064 do_pval (a_ptr);
1065 if (rand_int (2) == 0) a_ptr->flags2 |= TR2_SUST_DEX;
1066 break;
1067 case 4:
1068 a_ptr->flags1 |= TR1_CON;
1069 do_pval (a_ptr);
1070 if (rand_int (2) == 0) a_ptr->flags2 |= TR2_SUST_CON;
1071 break;
1072 case 5:
1073 a_ptr->flags1 |= TR1_CHR;
1074 do_pval (a_ptr);
1075 if (rand_int (2) == 0) a_ptr->flags2 |= TR2_SUST_CHR;
1076 break;
1077 case 6:
1078 a_ptr->flags1 |= TR1_STEALTH;
1079 do_pval (a_ptr);
1080 break;
1081 case 7:
1082 a_ptr->flags1 |= TR1_SEARCH;
1083 do_pval (a_ptr);
1084 break;
1085 case 8:
1086 /* cut chance in half again -> approx. 1/20..1/25 over whole item base - C. Blue */
1087 if (!rand_int(2)) a_ptr->flags3 |= TR3_NO_MAGIC;
1088 break;
1089 case 9:
1090 /* hack: no +speed on shields, this puts 2h weapons at a severe disadvantage,
1091 because even though they may get +6 speed, seemingly equal to +3/+3 (1h+shield),
1092 this has 2 big flaws:
1093 1) getting +5 or +6 speed is RARE, 2) this means the weapon won't have +EA! */
1094 if (a_ptr->tval == TV_SHIELD) {
1095 a_ptr->flags5 |= TR5_REFLECT;
1096 break;
1097 }
1098 /* hack: no +speed on boomerangs
1099 (mainly for ENABLE_MA_BOOMERANG in regards to MA mimics -> +speed overkill) */
1100 if (a_ptr->tval == TV_BOOMERANG) {
1101 //a_ptr->flags |= TR_; -- no good filler available atm. so just retry.
1102 break;
1103 }
1104
1105 a_ptr->flags1 |= TR1_SPEED;
1106 if (a_ptr->pval == 0) a_ptr->pval = 3 + rand_int (3);
1107 else do_pval (a_ptr);
1108 break;
1109 case 10:
1110 a_ptr->flags2 |= TR2_SUST_STR;
1111 if (rand_int (2) == 0) {
1112 a_ptr->flags1 |= TR1_STR;
1113 do_pval (a_ptr);
1114 }
1115 break;
1116 case 11:
1117 a_ptr->flags2 |= TR2_SUST_INT;
1118 if (rand_int (2) == 0) {
1119 a_ptr->flags1 |= TR1_INT;
1120 do_pval (a_ptr);
1121 }
1122 break;
1123 case 12:
1124 a_ptr->flags2 |= TR2_SUST_WIS;
1125 if (rand_int (2) == 0) {
1126 a_ptr->flags1 |= TR1_WIS;
1127 do_pval (a_ptr);
1128 if (a_ptr->tval == TV_SWORD || a_ptr->tval == TV_POLEARM)
1129 a_ptr->flags3 |= TR3_BLESSED;
1130 }
1131 break;
1132 case 13:
1133 a_ptr->flags2 |= TR2_SUST_DEX;
1134 if (rand_int (2) == 0) {
1135 a_ptr->flags1 |= TR1_DEX;
1136 do_pval (a_ptr);
1137 }
1138 break;
1139 case 14:
1140 a_ptr->flags2 |= TR2_SUST_CON;
1141 if (rand_int (2) == 0) {
1142 a_ptr->flags1 |= TR1_CON;
1143 do_pval (a_ptr);
1144 }
1145 break;
1146 case 15:
1147 a_ptr->flags2 |= TR2_SUST_CHR;
1148 if (rand_int (2) == 0) {
1149 a_ptr->flags1 |= TR1_CHR;
1150 do_pval (a_ptr);
1151 }
1152 break;
1153 case 16:
1154 if (rand_int (3) == 0) a_ptr->flags2 |= TR2_IM_ACID;
1155 break;
1156 case 17:
1157 if (rand_int (3) == 0) a_ptr->flags2 |= TR2_IM_ELEC;
1158 break;
1159 case 18:
1160 if (rand_int (4) == 0) a_ptr->flags2 |= TR2_IM_FIRE;
1161 break;
1162 case 19:
1163 if (rand_int (3) == 0) a_ptr->flags2 |= TR2_IM_COLD;
1164 break;
1165 case 20: a_ptr->flags2 |= TR2_FREE_ACT; break;
1166 case 21: a_ptr->flags2 |= TR2_HOLD_LIFE; break;
1167 case 22: a_ptr->flags2 |= TR2_RES_ACID; break;
1168 case 23: a_ptr->flags2 |= TR2_RES_ELEC; break;
1169 case 24: a_ptr->flags2 |= TR2_RES_FIRE; break;
1170 case 25: a_ptr->flags2 |= TR2_RES_COLD; break;
1171
1172 case 26: a_ptr->flags2 |= TR2_RES_POIS; break;
1173 case 27: a_ptr->flags2 |= TR2_RES_LITE; break;
1174 case 28: a_ptr->flags2 |= TR2_RES_DARK; break;
1175 case 29: a_ptr->flags2 |= TR2_RES_BLIND; break;
1176 case 30: a_ptr->flags2 |= TR2_RES_CONF; break;
1177 case 31: a_ptr->flags2 |= TR2_RES_SOUND; break;
1178 case 32: a_ptr->flags2 |= TR2_RES_SHARDS; break;
1179 case 33:
1180 if (rand_int (2) == 0) a_ptr->flags2 |= TR2_RES_NETHER;
1181 break;
1182 case 34: a_ptr->flags2 |= TR2_RES_NEXUS; break;
1183 case 35: a_ptr->flags2 |= TR2_RES_CHAOS; break;
1184 case 36:
1185 if (rand_int (2) == 0) a_ptr->flags2 |= TR2_RES_DISEN;
1186 break;
1187 case 37: a_ptr->flags3 |= TR3_FEATHER; break;
1188 case 38: a_ptr->flags3 |= TR3_LITE1; break;
1189 case 39: a_ptr->flags3 |= TR3_SEE_INVIS; break;
1190 case 40:
1191 #if 0
1192 if (rand_int (3) == 0)
1193 // a_ptr->flags3 |= TR3_TELEPATHY;
1194 a_ptr->esp |= (ESP_ALL);
1195 #endif // 0
1196 {
1197 int rr = rand_int (29);
1198 if (rr < 1) a_ptr->esp |= (ESP_ORC);
1199 else if (rr < 2) a_ptr->esp |= (ESP_TROLL);
1200 else if (rr < 3) a_ptr->esp |= (ESP_DRAGON);
1201 else if (rr < 4) a_ptr->esp |= (ESP_GIANT);
1202 else if (rr < 5) a_ptr->esp |= (ESP_DEMON);
1203 else if (rr < 8) a_ptr->esp |= (ESP_UNDEAD);
1204 else if (rr < 12) a_ptr->esp |= (ESP_EVIL);
1205 else if (rr < 14) a_ptr->esp |= (ESP_ANIMAL);
1206 else if (rr < 16) a_ptr->esp |= (ESP_DRAGONRIDER);
1207 else if (rr < 19) a_ptr->esp |= (ESP_GOOD);
1208 else if (rr < 21) a_ptr->esp |= (ESP_NONLIVING);
1209 else if (rr < 24) a_ptr->esp |= (ESP_UNIQUE);
1210 else if (rr < 26) a_ptr->esp |= (ESP_SPIDER);
1211 else a_ptr->esp |= (ESP_ALL);
1212 break;
1213 }
1214 case 41: a_ptr->flags3 |= TR3_SLOW_DIGEST; break;
1215 case 42:
1216 a_ptr->flags5 |= TR5_REGEN_MANA; break;
1217 case 43:
1218 a_ptr->flags3 |= TR3_REGEN; break;
1219 #if 0 /* only for helms/crowns */
1220 case 44:
1221 a_ptr->flags1 |= TR1_INFRA;
1222 do_pval (a_ptr);
1223 break;
1224 #endif
1225 }
1226 }
1227 }
1228 }
1229
1230
1231
1232 /* Fix various artifact limits and contradictions */
artifact_fix_limits_inbetween(artifact_type * a_ptr,object_kind * k_ptr)1233 static void artifact_fix_limits_inbetween(artifact_type *a_ptr, object_kind *k_ptr) {
1234 int c = 0; /* used to count how many stats the artifact increases */
1235
1236 /* -------------------------------------- Initial min/max limit -------------------------------------- */
1237
1238 /* Never have more than +11 bonus */
1239 if (!is_ammo(a_ptr->tval) && a_ptr->pval > 11) a_ptr->pval = 11;
1240
1241 /* Ensure a bonus for certain items whose base types always have a (b)pval */
1242 if (((k_ptr->flags1 & TR1_PVAL_MASK) || (k_ptr->flags5 & TR5_PVAL_MASK)) && !a_ptr->pval) {
1243 a_ptr->pval = randint(3); /* do_pval */
1244 if (k_ptr->flags3 & TR3_CURSED) a_ptr->pval = -a_ptr->pval;
1245 }
1246
1247 /* -------------------------------------- pval-independant limits -------------------------------------- */
1248
1249 /* Don't exaggerate at weapon dice (2h: 5d6, 6d8, 6d8, 10d4; 1.5h: 5d5, 6d3, 1h: 2d8/3d5 */
1250 while (a_ptr->dd * (a_ptr->ds + 1) > slay_limit_randart(a_ptr, k_ptr)
1251 // || ((k_ptr->flags4 & (TR4_MUST2H | TR4_SHOULD2H)) && a_ptr->dd * (a_ptr->ds + 1) >= (k_ptr->dd * (k_ptr->ds + 1)) << 1)
1252 ) {
1253 if (a_ptr->dd <= k_ptr->dd) a_ptr->ds--;
1254 else if (a_ptr->ds <= k_ptr->ds) a_ptr->dd--;
1255 else {
1256 if (rand_int(2)) a_ptr->ds--;
1257 else a_ptr->dd--;
1258 }
1259 }
1260 /* fix lower limit (paranoia) */
1261 if (a_ptr->dd < 1) a_ptr->dd = 1;
1262 if (a_ptr->ds < 1) a_ptr->ds = 1;
1263 /* Don't increase it too much, ie less than for 'of slaying' ego weapons */
1264 if (k_ptr->dd >= 7) {
1265 if (a_ptr->dd > k_ptr->dd + 3) a_ptr->dd = k_ptr->dd + 3;
1266 } else {
1267 if (a_ptr->dd > k_ptr->dd + 2) a_ptr->dd = k_ptr->dd + 2;
1268 }
1269 if (a_ptr->ds > k_ptr->ds + 2) a_ptr->ds = k_ptr->ds + 2;
1270
1271 /* Never more than +6 +hit/+dam on gloves, +30 in general */
1272 switch (a_ptr->tval) { /* CAP_ITEM_BONI */
1273 case TV_GLOVES:
1274 if (a_ptr->to_h > 6) a_ptr->to_h = 6;
1275 if (a_ptr->to_d > 6) a_ptr->to_d = 6;
1276 #ifndef TO_AC_CAP_30
1277 if (a_ptr->to_a > 35) a_ptr->to_a = 35;
1278 #else
1279 if (a_ptr->to_a > 30) a_ptr->to_a = 30;
1280 #endif
1281 break;
1282 case TV_SHIELD:
1283 #ifdef USE_NEW_SHIELDS /* should actually be USE_BLOCKING, but could be too */
1284 /* dramatic a change if it gets enabled temporarily - C. Blue */
1285 #ifndef NEW_SHIELDS_NO_AC
1286 if (a_ptr->to_a > 15) a_ptr->to_a = 15;
1287 #else
1288 a_ptr->to_a = 0;
1289 #endif
1290 break;
1291 #endif
1292 case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR:
1293 case TV_CLOAK: case TV_HELM: case TV_CROWN: case TV_BOOTS:
1294 // if (a_ptr->to_a > 50) a_ptr->to_a = 50;
1295 #ifndef TO_AC_CAP_30
1296 if (a_ptr->to_a > 35) a_ptr->to_a = 35;
1297 #else
1298 if (a_ptr->to_a > 30) a_ptr->to_a = 30;
1299 #endif
1300 break;
1301 case TV_BOW:
1302 case TV_BOOMERANG:
1303 default: /* all melee weapons */
1304 if (a_ptr->to_h > 30) a_ptr->to_h = 30;
1305 if (a_ptr->to_d > 30) a_ptr->to_d = 30;
1306 break;
1307 }
1308
1309 /* Mage staves never have NO_MAGIC but their pval always adds to MANA */
1310 if (a_ptr->tval == TV_MSTAFF) {
1311 a_ptr->flags3 &= ~TR3_NO_MAGIC;
1312 if (a_ptr->pval) a_ptr->flags1 |= TR1_MANA;
1313
1314 #if 0 /* these aren't counted into AP for mage staves actually */
1315 /* keep it neutral for now, to keep AP unaffected */
1316 a_ptr->to_h = 0;
1317 a_ptr->to_d = 0;
1318 #endif
1319 }
1320 /* Dark Swords never add to MANA */
1321 if (a_ptr->tval == TV_SWORD && a_ptr->sval == SV_DARK_SWORD) a_ptr->flags1 &= ~TR1_MANA;
1322
1323 /* If an item gives +MANA, remove NO_MAGIC property */
1324 if ((a_ptr->flags1 & TR1_MANA) && !(k_ptr->flags3 & TR3_NO_MAGIC)) a_ptr->flags3 &= ~TR3_NO_MAGIC;
1325 /* If an item gives REGEN_MANA, remove NO_MAGIC property */
1326 if ((a_ptr->flags5 & TR5_REGEN_MANA) && !(k_ptr->flags3 & TR3_NO_MAGIC)) a_ptr->flags3 &= ~TR3_NO_MAGIC;
1327 #if 0 /* would also need to disallow egos w/ BLESSED then, which is problematic in some ways */
1328 /* Don't allow BLESSED on Dark Swords */
1329 if (k_ptr->tval == TV_SWORD && k_ptr->sval == SV_DARK_SWORD) a_ptr->flags3 &= ~TR3_BLESSED;
1330 #endif
1331 /* If an item is BLESSED, remove NO_MAGIC property */
1332 if ((a_ptr->flags3 & TR3_BLESSED) && !(k_ptr->flags3 & TR3_NO_MAGIC)) a_ptr->flags3 &= ~TR3_NO_MAGIC;
1333
1334 /* -------------------------------------- Flag-killing limits -------------------------------------- */
1335
1336 /* Not more than +5 stealth */
1337 /* exception for cloaks to get on par with elven cloaks of the bat */
1338 if (a_ptr->flags1 & TR1_STEALTH) {
1339 if (k_ptr->tval != TV_CLOAK) {
1340 if (a_ptr->pval > 5) {
1341 if (((a_ptr->flags1 & TR1_SPEED) || (a_ptr->flags5 & TR5_CRIT) || (a_ptr->flags1 & TR1_MANA))
1342 && !(k_ptr->flags1 & TR1_STEALTH))
1343 a_ptr->flags1 &= ~TR1_STEALTH;
1344 else
1345 a_ptr->pval = 5;
1346 }
1347 }
1348 else if (a_ptr->pval > 6) a_ptr->pval = 6;
1349 }
1350
1351 /* Not more than +4 searching, but remove searching if it blocks highly valued flags instead */
1352 if ((a_ptr->flags1 & TR1_SEARCH) && (a_ptr->pval > 4)) {
1353 if (((a_ptr->flags1 & TR1_SPEED) || (a_ptr->flags5 & TR5_CRIT) || (a_ptr->flags1 & TR1_MANA))
1354 && !(k_ptr->flags1 & TR1_SEARCH))
1355 a_ptr->flags1 &= ~TR1_SEARCH;
1356 else
1357 a_ptr->pval = 4;
1358 }
1359
1360 /* Preparation for erasure of heaviest speed/mana killing flags, see further below.. */
1361 if (a_ptr->flags1 & (TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | TR1_CON | TR1_CHR)) {
1362 /* Count how many stats are increased */
1363 if (a_ptr->flags1 & TR1_STR) c++;
1364 if (a_ptr->flags1 & TR1_INT) c++;
1365 if (a_ptr->flags1 & TR1_WIS) c++;
1366 if (a_ptr->flags1 & TR1_DEX) c++;
1367 if (a_ptr->flags1 & TR1_CON) c++;
1368 if (a_ptr->flags1 & TR1_CHR) c++;
1369 }
1370
1371 /* Speed is of primary importance on boots! */
1372 if ((a_ptr->flags1 & TR1_SPEED) && (k_ptr->tval == TV_BOOTS)) {
1373 /* Erase the heaviest speed-killing flags! */
1374 if (a_ptr->pval > 5) { /* differ from post-check, to match reduction below */
1375 a_ptr->flags1 &= ~(TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | TR1_CON | TR1_CHR);
1376 } else if (a_ptr->pval > 3 && c > 3) { /* differ from post-check, to match reduction below */
1377 a_ptr->flags1 &= ~(TR1_INT | TR1_WIS | TR1_CHR); /* quite nice selectivity */
1378 }
1379 }
1380 /* And I guess mana is similarly important on mage staves */
1381 if ((a_ptr->flags1 & TR1_MANA) && (k_ptr->tval == TV_MSTAFF)) {
1382 /* Erase the heaviest mana-killing flags! */
1383 if (a_ptr->pval > 5) { /* differ from post-check, to match reduction below */
1384 a_ptr->flags1 &= ~(TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | TR1_CON | TR1_CHR);
1385 } else if (a_ptr->pval > 3 && c > 3) { /* differ from post-check, to match reduction below */
1386 a_ptr->flags1 &= ~(TR1_INT | TR1_WIS | TR1_CHR); /* quite nice selectivity */
1387 }
1388 }
1389 /* Note: Crit on weapons actually isn't that big of a deal, since
1390 it doesn't scale in a linear way anyway, so leaving it out here. - C. Blue */
1391
1392 /* Update count */
1393 c = 0;
1394 if (a_ptr->flags1 & (TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | TR1_CON | TR1_CHR)) {
1395 /* Count how many stats are increased */
1396 if (a_ptr->flags1 & TR1_STR) c++;
1397 if (a_ptr->flags1 & TR1_INT) c++;
1398 if (a_ptr->flags1 & TR1_WIS) c++;
1399 if (a_ptr->flags1 & TR1_DEX) c++;
1400 if (a_ptr->flags1 & TR1_CON) c++;
1401 if (a_ptr->flags1 & TR1_CHR) c++;
1402 }
1403
1404 /* -------------------------------------- pval-dividing limits -------------------------------------- */
1405
1406 /* Never more than +3 EA, +2 on gloves (also done below in pval-fixing limits */
1407 if (a_ptr->flags1 & TR1_BLOWS) {
1408 if (a_ptr->tval == TV_GLOVES) {
1409 //if (a_ptr->pval > 2) a_ptr->pval /= 3;
1410 if (a_ptr->pval > 2) a_ptr->pval = 2;
1411 } else {
1412 //if (a_ptr->pval > 3) a_ptr->pval /= 2;
1413 if (a_ptr->pval > 3) a_ptr->pval = 3;
1414 }
1415 if (a_ptr->pval == 0) a_ptr->pval = 1;
1416 }
1417
1418 /* -------------------------------------- pval-fixing limits -------------------------------------- */
1419
1420 /* Never more than +3 LIFE or +3 EA */
1421 if ((a_ptr->flags1 & (TR1_LIFE | TR1_BLOWS)) && (a_ptr->pval > 3)) a_ptr->pval = 3;
1422 if ((a_ptr->tval == TV_GLOVES) && (a_ptr->flags1 & TR1_BLOWS) && (a_ptr->pval > 2)) a_ptr->pval = 2;
1423
1424 /* Never have super EA _and_ LIFE at the same time o_o */
1425 if ((a_ptr->flags1 & TR1_LIFE) && (a_ptr->flags1 & TR1_BLOWS) && (a_ptr->pval > 1)) a_ptr->pval = 1;
1426
1427 if ((a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN)) {
1428 /* Not more than +6 IV on helms and crowns */
1429 if ((a_ptr->flags1 & TR1_INFRA) && (a_ptr->pval > 6)) a_ptr->pval = 6;
1430 /* Not more than +3 speed on helms/crowns */
1431 if ((a_ptr->flags1 & TR1_SPEED) && (a_ptr->pval > 3)) a_ptr->pval = 3;
1432 }
1433
1434 /* Limits for +MANA */
1435 if (a_ptr->flags1 & TR1_MANA) {
1436 /* Randart mage staves may give up to +10 +1 bonus MANA */
1437 if ((a_ptr->tval == TV_MSTAFF) && (a_ptr->pval >= 11)) a_ptr->pval = 11;
1438 /* Helms and crowns may not give more than +3 MANA */
1439 else if ((a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) &&
1440 (a_ptr->pval > 3)) a_ptr->pval = 3;
1441 /* Usually +10 MANA is max */
1442 else if (a_ptr->pval > 10) a_ptr->pval = 10;
1443 }
1444
1445 /* Limit speed on 1-hand weapons and shields (balances both, dual-wiel and 2-handed weapons) */
1446 /* Limit +LIFE to +2 under same circumstances */
1447 if (k_ptr->tval == TV_SHIELD || is_weapon(k_ptr->tval)) {
1448 if (!(k_ptr->flags4 & TR4_SHOULD2H) && !(k_ptr->flags4 & TR4_MUST2H)) {
1449 if ((a_ptr->flags1 & TR1_SPEED) && (a_ptr->pval > 3)) a_ptr->pval = 3;
1450 if ((a_ptr->flags1 & TR1_LIFE) && (a_ptr->pval > 2)) a_ptr->pval = 2;
1451 } else if ((a_ptr->flags1 & TR1_SPEED) && (a_ptr->pval > 6)) a_ptr->pval = 6;
1452 }
1453
1454 /* Note: Neither luck nor disarm can actually newly appear on a randart except if coming from k_info. */
1455
1456 /* Not more than +6 luck (was +5, increased for randart elven cloaks!) */
1457 if ((a_ptr->flags5 & TR5_LUCK) && (a_ptr->pval > 6)) a_ptr->pval = 6;
1458
1459 /* Not more than +3 disarming ability (randart picklocks aren't allowed anyways) */
1460 if ((a_ptr->flags5 & TR5_DISARM) && (a_ptr->pval > 3)) {
1461 if (!(k_ptr->flags5 & TR5_DISARM)) a_ptr->flags5 &= ~TR5_DISARM;
1462 else a_ptr->pval = 3;
1463 }
1464
1465 /* -------------------------------------- Misc unaffecting boni/limits -------------------------------------- */
1466
1467 }
1468
1469 /* Fix various artifact limits and contradictions */
artifact_fix_limits_afterwards(artifact_type * a_ptr,object_kind * k_ptr)1470 static void artifact_fix_limits_afterwards(artifact_type *a_ptr, object_kind *k_ptr) {
1471 int c = 0; /* used to count how many stats the artifact increases */
1472
1473 /* -------------------------------------- Initial min/max limit -------------------------------------- */
1474
1475 /* Never have more than +11 bonus */
1476 if (!is_ammo(a_ptr->tval) && a_ptr->pval > 11) a_ptr->pval = 11;
1477
1478 /* Ensure a bonus for certain items whose base types always have a (b)pval */
1479 if (((k_ptr->flags1 & TR1_PVAL_MASK) || (k_ptr->flags5 & TR5_PVAL_MASK)) && !a_ptr->pval) {
1480 a_ptr->pval = randint(3); /* do_pval */
1481 if (k_ptr->flags3 & TR3_CURSED) a_ptr->pval = -a_ptr->pval;
1482 }
1483
1484 /* -------------------------------------- pval-independant limits -------------------------------------- */
1485
1486 /* Don't exaggerate at weapon dice (2h: 5d6, 6d8, 6d8, 10d4; 1.5h: 5d5, 6d3, 1h: 2d8/3d5 */
1487 while (a_ptr->dd * (a_ptr->ds + 1) > slay_limit_randart(a_ptr, k_ptr)
1488 // || ((k_ptr->flags4 & (TR4_MUST2H | TR4_SHOULD2H)) && a_ptr->dd * (a_ptr->ds + 1) >= (k_ptr->dd * (k_ptr->ds + 1)) << 1)
1489 ) {
1490 if (a_ptr->dd <= k_ptr->dd) a_ptr->ds--;
1491 else if (a_ptr->ds <= k_ptr->ds) a_ptr->dd--;
1492 else {
1493 if (rand_int(2)) a_ptr->ds--;
1494 else a_ptr->dd--;
1495 }
1496 }
1497 /* fix lower limit (paranoia) */
1498 if (a_ptr->dd < 1) a_ptr->dd = 1;
1499 if (a_ptr->ds < 1) a_ptr->ds = 1;
1500 /* Don't increase it too much, ie less than for 'of slaying' ego weapons */
1501 if (k_ptr->dd >= 7) {
1502 if (a_ptr->dd > k_ptr->dd + 3) a_ptr->dd = k_ptr->dd + 3;
1503 } else {
1504 if (a_ptr->dd > k_ptr->dd + 2) a_ptr->dd = k_ptr->dd + 2;
1505 }
1506 if (a_ptr->ds > k_ptr->ds + 2) a_ptr->ds = k_ptr->ds + 2;
1507
1508 /* Never more than +6 +hit/+dam on gloves, +30 in general */
1509 switch (a_ptr->tval) { /* CAP_ITEM_BONI */
1510 case TV_GLOVES:
1511 if (a_ptr->to_h > 6) a_ptr->to_h = 6;
1512 if (a_ptr->to_d > 6) a_ptr->to_d = 6;
1513 #ifndef TO_AC_CAP_30
1514 if (a_ptr->to_a > 35) a_ptr->to_a = 35;
1515 #else
1516 if (a_ptr->to_a > 30) a_ptr->to_a = 30;
1517 #endif
1518 break;
1519 case TV_SHIELD:
1520 #ifdef USE_NEW_SHIELDS /* should actually be USE_BLOCKING, but could be too */
1521 /* dramatic a change if it gets enabled temporarily - C. Blue */
1522 #ifndef NEW_SHIELDS_NO_AC
1523 if (a_ptr->to_a > 15) a_ptr->to_a = 15;
1524 #else
1525 a_ptr->to_a = 0;
1526 #endif
1527 break;
1528 #endif
1529 case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR:
1530 case TV_CLOAK: case TV_HELM: case TV_CROWN: case TV_BOOTS:
1531 // if (a_ptr->to_a > 50) a_ptr->to_a = 50;
1532 #ifndef TO_AC_CAP_30
1533 if (a_ptr->to_a > 35) a_ptr->to_a = 35;
1534 #else
1535 if (a_ptr->to_a > 30) a_ptr->to_a = 30;
1536 #endif
1537 break;
1538 case TV_BOW:
1539 case TV_BOOMERANG:
1540 default: /* all melee weapons */
1541 if (a_ptr->to_h > 30) a_ptr->to_h = 30;
1542 if (a_ptr->to_d > 30) a_ptr->to_d = 30;
1543 break;
1544 }
1545
1546 /* Mage staves never have NO_MAGIC but their pval always adds to MANA */
1547 if (a_ptr->tval == TV_MSTAFF) {
1548 a_ptr->flags3 &= ~TR3_NO_MAGIC;
1549 if (a_ptr->pval) a_ptr->flags1 |= TR1_MANA;
1550 #if 0
1551 /* reduce +hit/+dam depending on +MANA bonus */
1552 a_ptr->to_h = -(a_ptr->pval + rand_int(5)) * 3;
1553 a_ptr->to_d = -(a_ptr->pval + rand_int(5)) * 3;
1554 if (a_ptr->to_h > 10) a_ptr->to_h = 10;
1555 if (a_ptr->to_d > 10) a_ptr->to_d = 10;
1556 #else
1557 if (a_ptr->to_h > 15) a_ptr->to_h = 15;
1558 if (a_ptr->to_d > 15) a_ptr->to_d = 15;
1559 #endif
1560 }
1561 /* Dark Swords never add to MANA */
1562 if (a_ptr->tval == TV_SWORD && a_ptr->sval == SV_DARK_SWORD) a_ptr->flags1 &= ~TR1_MANA;
1563
1564 /* If an item gives +MANA, remove NO_MAGIC property */
1565 if ((a_ptr->flags1 & TR1_MANA) && !(k_ptr->flags3 & TR3_NO_MAGIC)) a_ptr->flags3 &= ~TR3_NO_MAGIC;
1566 /* If an item gives REGEN_MANA, remove NO_MAGIC property */
1567 if ((a_ptr->flags5 & TR5_REGEN_MANA) && !(k_ptr->flags3 & TR3_NO_MAGIC)) a_ptr->flags3 &= ~TR3_NO_MAGIC;
1568 #if 0 /* would also need to disallow egos w/ BLESSED then, which is problematic in some ways */
1569 /* Don't allow BLESSED on Dark Swords */
1570 if (k_ptr->tval == TV_SWORD && k_ptr->sval == SV_DARK_SWORD) a_ptr->flags3 &= ~TR3_BLESSED;
1571 #endif
1572 /* If an item is BLESSED, remove NO_MAGIC property */
1573 if ((a_ptr->flags3 & TR3_BLESSED) && !(k_ptr->flags3 & TR3_NO_MAGIC)) a_ptr->flags3 &= ~TR3_NO_MAGIC;
1574
1575 /* -------------------------------------- Flag-killing limits -------------------------------------- */
1576
1577 /* Not more than +5 stealth */
1578 /* exception for cloaks to get on par with elven cloaks of the bat */
1579 if (a_ptr->flags1 & TR1_STEALTH) {
1580 if (k_ptr->tval != TV_CLOAK) {
1581 if (a_ptr->pval > 5) {
1582 if (((a_ptr->flags1 & TR1_SPEED) || (a_ptr->flags5 & TR5_CRIT) || (a_ptr->flags1 & TR1_MANA))
1583 && !(k_ptr->flags1 & TR1_STEALTH))
1584 a_ptr->flags1 &= ~TR1_STEALTH;
1585 else
1586 a_ptr->pval = 5;
1587 }
1588 }
1589 else if (a_ptr->pval > 6) a_ptr->pval = 6;
1590 }
1591
1592 /* Not more than +4 searching, but remove searching if it blocks highly valued flags instead */
1593 if ((a_ptr->flags1 & TR1_SEARCH) && (a_ptr->pval > 4)) {
1594 if (((a_ptr->flags1 & TR1_SPEED) || (a_ptr->flags5 & TR5_CRIT) || (a_ptr->flags1 & TR1_MANA))
1595 && !(k_ptr->flags1 & TR1_SEARCH))
1596 a_ptr->flags1 &= ~TR1_SEARCH;
1597 else
1598 a_ptr->pval = 4;
1599 }
1600
1601 /* Preparation for erasure of heaviest speed/mana killing flags, see further below.. */
1602 if (a_ptr->flags1 & (TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | TR1_CON | TR1_CHR)) {
1603 /* Count how many stats are increased */
1604 if (a_ptr->flags1 & TR1_STR) c++;
1605 if (a_ptr->flags1 & TR1_INT) c++;
1606 if (a_ptr->flags1 & TR1_WIS) c++;
1607 if (a_ptr->flags1 & TR1_DEX) c++;
1608 if (a_ptr->flags1 & TR1_CON) c++;
1609 if (a_ptr->flags1 & TR1_CHR) c++;
1610 }
1611
1612 /* Speed is of primary importance on boots! */
1613 if ((a_ptr->flags1 & TR1_SPEED) && (k_ptr->tval == TV_BOOTS)) {
1614 /* Erase the heaviest speed-killing flags! */
1615 if (a_ptr->pval > 6) {
1616 a_ptr->flags1 &= ~(TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | TR1_CON | TR1_CHR);
1617 } else if (a_ptr->pval > 4 && c > 3) {
1618 a_ptr->flags1 &= ~(TR1_INT | TR1_WIS | TR1_CHR); /* quite nice selectivity */
1619 }
1620 }
1621 /* And I guess mana is similarly important on mage staves */
1622 if ((a_ptr->flags1 & TR1_MANA) && (k_ptr->tval == TV_MSTAFF)) {
1623 /* Erase the heaviest mana-killing flags! */
1624 if (a_ptr->pval > 6) {
1625 a_ptr->flags1 &= ~(TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | TR1_CON | TR1_CHR);
1626 } else if (a_ptr->pval > 4 && c > 3) {
1627 a_ptr->flags1 &= ~(TR1_INT | TR1_WIS | TR1_CHR); /* quite nice selectivity */
1628 }
1629 }
1630 /* Note: Crit on weapons actually isn't that big of a deal, since
1631 it doesn't scale in a linear way anyway, so leaving it out here. - C. Blue */
1632
1633 /* Update count */
1634 c = 0;
1635 if (a_ptr->flags1 & (TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | TR1_CON | TR1_CHR)) {
1636 /* Count how many stats are increased */
1637 if (a_ptr->flags1 & TR1_STR) c++;
1638 if (a_ptr->flags1 & TR1_INT) c++;
1639 if (a_ptr->flags1 & TR1_WIS) c++;
1640 if (a_ptr->flags1 & TR1_DEX) c++;
1641 if (a_ptr->flags1 & TR1_CON) c++;
1642 if (a_ptr->flags1 & TR1_CHR) c++;
1643 }
1644
1645 /* -------------------------------------- pval-dividing limits -------------------------------------- */
1646
1647 /* If an item increases all three, SPEED, CRIT, MANA,
1648 then reduce pval to 1/2 to balance */
1649 if ((a_ptr->flags1 & TR1_SPEED) && (a_ptr->flags5 & TR5_CRIT) && (a_ptr->flags1 & TR1_MANA)) {
1650 a_ptr->pval /= 2;
1651 if (!a_ptr->pval) a_ptr->pval = 1;
1652 }
1653 /* If an item increases two of SPEED, CRIT, MANA by over 7
1654 then reduce pval to 2/3 to balance */
1655 else if ((((a_ptr->flags1 & TR1_SPEED) && (a_ptr->flags5 & TR5_CRIT)) ||
1656 ((a_ptr->flags1 & TR1_SPEED) && (a_ptr->flags1 & TR1_MANA)) ||
1657 ((a_ptr->flags1 & TR1_MANA) && (a_ptr->flags5 & TR5_CRIT)))) {
1658 a_ptr->pval = (a_ptr->pval * 2) / 3;
1659 if (!a_ptr->pval) a_ptr->pval = 1;
1660 }
1661
1662 /* Never more than +3 EA, +2 on gloves */
1663 if (a_ptr->flags1 & TR1_BLOWS) {
1664 if (a_ptr->tval == TV_GLOVES) {
1665 //if (a_ptr->pval > 2) a_ptr->pval /= 3;
1666 if (a_ptr->pval > 2) a_ptr->pval = 2;
1667 } else {
1668 //if (a_ptr->pval > 3) a_ptr->pval /= 2;
1669 if (a_ptr->pval > 3) a_ptr->pval = 3;
1670 }
1671 if (a_ptr->pval == 0) a_ptr->pval = 1;
1672 }
1673
1674 /* Never increase stats too greatly */
1675 if (c) {
1676 /* limit +stats to 15 (3*(+5) or 5*(+3)),
1677 never more than +3 on amulets */
1678 /* Items with only 1 stat may greatly increase it */
1679 if ((a_ptr->tval == TV_AMULET) || (c > 3)) {
1680 if (a_ptr->pval > 3) a_ptr->pval = (a_ptr->pval + 1) / 2;
1681 if (a_ptr->pval > 3) a_ptr->pval = 3;
1682 if (a_ptr->pval == 0) a_ptr->pval = 1 + rand_int(2);
1683 } else {
1684 if (a_ptr->pval > 5) a_ptr->pval = (a_ptr->pval + 2) / 2;
1685 if (a_ptr->pval > 5) a_ptr->pval = 5;
1686 if (a_ptr->pval == 0) a_ptr->pval = 1 + rand_int(3);
1687 }
1688 }
1689
1690 /* -------------------------------------- pval-fixing limits -------------------------------------- */
1691
1692 /* Never more than +3 LIFE (doesn't occur on randarts anyways, yet) or +3 EA */
1693 if ((a_ptr->flags1 & (TR1_LIFE | TR1_BLOWS)) && (a_ptr->pval > 3)) a_ptr->pval = 3;
1694 /* Never have super EA _and_ LIFE at the same time o_o */
1695 if ((a_ptr->flags1 & TR1_LIFE) && (a_ptr->flags1 & TR1_BLOWS) && (a_ptr->pval > 1)) a_ptr->pval = 1;
1696
1697 if ((a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN)) {
1698 /* Not more than +6 IV on helms and crowns */
1699 if ((a_ptr->flags1 & TR1_INFRA) && (a_ptr->pval > 6)) a_ptr->pval = 6;
1700 /* Not more than +3 speed on helms/crowns */
1701 if ((a_ptr->flags1 & TR1_SPEED) && (a_ptr->pval > 3)) a_ptr->pval = 3;
1702 }
1703
1704 /* Limits for +MANA */
1705 if (a_ptr->flags1 & TR1_MANA) {
1706 /* Randart mage staves may give up to +10 +1 bonus MANA */
1707 if ((a_ptr->tval == TV_MSTAFF) && (a_ptr->pval >= 11)) a_ptr->pval = 11;
1708 /* Helms and crowns may not give more than +3 MANA */
1709 else if ((a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) &&
1710 (a_ptr->pval > 3)) a_ptr->pval = 3;
1711 /* Usually +10 MANA is max */
1712 else if (a_ptr->pval > 10) a_ptr->pval = 10;
1713 }
1714
1715 /* Limit speed on 1-hand weapons and shields (balances both, dual-wiel and 2-handed weapons) */
1716 /* Limit +LIFE to +2 under same circumstances */
1717 if (k_ptr->tval == TV_SHIELD || is_weapon(k_ptr->tval)) {
1718 if (!(k_ptr->flags4 & TR4_SHOULD2H) && !(k_ptr->flags4 & TR4_MUST2H)) {
1719 if ((a_ptr->flags1 & TR1_SPEED) && (a_ptr->pval > 3)) a_ptr->pval = 3;
1720 if ((a_ptr->flags1 & TR1_LIFE) && (a_ptr->pval > 2)) a_ptr->pval = 2;
1721 } else if ((a_ptr->flags1 & TR1_SPEED) && (a_ptr->pval > 6)) a_ptr->pval = 6;
1722 }
1723
1724 /* Note: Neither luck nor disarm can actually newly appear on a randart except if coming from k_info. */
1725
1726 /* Not more than +6 luck (was +5, increased for randart elven cloaks!) */
1727 if ((a_ptr->flags5 & TR5_LUCK) && (a_ptr->pval > 6)) a_ptr->pval = 6;
1728
1729 /* Not more than +3 disarming ability (randart picklocks aren't allowed anyways) */
1730 if ((a_ptr->flags5 & TR5_DISARM) && (a_ptr->pval > 3)) {
1731 if (!(k_ptr->flags5 & TR5_DISARM)) a_ptr->flags5 &= ~TR5_DISARM;
1732 else a_ptr->pval = 3;
1733 }
1734
1735 /* -------------------------------------- Misc unaffecting boni/limits -------------------------------------- */
1736
1737 /* Hack -- DarkSword randarts should have this */
1738 if ((a_ptr->tval == TV_SWORD) && (a_ptr->sval == SV_DARK_SWORD)) {
1739 /* Remove all old ANTIMAGIC flags that might have been
1740 set by a curse or random ability */
1741 a_ptr->flags4 &= ((~TR4_ANTIMAGIC_30) & (~TR4_ANTIMAGIC_20) & (~TR4_ANTIMAGIC_10));
1742
1743 /* Start with basic Antimagic */
1744 a_ptr->flags4 |= TR4_ANTIMAGIC_50;
1745
1746 /* If they have large tohit/dam boni they can get more AM even */
1747
1748 /* If +hit/+dam cancels out base AM.. */
1749 if ((a_ptr->to_h + a_ptr->to_d) >= 50) {
1750 /* Reduce +hit/+dam equally so it just cancels out 50% base AM */
1751 if (magik(50))
1752 while (a_ptr->to_h + a_ptr->to_d > 50) {
1753 a_ptr->to_h--;
1754 if (a_ptr->to_h + a_ptr->to_d > 50) a_ptr->to_d--;
1755 }
1756 /* Now add 0%..50% AM to receive -10%..50% AM in total;
1757 (-10% from +30+30 -50% if +hit+dam wasn't reduced above) */
1758 if (magik(40)) a_ptr->flags4 |= TR4_ANTIMAGIC_30 | TR4_ANTIMAGIC_20;
1759 else if (magik(60)) a_ptr->flags4 |= TR4_ANTIMAGIC_30 | TR4_ANTIMAGIC_10;
1760 else if (magik(80)) a_ptr->flags4 |= TR4_ANTIMAGIC_30;
1761 else if (magik(90)) a_ptr->flags4 |= TR4_ANTIMAGIC_20;
1762 else if (magik(95)) a_ptr->flags4 |= TR4_ANTIMAGIC_10;
1763 } else if ((a_ptr->to_h + a_ptr->to_d) >= 40) {
1764 if (magik(50))
1765 while (a_ptr->to_h + a_ptr->to_d > 40) {
1766 a_ptr->to_h--;
1767 if (a_ptr->to_h + a_ptr->to_d > 40) a_ptr->to_d--;
1768 }
1769
1770 if (magik(50)) a_ptr->flags4 |= TR4_ANTIMAGIC_30 | TR4_ANTIMAGIC_10;
1771 else if (magik(65)) a_ptr->flags4 |= TR4_ANTIMAGIC_30;
1772 else if (magik(80)) a_ptr->flags4 |= TR4_ANTIMAGIC_20;
1773 else if (magik(90)) a_ptr->flags4 |= TR4_ANTIMAGIC_10;
1774 } else if ((a_ptr->to_h + a_ptr->to_d) >= 30) {
1775 if (magik(50))
1776 while (a_ptr->to_h + a_ptr->to_d > 30) {
1777 a_ptr->to_h--;
1778 if (a_ptr->to_h + a_ptr->to_d > 30) a_ptr->to_d--;
1779 }
1780
1781 if (magik(60)) a_ptr->flags4 |= TR4_ANTIMAGIC_30;
1782 else if (magik(75)) a_ptr->flags4 |= TR4_ANTIMAGIC_20;
1783 else if (magik(90)) a_ptr->flags4 |= TR4_ANTIMAGIC_10;
1784 } else if ((a_ptr->to_h + a_ptr->to_d) >= 20) {
1785 if (magik(50))
1786 while (a_ptr->to_h + a_ptr->to_d > 20) {
1787 a_ptr->to_h--;
1788 if (a_ptr->to_h + a_ptr->to_d > 20) a_ptr->to_d--;
1789 }
1790
1791 if (magik(70)) a_ptr->flags4 |= TR4_ANTIMAGIC_20;
1792 else if (magik(85)) a_ptr->flags4 |= TR4_ANTIMAGIC_10;
1793 } else if ((a_ptr->to_h + a_ptr->to_d) >= 10) {
1794 if (magik(50))
1795 while (a_ptr->to_h + a_ptr->to_d > 10) {
1796 a_ptr->to_h--;
1797 if (a_ptr->to_h + a_ptr->to_d > 10) a_ptr->to_d--;
1798 }
1799
1800 if (magik(80)) a_ptr->flags4 |= TR4_ANTIMAGIC_10;
1801 }
1802 }
1803 }
1804
1805 /*
1806 * Returns pointer to randart artifact_type structure.
1807 *
1808 * o_ptr should contain the seed (in name3) plus a tval
1809 * and sval. It returns NULL on illegal sval and tvals.
1810 */
randart_make(object_type * o_ptr)1811 artifact_type *randart_make(object_type *o_ptr) {
1812 /*u32b activates;*/
1813 s32b power;
1814 int tries, quality_boost = 0;
1815 s32b ap;
1816 bool curse_me = FALSE;
1817 bool aggravate_me = FALSE;
1818
1819 /* Get pointer to our artifact_type object */
1820 artifact_type *a_ptr = &randart;
1821
1822 /* Get pointer to object kind */
1823 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1824
1825 /* Set the RNG seed. */
1826 Rand_value = o_ptr->name3;
1827 Rand_quick = TRUE;
1828
1829 /* Screen for disallowed TVALS */
1830 if ((k_ptr->tval != TV_BOW) &&
1831 (k_ptr->tval != TV_BOOMERANG) &&
1832 !is_ammo(k_ptr->tval) &&
1833 !is_weapon(k_ptr->tval) &&
1834 !is_armour(k_ptr->tval) &&
1835 (k_ptr->tval != TV_MSTAFF) &&
1836 (k_ptr->tval != TV_LITE) &&
1837 (k_ptr->tval != TV_RING) &&
1838 (k_ptr->tval != TV_AMULET) &&
1839 // (k_ptr->tval != TV_DIGGING) && /* better ban it? */
1840 // (k_ptr->tval != TV_TOOL) &&
1841 // (k_ptr->tval != TV_INSTRUMENT) &&
1842 (k_ptr->tval != TV_SPECIAL)) { /* <- forgot this one, else panic save if randart becomes seal, since a_ptr becomes NULL! - C. Blue */
1843 /* Not an allowed type */
1844 return(NULL);
1845 }
1846
1847 /* Randart ammo doesn't keep (exploding) from normal item */
1848 if (is_ammo(k_ptr->tval)) k_ptr->pval = 0;
1849
1850 /* Mega Hack -- forbid randart polymorph rings(pval would be BAD) */
1851 if ((k_ptr->tval == TV_RING) && (k_ptr->sval == SV_RING_POLYMORPH))
1852 return (NULL);
1853
1854 /* Forbid amulets of Telepathic Awareness */
1855 if (k_ptr->tval == TV_AMULET && k_ptr->sval == SV_AMULET_ESP)
1856 return (NULL);
1857
1858 /* Forbid costumes too */
1859 if ((k_ptr->tval == TV_SOFT_ARMOR) && (k_ptr->sval == SV_COSTUME))
1860 return (NULL);
1861
1862 /* taken out the quality boosts again, since those weapons already deal insane damage.
1863 alternatively their damage could be lowered so they don't rival grond (7d8 weapon w/ kill flags..). */
1864 #if 0
1865 if (k_ptr->flags4 & TR4_SHOULD2H) quality_boost += 15;
1866 if (k_ptr->flags4 & TR4_MUST2H) quality_boost += 30;
1867 if (k_ptr->flags4 & TR4_COULD2H) quality_boost += 0;
1868 #endif
1869
1870 /* Wipe the artifact_type structure */
1871 WIPE(&randart, artifact_type);
1872
1873
1874 /*
1875 * First get basic artifact quality
1876 * 90% are good
1877 */
1878
1879 /* Hack - make nazgul rings of power more useful
1880 (and never 'cursed randarts' in the sense of sucking really badly): */
1881 if ((k_ptr->tval == TV_RING) && (k_ptr->sval == SV_RING_SPECIAL)) {
1882 power = 65 + rand_int(15) + RANDART_QUALITY; /* 60+rnd(20)+RQ should be maximum */
1883 } else if (!rand_int(10) || (k_ptr->flags3 & TR3_CURSED)) { /* 10% are cursed */
1884 power = rand_int(40) - (2 * RANDART_QUALITY);
1885 } else if (k_ptr->flags5 & TR5_WINNERS_ONLY) {
1886 power = 30 + rand_int(50) + RANDART_QUALITY; /* avoid very useless WINNERS_ONLY randarts */
1887 } else {
1888 /* maybe move quality_boost to become added to randart_quality.. */
1889 /* note: quality_boost is constantly 0 atm, ie effectless */
1890 power = rand_int(80 + quality_boost) + RANDART_QUALITY;
1891 }
1892 if (power < 0) curse_me = TRUE;
1893
1894 /* Really powerful items should aggravate. */
1895 if (power > 100 + quality_boost) {
1896 if (rand_int (100) < (power - 100 - quality_boost) * 3) {
1897 aggravate_me = TRUE;
1898 }
1899 }
1900
1901 if (is_ammo(k_ptr->tval) || /* ammo never aggravates */
1902 ((k_ptr->tval == TV_RING) && (k_ptr->sval == SV_RING_SPECIAL))) { /* rings of power would lose their granted invisibility! */
1903 aggravate_me = FALSE;
1904 // power /= 3;
1905 }
1906
1907 /* Default values */
1908 a_ptr->cur_num = 0;
1909 a_ptr->max_num = 1;
1910 a_ptr->tval = k_ptr->tval;
1911 a_ptr->sval = k_ptr->sval;
1912 // a_ptr->pval = k_ptr->pval; /* unsure about this */
1913
1914 /* 'Merge' pval and bpval into a single value, by just discarding
1915 o_ptr->bpval, and using only a_ptr->pval, which becomes o_ptr->pval,
1916 otherwise we get things like ring of speed (+7)(+6):
1917 Some items that use bpval in a special way are exempt and need to
1918 keep their bpval: Rings of Power. */
1919 if ((k_ptr->tval != TV_RING) || (k_ptr->sval != SV_RING_SPECIAL)) {
1920 // if (o_ptr->bpval) a_ptr->pval = (o_ptr->pval < o_ptr->bpval)? o_ptr->bpval : o_ptr->pval;
1921 o_ptr->bpval = 0;
1922 }
1923
1924 /* Amulets and Rings keep their (+hit,+dam)[+AC] instead of having it
1925 reset to (+0,+0)[+0] (since those boni are hard-coded for jewelry) */
1926 if ((a_ptr->tval == TV_AMULET) || (a_ptr->tval == TV_RING)) {
1927 a_ptr->to_h = o_ptr->to_h;
1928 a_ptr->to_d = o_ptr->to_d;
1929 a_ptr->to_a = o_ptr->to_a;
1930 #ifdef RANDART_WEAPON_BUFF
1931 } else if (is_weapon(a_ptr->tval)) {
1932 /* normalise +hit,+dam to somewhat more buffed values for all art weapons */
1933 a_ptr->to_h = 0;//k_ptr->to_h / 2;
1934 a_ptr->to_d = 0;//k_ptr->to_d / 2;
1935
1936 a_ptr->to_a = k_ptr->to_a;
1937 #endif
1938 } else {
1939 /* Get base +hit,+dam,+ac from k_info for any item type, to start out with this. */
1940 #ifdef RANDART_WEAPON_BUFF
1941 /* note: we assume that shooters don't have big k_info +hit/+dam,
1942 or we'd have to move them up there to is_weapon() block probably. */
1943 #endif
1944 a_ptr->to_h = k_ptr->to_h;
1945 a_ptr->to_d = k_ptr->to_d;
1946 a_ptr->to_a = k_ptr->to_a;
1947 }
1948
1949 /* keep all other base attributes */
1950 a_ptr->ac = k_ptr->ac;
1951 a_ptr->dd = k_ptr->dd;
1952 a_ptr->ds = k_ptr->ds;
1953 a_ptr->weight = k_ptr->weight;
1954 a_ptr->flags1 = k_ptr->flags1;
1955 a_ptr->flags2 = k_ptr->flags2;
1956 a_ptr->flags3 = k_ptr->flags3;
1957 a_ptr->flags3 |= (TR3_IGNORE_ACID | TR3_IGNORE_ELEC |
1958 TR3_IGNORE_FIRE | TR3_IGNORE_COLD);
1959 a_ptr->flags4 = k_ptr->flags4;
1960 a_ptr->flags5 = k_ptr->flags5;
1961 a_ptr->flags5 |= TR5_IGNORE_WATER;
1962 a_ptr->flags6 = k_ptr->flags6;
1963
1964 /* Ensure weapons have some bonus to hit & dam */
1965 #ifdef RANDART_WEAPON_BUFF
1966 if (is_weapon(a_ptr->tval) || a_ptr->tval == TV_BOOMERANG) {
1967 /* emphasise non-low values */
1968 #if 0 /* relatively steep start -- y=20-(125/(5+x)-5), 0<=x<=20 */
1969 a_ptr->to_d += 20 - (125 / (5 + rand_int(21)) - 5);
1970 a_ptr->to_h += 20 - (125 / (5 + rand_int(21)) - 5);
1971 #endif
1972 #if 1 /* not so steep start -- y=21-(560/(20+x)-7), 0<=x<=60 */
1973 a_ptr->to_d += 21 - (560 / (20 + rand_int(61)) - 7);
1974 a_ptr->to_h += 21 - (560 / (20 + rand_int(61)) - 7);
1975 #endif
1976 } else if (a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_BOW) {
1977 a_ptr->to_d += rand_int(21);
1978 a_ptr->to_h += rand_int(21);
1979 }
1980 #else
1981 if (is_weapon(a_ptr->tval) || a_ptr->tval == TV_BOOMERANG ||
1982 a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_BOW) {
1983 a_ptr->to_d += 1 + rand_int(20);
1984 a_ptr->to_h += 1 + rand_int(20);
1985 }
1986 #endif
1987
1988 /* Ensure armour has some decent bonus to ac - C. Blue */
1989 if (is_armour(k_ptr->tval)) {
1990 /* Fixed bonus to avoid useless randarts */
1991 a_ptr->to_a = 10 + rand_int(6);
1992
1993 /* pay respect to k_info +ac bonus */
1994 a_ptr->to_a += k_ptr->to_a / 2;
1995
1996 /* higher level armour will get additional bonus :-o (mith110, adam120) */
1997 a_ptr->to_a += k_ptr->level / 15;
1998
1999 /* fix limit */
2000 #ifndef TO_AC_CAP_30
2001 if (a_ptr->to_a > 35) a_ptr->to_a = 35;
2002 #else
2003 if (a_ptr->to_a > 30) a_ptr->to_a = 30;
2004 #endif
2005
2006 /* Hack: Account for the o_ptr immunities of MHDSMs: */
2007 if (k_ptr->tval == TV_DRAG_ARMOR && k_ptr->sval == SV_DRAGON_MULTIHUED) {
2008 if ((o_ptr->xtra2 & 0x1)) a_ptr->flags2 |= TR2_IM_FIRE;
2009 if ((o_ptr->xtra2 & 0x2)) a_ptr->flags2 |= TR2_IM_COLD;
2010 if ((o_ptr->xtra2 & 0x4)) a_ptr->flags2 |= TR2_IM_ELEC;
2011 if ((o_ptr->xtra2 & 0x8)) a_ptr->flags2 |= TR2_IM_ACID;
2012 if ((o_ptr->xtra2 & 0x10)) a_ptr->flags5 |= TR5_IM_POISON;
2013 }
2014 }
2015
2016 #ifdef USE_NEW_SHIELDS
2017 #ifndef NEW_SHIELDS_NO_AC
2018 /* Shields always get maximum of 15 */
2019 if (k_ptr->tval == TV_SHIELD) a_ptr->to_a = 15;
2020 #else
2021 if (k_ptr->tval == TV_SHIELD) a_ptr->to_a = 0;
2022 #endif
2023 #endif
2024
2025 /* Art ammo doesn't get great hit/dam in general. */
2026 if (is_ammo(a_ptr->tval)) {
2027 a_ptr->to_d = 0;
2028 a_ptr->to_h = 0;
2029 if (magik(50)) {
2030 a_ptr->to_d += randint(3);
2031 if (magik(50)) a_ptr->to_d += randint(3);
2032 }
2033 if (magik(50)) {
2034 a_ptr->to_h += randint(6);
2035 if (magik(50)) a_ptr->to_h += randint(6);
2036 }
2037 if (magik(20)) a_ptr->ds += 1;
2038 else if (magik(20)) a_ptr->dd += 1;
2039
2040 /* exploding art ammo is very rare - note: magic ammo can't explode */
2041 if (magik(10) && (a_ptr->sval != SV_AMMO_MAGIC)) {
2042 int power[28]= { GF_ELEC, GF_POIS, GF_ACID,
2043 GF_COLD, GF_FIRE, GF_PLASMA, GF_LITE,
2044 GF_DARK, GF_SHARDS, GF_SOUND,
2045 GF_CONFUSION, GF_FORCE, GF_INERTIA,
2046 GF_MANA, GF_METEOR, GF_ICE, GF_CHAOS,
2047 GF_NETHER, GF_NEXUS, GF_TIME,
2048 GF_GRAVITY, GF_KILL_WALL, GF_AWAY_ALL,
2049 GF_TURN_ALL, GF_NUKE, GF_STUN,
2050 GF_DISINTEGRATE, GF_HELL_FIRE };
2051 a_ptr->pval = power[rand_int(28)];
2052 }
2053 }
2054
2055 /* First draft: add two abilities, then curse it three times. */
2056 if (curse_me) {
2057 add_ability(a_ptr);
2058 add_ability(a_ptr);
2059 do_curse(a_ptr);
2060 do_curse(a_ptr);
2061 do_curse(a_ptr);
2062 remove_contradictory(a_ptr, (a_ptr->flags3 & TR3_AGGRAVATE) != 0);
2063 remove_redundant_esp(a_ptr);
2064 ap = artifact_power(a_ptr);
2065 } else if (is_ammo(k_ptr->tval)) {
2066 add_ability (a_ptr);
2067 if (magik(50)) add_ability(a_ptr);
2068 if (magik(25)) add_ability(a_ptr);
2069 if (magik(10)) add_ability(a_ptr);
2070 remove_contradictory(a_ptr, FALSE);
2071 remove_redundant_esp(a_ptr);
2072 ap = artifact_power(a_ptr) + RANDART_QUALITY + 15; /* in general ~5k+(40-40)+15k value */
2073 } else { /* neither cursed, nor ammo: */
2074 artifact_type a_old;
2075
2076 /* Select a random set of abilities which roughly matches the
2077 original's in terms of overall power/usefulness. */
2078 for (tries = 0; tries < MAX_TRIES; tries++) {
2079 /* Copy artifact info temporarily. */
2080 a_old = *a_ptr;
2081 add_ability(a_ptr);
2082
2083 remove_contradictory(a_ptr, aggravate_me);
2084 remove_redundant_esp(a_ptr);
2085 /* Moved limit-fixing here experimentally! */
2086 artifact_fix_limits_inbetween(a_ptr, k_ptr);
2087
2088 ap = artifact_power(a_ptr);
2089
2090 if (ap > (power * 11) / 10 + 1) {
2091 /* too powerful -- put it back */
2092 *a_ptr = a_old;
2093 continue;
2094 } else if (ap >= (power * 9) / 10) break; /* just right */
2095 /* Stop if we're going negative, so we don't overload
2096 the artifact with great powers to compensate: */
2097 else if ((ap < 0) && (ap < (-(power * 1)) / 10)) break;
2098 } /* end of power selection */
2099
2100 #if 0 /* disallow such randarts that haven't gained any extra powers over base item version? */
2101 /* should almost never happen: Rolled a 'too powerful' artifact on _every_ attempt.
2102 This would require a base item that is already extremely powerful (eg PDSM). */
2103 if (tries == MAX_TRIES)
2104 /* fail randart generation completely */
2105 return (NULL);
2106 #else /* allow them */
2107 if (tries == MAX_TRIES)
2108 /* just use the absolute base randart, ie without additional ability mods
2109 except for those hard-wired like for ammo or cursed ones. - C. Blue
2110 I wonder whether a cursed PDSM randart could thereby get extra mods.. :) */
2111 *a_ptr = a_old;
2112 #endif
2113
2114 if (aggravate_me) {
2115 a_ptr->flags3 |= TR3_AGGRAVATE;
2116 a_ptr->flags1 &= ~(TR1_STEALTH);
2117 a_ptr->flags5 &= ~(TR5_INVIS);
2118 ap = artifact_power(a_ptr); /* recalculate, to calculate proper price and level below.. */
2119 }
2120 }
2121
2122 /* Fixing final limits */
2123 artifact_fix_limits_afterwards(a_ptr, k_ptr);
2124
2125 a_ptr->cost = (ap - RANDART_QUALITY + 50);
2126 if (a_ptr->cost < 0) {
2127 a_ptr->cost = 0;
2128 } else {
2129 a_ptr->cost = (ap * ap * ap) / 15;
2130 }
2131
2132 /* NOTE: a_ptr->level is only the base level. Apply_magic as well as
2133 create_artifact_aux execute a 'determine_level_req' on randarts
2134 after calling make_artifact/creating the seed, so the _real_ level
2135 reqs will base on this value, but not be the same. Just FYI ^^ - C. Blue */
2136 a_ptr->level = (curse_me ? (ap < -20 ? -ap : (ap > 20 ? ap : 15 + ABS(ap))) : ap);
2137
2138 /* hack for randart ammunition: usually, its _final_ level would be around 35 if artscroll'ed.
2139 however, let's use a more specific routine for ammo (note that it's _base_ level): */
2140 if (is_ammo(k_ptr->tval)) {
2141 int cost = 0;
2142 /* in general: SLAYs, BRANDs, +dam, +dice all weigh much */
2143 if (a_ptr->flags1 & TR1_VAMPIRIC) {a_ptr->level += 6; cost += 30000;}
2144 if (a_ptr->flags1 & TR1_SLAY_EVIL) {a_ptr->level += 6; cost += 40000;}
2145 if (a_ptr->flags1 & TR1_SLAY_ANIMAL) {a_ptr->level += 3; cost += 15000;}
2146 if (a_ptr->flags1 & TR1_KILL_UNDEAD) {a_ptr->level += 6; cost += 35000;}
2147 else if (a_ptr->flags1 & TR1_SLAY_UNDEAD) {a_ptr->level += 2; cost += 15000;}
2148 if (a_ptr->flags1 & TR1_KILL_DRAGON) {a_ptr->level += 6; cost += 35000;}
2149 else if (a_ptr->flags1 & TR1_SLAY_DRAGON) {a_ptr->level += 2; cost += 20000;}
2150 if (a_ptr->flags1 & TR1_KILL_DEMON) {a_ptr->level += 7; cost += 50000;}
2151 else if (a_ptr->flags1 & TR1_SLAY_DEMON) {a_ptr->level += 4; cost += 30000;}
2152 if (a_ptr->flags1 & TR1_SLAY_TROLL) {a_ptr->level += 1; cost += 3500;}
2153 if (a_ptr->flags1 & TR1_SLAY_ORC) {a_ptr->level += 1; cost += 2000;}
2154 if (a_ptr->flags1 & TR1_SLAY_GIANT) {a_ptr->level += 2; cost += 6000;}
2155 if (a_ptr->flags1 & TR1_BRAND_ACID) {a_ptr->level += 4; cost += 25000;}
2156 if (a_ptr->flags1 & TR1_BRAND_ELEC) {a_ptr->level += 4; cost += 25000;}
2157 if (a_ptr->flags1 & TR1_BRAND_FIRE) {a_ptr->level += 3; cost += 15000;}
2158 if (a_ptr->flags1 & TR1_BRAND_COLD) {a_ptr->level += 2; cost += 15000;}
2159 if (a_ptr->flags1 & TR1_BRAND_POIS) {a_ptr->level += 2; cost += 10000;}
2160 if (a_ptr->dd > k_ptr->dd) {a_ptr->level += 4; cost += 20000;}
2161 if (a_ptr->ds > k_ptr->ds) {a_ptr->level += 3; cost += 15000;}
2162 a_ptr->level += a_ptr->to_h / 2;
2163 cost += a_ptr->to_h * 3000;
2164 a_ptr->level += a_ptr->to_d;
2165 cost += a_ptr->to_d * 8000;
2166 switch(a_ptr->pval) {
2167 case GF_POIS: case GF_COLD: a_ptr->level += 2; cost += 10000; break;
2168 case GF_FIRE: case GF_ELEC: case GF_ACID: a_ptr->level += 2; cost += 15000; break;
2169 case GF_LITE: case GF_DARK: case GF_ICE: case GF_SHARDS: case GF_NUKE: a_ptr->level += 2; cost += 20000; break;
2170 case GF_MANA: case GF_METEOR: case GF_CHAOS: case GF_NETHER: case GF_HELL_FIRE: case GF_TIME: a_ptr->level += 5; cost += 30000; break;
2171 case GF_CONFUSION: case GF_INERTIA: a_ptr->level += 4; cost += 20000; break;
2172 case GF_NEXUS: case GF_GRAVITY: case GF_AWAY_ALL: case GF_TURN_ALL: a_ptr->level += 5; cost += 15000; break;
2173 case GF_PLASMA: case GF_SOUND: case GF_FORCE: case GF_STUN: a_ptr->level += 6; cost += 35000; break;
2174 case GF_KILL_WALL: a_ptr->level += 6; cost += 15000; break;
2175 case GF_DISINTEGRATE: a_ptr->level += 7; cost += 30000; break;
2176 }
2177 /* also hack their value */
2178 if (a_ptr->cost) a_ptr->cost = (cost * 4) / 5;
2179 }
2180
2181 if (a_ptr->cost < 0) a_ptr->cost = 0;
2182
2183 #if 0
2184 /* One last hack: if the artifact is very powerful, raise the rarity.
2185 This compensates for artifacts like (original) Bladeturner, which
2186 have low artifact rarities but came from extremely-rare base
2187 kinds. */
2188 if ((ap > 0) && ((ap / 8) > a_ptr->rarity))
2189 a_ptr->rarity = ap / 8;
2190
2191 /*if (activates) a_ptr->flags3 |= TR3_ACTIVATE;*/
2192 /*if (a_idx < ART_MIN_NORMAL) a_ptr->flags3 |= TR3_INSTA_ART;*/
2193 #endif /* if 0 */
2194
2195 /* Add TR3_HIDE_TYPE to all artifacts with nonzero pval because we're
2196 too lazy to find out which ones need it and which ones don't. */
2197 if (a_ptr->pval) a_ptr->flags3 |= TR3_HIDE_TYPE;
2198
2199 /* Restore RNG */
2200 Rand_quick = FALSE;
2201
2202 /* Return a pointer to the artifact_type */
2203 return (a_ptr);
2204 }
2205
2206
2207 /*
2208 * Make random artifact name.
2209 */
randart_name(object_type * o_ptr,char * buffer,char * raw_buffer)2210 void randart_name(object_type *o_ptr, char *buffer, char *raw_buffer)
2211 {
2212 char tmp[80];
2213
2214 /* Set the RNG seed. It this correct. Should it be restored??? XXX */
2215 Rand_value = o_ptr->name3;
2216 Rand_quick = TRUE;
2217
2218 /* Take a random name */
2219 o_ptr->name4 = get_rnd_line("randarts.txt", 0, tmp, MAX_CHARS);
2220
2221 /* Capitalise first character */
2222 tmp[0] = toupper(tmp[0]);
2223
2224 /* Either "sword of something" or
2225 * "sword 'something'" form */
2226 if (rand_int(2)) sprintf(buffer, "of %s", tmp);
2227 else sprintf(buffer, "'%s'", tmp);
2228
2229 /* Restore RNG */
2230 Rand_quick = FALSE;
2231
2232 /* for true arts in EQUIPMENT_SET_BONUS */
2233 if (raw_buffer != NULL) strcpy(raw_buffer, tmp);
2234
2235 return;
2236 }
2237
2238
apply_enchantment_limits(object_type * o_ptr)2239 void apply_enchantment_limits(object_type *o_ptr) {
2240 /* not too high to-hit/to-dam boni. No need to check gloves. */
2241 switch (o_ptr->tval) { /* CAP_ITEM_BONI */
2242 case TV_SHIELD:
2243 #ifdef USE_NEW_SHIELDS /* should actually be USE_BLOCKING, but could be too */
2244 /* dramatic a change if it gets enabled temporarily - C. Blue */
2245 #ifndef NEW_SHIELDS_NO_AC
2246 if (o_ptr->to_a > 15) o_ptr->to_a = 15;
2247 #else
2248 o_ptr->to_a = 0;
2249 #endif
2250 return;
2251 #endif
2252 case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR:
2253 case TV_CLOAK: case TV_HELM: case TV_CROWN: case TV_GLOVES: case TV_BOOTS:
2254 #ifndef TO_AC_CAP_30
2255 if (o_ptr->to_a > 35) o_ptr->to_a = 35;
2256 #else
2257 if (o_ptr->to_a > 30) o_ptr->to_a = 30;
2258 #endif
2259 return;
2260
2261 case TV_BOLT:
2262 case TV_ARROW:
2263 case TV_SHOT:
2264 if (o_ptr->to_h > 15) o_ptr->to_h = 15;
2265 if (o_ptr->to_d > 15) o_ptr->to_d = 15;
2266 return;
2267
2268 case TV_TRAPKIT:
2269 if (!is_firearm_trapkit(o_ptr->sval)) {
2270 o_ptr->to_h = o_ptr->to_d = 0;
2271 return;
2272 }
2273 case TV_BOW:
2274 case TV_BOOMERANG:
2275 default: /* all melee weapons */
2276 if (o_ptr->to_h > 30) o_ptr->to_h = 30;
2277 if (o_ptr->to_d > 30) o_ptr->to_d = 30;
2278 return;
2279 }
2280 }
2281 /*
2282 * Here begins the code for new ego-items. - Jir -
2283 * Powers of ego-items are determined from random seed
2284 * just like randarts, but is controlled by ego-flags.
2285 *
2286 * This code is the mixture of PernAngband ego-item system
2287 * and PernMangband randarts system(as you see above).
2288 *
2289 * Our system is more efficient in memory/file-size (all we
2290 * need is a s32b seed), but *less* efficient in executing
2291 * speed (we 'generate' egos each time they are used!)
2292 * than that of PernA.
2293 */
2294
2295 /*
2296 * Returns pointer to ego-item artifact_type structure.
2297 *
2298 * o_ptr should contain the seed (in name3) plus a tval
2299 * and sval.
2300 */
ego_make(object_type * o_ptr)2301 artifact_type *ego_make(object_type *o_ptr)
2302 {
2303 ego_item_type *e_ptr;
2304 int j, rr, granted_pval;
2305 bool limit_blows = FALSE;
2306 // u32b f1, f2, f3, f4, f5, f6, esp;
2307 s16b e_idx;
2308
2309 /* Hack -- initialize bias */
2310 artifact_bias = 0;
2311
2312 /* Get pointer to our artifact_type object */
2313 artifact_type *a_ptr = &randart;
2314
2315 /* Get pointer to object kind */
2316 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2317
2318 /* Set the RNG seed. */
2319 Rand_value = o_ptr->name3;
2320 Rand_quick = TRUE;
2321
2322 /* Wipe the artifact_type structure */
2323 WIPE(&randart, artifact_type);
2324 a_ptr->tval = k_ptr->tval;
2325 a_ptr->sval = k_ptr->sval;
2326
2327 e_idx = o_ptr->name2;
2328
2329 /* Ok now, THAT is truly ugly */
2330 try_an_other_ego:
2331 e_ptr = &e_info[e_idx];
2332
2333 /* Hack -- extra powers */
2334 for (j = 0; j < 5; j++) {
2335 /* Rarity check */
2336 if (magik(e_ptr->rar[j])) {
2337 a_ptr->flags1 |= e_ptr->flags1[j];
2338 a_ptr->flags2 |= e_ptr->flags2[j];
2339 a_ptr->flags3 |= e_ptr->flags3[j];
2340 a_ptr->flags4 |= e_ptr->flags4[j];
2341 a_ptr->flags5 |= e_ptr->flags5[j];
2342 a_ptr->flags6 |= e_ptr->flags6[j];
2343 a_ptr->esp |= e_ptr->esp[j];
2344 add_random_ego_flag(a_ptr, e_ptr->fego1[j], e_ptr->fego2[j], &limit_blows, o_ptr->level, o_ptr);
2345 }
2346 }
2347
2348 /* Hack - Amulet of telepathic awareness (formerly of ESP) */
2349 #if 1
2350 {
2351 /* Apply limited ESP powers, evaluated from R_ESP_ flags */
2352 if (a_ptr->esp & R_ESP_LOW) {
2353 //if (rand_int(100) < 25) {
2354 rr = rand_int(16) - 1;
2355 if (rr < 2) a_ptr->esp |= (ESP_ORC);
2356 else if (rr < 4) a_ptr->esp |= (ESP_TROLL);
2357 else if (rr < 6) a_ptr->esp |= (ESP_GIANT);
2358 else if (rr < 8) a_ptr->esp |= (ESP_ANIMAL);
2359 else if (rr < 10) a_ptr->esp |= (ESP_DRAGONRIDER);
2360 else if (rr < 12) a_ptr->esp |= (ESP_GOOD);
2361 else if (rr < 14) a_ptr->esp |= (ESP_NONLIVING);
2362 else a_ptr->esp |= (ESP_SPIDER);
2363 a_ptr->esp &= (~R_ESP_LOW);
2364 }
2365 if (a_ptr->esp & R_ESP_HIGH) {
2366 //if (rand_int(100) < 50) {
2367 rr = rand_int(10) - 1;
2368 if (rr < 2) a_ptr->esp |= (ESP_DRAGON);
2369 else if (rr < 4) a_ptr->esp |= (ESP_DEMON);
2370 else if (rr < 7) a_ptr->esp |= (ESP_UNDEAD);
2371 else if (rr < 8) a_ptr->esp |= (ESP_EVIL);
2372 else a_ptr->esp |= (ESP_UNIQUE);
2373 a_ptr->esp &= (~R_ESP_HIGH);
2374 }
2375 if (a_ptr->esp & R_ESP_ANY) {
2376 rr = rand_int(26) - 1;
2377 if (rr < 1) a_ptr->esp |= (ESP_ORC);
2378 else if (rr < 2) a_ptr->esp |= (ESP_TROLL);
2379 else if (rr < 3) a_ptr->esp |= (ESP_DRAGON);
2380 else if (rr < 4) a_ptr->esp |= (ESP_GIANT);
2381 else if (rr < 5) a_ptr->esp |= (ESP_DEMON);
2382 else if (rr < 8) a_ptr->esp |= (ESP_UNDEAD);
2383 else if (rr < 12) a_ptr->esp |= (ESP_EVIL);
2384 else if (rr < 14) a_ptr->esp |= (ESP_ANIMAL);
2385 else if (rr < 16) a_ptr->esp |= (ESP_DRAGONRIDER);
2386 else if (rr < 19) a_ptr->esp |= (ESP_GOOD);
2387 else if (rr < 21) a_ptr->esp |= (ESP_NONLIVING);
2388 else if (rr < 24) a_ptr->esp |= (ESP_UNIQUE);
2389 else a_ptr->esp |= (ESP_SPIDER);
2390 a_ptr->esp &= (~R_ESP_ANY);
2391 }
2392 //if (rand_int(100) < 5) a_ptr->esp |= ESP_ALL;
2393 //if (a_ptr->esp & R_ESP_ALL)
2394 }
2395 #endif
2396
2397 /* Hack -- obtain bonuses */
2398 if (e_ptr->max_to_h > 0) a_ptr->to_h += randint(e_ptr->max_to_h);
2399 if (e_ptr->max_to_h < 0) a_ptr->to_h -= randint(-e_ptr->max_to_h);
2400 if (e_ptr->max_to_d > 0) a_ptr->to_d += randint(e_ptr->max_to_d);
2401 if (e_ptr->max_to_d < 0) a_ptr->to_d -= randint(-e_ptr->max_to_d);
2402 if (e_ptr->max_to_a > 0) a_ptr->to_a += randint(e_ptr->max_to_a);
2403 if (e_ptr->max_to_a < 0) a_ptr->to_a -= randint(-e_ptr->max_to_a);
2404
2405 /* No insane number of blows */
2406 if (limit_blows && (a_ptr->flags1 & TR1_BLOWS)) {
2407 if (a_ptr->pval > 2)
2408 a_ptr->pval -= randint(a_ptr->pval - 2);
2409 }
2410
2411
2412 /* --- Obtain granted minimum pval --- */
2413 granted_pval = 0;
2414 /* Mage staves have pvals minima */
2415 if ((o_ptr->tval == TV_MSTAFF) && (o_ptr->sval == SV_MSTAFF)) {
2416 if ((o_ptr->name2b == 2)||(o_ptr->name2 == 2)) granted_pval = 4;
2417 if ((o_ptr->name2b == 3)||(o_ptr->name2 == 3)) granted_pval = 7;
2418 }
2419 /* Elvenkind boots are more likely to get good pval, ugh */
2420 if (e_idx == EGO_ELVENKIND2) granted_pval = rand_int(e_ptr->max_pval - 2);
2421 /* Enchanted lanterns shouldn't be terrible */
2422 if (e_idx == EGO_ENCHANTED) granted_pval = 2;
2423
2424
2425 /* Hack -- obtain pval */
2426 if (e_ptr->max_pval > 0) a_ptr->pval += granted_pval + randint(e_ptr->max_pval - granted_pval);
2427 if (e_ptr->max_pval < 0) a_ptr->pval -= (granted_pval + randint(-e_ptr->max_pval - granted_pval));
2428
2429 /* Remove redundant ESP and contradictory flags */
2430 remove_contradictory(a_ptr, (a_ptr->flags3 & TR3_AGGRAVATE) != 0);
2431 remove_redundant_esp(a_ptr);
2432
2433 /* Hack -- apply rating bonus(it's done in apply_magic) */
2434 // rating += e_ptr->rating;
2435
2436 #if 1 /* double-ego code.. future pleasure :) */
2437 if (o_ptr->name2b && (o_ptr->name2b != e_idx)) {
2438 e_idx = o_ptr->name2b;
2439 goto try_an_other_ego;
2440 }
2441 #endif
2442
2443 /* Fix some limits */
2444 /* Never have more than +15 bonus */
2445 if (!is_ammo(a_ptr->tval) && a_ptr->pval > 15) a_ptr->pval = 15;
2446 /* Mage Staves don't have NO_MAGIC */
2447 if (o_ptr->tval == TV_MSTAFF) a_ptr->flags3 &= ~TR3_NO_MAGIC;
2448 /* Dark Swords don't have MANA (or SPELL) flag */
2449 if (o_ptr->tval == TV_SWORD && o_ptr->sval == SV_DARK_SWORD) {
2450 a_ptr->flags1 &= ~TR1_MANA;
2451 a_ptr->flags1 &= ~TR1_SPELL;
2452 }
2453 /* Items of/with 'Magi'/'Istari' or which are BLESSED
2454 don't have NO_MAGIC: */
2455 if (!(k_ptr->flags3 & TR3_NO_MAGIC) &&
2456 ((o_ptr->name2 == EGO_MAGI || o_ptr->name2b == EGO_MAGI) ||
2457 (o_ptr->name2 == EGO_LITE_MAGI || o_ptr->name2b == EGO_LITE_MAGI) ||
2458 (o_ptr->name2 == 135 || o_ptr->name2b == 135) ||
2459 (o_ptr->name2 == 169 || o_ptr->name2b == 169) ||
2460 (o_ptr->name2 == 185 || o_ptr->name2b == 185) ||
2461 (o_ptr->name2 == 186 || o_ptr->name2b == 186) ||
2462 /* BLESSED flag: */
2463 (o_ptr->name2 == 65 || o_ptr->name2b == 65) ||
2464 (o_ptr->name2 == 67 || o_ptr->name2b == 67) ||
2465 (o_ptr->name2 == 90 || o_ptr->name2b == 90)))
2466 a_ptr->flags3 &= ~TR3_NO_MAGIC;
2467 /* If an item increases all three, SPEED, CRIT, MANA,
2468 then reduce pval to 1/2 to balance */
2469 if ((a_ptr->flags1 & TR1_SPEED) && (a_ptr->flags5 & TR5_CRIT) && (a_ptr->flags1 & TR1_MANA)) {
2470 a_ptr->pval /= 2;
2471 if (!a_ptr->pval) a_ptr->pval = 1;
2472 }
2473 /* If an item increases two of SPEED, CRIT, MANA by over 7
2474 then reduce pval to 2/3 to balance */
2475 else if ((((a_ptr->flags1 & TR1_SPEED) && (a_ptr->flags5 & TR5_CRIT)) ||
2476 ((a_ptr->flags1 & TR1_SPEED) && (a_ptr->flags1 & TR1_MANA)) ||
2477 ((a_ptr->flags1 & TR1_MANA) && (a_ptr->flags5 & TR5_CRIT)))) {
2478 a_ptr->pval = (a_ptr->pval * 2) / 3;
2479 if (!a_ptr->pval) a_ptr->pval = 1;
2480 }
2481 /* While +MANA is capped at 10 for randarts, it's 12 for egos(!) */
2482 if ((a_ptr->flags1 & TR1_MANA) && a_ptr->pval > 12) a_ptr->pval = 12;
2483 /* Stealth cap; stealth/speed cap on all items except boots (for 'of Swiftness') */
2484 if (a_ptr->flags1 & TR1_STEALTH) {
2485 /* Don't limit elvenkind boots */
2486 if ((a_ptr->flags1 & TR1_SPEED) && o_ptr->tval != TV_BOOTS) {
2487 if (a_ptr->pval > 4) a_ptr->pval = 3 + rand_int(2);
2488 } else {
2489 if (a_ptr->pval > 6) a_ptr->pval = 6;
2490 }
2491 }
2492 /* Speed cap for gnomish cloaks of magi/bat (check for consistency with above check) */
2493 if ((a_ptr->flags1 & TR1_SPEED)
2494 && is_armour(a_ptr->tval) && a_ptr->tval != TV_BOOTS
2495 && a_ptr->pval > 4)
2496 a_ptr->pval = 4;
2497 if ((a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN)) {
2498 /* Not more than +6 IV on helms and crowns */
2499 if ((a_ptr->flags1 & TR1_INFRA) && (a_ptr->pval > 6)) a_ptr->pval = 6;
2500 /* Not more than +3 speed on helms/crowns */
2501 if ((a_ptr->flags1 & TR1_SPEED) && (a_ptr->pval > 3)) a_ptr->pval = 3;
2502 }
2503 /* Luck/Disarm caps */
2504 if(a_ptr->flags5 & TR5_LUCK) {
2505 if (a_ptr->pval > 5) a_ptr->pval = 5;
2506 }
2507 if(a_ptr->flags5 & TR5_DISARM) {
2508 if (a_ptr->pval > 3) a_ptr->pval = 3;
2509 }
2510 /* +Attribute caps */
2511 if (a_ptr->flags1 & (TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | TR1_CON | TR1_CHR)) {
2512 if (a_ptr->tval == TV_AMULET) {
2513 if (a_ptr->pval > 3) a_ptr->pval = (a_ptr->pval + 1) / 2;
2514 if (a_ptr->pval > 3) a_ptr->pval = 3;
2515 if (a_ptr->pval == 0) a_ptr->pval = 1;
2516 } else {
2517 if (a_ptr->pval > 5) a_ptr->pval = (a_ptr->pval + 2) / 2;
2518 if (a_ptr->pval > 5) a_ptr->pval = 5;
2519 if (a_ptr->pval == 0) a_ptr->pval = 1;
2520 }
2521 }
2522 /* +EA caps */
2523 if (a_ptr->flags1 & TR1_BLOWS) {
2524 if (o_ptr->tval == TV_GLOVES) {
2525 //if (a_ptr->pval > 2) a_ptr->pval /= 3;
2526 if (a_ptr->pval > 2) a_ptr->pval = 2;
2527 } else {
2528 //if (a_ptr->pval > 3) a_ptr->pval /= 2;
2529 if (a_ptr->pval > 3) a_ptr->pval = 3;
2530 }
2531 if (a_ptr->pval == 0) a_ptr->pval = 1;
2532 }
2533 if ((a_ptr->flags1 & TR1_LIFE) && (a_ptr->flags1 & TR1_BLOWS) && (a_ptr->pval > 1)) a_ptr->pval = 1;
2534
2535 apply_enchantment_limits(o_ptr);
2536 #if 0 /* removed LIFE from VAMPIRIC items for now */
2537 /* Back Hack :( */
2538 if ((o_ptr->name2 == EGO_VAMPIRIC || o_ptr->name2b == EGO_VAMPIRIC) &&
2539 o_ptr->pval >= 0 && o_ptr->bpval >= 0) {
2540 if (o_ptr->bpval > 0) o_ptr->bpval = o_ptr->bpval > 2 ? -2 : 0 - o_ptr->bpval;
2541 else o_ptr->pval = o_ptr->pval > 2 ? -2 : 0 - o_ptr->pval;
2542 }
2543 #endif
2544 if ((a_ptr->flags1 & (TR1_LIFE | TR1_BLOWS)) && (a_ptr->pval > 3)) {
2545 a_ptr->pval = 3;
2546 }
2547
2548 /* Limit +LIFE on 1-hand weapons +2 (balances both, dual-wiel and 2-handed weapons) */
2549 if (o_ptr->tval == TV_SHIELD ||
2550 (is_weapon(o_ptr->tval) &&
2551 !(k_ptr->flags4 & TR4_SHOULD2H) && !(k_ptr->flags4 & TR4_MUST2H)) ) {
2552 if ((a_ptr->flags1 & TR1_LIFE) && (a_ptr->pval > 2)) a_ptr->pval = 2;
2553 }
2554 /* Limit +LIFE on armour (including shields) to +1 (in case of shields balancing dual/2h wield) */
2555 if (is_armour(o_ptr->tval)) {
2556 if ((a_ptr->flags1 & TR1_LIFE) && (a_ptr->pval > 1)) a_ptr->pval = 1;
2557 }
2558
2559 /* Restore RNG */
2560 Rand_quick = FALSE;
2561
2562 /* Return a pointer to the artifact_type */
2563 return (a_ptr);
2564 }
add_random_esp(artifact_type * a_ptr,int all)2565 static void add_random_esp(artifact_type *a_ptr, int all)
2566 {
2567 int rr = rand_int(25 + all);
2568 if (rr < 1) a_ptr->esp |= (ESP_SPIDER);
2569 else if (rr < 2) a_ptr->esp |= (ESP_ORC);
2570 else if (rr < 3) a_ptr->esp |= (ESP_TROLL);
2571 else if (rr < 4) a_ptr->esp |= (ESP_GIANT);
2572 else if (rr < 5) a_ptr->esp |= (ESP_DRAGONRIDER);
2573 else if (rr < 7) a_ptr->esp |= (ESP_UNIQUE);
2574 else if (rr < 9) a_ptr->esp |= (ESP_NONLIVING);
2575 else if (rr < 11) a_ptr->esp |= (ESP_UNDEAD);
2576 else if (rr < 13) a_ptr->esp |= (ESP_DRAGON);
2577 else if (rr < 15) a_ptr->esp |= (ESP_DEMON);
2578 else if (rr < 18) a_ptr->esp |= (ESP_GOOD);
2579 else if (rr < 21) a_ptr->esp |= (ESP_ANIMAL);
2580 else if (rr < 25) a_ptr->esp |= (ESP_EVIL);
2581 else a_ptr->esp |= (ESP_ALL);
2582 }
2583
2584 /* Add a random flag to the ego item */
2585 /*
2586 * Hack -- 'dlev' is needed to determine some values;
2587 * I diverted lv-req of item for this purpose, thus changes in o_ptr->level
2588 * will result in changes of ego-item powers themselves!! - Jir -
2589 */
add_random_ego_flag(artifact_type * a_ptr,u32b fego1,u32b fego2,bool * limit_blows,s16b dlev,object_type * o_ptr)2590 void add_random_ego_flag(artifact_type *a_ptr, u32b fego1, u32b fego2, bool *limit_blows, s16b dlev, object_type *o_ptr) {
2591 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2592
2593 /* ----- fego1 flags ----- */
2594
2595 if (fego1 & ETR1_SUSTAIN) {
2596 /* Make a random sustain */
2597 switch(randint(6)) {
2598 case 1: a_ptr->flags2 |= TR2_SUST_STR; break;
2599 case 2: a_ptr->flags2 |= TR2_SUST_INT; break;
2600 case 3: a_ptr->flags2 |= TR2_SUST_WIS; break;
2601 case 4: a_ptr->flags2 |= TR2_SUST_DEX; break;
2602 case 5: a_ptr->flags2 |= TR2_SUST_CON; break;
2603 case 6: a_ptr->flags2 |= TR2_SUST_CHR; break;
2604 }
2605 }
2606
2607 if (fego1 & ETR1_OLD_RESIST) {
2608 /* Make a random resist, equal probabilities */
2609 switch (randint(11)) {
2610 case 1: a_ptr->flags2 |= (TR2_RES_BLIND); break;
2611 case 2: a_ptr->flags2 |= (TR2_RES_CONF); break;
2612 case 3: a_ptr->flags2 |= (TR2_RES_SOUND); break;
2613 case 4: a_ptr->flags2 |= (TR2_RES_SHARDS); break;
2614 case 5: a_ptr->flags2 |= (TR2_RES_NETHER); break;
2615 case 6: a_ptr->flags2 |= (TR2_RES_NEXUS); break;
2616 case 7: a_ptr->flags2 |= (TR2_RES_CHAOS); break;
2617 case 8: a_ptr->flags2 |= (TR2_RES_DISEN); break;
2618 case 9: a_ptr->flags2 |= (TR2_RES_POIS); break;
2619 case 10: a_ptr->flags2 |= (TR2_RES_DARK); break;
2620 case 11: a_ptr->flags2 |= (TR2_RES_LITE); break;
2621 }
2622 }
2623
2624 if (fego1 & ETR1_ABILITY) {
2625 /* Choose an ability */
2626 switch (randint(10)) {
2627 case 1: a_ptr->flags3 |= (TR3_FEATHER); break;
2628 case 2: a_ptr->flags3 |= (TR3_LITE1); break;
2629 case 3: a_ptr->flags3 |= (TR3_SEE_INVIS); break;
2630 // case 4: a_ptr->esp |= (ESP_ALL); break;
2631 case 4: add_random_esp(a_ptr, 5); break;
2632 case 5: a_ptr->flags3 |= (TR3_SLOW_DIGEST); break;
2633 case 6: a_ptr->flags3 |= (TR3_REGEN); break;
2634 case 7: a_ptr->flags2 |= (TR2_FREE_ACT); break;
2635 case 8: a_ptr->flags2 |= (TR2_HOLD_LIFE); break;
2636 case 9: a_ptr->flags3 |= (TR3_NO_MAGIC); break;
2637 case 10: a_ptr->flags5 |= (TR5_REGEN_MANA); break;
2638 }
2639 }
2640
2641 if (fego1 & ETR1_LOW_ABILITY) {
2642 /* Choose an ability */
2643 switch (randint(10)) {
2644 case 1: a_ptr->flags3 |= (TR3_FEATHER); break;
2645 case 2: a_ptr->flags3 |= (TR3_LITE1); break;
2646 case 3: a_ptr->flags3 |= (TR3_SEE_INVIS); break;
2647 // case 4: a_ptr->esp |= (ESP_ALL); break;
2648 case 4: add_random_esp(a_ptr, -4); break;
2649 case 5: a_ptr->flags3 |= (TR3_SLOW_DIGEST); break;
2650 case 6: a_ptr->flags3 |= (TR3_REGEN); break;
2651 case 7: a_ptr->flags2 |= (TR2_FREE_ACT); break;
2652 case 8: a_ptr->flags2 |= (TR2_HOLD_LIFE); break;
2653 case 9: a_ptr->flags3 |= (TR3_NO_MAGIC); break;
2654 case 10: a_ptr->flags5 |= (TR5_REGEN_MANA); break;
2655 }
2656 }
2657
2658 if (fego1 & ETR1_R_ELEM) {
2659 /* Make an acid/elec/fire/cold/poison resist */
2660 random_resistance(a_ptr, FALSE, randint(14) + 4);
2661 }
2662 if (fego1 & ETR1_R_LOW) {
2663 /* Make an acid/elec/fire/cold resist */
2664 random_resistance(a_ptr, FALSE, randint(12) + 4);
2665 }
2666 if (fego1 & ETR1_R_HIGH) {
2667 /* Make a high resist */
2668 random_resistance(a_ptr, FALSE, randint(22) + 16);
2669 }
2670 if (fego1 & ETR1_R_ANY) {
2671 /* Make any resist */
2672 random_resistance(a_ptr, FALSE, randint(34) + 4);
2673 }
2674 if (fego1 & ETR1_R_DRAGON) {
2675 /* Make "dragon resist" */
2676 dragon_resist(a_ptr);
2677 }
2678 if (fego1 & ETR1_DAM_DIE) {
2679 /* Increase damage dice */
2680 a_ptr->dd++;
2681 }
2682 if (fego1 & ETR1_DAM_SIZE) {
2683 /* Increase damage dice size */
2684 a_ptr->ds++;
2685 }
2686 if (fego1 & ETR1_SLAY_WEAP) {
2687 /* Make a Weapon of Slaying */
2688
2689 if (randint(3) == 1) { /* double damage */
2690 a_ptr->dd = k_ptr->dd;
2691 while ((a_ptr->dd + k_ptr->dd) * (a_ptr->ds + k_ptr->ds + 1) > slay_limit_ego(a_ptr, k_ptr)
2692 && (a_ptr->dd > 0))
2693 a_ptr->dd -= 1; /* No overpowered slaying weapons */
2694 } else if (randint(2) == 1) {
2695 while (randint(a_ptr->dd + 1) == 1 &&
2696 (1 + a_ptr->dd + k_ptr->dd) * (a_ptr->ds + k_ptr->ds + 1) <= slay_limit_ego(a_ptr, k_ptr))
2697 /* No overpowered slaying weapons */
2698 a_ptr->dd++;
2699
2700 while (randint(a_ptr->ds + 1) == 1 &&
2701 (a_ptr->dd + k_ptr->dd) * (1 + a_ptr->ds + k_ptr->ds + 1) <= slay_limit_ego(a_ptr, k_ptr))
2702 /* No overpowered slaying weapons */
2703 a_ptr->ds++;
2704 } else {
2705 while (randint(a_ptr->ds + 1) == 1 &&
2706 (a_ptr->dd + k_ptr->dd) * (1 + a_ptr->ds + k_ptr->ds + 1) <= slay_limit_ego(a_ptr, k_ptr))
2707 /* No overpowered slaying weapons */
2708 a_ptr->ds++;
2709
2710 while (randint(a_ptr->dd + 1) == 1 &&
2711 (1 + a_ptr->dd + k_ptr->dd) * (a_ptr->ds + k_ptr->ds + 1) <= slay_limit_ego(a_ptr, k_ptr))
2712 /* No overpowered slaying weapons */
2713 a_ptr->dd++;
2714 }
2715
2716 if (randint(5) == 1) a_ptr->flags1 |= TR1_BRAND_POIS;
2717
2718 /* if (k_ptr->tval == TV_SWORD && (randint(4) == 1))*/
2719 if ((k_ptr->tval != TV_BLUNT) &&
2720 !(k_ptr->tval == TV_POLEARM &&
2721 k_ptr->sval != 3 && k_ptr->sval != 6 && k_ptr->sval != 9 && k_ptr->sval != 13 && k_ptr->sval != 17 && k_ptr->sval != 30
2722 ) && (randint(3) == 1))
2723 a_ptr->flags5 |= TR5_VORPAL;
2724 }
2725
2726 if (fego1 & ETR1_LIMIT_BLOWS) {
2727 /* Swap this flag */
2728 *limit_blows = !(*limit_blows);
2729 }
2730 if (fego1 & ETR1_PVAL_M1) {
2731 /* Increase pval */
2732 a_ptr->pval++;
2733 }
2734 if (fego1 & ETR1_PVAL_M2) {
2735 /* Increase pval */
2736 a_ptr->pval += m_bonus(2, dlev);
2737 }
2738 if (fego1 & ETR1_PVAL_M3) {
2739 /* Increase pval */
2740 a_ptr->pval += m_bonus(3, dlev);
2741 }
2742 if (fego1 & ETR1_PVAL_M5) {
2743 /* Increase pval */
2744 a_ptr->pval += m_bonus(5, dlev);
2745 }
2746 #if 0
2747 if (fego1 & ETR1_AC_M1) {
2748 /* Increase ac */
2749 a_ptr->to_a++;
2750 }
2751 if (fego1 & ETR1_AC_M2) {
2752 /* Increase ac */
2753 a_ptr->to_a += m_bonus(2, dlev);
2754 }
2755 if (fego1 & ETR1_AC_M3) {
2756 /* Increase ac */
2757 a_ptr->to_a += m_bonus(3, dlev);
2758 }
2759 #endif
2760 if (fego1 & ETR1_AC_M5) {
2761 /* Increase ac */
2762 a_ptr->to_a += m_bonus(5, dlev);
2763 }
2764 #if 0
2765 if (fego1 & ETR1_TH_M1) {
2766 /* Increase to hit */
2767 a_ptr->to_h++;
2768 }
2769 if (fego1 & ETR1_TH_M2) {
2770 /* Increase to hit */
2771 a_ptr->to_h += m_bonus(2, dlev);
2772 }
2773 if (fego1 & ETR1_TH_M3) {
2774 /* Increase to hit */
2775 a_ptr->to_h += m_bonus(3, dlev);
2776 }
2777 if (fego1 & ETR1_TH_M5) {
2778 /* Increase to hit */
2779 a_ptr->to_h += m_bonus(5, dlev);
2780 }
2781 #endif
2782 #if 0
2783 if (fego1 & ETR1_TD_M1) {
2784 /* Increase to dam */
2785 a_ptr->to_d++;
2786 }
2787 if (fego1 & ETR1_TD_M2) {
2788 /* Increase to dam */
2789 a_ptr->to_d += m_bonus(2, dlev);
2790 }
2791
2792 #endif
2793 if (fego1 & ETR1_R_ESP) {
2794 add_random_esp(a_ptr, 1);
2795 }
2796 if (fego1 & ETR1_NO_SEED) {
2797 /* Nothing */
2798 }
2799 #if 0
2800 if (fego1 & ETR1_TD_M3) {
2801 /* Increase to dam */
2802 a_ptr->to_d += m_bonus(3, dlev);
2803 }
2804 if (fego1 & ETR1_TD_M5) {
2805 /* Increase to dam */
2806 a_ptr->to_d += m_bonus(5, dlev);
2807 }
2808 #endif
2809 if (fego1 & ETR1_R_P_ABILITY) {
2810 /* Add a random pval-affected ability */
2811 /* This might cause boots with + to blows */
2812 switch (randint(6)) {
2813 case 1:a_ptr->flags1 |= TR1_STEALTH; break;
2814 case 2:a_ptr->flags1 |= TR1_SEARCH; break;
2815 case 3:a_ptr->flags1 |= TR1_INFRA; break;
2816 case 4:a_ptr->flags1 |= TR1_TUNNEL; break;
2817 case 5:a_ptr->flags1 |= TR1_SPEED; break;
2818 case 6:a_ptr->flags1 |= TR1_BLOWS; break;
2819 }
2820
2821 }
2822 if (fego1 & ETR1_R_STAT) {
2823 /* Add a random stat */
2824 switch (randint(6)) {
2825 case 1:a_ptr->flags1 |= TR1_STR; break;
2826 case 2:a_ptr->flags1 |= TR1_INT; break;
2827 case 3:a_ptr->flags1 |= TR1_WIS; break;
2828 case 4:a_ptr->flags1 |= TR1_DEX; break;
2829 case 5:a_ptr->flags1 |= TR1_CON; break;
2830 case 6:a_ptr->flags1 |= TR1_CHR; break;
2831 }
2832 }
2833 if (fego1 & ETR1_R_STAT_SUST) {
2834 /* Add a random stat and sustain it */
2835 switch (randint(6)) {
2836 case 1:
2837 a_ptr->flags1 |= TR1_STR;
2838 a_ptr->flags2 |= TR2_SUST_STR;
2839 break;
2840 case 2:
2841 a_ptr->flags1 |= TR1_INT;
2842 a_ptr->flags2 |= TR2_SUST_INT;
2843 break;
2844 case 3:
2845 a_ptr->flags1 |= TR1_WIS;
2846 a_ptr->flags2 |= TR2_SUST_WIS;
2847 break;
2848 case 4:
2849 a_ptr->flags1 |= TR1_DEX;
2850 a_ptr->flags2 |= TR2_SUST_DEX;
2851 break;
2852 case 5:
2853 a_ptr->flags1 |= TR1_CON;
2854 a_ptr->flags2 |= TR2_SUST_CON;
2855 break;
2856 case 6:
2857 a_ptr->flags1 |= TR1_CHR;
2858 a_ptr->flags2 |= TR2_SUST_CHR;
2859 break;
2860 }
2861 }
2862 if (fego1 & ETR1_R_IMMUNITY) {
2863 /* Give a random immunity */
2864 switch (randint(4)) {
2865 case 1:
2866 a_ptr->flags2 |= TR2_IM_FIRE;
2867 a_ptr->flags3 |= TR3_IGNORE_FIRE;
2868 break;
2869 case 2:
2870 a_ptr->flags2 |= TR2_IM_ACID;
2871 a_ptr->flags3 |= TR3_IGNORE_ACID;
2872 a_ptr->flags5 |= TR5_IGNORE_WATER;
2873 break;
2874 case 3:
2875 a_ptr->flags2 |= TR2_IM_ELEC;
2876 a_ptr->flags3 |= TR3_IGNORE_ELEC;
2877 break;
2878 case 4:
2879 a_ptr->flags2 |= TR2_IM_COLD;
2880 a_ptr->flags3 |= TR3_IGNORE_COLD;
2881 break;
2882 }
2883 }
2884
2885 /* ----- fego2 flags ----- */
2886
2887 if (fego2 & ETR2_R_SLAY) {
2888 switch (rand_int(8)) {
2889 case 0:
2890 a_ptr->flags1 |= TR1_SLAY_ANIMAL;
2891 break;
2892 case 1:
2893 a_ptr->flags1 |= TR1_SLAY_EVIL;
2894 break;
2895 case 2:
2896 a_ptr->flags1 |= TR1_SLAY_UNDEAD;
2897 break;
2898 case 3:
2899 a_ptr->flags1 |= TR1_SLAY_DEMON;
2900 break;
2901 case 4:
2902 a_ptr->flags1 |= TR1_SLAY_ORC;
2903 break;
2904 case 5:
2905 a_ptr->flags1 |= TR1_SLAY_TROLL;
2906 break;
2907 case 6:
2908 a_ptr->flags1 |= TR1_SLAY_GIANT;
2909 break;
2910 case 7:
2911 a_ptr->flags1 |= TR1_SLAY_DRAGON;
2912 break;
2913 }
2914 }
2915 }
2916
2917
2918 /*
2919 * Borrowed from spells2.c of PernAngband.
2920 * erm.. btw.. what's that 'is_scroll'? - Jir -
2921 */
2922
2923 #define WEIRD_LUCK 12
2924 #define BIAS_LUCK 20
2925 /*
2926 * Bias luck needs to be higher than weird luck,
2927 * since it is usually tested several times...
2928 */
2929
2930 //void random_resistance (object_type * o_ptr, bool is_scroll, int specific)
random_resistance(artifact_type * a_ptr,bool is_scroll,int specific)2931 void random_resistance (artifact_type * a_ptr, bool is_scroll, int specific)
2932 {
2933 if (!specific) /* To avoid a number of possible bugs */
2934 {
2935 if (artifact_bias == BIAS_ACID)
2936 {
2937 if (!(a_ptr->flags2 & TR2_RES_ACID))
2938 {
2939 a_ptr->flags2 |= TR2_RES_ACID;
2940 if (randint(2) == 1) return;
2941 }
2942 if (randint(BIAS_LUCK) == 1 && !(a_ptr->flags2 & TR2_IM_ACID))
2943 {
2944 a_ptr->flags2 |= TR2_IM_ACID;
2945 if (randint(2) == 1) return;
2946 }
2947 }
2948 else if (artifact_bias == BIAS_ELEC)
2949 {
2950 if (!(a_ptr->flags2 & TR2_RES_ELEC))
2951 {
2952 a_ptr->flags2 |= TR2_RES_ELEC;
2953 if (randint(2) == 1) return;
2954 }
2955 if (a_ptr->tval >= TV_CLOAK && a_ptr->tval <= TV_HARD_ARMOR &&
2956 ! (a_ptr->flags3 & TR3_SH_ELEC))
2957 {
2958 a_ptr->flags3 |= TR3_SH_ELEC;
2959 if (randint(2) == 1) return;
2960 }
2961 if (randint(BIAS_LUCK) == 1 && !(a_ptr->flags2 & TR2_IM_ELEC))
2962 {
2963 a_ptr->flags2 |= TR2_IM_ELEC;
2964 if (randint(2) == 1) return;
2965 }
2966 }
2967 else if (artifact_bias == BIAS_FIRE)
2968 {
2969 if (!(a_ptr->flags2 & TR2_RES_FIRE))
2970 {
2971 a_ptr->flags2 |= TR2_RES_FIRE;
2972 if (randint(2) == 1) return;
2973 }
2974 if (a_ptr->tval >= TV_CLOAK && a_ptr->tval <= TV_HARD_ARMOR &&
2975 ! (a_ptr->flags3 & TR3_SH_FIRE))
2976 {
2977 a_ptr->flags3 |= TR3_SH_FIRE;
2978 if (randint(2) == 1) return;
2979 }
2980 if (randint(BIAS_LUCK) == 1 && !(a_ptr->flags2 & TR2_IM_FIRE))
2981 {
2982 a_ptr->flags2 |= TR2_IM_FIRE;
2983 if (randint(2) == 1) return;
2984 }
2985 }
2986 else if (artifact_bias == BIAS_COLD)
2987 {
2988 if (!(a_ptr->flags2 & TR2_RES_COLD))
2989 {
2990 a_ptr->flags2 |= TR2_RES_COLD;
2991 if (randint(2) == 1) return;
2992 }
2993 if (a_ptr->tval >= TV_CLOAK && a_ptr->tval <= TV_HARD_ARMOR &&
2994 ! (a_ptr->flags5 & TR5_SH_COLD))
2995 {
2996 a_ptr->flags5 |= TR5_SH_COLD;
2997 if (randint(2) == 1) return;
2998 }
2999 if (randint(BIAS_LUCK) == 1 && !(a_ptr->flags2 & TR2_IM_COLD))
3000 {
3001 a_ptr->flags2 |= TR2_IM_COLD;
3002 if (randint(2) == 1) return;
3003 }
3004 }
3005 else if (artifact_bias == BIAS_POIS)
3006 {
3007 if (!(a_ptr->flags2 & TR2_RES_POIS))
3008 {
3009 a_ptr->flags2 |= TR2_RES_POIS;
3010 if (randint(2) == 1) return;
3011 }
3012 }
3013 else if (artifact_bias == BIAS_WARRIOR)
3014 {
3015 if (randint(3) != 1 && (!(a_ptr->flags2 & TR2_RES_FEAR)))
3016 {
3017 a_ptr->flags2 |= TR2_RES_FEAR;
3018 if (randint(2) == 1) return;
3019 }
3020 if ((randint(3) == 1) && (!(a_ptr->flags3 & TR3_NO_MAGIC)))
3021 {
3022 a_ptr->flags3 |= TR3_NO_MAGIC;
3023 if (randint(2) == 1) return;
3024 }
3025 }
3026 else if (artifact_bias == BIAS_NECROMANTIC)
3027 {
3028 if (!(a_ptr->flags2 & TR2_RES_NETHER))
3029 {
3030 a_ptr->flags2 |= TR2_RES_NETHER;
3031 if (randint(2) == 1) return;
3032 }
3033 if (!(a_ptr->flags2 & TR2_RES_POIS))
3034 {
3035 a_ptr->flags2 |= TR2_RES_POIS;
3036 if (randint(2) == 1) return;
3037 }
3038 if (!(a_ptr->flags2 & TR2_RES_DARK))
3039 {
3040 a_ptr->flags2 |= TR2_RES_DARK;
3041 if (randint(2) == 1) return;
3042 }
3043 }
3044 else if (artifact_bias == BIAS_CHAOS)
3045 {
3046 if (!(a_ptr->flags2 & TR2_RES_CHAOS))
3047 {
3048 a_ptr->flags2 |= TR2_RES_CHAOS;
3049 if (randint(2) == 1) return;
3050 }
3051 if (!(a_ptr->flags2 & TR2_RES_CONF))
3052 {
3053 a_ptr->flags2 |= TR2_RES_CONF;
3054 if (randint(2) == 1) return;
3055 }
3056 if (!(a_ptr->flags2 & TR2_RES_DISEN))
3057 {
3058 a_ptr->flags2 |= TR2_RES_DISEN;
3059 if (randint(2) == 1) return;
3060 }
3061 }
3062 }
3063
3064 switch (specific ? specific : randint(41))
3065 {
3066 case 1:
3067 if (randint(WEIRD_LUCK) != 1)
3068 random_resistance(a_ptr, is_scroll, specific);
3069 else
3070 {
3071 a_ptr->flags2 |= TR2_IM_ACID;
3072 /* if (is_scroll) msg_print("It looks totally incorruptible."); */
3073 if (!(artifact_bias))
3074 artifact_bias = BIAS_ACID;
3075 }
3076 break;
3077 case 2:
3078 if (randint(WEIRD_LUCK) != 1)
3079 random_resistance(a_ptr, is_scroll, specific);
3080 else
3081 {
3082 a_ptr->flags2 |= TR2_IM_ELEC;
3083 /* if (is_scroll) msg_print("It looks completely grounded."); */
3084 if (!(artifact_bias))
3085 artifact_bias = BIAS_ELEC;
3086 }
3087 break;
3088 case 3:
3089 if (randint(WEIRD_LUCK) != 1)
3090 random_resistance(a_ptr, is_scroll, specific);
3091 else
3092 {
3093 a_ptr->flags2 |= TR2_IM_COLD;
3094 /* if (is_scroll) msg_print("It feels very warm."); */
3095 if (!(artifact_bias))
3096 artifact_bias = BIAS_COLD;
3097 }
3098 break;
3099 case 4:
3100 if (randint(WEIRD_LUCK) != 1)
3101 random_resistance(a_ptr, is_scroll, specific);
3102 else
3103 {
3104 a_ptr->flags2 |= TR2_IM_FIRE;
3105 /* if (is_scroll) msg_print("It feels very cool."); */
3106 if (!(artifact_bias))
3107 artifact_bias = BIAS_FIRE;
3108 }
3109 break;
3110 case 5: case 6: case 13:
3111 a_ptr->flags2 |= TR2_RES_ACID;
3112 /* if (is_scroll) msg_print("It makes your stomach rumble."); */
3113 if (!(artifact_bias))
3114 artifact_bias = BIAS_ACID;
3115 break;
3116 case 7: case 8: case 14:
3117 a_ptr->flags2 |= TR2_RES_ELEC;
3118 /* if (is_scroll) msg_print("It makes you feel grounded."); */
3119 if (!(artifact_bias))
3120 artifact_bias = BIAS_ELEC;
3121 break;
3122 case 9: case 10: case 15:
3123 a_ptr->flags2 |= TR2_RES_FIRE;
3124 /* if (is_scroll) msg_print("It makes you feel cool!");*/
3125 if (!(artifact_bias))
3126 artifact_bias = BIAS_FIRE;
3127 break;
3128 case 11: case 12: case 16:
3129 a_ptr->flags2 |= TR2_RES_COLD;
3130 /* if (is_scroll) msg_print("It makes you feel full of hot air!");*/
3131 if (!(artifact_bias))
3132 artifact_bias = BIAS_COLD;
3133 break;
3134 case 17: case 18:
3135 a_ptr->flags2 |= TR2_RES_POIS;
3136 /* if (is_scroll) msg_print("It makes breathing easier for you."); */
3137 if (!(artifact_bias) && randint(4) != 1)
3138 artifact_bias = BIAS_POIS;
3139 else if (!(artifact_bias) && randint(2) == 1)
3140 artifact_bias = BIAS_NECROMANTIC;
3141 else if (!(artifact_bias) && randint(2) == 1)
3142 artifact_bias = BIAS_ROGUE;
3143 break;
3144 case 19: case 20:
3145 a_ptr->flags2 |= TR2_RES_FEAR;
3146 /* if (is_scroll) msg_print("It makes you feel brave!"); */
3147 if (!(artifact_bias) && randint(3) == 1)
3148 artifact_bias = BIAS_WARRIOR;
3149 break;
3150 case 21:
3151 a_ptr->flags2 |= TR2_RES_LITE;
3152 /* if (is_scroll) msg_print("It makes everything look darker.");*/
3153 break;
3154 case 22:
3155 a_ptr->flags2 |= TR2_RES_DARK;
3156 /* if (is_scroll) msg_print("It makes everything look brigher.");*/
3157 break;
3158 case 23: case 24:
3159 a_ptr->flags2 |= TR2_RES_BLIND;
3160 /* if (is_scroll) msg_print("It makes you feel you are wearing glasses.");*/
3161 break;
3162 case 25: case 26:
3163 a_ptr->flags2 |= TR2_RES_CONF;
3164 /* if (is_scroll) msg_print("It makes you feel very determined.");*/
3165 if (!(artifact_bias) && randint(6) == 1)
3166 artifact_bias = BIAS_CHAOS;
3167 break;
3168 case 27: case 28:
3169 a_ptr->flags2 |= TR2_RES_SOUND;
3170 /* if (is_scroll) msg_print("It makes you feel deaf!");*/
3171 break;
3172 case 29: case 30:
3173 a_ptr->flags2 |= TR2_RES_SHARDS;
3174 /* if (is_scroll) msg_print("It makes your skin feel thicker.");*/
3175 break;
3176 case 31: case 32:
3177 a_ptr->flags2 |= TR2_RES_NETHER;
3178 /* if (is_scroll) msg_print("It makes you feel like visiting a graveyard!");*/
3179 if (!(artifact_bias) && randint(3) == 1)
3180 artifact_bias = BIAS_NECROMANTIC;
3181 break;
3182 case 33: case 34:
3183 a_ptr->flags2 |= TR2_RES_NEXUS;
3184 /* if (is_scroll) msg_print("It makes you feel normal.");*/
3185 break;
3186 case 35: case 36:
3187 a_ptr->flags2 |= TR2_RES_CHAOS;
3188 /* if (is_scroll) msg_print("It makes you feel very firm.");*/
3189 if (!(artifact_bias) && randint(2) == 1)
3190 artifact_bias = BIAS_CHAOS;
3191 break;
3192 case 37: case 38:
3193 a_ptr->flags2 |= TR2_RES_DISEN;
3194 /* if (is_scroll) msg_print("It is surrounded by a static feeling.");*/
3195 break;
3196 case 39:
3197 if (a_ptr->tval >= TV_CLOAK && a_ptr->tval <= TV_HARD_ARMOR)
3198 a_ptr->flags3 |= TR3_SH_ELEC;
3199 else
3200 random_resistance(a_ptr, is_scroll, specific);
3201 if (!(artifact_bias))
3202 artifact_bias = BIAS_ELEC;
3203 break;
3204 case 40:
3205 if (a_ptr->tval >= TV_CLOAK && a_ptr->tval <= TV_HARD_ARMOR)
3206 a_ptr->flags3 |= TR3_SH_FIRE;
3207 else
3208 random_resistance(a_ptr, is_scroll, specific);
3209 if (!(artifact_bias))
3210 artifact_bias = BIAS_FIRE;
3211 break;
3212 case 41:
3213 if (a_ptr->tval >= TV_CLOAK && a_ptr->tval <= TV_HARD_ARMOR)
3214 a_ptr->flags5 |= TR5_SH_COLD;
3215 else
3216 random_resistance(a_ptr, is_scroll, specific);
3217 if (!(artifact_bias))
3218 artifact_bias = BIAS_COLD;
3219 break;
3220 case 42: /* currently not possible since switch goes only up to 41. also buggy/wrong to give reflect to these items. */
3221 if (a_ptr->tval == TV_SHIELD || a_ptr->tval == TV_CLOAK ||
3222 a_ptr->tval == TV_HELM || a_ptr->tval == TV_HARD_ARMOR)
3223 a_ptr->flags5 |= TR5_REFLECT;
3224 else
3225 random_resistance(a_ptr, is_scroll, specific);
3226 break;
3227 }
3228 }
3229
3230 /* Borrowed from object2.c of PernAngband w/o even knowing
3231 * what it is :) - Jir -
3232 */
3233
dragon_resist(artifact_type * a_ptr)3234 void dragon_resist(artifact_type * a_ptr) {
3235 do {
3236 artifact_bias = 0;
3237
3238 if (randint(4) == 1)
3239 random_resistance(a_ptr, FALSE, ((randint(14)) + 4));
3240 else
3241 random_resistance(a_ptr, FALSE, ((randint(22)) + 16));
3242 }
3243 while (randint(2) == 1);
3244 }
3245