2 * @brief アミュレットを強化生成する処理
7 #include "object-enchant/apply-magic-amulet.h"
8 #include "artifact/random-art-generator.h"
9 #include "object-enchant/object-boost.h"
10 #include "object-enchant/object-ego.h"
11 #include "object-enchant/special-object-flags.h"
12 #include "object-enchant/trc-types.h"
13 #include "object-hook/hook-checker.h"
14 #include "object/object-kind.h"
15 #include "sv-definition/sv-amulet-types.h"
16 #include "system/object-type-definition.h"
17 #include "system/player-type-definition.h"
18 #include "util/bit-flags-calculator.h"
22 * @param owner_ptr プレーヤーへの参照ポインタ
23 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
27 AmuletEnchanter::AmuletEnchanter(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
28 : owner_ptr(owner_ptr)
36 * @brief アミュレットに生成ランクごとの強化を与える
37 * Apply magic to an item known to be a "ring" or "amulet"
38 * @param owner_ptr プレーヤーへの参照ポインタ
39 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
43 * @details power > 2 is debug only
45 void AmuletEnchanter::apply_magic()
48 if ((one_in_(150) && (this->power > 0) && !object_is_cursed(this->o_ptr) && (this->level > 79)) || (this->power > 2)) {
49 this->o_ptr->pval = MIN(this->o_ptr->pval, 4);
50 become_random_artifact(owner_ptr, this->o_ptr, false);
54 if ((this->power == 2) && one_in_(2)) {
56 this->o_ptr->curse_flags.clear();
60 if ((this->power == -2) && one_in_(2)) {
66 void AmuletEnchanter::enchant()
68 switch (this->o_ptr->sval) {
69 case SV_AMULET_INTELLIGENCE:
70 case SV_AMULET_WISDOM:
71 case SV_AMULET_CHARISMA:
72 this->o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, this->level);
73 if (this->power < 0) {
74 set_bits(this->o_ptr->ident, IDENT_BROKEN);
75 this->o_ptr->curse_flags.set(TRC::CURSED);
76 this->o_ptr->pval = 0 - this->o_ptr->pval;
80 case SV_AMULET_BRILLIANCE:
81 this->o_ptr->pval = 1 + m_bonus(3, this->level);
86 if (this->power < 0) {
87 set_bits(this->o_ptr->ident, IDENT_BROKEN);
88 this->o_ptr->curse_flags.set(TRC::CURSED);
89 this->o_ptr->pval = 0 - this->o_ptr->pval;
93 case SV_AMULET_NO_MAGIC:
94 case SV_AMULET_NO_TELE:
95 if (this->power < 0) {
96 this->o_ptr->curse_flags.set(TRC::CURSED);
100 case SV_AMULET_RESISTANCE:
102 one_high_resistance(this->o_ptr);
106 add_flag(this->o_ptr->art_flags, TR_RES_POIS);
110 case SV_AMULET_SEARCHING:
111 this->o_ptr->pval = 2 + randint1(6);
112 if (this->power >= 0) {
113 add_esp_weak(this->o_ptr, false);
117 set_bits(this->o_ptr->ident, IDENT_BROKEN);
118 this->o_ptr->curse_flags.set(TRC::CURSED);
119 this->o_ptr->pval = 0 - (this->o_ptr->pval);
121 case SV_AMULET_THE_MAGI:
122 this->o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, this->level);
123 this->o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, this->level);
124 add_esp_weak(this->o_ptr, false);
127 set_bits(this->o_ptr->ident, IDENT_BROKEN);
128 this->o_ptr->curse_flags.set(TRC::CURSED);
129 this->o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, this->level));
130 this->o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, this->level));
131 if (this->power > 0) {
132 this->power = 0 - this->power;
136 case SV_AMULET_MAGIC_MASTERY:
137 this->o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, this->level);
138 if (this->power >= 0) {
142 set_bits(this->o_ptr->ident, IDENT_BROKEN);
143 this->o_ptr->curse_flags.set(TRC::CURSED);
144 this->o_ptr->pval = 0 - this->o_ptr->pval;
149 void AmuletEnchanter::give_ego_index()
151 while (!this->o_ptr->name2) {
152 auto *k_ptr = &k_info[this->o_ptr->k_idx];
153 switch (randint1(21)) {
156 if (has_flag(k_ptr->flags, TR_SLOW_DIGEST)) {
160 this->o_ptr->name2 = EGO_AMU_SLOW_D;
164 if (this->o_ptr->pval) {
168 this->o_ptr->name2 = EGO_AMU_INFRA;
172 if (has_flag(k_ptr->flags, TR_SEE_INVIS)) {
176 this->o_ptr->name2 = EGO_AMU_SEE_INVIS;
180 if (has_flag(k_ptr->flags, TR_HOLD_EXP)) {
184 this->o_ptr->name2 = EGO_AMU_HOLD_EXP;
187 if (has_flag(k_ptr->flags, TR_LEVITATION)) {
191 this->o_ptr->name2 = EGO_AMU_LEVITATION;
196 this->o_ptr->name2 = EGO_AMU_AC;
199 if (has_flag(k_ptr->flags, TR_RES_FIRE)) {
203 if (m_bonus(10, this->level) > 8) {
204 this->o_ptr->name2 = EGO_AMU_RES_FIRE_;
208 this->o_ptr->name2 = EGO_AMU_RES_FIRE;
211 if (has_flag(k_ptr->flags, TR_RES_COLD)) {
215 if (m_bonus(10, this->level) > 8) {
216 this->o_ptr->name2 = EGO_AMU_RES_COLD_;
220 this->o_ptr->name2 = EGO_AMU_RES_COLD;
223 if (has_flag(k_ptr->flags, TR_RES_ELEC)) {
227 if (m_bonus(10, this->level) > 8) {
228 this->o_ptr->name2 = EGO_AMU_RES_ELEC_;
232 this->o_ptr->name2 = EGO_AMU_RES_ELEC;
235 if (has_flag(k_ptr->flags, TR_RES_ACID)) {
239 if (m_bonus(10, this->level) > 8) {
240 this->o_ptr->name2 = EGO_AMU_RES_ACID_;
244 this->o_ptr->name2 = EGO_AMU_RES_ACID;
251 give_high_ego_index();
257 void AmuletEnchanter::give_high_ego_index()
259 switch (this->o_ptr->sval) {
260 case SV_AMULET_TELEPORT:
261 if (m_bonus(10, this->level) > 9) {
262 this->o_ptr->name2 = EGO_AMU_D_DOOR;
267 this->o_ptr->name2 = EGO_AMU_JUMP;
271 this->o_ptr->name2 = EGO_AMU_TELEPORT;
273 case SV_AMULET_RESIST_ACID:
274 if ((m_bonus(10, this->level) > 6) && one_in_(2)) {
275 this->o_ptr->name2 = EGO_AMU_RES_ACID_;
279 case SV_AMULET_SEARCHING:
280 this->o_ptr->name2 = EGO_AMU_STEALTH;
282 case SV_AMULET_BRILLIANCE:
287 this->o_ptr->name2 = EGO_AMU_IDENT;
289 case SV_AMULET_CHARISMA:
294 this->o_ptr->name2 = EGO_AMU_CHARM;
296 case SV_AMULET_THE_MAGI:
301 this->o_ptr->name2 = EGO_AMU_GREAT;
303 case SV_AMULET_RESISTANCE:
308 this->o_ptr->name2 = EGO_AMU_DEFENDER;
310 case SV_AMULET_TELEPATHY:
315 this->o_ptr->name2 = EGO_AMU_DETECTION;
322 void AmuletEnchanter::give_cursed()
324 if (this->o_ptr->to_h > 0) {
325 this->o_ptr->to_h = 0 - this->o_ptr->to_h;
328 if (this->o_ptr->to_d > 0) {
329 this->o_ptr->to_d = 0 - this->o_ptr->to_d;
332 if (this->o_ptr->to_a > 0) {
333 this->o_ptr->to_a = 0 - this->o_ptr->to_a;
336 if (this->o_ptr->pval > 0) {
337 this->o_ptr->pval = 0 - this->o_ptr->pval;
340 this->o_ptr->art_flags[0] = 0;
341 this->o_ptr->art_flags[1] = 0;
342 while (!this->o_ptr->name2) {
343 auto *k_ptr = &k_info[this->o_ptr->k_idx];
344 switch (randint1(5)) {
346 if (has_flag(k_ptr->flags, TR_DRAIN_EXP)) {
350 this->o_ptr->name2 = EGO_AMU_DRAIN_EXP;
353 this->o_ptr->name2 = EGO_AMU_FOOL;
356 if (has_flag(k_ptr->flags, TR_AGGRAVATE)) {
360 this->o_ptr->name2 = EGO_AMU_AGGRAVATE;
363 if (has_flag(k_ptr->flags, TR_TY_CURSE)) {
367 this->o_ptr->name2 = EGO_AMU_TY_CURSE;
370 this->o_ptr->name2 = EGO_AMU_NAIVETY;
375 set_bits(this->o_ptr->ident, IDENT_BROKEN);
376 this->o_ptr->curse_flags.set({ TRC::CURSED, TRC::HEAVY_CURSE });