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