3 * @brief 防具系のアイテムを強化して(恐らく床に)生成する処理
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"
21 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
22 * Apply magic to an item known to be a "ring" or "amulet"
23 * @param owner_ptr プレーヤーへの参照ポインタ
24 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
29 * Hack -- note special "pval boost" code for ring of speed\n
30 * Hack -- note that some items must be cursed (or blessed)\n
32 void apply_magic_accessary(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
34 switch (o_ptr->tval) {
36 switch (o_ptr->sval) {
37 case SV_RING_ATTACKS: {
38 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
45 o_ptr->ident |= (IDENT_BROKEN);
46 o_ptr->curse_flags |= TRC_CURSED;
47 o_ptr->pval = 0 - (o_ptr->pval);
58 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
60 o_ptr->ident |= (IDENT_BROKEN);
61 o_ptr->curse_flags |= TRC_CURSED;
62 o_ptr->pval = 0 - (o_ptr->pval);
68 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
69 while (randint0(100) < 50)
73 o_ptr->ident |= (IDENT_BROKEN);
74 o_ptr->curse_flags |= TRC_CURSED;
75 o_ptr->pval = 0 - (o_ptr->pval);
81 case SV_RING_LORDLY: {
83 one_lordly_high_resistance(o_ptr);
86 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
89 case SV_RING_WARNING: {
94 case SV_RING_SEARCHING: {
95 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
97 o_ptr->ident |= (IDENT_BROKEN);
98 o_ptr->curse_flags |= TRC_CURSED;
99 o_ptr->pval = 0 - (o_ptr->pval);
108 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
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));
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));
131 case SV_RING_DAMAGE: {
132 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
134 o_ptr->ident |= (IDENT_BROKEN);
135 o_ptr->curse_flags |= TRC_CURSED;
136 o_ptr->to_d = 0 - o_ptr->to_d;
141 case SV_RING_ACCURACY: {
142 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
144 o_ptr->ident |= (IDENT_BROKEN);
145 o_ptr->curse_flags |= TRC_CURSED;
146 o_ptr->to_h = 0 - o_ptr->to_h;
151 case SV_RING_PROTECTION: {
152 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
154 o_ptr->ident |= (IDENT_BROKEN);
155 o_ptr->curse_flags |= TRC_CURSED;
156 o_ptr->to_a = 0 - o_ptr->to_a;
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);
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;
174 case SV_RING_MUSCLE: {
175 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
180 o_ptr->ident |= (IDENT_BROKEN);
181 o_ptr->curse_flags |= TRC_CURSED;
182 o_ptr->pval = 0 - o_ptr->pval;
187 case SV_RING_AGGRAVATION: {
188 o_ptr->ident |= (IDENT_BROKEN);
189 o_ptr->curse_flags |= TRC_CURSED;
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)) {
207 o_ptr->name2 = EGO_RING_THROW;
211 if (have_flag(k_ptr->flags, TR_REGEN))
213 o_ptr->name2 = EGO_RING_REGEN;
217 if (have_flag(k_ptr->flags, TR_LITE_1))
219 o_ptr->name2 = EGO_RING_LITE;
223 if (have_flag(k_ptr->flags, TR_TELEPORT))
225 o_ptr->name2 = EGO_RING_TELEPORT;
231 o_ptr->name2 = EGO_RING_TO_H;
237 o_ptr->name2 = EGO_RING_TO_D;
240 if ((o_ptr->to_h) || (o_ptr->to_d))
242 o_ptr->name2 = EGO_RING_SLAY;
245 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d)
247 o_ptr->name2 = EGO_RING_WIZARD;
250 if (have_flag(k_ptr->flags, TR_ACTIVATE))
252 o_ptr->name2 = EGO_RING_HERO;
255 if (have_flag(k_ptr->flags, TR_ACTIVATE))
258 o_ptr->name2 = EGO_RING_MANA_BALL;
260 o_ptr->name2 = EGO_RING_MANA_BOLT;
262 o_ptr->name2 = EGO_RING_MAGIC_MIS;
265 if (have_flag(k_ptr->flags, TR_ACTIVATE))
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)))
271 o_ptr->name2 = EGO_RING_DRAGON_F;
273 o_ptr->name2 = EGO_RING_FIRE_BALL;
275 o_ptr->name2 = EGO_RING_FIRE_BOLT;
278 if (have_flag(k_ptr->flags, TR_ACTIVATE))
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)))
284 o_ptr->name2 = EGO_RING_DRAGON_C;
286 o_ptr->name2 = EGO_RING_COLD_BALL;
288 o_ptr->name2 = EGO_RING_COLD_BOLT;
291 if (have_flag(k_ptr->flags, TR_ACTIVATE))
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)))
297 o_ptr->name2 = EGO_RING_ELEC_BALL;
299 o_ptr->name2 = EGO_RING_ELEC_BOLT;
302 if (have_flag(k_ptr->flags, TR_ACTIVATE))
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)))
308 o_ptr->name2 = EGO_RING_ACID_BALL;
310 o_ptr->name2 = EGO_RING_ACID_BOLT;
318 switch (o_ptr->sval) {
322 o_ptr->name2 = EGO_RING_D_SPEED;
325 case SV_RING_ACCURACY:
326 case SV_RING_SLAYING:
330 o_ptr->name2 = EGO_RING_HERO;
332 o_ptr->name2 = EGO_RING_BERSERKER;
333 o_ptr->to_h -= 2 + randint1(4);
334 o_ptr->to_d += 2 + randint1(4);
338 case SV_RING_PROTECTION:
339 o_ptr->name2 = EGO_RING_SUPER_AC;
340 o_ptr->to_a += 7 + m_bonus(5, level);
342 case SV_RING_RES_FEAR:
343 o_ptr->name2 = EGO_RING_HERO;
348 o_ptr->name2 = EGO_RING_HUNTER;
350 case SV_RING_SEARCHING:
351 o_ptr->name2 = EGO_RING_STEALTH;
353 case SV_RING_TELEPORTATION:
354 o_ptr->name2 = EGO_RING_TELE_AWAY;
356 case SV_RING_RES_BLINDNESS:
358 o_ptr->name2 = EGO_RING_RES_LITE;
360 o_ptr->name2 = EGO_RING_RES_DARK;
365 one_lordly_high_resistance(o_ptr);
366 one_lordly_high_resistance(o_ptr);
367 o_ptr->name2 = EGO_RING_TRUE;
369 case SV_RING_SUSTAIN:
372 o_ptr->name2 = EGO_RING_RES_TIME;
377 o_ptr->name2 = EGO_RING_DRAGON_F;
382 o_ptr->name2 = EGO_RING_DRAGON_C;
384 case SV_RING_WARNING:
387 o_ptr->name2 = EGO_RING_M_DETECT;
397 o_ptr->curse_flags = 0L;
398 } else if ((power == -2) && one_in_(2)) {
400 o_ptr->to_h = 0 - o_ptr->to_h;
402 o_ptr->to_d = 0 - o_ptr->to_d;
404 o_ptr->to_a = 0 - o_ptr->to_a;
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)) {
413 if (have_flag(k_ptr->flags, TR_DRAIN_EXP))
415 o_ptr->name2 = EGO_RING_DRAIN_EXP;
418 o_ptr->name2 = EGO_RING_NO_MELEE;
421 if (have_flag(k_ptr->flags, TR_AGGRAVATE))
423 o_ptr->name2 = EGO_RING_AGGRAVATE;
426 if (have_flag(k_ptr->flags, TR_TY_CURSE))
428 o_ptr->name2 = EGO_RING_TY_CURSE;
431 o_ptr->name2 = EGO_RING_ALBINO;
436 o_ptr->ident |= (IDENT_BROKEN);
437 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
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);
449 o_ptr->ident |= (IDENT_BROKEN);
450 o_ptr->curse_flags |= (TRC_CURSED);
451 o_ptr->pval = 0 - o_ptr->pval;
456 case SV_AMULET_BRILLIANCE: {
457 o_ptr->pval = 1 + m_bonus(3, level);
462 o_ptr->ident |= (IDENT_BROKEN);
463 o_ptr->curse_flags |= (TRC_CURSED);
464 o_ptr->pval = 0 - o_ptr->pval;
469 case SV_AMULET_NO_MAGIC:
470 case SV_AMULET_NO_TELE: {
472 o_ptr->curse_flags |= (TRC_CURSED);
477 case SV_AMULET_RESISTANCE: {
479 one_high_resistance(o_ptr);
481 add_flag(o_ptr->art_flags, TR_RES_POIS);
484 case SV_AMULET_SEARCHING: {
485 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
487 o_ptr->ident |= (IDENT_BROKEN);
488 o_ptr->curse_flags |= (TRC_CURSED);
489 o_ptr->pval = 0 - (o_ptr->pval);
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);
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));
510 case SV_AMULET_MAGIC_MASTERY: {
511 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
513 o_ptr->ident |= (IDENT_BROKEN);
514 o_ptr->curse_flags |= (TRC_CURSED);
515 o_ptr->pval = 0 - o_ptr->pval;
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)) {
532 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST))
534 o_ptr->name2 = EGO_AMU_SLOW_D;
540 o_ptr->name2 = EGO_AMU_INFRA;
544 if (have_flag(k_ptr->flags, TR_SEE_INVIS))
546 o_ptr->name2 = EGO_AMU_SEE_INVIS;
550 if (have_flag(k_ptr->flags, TR_HOLD_EXP))
552 o_ptr->name2 = EGO_AMU_HOLD_EXP;
555 if (have_flag(k_ptr->flags, TR_LEVITATION))
557 o_ptr->name2 = EGO_AMU_LEVITATION;
562 o_ptr->name2 = EGO_AMU_AC;
565 if (have_flag(k_ptr->flags, TR_RES_FIRE))
567 if (m_bonus(10, level) > 8)
568 o_ptr->name2 = EGO_AMU_RES_FIRE_;
570 o_ptr->name2 = EGO_AMU_RES_FIRE;
573 if (have_flag(k_ptr->flags, TR_RES_COLD))
575 if (m_bonus(10, level) > 8)
576 o_ptr->name2 = EGO_AMU_RES_COLD_;
578 o_ptr->name2 = EGO_AMU_RES_COLD;
581 if (have_flag(k_ptr->flags, TR_RES_ELEC))
583 if (m_bonus(10, level) > 8)
584 o_ptr->name2 = EGO_AMU_RES_ELEC_;
586 o_ptr->name2 = EGO_AMU_RES_ELEC;
589 if (have_flag(k_ptr->flags, TR_RES_ACID))
591 if (m_bonus(10, level) > 8)
592 o_ptr->name2 = EGO_AMU_RES_ACID_;
594 o_ptr->name2 = EGO_AMU_RES_ACID;
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;
606 o_ptr->name2 = EGO_AMU_JUMP;
608 o_ptr->name2 = EGO_AMU_TELEPORT;
610 case SV_AMULET_RESIST_ACID:
611 if ((m_bonus(10, level) > 6) && one_in_(2))
612 o_ptr->name2 = EGO_AMU_RES_ACID_;
614 case SV_AMULET_SEARCHING:
615 o_ptr->name2 = EGO_AMU_STEALTH;
617 case SV_AMULET_BRILLIANCE:
620 o_ptr->name2 = EGO_AMU_IDENT;
622 case SV_AMULET_CHARISMA:
625 o_ptr->name2 = EGO_AMU_CHARM;
627 case SV_AMULET_THE_MAGI:
630 o_ptr->name2 = EGO_AMU_GREAT;
632 case SV_AMULET_RESISTANCE:
635 o_ptr->name2 = EGO_AMU_DEFENDER;
637 case SV_AMULET_TELEPATHY:
640 o_ptr->name2 = EGO_AMU_DETECTION;
645 o_ptr->curse_flags = 0L;
646 } else if ((power == -2) && one_in_(2)) {
648 o_ptr->to_h = 0 - o_ptr->to_h;
650 o_ptr->to_d = 0 - o_ptr->to_d;
652 o_ptr->to_a = 0 - o_ptr->to_a;
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)) {
661 if (have_flag(k_ptr->flags, TR_DRAIN_EXP))
663 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
666 o_ptr->name2 = EGO_AMU_FOOL;
669 if (have_flag(k_ptr->flags, TR_AGGRAVATE))
671 o_ptr->name2 = EGO_AMU_AGGRAVATE;
674 if (have_flag(k_ptr->flags, TR_TY_CURSE))
676 o_ptr->name2 = EGO_AMU_TY_CURSE;
679 o_ptr->name2 = EGO_AMU_NAIVETY;
684 o_ptr->ident |= (IDENT_BROKEN);
685 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);