OSDN Git Service

[Refactor] #40399 Adjusted inclusion relationship for object1.h
[hengband/hengband.git] / src / object-enchant / apply-magic-accessory.c
1 /*!
2  * todo かなり長い。要分割
3  * @brief 防具系のアイテムを強化して(恐らく床に)生成する処理
4  * @date 2020/06/02
5  * @author Hourier
6  */
7
8 #include "object-enchant/apply-magic-accessory.h"
9 #include "object-enchant/artifact.h"
10 #include "object-enchant/object-boost.h"
11 #include "object-enchant/object-ego.h"
12 #include "object-enchant/special-object-flags.h"
13 #include "object-enchant/tr-types.h"
14 #include "object-enchant/trc-types.h"
15 #include "object/object-hook.h"
16 #include "object/object-kind.h"
17 #include "sv-definition/sv-amulet-types.h"
18 #include "sv-definition/sv-ring-types.h"
19
20 /*!
21  * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
22  * Apply magic to an item known to be a "ring" or "amulet"
23  * @param owner_ptr プレーヤーへの参照ポインタ
24  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
25  * @param level 生成基準階
26  * @param power 生成ランク
27  * @return なし
28  * @details
29  * Hack -- note special "pval boost" code for ring of speed\n
30  * Hack -- note that some items must be cursed (or blessed)\n
31  */
32 void apply_magic_accessary(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
33 {
34     switch (o_ptr->tval) {
35     case TV_RING: {
36         switch (o_ptr->sval) {
37         case SV_RING_ATTACKS: {
38             o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
39             if (one_in_(15))
40                 o_ptr->pval++;
41             if (o_ptr->pval < 1)
42                 o_ptr->pval = 1;
43
44             if (power < 0) {
45                 o_ptr->ident |= (IDENT_BROKEN);
46                 o_ptr->curse_flags |= TRC_CURSED;
47                 o_ptr->pval = 0 - (o_ptr->pval);
48             }
49
50             break;
51         }
52         case SV_RING_SHOTS: {
53             break;
54         }
55         case SV_RING_STR:
56         case SV_RING_CON:
57         case SV_RING_DEX: {
58             o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
59             if (power < 0) {
60                 o_ptr->ident |= (IDENT_BROKEN);
61                 o_ptr->curse_flags |= TRC_CURSED;
62                 o_ptr->pval = 0 - (o_ptr->pval);
63             }
64
65             break;
66         }
67         case SV_RING_SPEED: {
68             o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
69             while (randint0(100) < 50)
70                 o_ptr->pval++;
71
72             if (power < 0) {
73                 o_ptr->ident |= (IDENT_BROKEN);
74                 o_ptr->curse_flags |= TRC_CURSED;
75                 o_ptr->pval = 0 - (o_ptr->pval);
76                 break;
77             }
78
79             break;
80         }
81         case SV_RING_LORDLY: {
82             do {
83                 one_lordly_high_resistance(o_ptr);
84             } while (one_in_(4));
85
86             o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
87             break;
88         }
89         case SV_RING_WARNING: {
90             if (one_in_(3))
91                 one_low_esp(o_ptr);
92             break;
93         }
94         case SV_RING_SEARCHING: {
95             o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
96             if (power < 0) {
97                 o_ptr->ident |= (IDENT_BROKEN);
98                 o_ptr->curse_flags |= TRC_CURSED;
99                 o_ptr->pval = 0 - (o_ptr->pval);
100             }
101
102             break;
103         }
104         case SV_RING_FLAMES:
105         case SV_RING_ACID:
106         case SV_RING_ICE:
107         case SV_RING_ELEC: {
108             o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
109             break;
110         }
111         case SV_RING_WEAKNESS:
112         case SV_RING_STUPIDITY: {
113             o_ptr->ident |= (IDENT_BROKEN);
114             o_ptr->curse_flags |= TRC_CURSED;
115             o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
116             if (power > 0)
117                 power = 0 - power;
118
119             break;
120         }
121         case SV_RING_WOE: {
122             o_ptr->ident |= (IDENT_BROKEN);
123             o_ptr->curse_flags |= TRC_CURSED;
124             o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
125             o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
126             if (power > 0)
127                 power = 0 - power;
128
129             break;
130         }
131         case SV_RING_DAMAGE: {
132             o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
133             if (power < 0) {
134                 o_ptr->ident |= (IDENT_BROKEN);
135                 o_ptr->curse_flags |= TRC_CURSED;
136                 o_ptr->to_d = 0 - o_ptr->to_d;
137             }
138
139             break;
140         }
141         case SV_RING_ACCURACY: {
142             o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
143             if (power < 0) {
144                 o_ptr->ident |= (IDENT_BROKEN);
145                 o_ptr->curse_flags |= TRC_CURSED;
146                 o_ptr->to_h = 0 - o_ptr->to_h;
147             }
148
149             break;
150         }
151         case SV_RING_PROTECTION: {
152             o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
153             if (power < 0) {
154                 o_ptr->ident |= (IDENT_BROKEN);
155                 o_ptr->curse_flags |= TRC_CURSED;
156                 o_ptr->to_a = 0 - o_ptr->to_a;
157             }
158
159             break;
160         }
161         case SV_RING_SLAYING: {
162             o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
163             o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
164
165             if (power < 0) {
166                 o_ptr->ident |= (IDENT_BROKEN);
167                 o_ptr->curse_flags |= TRC_CURSED;
168                 o_ptr->to_h = 0 - o_ptr->to_h;
169                 o_ptr->to_d = 0 - o_ptr->to_d;
170             }
171
172             break;
173         }
174         case SV_RING_MUSCLE: {
175             o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
176             if (one_in_(4))
177                 o_ptr->pval++;
178
179             if (power < 0) {
180                 o_ptr->ident |= (IDENT_BROKEN);
181                 o_ptr->curse_flags |= TRC_CURSED;
182                 o_ptr->pval = 0 - o_ptr->pval;
183             }
184
185             break;
186         }
187         case SV_RING_AGGRAVATION: {
188             o_ptr->ident |= (IDENT_BROKEN);
189             o_ptr->curse_flags |= TRC_CURSED;
190             if (power > 0)
191                 power = 0 - power;
192             break;
193         }
194         }
195
196         /* power > 2 is debug only */
197         if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79)) || (power > 2)) {
198             o_ptr->pval = MIN(o_ptr->pval, 4);
199             become_random_artifact(owner_ptr, o_ptr, FALSE);
200         } else if ((power == 2) && one_in_(2)) {
201             while (!o_ptr->name2) {
202                 int tmp = m_bonus(10, level);
203                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
204                 switch (randint1(28)) {
205                 case 1:
206                 case 2:
207                     o_ptr->name2 = EGO_RING_THROW;
208                     break;
209                 case 3:
210                 case 4:
211                     if (have_flag(k_ptr->flags, TR_REGEN))
212                         break;
213                     o_ptr->name2 = EGO_RING_REGEN;
214                     break;
215                 case 5:
216                 case 6:
217                     if (have_flag(k_ptr->flags, TR_LITE_1))
218                         break;
219                     o_ptr->name2 = EGO_RING_LITE;
220                     break;
221                 case 7:
222                 case 8:
223                     if (have_flag(k_ptr->flags, TR_TELEPORT))
224                         break;
225                     o_ptr->name2 = EGO_RING_TELEPORT;
226                     break;
227                 case 9:
228                 case 10:
229                     if (o_ptr->to_h)
230                         break;
231                     o_ptr->name2 = EGO_RING_TO_H;
232                     break;
233                 case 11:
234                 case 12:
235                     if (o_ptr->to_d)
236                         break;
237                     o_ptr->name2 = EGO_RING_TO_D;
238                     break;
239                 case 13:
240                     if ((o_ptr->to_h) || (o_ptr->to_d))
241                         break;
242                     o_ptr->name2 = EGO_RING_SLAY;
243                     break;
244                 case 14:
245                     if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d)
246                         break;
247                     o_ptr->name2 = EGO_RING_WIZARD;
248                     break;
249                 case 15:
250                     if (have_flag(k_ptr->flags, TR_ACTIVATE))
251                         break;
252                     o_ptr->name2 = EGO_RING_HERO;
253                     break;
254                 case 16:
255                     if (have_flag(k_ptr->flags, TR_ACTIVATE))
256                         break;
257                     if (tmp > 8)
258                         o_ptr->name2 = EGO_RING_MANA_BALL;
259                     else if (tmp > 4)
260                         o_ptr->name2 = EGO_RING_MANA_BOLT;
261                     else
262                         o_ptr->name2 = EGO_RING_MAGIC_MIS;
263                     break;
264                 case 17:
265                     if (have_flag(k_ptr->flags, TR_ACTIVATE))
266                         break;
267                     if (!(have_flag(k_ptr->flags, TR_RES_FIRE))
268                         && (have_flag(k_ptr->flags, TR_RES_COLD) || have_flag(k_ptr->flags, TR_RES_ELEC) || have_flag(k_ptr->flags, TR_RES_ACID)))
269                         break;
270                     if (tmp > 7)
271                         o_ptr->name2 = EGO_RING_DRAGON_F;
272                     else if (tmp > 3)
273                         o_ptr->name2 = EGO_RING_FIRE_BALL;
274                     else
275                         o_ptr->name2 = EGO_RING_FIRE_BOLT;
276                     break;
277                 case 18:
278                     if (have_flag(k_ptr->flags, TR_ACTIVATE))
279                         break;
280                     if (!(have_flag(k_ptr->flags, TR_RES_COLD))
281                         && (have_flag(k_ptr->flags, TR_RES_FIRE) || have_flag(k_ptr->flags, TR_RES_ELEC) || have_flag(k_ptr->flags, TR_RES_ACID)))
282                         break;
283                     if (tmp > 7)
284                         o_ptr->name2 = EGO_RING_DRAGON_C;
285                     else if (tmp > 3)
286                         o_ptr->name2 = EGO_RING_COLD_BALL;
287                     else
288                         o_ptr->name2 = EGO_RING_COLD_BOLT;
289                     break;
290                 case 19:
291                     if (have_flag(k_ptr->flags, TR_ACTIVATE))
292                         break;
293                     if (!(have_flag(k_ptr->flags, TR_RES_ELEC))
294                         && (have_flag(k_ptr->flags, TR_RES_COLD) || have_flag(k_ptr->flags, TR_RES_FIRE) || have_flag(k_ptr->flags, TR_RES_ACID)))
295                         break;
296                     if (tmp > 4)
297                         o_ptr->name2 = EGO_RING_ELEC_BALL;
298                     else
299                         o_ptr->name2 = EGO_RING_ELEC_BOLT;
300                     break;
301                 case 20:
302                     if (have_flag(k_ptr->flags, TR_ACTIVATE))
303                         break;
304                     if (!(have_flag(k_ptr->flags, TR_RES_ACID))
305                         && (have_flag(k_ptr->flags, TR_RES_COLD) || have_flag(k_ptr->flags, TR_RES_ELEC) || have_flag(k_ptr->flags, TR_RES_FIRE)))
306                         break;
307                     if (tmp > 4)
308                         o_ptr->name2 = EGO_RING_ACID_BALL;
309                     else
310                         o_ptr->name2 = EGO_RING_ACID_BOLT;
311                     break;
312                 case 21:
313                 case 22:
314                 case 23:
315                 case 24:
316                 case 25:
317                 case 26:
318                     switch (o_ptr->sval) {
319                     case SV_RING_SPEED:
320                         if (!one_in_(3))
321                             break;
322                         o_ptr->name2 = EGO_RING_D_SPEED;
323                         break;
324                     case SV_RING_DAMAGE:
325                     case SV_RING_ACCURACY:
326                     case SV_RING_SLAYING:
327                         if (one_in_(2))
328                             break;
329                         if (one_in_(2))
330                             o_ptr->name2 = EGO_RING_HERO;
331                         else {
332                             o_ptr->name2 = EGO_RING_BERSERKER;
333                             o_ptr->to_h -= 2 + randint1(4);
334                             o_ptr->to_d += 2 + randint1(4);
335                         }
336
337                         break;
338                     case SV_RING_PROTECTION:
339                         o_ptr->name2 = EGO_RING_SUPER_AC;
340                         o_ptr->to_a += 7 + m_bonus(5, level);
341                         break;
342                     case SV_RING_RES_FEAR:
343                         o_ptr->name2 = EGO_RING_HERO;
344                         break;
345                     case SV_RING_SHOTS:
346                         if (one_in_(2))
347                             break;
348                         o_ptr->name2 = EGO_RING_HUNTER;
349                         break;
350                     case SV_RING_SEARCHING:
351                         o_ptr->name2 = EGO_RING_STEALTH;
352                         break;
353                     case SV_RING_TELEPORTATION:
354                         o_ptr->name2 = EGO_RING_TELE_AWAY;
355                         break;
356                     case SV_RING_RES_BLINDNESS:
357                         if (one_in_(2))
358                             o_ptr->name2 = EGO_RING_RES_LITE;
359                         else
360                             o_ptr->name2 = EGO_RING_RES_DARK;
361                         break;
362                     case SV_RING_LORDLY:
363                         if (!one_in_(20))
364                             break;
365                         one_lordly_high_resistance(o_ptr);
366                         one_lordly_high_resistance(o_ptr);
367                         o_ptr->name2 = EGO_RING_TRUE;
368                         break;
369                     case SV_RING_SUSTAIN:
370                         if (!one_in_(4))
371                             break;
372                         o_ptr->name2 = EGO_RING_RES_TIME;
373                         break;
374                     case SV_RING_FLAMES:
375                         if (!one_in_(2))
376                             break;
377                         o_ptr->name2 = EGO_RING_DRAGON_F;
378                         break;
379                     case SV_RING_ICE:
380                         if (!one_in_(2))
381                             break;
382                         o_ptr->name2 = EGO_RING_DRAGON_C;
383                         break;
384                     case SV_RING_WARNING:
385                         if (!one_in_(2))
386                             break;
387                         o_ptr->name2 = EGO_RING_M_DETECT;
388                         break;
389                     default:
390                         break;
391                     }
392
393                     break;
394                 }
395             }
396
397             o_ptr->curse_flags = 0L;
398         } else if ((power == -2) && one_in_(2)) {
399             if (o_ptr->to_h > 0)
400                 o_ptr->to_h = 0 - o_ptr->to_h;
401             if (o_ptr->to_d > 0)
402                 o_ptr->to_d = 0 - o_ptr->to_d;
403             if (o_ptr->to_a > 0)
404                 o_ptr->to_a = 0 - o_ptr->to_a;
405             if (o_ptr->pval > 0)
406                 o_ptr->pval = 0 - o_ptr->pval;
407             o_ptr->art_flags[0] = 0;
408             o_ptr->art_flags[1] = 0;
409             while (!o_ptr->name2) {
410                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
411                 switch (randint1(5)) {
412                 case 1:
413                     if (have_flag(k_ptr->flags, TR_DRAIN_EXP))
414                         break;
415                     o_ptr->name2 = EGO_RING_DRAIN_EXP;
416                     break;
417                 case 2:
418                     o_ptr->name2 = EGO_RING_NO_MELEE;
419                     break;
420                 case 3:
421                     if (have_flag(k_ptr->flags, TR_AGGRAVATE))
422                         break;
423                     o_ptr->name2 = EGO_RING_AGGRAVATE;
424                     break;
425                 case 4:
426                     if (have_flag(k_ptr->flags, TR_TY_CURSE))
427                         break;
428                     o_ptr->name2 = EGO_RING_TY_CURSE;
429                     break;
430                 case 5:
431                     o_ptr->name2 = EGO_RING_ALBINO;
432                     break;
433                 }
434             }
435
436             o_ptr->ident |= (IDENT_BROKEN);
437             o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
438         }
439
440         break;
441     }
442     case TV_AMULET: {
443         switch (o_ptr->sval) {
444         case SV_AMULET_INTELLIGENCE:
445         case SV_AMULET_WISDOM:
446         case SV_AMULET_CHARISMA: {
447             o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
448             if (power < 0) {
449                 o_ptr->ident |= (IDENT_BROKEN);
450                 o_ptr->curse_flags |= (TRC_CURSED);
451                 o_ptr->pval = 0 - o_ptr->pval;
452             }
453
454             break;
455         }
456         case SV_AMULET_BRILLIANCE: {
457             o_ptr->pval = 1 + m_bonus(3, level);
458             if (one_in_(4))
459                 o_ptr->pval++;
460
461             if (power < 0) {
462                 o_ptr->ident |= (IDENT_BROKEN);
463                 o_ptr->curse_flags |= (TRC_CURSED);
464                 o_ptr->pval = 0 - o_ptr->pval;
465             }
466
467             break;
468         }
469         case SV_AMULET_NO_MAGIC:
470         case SV_AMULET_NO_TELE: {
471             if (power < 0) {
472                 o_ptr->curse_flags |= (TRC_CURSED);
473             }
474
475             break;
476         }
477         case SV_AMULET_RESISTANCE: {
478             if (one_in_(5))
479                 one_high_resistance(o_ptr);
480             if (one_in_(5))
481                 add_flag(o_ptr->art_flags, TR_RES_POIS);
482             break;
483         }
484         case SV_AMULET_SEARCHING: {
485             o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
486             if (power < 0) {
487                 o_ptr->ident |= (IDENT_BROKEN);
488                 o_ptr->curse_flags |= (TRC_CURSED);
489                 o_ptr->pval = 0 - (o_ptr->pval);
490             }
491
492             break;
493         }
494         case SV_AMULET_THE_MAGI: {
495             o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
496             o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
497             add_esp_weak(o_ptr, FALSE);
498             break;
499         }
500         case SV_AMULET_DOOM: {
501             o_ptr->ident |= (IDENT_BROKEN);
502             o_ptr->curse_flags |= (TRC_CURSED);
503             o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
504             o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
505             if (power > 0)
506                 power = 0 - power;
507
508             break;
509         }
510         case SV_AMULET_MAGIC_MASTERY: {
511             o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
512             if (power < 0) {
513                 o_ptr->ident |= (IDENT_BROKEN);
514                 o_ptr->curse_flags |= (TRC_CURSED);
515                 o_ptr->pval = 0 - o_ptr->pval;
516             }
517
518             break;
519         }
520         }
521
522         /* power > 2 is debug only */
523         if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79)) || (power > 2)) {
524             o_ptr->pval = MIN(o_ptr->pval, 4);
525             become_random_artifact(owner_ptr, o_ptr, FALSE);
526         } else if ((power == 2) && one_in_(2)) {
527             while (!o_ptr->name2) {
528                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
529                 switch (randint1(21)) {
530                 case 1:
531                 case 2:
532                     if (have_flag(k_ptr->flags, TR_SLOW_DIGEST))
533                         break;
534                     o_ptr->name2 = EGO_AMU_SLOW_D;
535                     break;
536                 case 3:
537                 case 4:
538                     if (o_ptr->pval)
539                         break;
540                     o_ptr->name2 = EGO_AMU_INFRA;
541                     break;
542                 case 5:
543                 case 6:
544                     if (have_flag(k_ptr->flags, TR_SEE_INVIS))
545                         break;
546                     o_ptr->name2 = EGO_AMU_SEE_INVIS;
547                     break;
548                 case 7:
549                 case 8:
550                     if (have_flag(k_ptr->flags, TR_HOLD_EXP))
551                         break;
552                     o_ptr->name2 = EGO_AMU_HOLD_EXP;
553                     break;
554                 case 9:
555                     if (have_flag(k_ptr->flags, TR_LEVITATION))
556                         break;
557                     o_ptr->name2 = EGO_AMU_LEVITATION;
558                     break;
559                 case 10:
560                 case 11:
561                 case 21:
562                     o_ptr->name2 = EGO_AMU_AC;
563                     break;
564                 case 12:
565                     if (have_flag(k_ptr->flags, TR_RES_FIRE))
566                         break;
567                     if (m_bonus(10, level) > 8)
568                         o_ptr->name2 = EGO_AMU_RES_FIRE_;
569                     else
570                         o_ptr->name2 = EGO_AMU_RES_FIRE;
571                     break;
572                 case 13:
573                     if (have_flag(k_ptr->flags, TR_RES_COLD))
574                         break;
575                     if (m_bonus(10, level) > 8)
576                         o_ptr->name2 = EGO_AMU_RES_COLD_;
577                     else
578                         o_ptr->name2 = EGO_AMU_RES_COLD;
579                     break;
580                 case 14:
581                     if (have_flag(k_ptr->flags, TR_RES_ELEC))
582                         break;
583                     if (m_bonus(10, level) > 8)
584                         o_ptr->name2 = EGO_AMU_RES_ELEC_;
585                     else
586                         o_ptr->name2 = EGO_AMU_RES_ELEC;
587                     break;
588                 case 15:
589                     if (have_flag(k_ptr->flags, TR_RES_ACID))
590                         break;
591                     if (m_bonus(10, level) > 8)
592                         o_ptr->name2 = EGO_AMU_RES_ACID_;
593                     else
594                         o_ptr->name2 = EGO_AMU_RES_ACID;
595                     break;
596                 case 16:
597                 case 17:
598                 case 18:
599                 case 19:
600                 case 20:
601                     switch (o_ptr->sval) {
602                     case SV_AMULET_TELEPORT:
603                         if (m_bonus(10, level) > 9)
604                             o_ptr->name2 = EGO_AMU_D_DOOR;
605                         else if (one_in_(2))
606                             o_ptr->name2 = EGO_AMU_JUMP;
607                         else
608                             o_ptr->name2 = EGO_AMU_TELEPORT;
609                         break;
610                     case SV_AMULET_RESIST_ACID:
611                         if ((m_bonus(10, level) > 6) && one_in_(2))
612                             o_ptr->name2 = EGO_AMU_RES_ACID_;
613                         break;
614                     case SV_AMULET_SEARCHING:
615                         o_ptr->name2 = EGO_AMU_STEALTH;
616                         break;
617                     case SV_AMULET_BRILLIANCE:
618                         if (!one_in_(3))
619                             break;
620                         o_ptr->name2 = EGO_AMU_IDENT;
621                         break;
622                     case SV_AMULET_CHARISMA:
623                         if (!one_in_(3))
624                             break;
625                         o_ptr->name2 = EGO_AMU_CHARM;
626                         break;
627                     case SV_AMULET_THE_MAGI:
628                         if (one_in_(2))
629                             break;
630                         o_ptr->name2 = EGO_AMU_GREAT;
631                         break;
632                     case SV_AMULET_RESISTANCE:
633                         if (!one_in_(5))
634                             break;
635                         o_ptr->name2 = EGO_AMU_DEFENDER;
636                         break;
637                     case SV_AMULET_TELEPATHY:
638                         if (!one_in_(3))
639                             break;
640                         o_ptr->name2 = EGO_AMU_DETECTION;
641                         break;
642                     }
643                 }
644             }
645             o_ptr->curse_flags = 0L;
646         } else if ((power == -2) && one_in_(2)) {
647             if (o_ptr->to_h > 0)
648                 o_ptr->to_h = 0 - o_ptr->to_h;
649             if (o_ptr->to_d > 0)
650                 o_ptr->to_d = 0 - o_ptr->to_d;
651             if (o_ptr->to_a > 0)
652                 o_ptr->to_a = 0 - o_ptr->to_a;
653             if (o_ptr->pval > 0)
654                 o_ptr->pval = 0 - o_ptr->pval;
655             o_ptr->art_flags[0] = 0;
656             o_ptr->art_flags[1] = 0;
657             while (!o_ptr->name2) {
658                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
659                 switch (randint1(5)) {
660                 case 1:
661                     if (have_flag(k_ptr->flags, TR_DRAIN_EXP))
662                         break;
663                     o_ptr->name2 = EGO_AMU_DRAIN_EXP;
664                     break;
665                 case 2:
666                     o_ptr->name2 = EGO_AMU_FOOL;
667                     break;
668                 case 3:
669                     if (have_flag(k_ptr->flags, TR_AGGRAVATE))
670                         break;
671                     o_ptr->name2 = EGO_AMU_AGGRAVATE;
672                     break;
673                 case 4:
674                     if (have_flag(k_ptr->flags, TR_TY_CURSE))
675                         break;
676                     o_ptr->name2 = EGO_AMU_TY_CURSE;
677                     break;
678                 case 5:
679                     o_ptr->name2 = EGO_AMU_NAIVETY;
680                     break;
681                 }
682             }
683
684             o_ptr->ident |= (IDENT_BROKEN);
685             o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
686         }
687
688         break;
689     }
690     }
691 }