3 * @brief 防具系のアイテムを強化して(恐らく床に)生成する処理
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"
22 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
23 * Apply magic to an item known to be a "ring" or "amulet"
24 * @param owner_ptr プレーヤーへの参照ポインタ
25 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
30 * Hack -- note special "pval boost" code for ring of speed\n
31 * Hack -- note that some items must be cursed (or blessed)\n
33 void apply_magic_accessary(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
35 switch (o_ptr->tval) {
37 switch (o_ptr->sval) {
38 case SV_RING_ATTACKS: {
39 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
46 o_ptr->ident |= (IDENT_BROKEN);
47 o_ptr->curse_flags |= TRC_CURSED;
48 o_ptr->pval = 0 - (o_ptr->pval);
59 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
61 o_ptr->ident |= (IDENT_BROKEN);
62 o_ptr->curse_flags |= TRC_CURSED;
63 o_ptr->pval = 0 - (o_ptr->pval);
69 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
70 while (randint0(100) < 50)
74 o_ptr->ident |= (IDENT_BROKEN);
75 o_ptr->curse_flags |= TRC_CURSED;
76 o_ptr->pval = 0 - (o_ptr->pval);
82 case SV_RING_LORDLY: {
84 one_lordly_high_resistance(o_ptr);
87 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
90 case SV_RING_WARNING: {
95 case SV_RING_SEARCHING: {
96 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
98 o_ptr->ident |= (IDENT_BROKEN);
99 o_ptr->curse_flags |= TRC_CURSED;
100 o_ptr->pval = 0 - (o_ptr->pval);
109 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
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));
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));
132 case SV_RING_DAMAGE: {
133 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
135 o_ptr->ident |= (IDENT_BROKEN);
136 o_ptr->curse_flags |= TRC_CURSED;
137 o_ptr->to_d = 0 - o_ptr->to_d;
142 case SV_RING_ACCURACY: {
143 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
145 o_ptr->ident |= (IDENT_BROKEN);
146 o_ptr->curse_flags |= TRC_CURSED;
147 o_ptr->to_h = 0 - o_ptr->to_h;
152 case SV_RING_PROTECTION: {
153 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
155 o_ptr->ident |= (IDENT_BROKEN);
156 o_ptr->curse_flags |= TRC_CURSED;
157 o_ptr->to_a = 0 - o_ptr->to_a;
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);
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;
175 case SV_RING_MUSCLE: {
176 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
181 o_ptr->ident |= (IDENT_BROKEN);
182 o_ptr->curse_flags |= TRC_CURSED;
183 o_ptr->pval = 0 - o_ptr->pval;
188 case SV_RING_AGGRAVATION: {
189 o_ptr->ident |= (IDENT_BROKEN);
190 o_ptr->curse_flags |= TRC_CURSED;
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)) {
208 o_ptr->name2 = EGO_RING_THROW;
212 if (has_flag(k_ptr->flags, TR_REGEN))
214 o_ptr->name2 = EGO_RING_REGEN;
218 if (has_flag(k_ptr->flags, TR_LITE_1))
220 o_ptr->name2 = EGO_RING_LITE;
224 if (has_flag(k_ptr->flags, TR_TELEPORT))
226 o_ptr->name2 = EGO_RING_TELEPORT;
232 o_ptr->name2 = EGO_RING_TO_H;
238 o_ptr->name2 = EGO_RING_TO_D;
241 if ((o_ptr->to_h) || (o_ptr->to_d))
243 o_ptr->name2 = EGO_RING_SLAY;
246 if ((has_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d)
248 o_ptr->name2 = EGO_RING_WIZARD;
251 if (has_flag(k_ptr->flags, TR_ACTIVATE))
253 o_ptr->name2 = EGO_RING_HERO;
256 if (has_flag(k_ptr->flags, TR_ACTIVATE))
259 o_ptr->name2 = EGO_RING_MANA_BALL;
261 o_ptr->name2 = EGO_RING_MANA_BOLT;
263 o_ptr->name2 = EGO_RING_MAGIC_MIS;
266 if (has_flag(k_ptr->flags, TR_ACTIVATE))
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)))
272 o_ptr->name2 = EGO_RING_DRAGON_F;
274 o_ptr->name2 = EGO_RING_FIRE_BALL;
276 o_ptr->name2 = EGO_RING_FIRE_BOLT;
279 if (has_flag(k_ptr->flags, TR_ACTIVATE))
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)))
285 o_ptr->name2 = EGO_RING_DRAGON_C;
287 o_ptr->name2 = EGO_RING_COLD_BALL;
289 o_ptr->name2 = EGO_RING_COLD_BOLT;
292 if (has_flag(k_ptr->flags, TR_ACTIVATE))
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)))
298 o_ptr->name2 = EGO_RING_ELEC_BALL;
300 o_ptr->name2 = EGO_RING_ELEC_BOLT;
303 if (has_flag(k_ptr->flags, TR_ACTIVATE))
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)))
309 o_ptr->name2 = EGO_RING_ACID_BALL;
311 o_ptr->name2 = EGO_RING_ACID_BOLT;
319 switch (o_ptr->sval) {
323 o_ptr->name2 = EGO_RING_D_SPEED;
326 case SV_RING_ACCURACY:
327 case SV_RING_SLAYING:
331 o_ptr->name2 = EGO_RING_HERO;
333 o_ptr->name2 = EGO_RING_BERSERKER;
334 o_ptr->to_h -= 2 + randint1(4);
335 o_ptr->to_d += 2 + randint1(4);
339 case SV_RING_PROTECTION:
340 o_ptr->name2 = EGO_RING_SUPER_AC;
341 o_ptr->to_a += 7 + m_bonus(5, level);
343 case SV_RING_RES_FEAR:
344 o_ptr->name2 = EGO_RING_HERO;
349 o_ptr->name2 = EGO_RING_HUNTER;
351 case SV_RING_SEARCHING:
352 o_ptr->name2 = EGO_RING_STEALTH;
354 case SV_RING_TELEPORTATION:
355 o_ptr->name2 = EGO_RING_TELE_AWAY;
357 case SV_RING_RES_BLINDNESS:
359 o_ptr->name2 = EGO_RING_RES_LITE;
361 o_ptr->name2 = EGO_RING_RES_DARK;
366 one_lordly_high_resistance(o_ptr);
367 one_lordly_high_resistance(o_ptr);
368 o_ptr->name2 = EGO_RING_TRUE;
370 case SV_RING_SUSTAIN:
373 o_ptr->name2 = EGO_RING_RES_TIME;
378 o_ptr->name2 = EGO_RING_DRAGON_F;
383 o_ptr->name2 = EGO_RING_DRAGON_C;
385 case SV_RING_WARNING:
388 o_ptr->name2 = EGO_RING_M_DETECT;
398 o_ptr->curse_flags = 0L;
399 } else if ((power == -2) && one_in_(2)) {
401 o_ptr->to_h = 0 - o_ptr->to_h;
403 o_ptr->to_d = 0 - o_ptr->to_d;
405 o_ptr->to_a = 0 - o_ptr->to_a;
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)) {
414 if (has_flag(k_ptr->flags, TR_DRAIN_EXP))
416 o_ptr->name2 = EGO_RING_DRAIN_EXP;
419 o_ptr->name2 = EGO_RING_NO_MELEE;
422 if (has_flag(k_ptr->flags, TR_AGGRAVATE))
424 o_ptr->name2 = EGO_RING_AGGRAVATE;
427 if (has_flag(k_ptr->flags, TR_TY_CURSE))
429 o_ptr->name2 = EGO_RING_TY_CURSE;
432 o_ptr->name2 = EGO_RING_ALBINO;
437 o_ptr->ident |= (IDENT_BROKEN);
438 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
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);
450 o_ptr->ident |= (IDENT_BROKEN);
451 o_ptr->curse_flags |= (TRC_CURSED);
452 o_ptr->pval = 0 - o_ptr->pval;
457 case SV_AMULET_BRILLIANCE: {
458 o_ptr->pval = 1 + m_bonus(3, level);
463 o_ptr->ident |= (IDENT_BROKEN);
464 o_ptr->curse_flags |= (TRC_CURSED);
465 o_ptr->pval = 0 - o_ptr->pval;
470 case SV_AMULET_NO_MAGIC:
471 case SV_AMULET_NO_TELE: {
473 o_ptr->curse_flags |= (TRC_CURSED);
478 case SV_AMULET_RESISTANCE: {
480 one_high_resistance(o_ptr);
482 add_flag(o_ptr->art_flags, TR_RES_POIS);
485 case SV_AMULET_SEARCHING: {
486 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
488 o_ptr->ident |= (IDENT_BROKEN);
489 o_ptr->curse_flags |= (TRC_CURSED);
490 o_ptr->pval = 0 - (o_ptr->pval);
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);
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));
511 case SV_AMULET_MAGIC_MASTERY: {
512 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
514 o_ptr->ident |= (IDENT_BROKEN);
515 o_ptr->curse_flags |= (TRC_CURSED);
516 o_ptr->pval = 0 - o_ptr->pval;
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)) {
533 if (has_flag(k_ptr->flags, TR_SLOW_DIGEST))
535 o_ptr->name2 = EGO_AMU_SLOW_D;
541 o_ptr->name2 = EGO_AMU_INFRA;
545 if (has_flag(k_ptr->flags, TR_SEE_INVIS))
547 o_ptr->name2 = EGO_AMU_SEE_INVIS;
551 if (has_flag(k_ptr->flags, TR_HOLD_EXP))
553 o_ptr->name2 = EGO_AMU_HOLD_EXP;
556 if (has_flag(k_ptr->flags, TR_LEVITATION))
558 o_ptr->name2 = EGO_AMU_LEVITATION;
563 o_ptr->name2 = EGO_AMU_AC;
566 if (has_flag(k_ptr->flags, TR_RES_FIRE))
568 if (m_bonus(10, level) > 8)
569 o_ptr->name2 = EGO_AMU_RES_FIRE_;
571 o_ptr->name2 = EGO_AMU_RES_FIRE;
574 if (has_flag(k_ptr->flags, TR_RES_COLD))
576 if (m_bonus(10, level) > 8)
577 o_ptr->name2 = EGO_AMU_RES_COLD_;
579 o_ptr->name2 = EGO_AMU_RES_COLD;
582 if (has_flag(k_ptr->flags, TR_RES_ELEC))
584 if (m_bonus(10, level) > 8)
585 o_ptr->name2 = EGO_AMU_RES_ELEC_;
587 o_ptr->name2 = EGO_AMU_RES_ELEC;
590 if (has_flag(k_ptr->flags, TR_RES_ACID))
592 if (m_bonus(10, level) > 8)
593 o_ptr->name2 = EGO_AMU_RES_ACID_;
595 o_ptr->name2 = EGO_AMU_RES_ACID;
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;
607 o_ptr->name2 = EGO_AMU_JUMP;
609 o_ptr->name2 = EGO_AMU_TELEPORT;
611 case SV_AMULET_RESIST_ACID:
612 if ((m_bonus(10, level) > 6) && one_in_(2))
613 o_ptr->name2 = EGO_AMU_RES_ACID_;
615 case SV_AMULET_SEARCHING:
616 o_ptr->name2 = EGO_AMU_STEALTH;
618 case SV_AMULET_BRILLIANCE:
621 o_ptr->name2 = EGO_AMU_IDENT;
623 case SV_AMULET_CHARISMA:
626 o_ptr->name2 = EGO_AMU_CHARM;
628 case SV_AMULET_THE_MAGI:
631 o_ptr->name2 = EGO_AMU_GREAT;
633 case SV_AMULET_RESISTANCE:
636 o_ptr->name2 = EGO_AMU_DEFENDER;
638 case SV_AMULET_TELEPATHY:
641 o_ptr->name2 = EGO_AMU_DETECTION;
646 o_ptr->curse_flags = 0L;
647 } else if ((power == -2) && one_in_(2)) {
649 o_ptr->to_h = 0 - o_ptr->to_h;
651 o_ptr->to_d = 0 - o_ptr->to_d;
653 o_ptr->to_a = 0 - o_ptr->to_a;
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)) {
662 if (has_flag(k_ptr->flags, TR_DRAIN_EXP))
664 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
667 o_ptr->name2 = EGO_AMU_FOOL;
670 if (has_flag(k_ptr->flags, TR_AGGRAVATE))
672 o_ptr->name2 = EGO_AMU_AGGRAVATE;
675 if (has_flag(k_ptr->flags, TR_TY_CURSE))
677 o_ptr->name2 = EGO_AMU_TY_CURSE;
680 o_ptr->name2 = EGO_AMU_NAIVETY;
685 o_ptr->ident |= (IDENT_BROKEN);
686 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);