OSDN Git Service

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