2 * @brief アミュレットを強化生成する処理
7 #include "object-enchant/others/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 "sv-definition/sv-amulet-types.h"
14 #include "system/baseitem-info-definition.h"
15 #include "system/object-type-definition.h"
16 #include "system/player-type-definition.h"
17 #include "util/bit-flags-calculator.h"
21 * @param player_ptr プレイヤーへの参照ポインタ
22 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
26 AmuletEnchanter::AmuletEnchanter(PlayerType *player_ptr, ItemEntity *o_ptr, DEPTH level, int power)
27 : player_ptr(player_ptr)
35 * @brief アミュレットに生成ランクごとの強化を与える
36 * Apply magic to an item known to be a "ring" or "amulet"
37 * @param player_ptr プレイヤーへの参照ポインタ
38 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
42 * @details power > 2はデバッグ専用.
44 void AmuletEnchanter::apply_magic()
46 if ((this->power == 0) && (randint0(100) < 50)) {
51 if ((this->power > 2) || (one_in_(150) && (this->power > 0) && !this->o_ptr->is_cursed() && (this->level > 79))) {
52 this->o_ptr->pval = std::min<short>(this->o_ptr->pval, 4);
53 become_random_artifact(player_ptr, this->o_ptr, false);
57 if ((this->power == 2) && one_in_(2)) {
59 this->o_ptr->curse_flags.clear();
63 if ((this->power == -2) && one_in_(2)) {
69 void AmuletEnchanter::sval_enchant()
71 switch (this->o_ptr->sval) {
72 case SV_AMULET_INTELLIGENCE:
73 case SV_AMULET_WISDOM:
74 case SV_AMULET_CHARISMA:
75 this->o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, this->level);
76 if (this->power < 0) {
77 set_bits(this->o_ptr->ident, IDENT_BROKEN);
78 this->o_ptr->curse_flags.set(CurseTraitType::CURSED);
79 this->o_ptr->pval = 0 - this->o_ptr->pval;
83 case SV_AMULET_BRILLIANCE:
84 this->o_ptr->pval = 1 + m_bonus(3, this->level);
89 if (this->power < 0) {
90 set_bits(this->o_ptr->ident, IDENT_BROKEN);
91 this->o_ptr->curse_flags.set(CurseTraitType::CURSED);
92 this->o_ptr->pval = 0 - this->o_ptr->pval;
96 case SV_AMULET_NO_MAGIC:
97 case SV_AMULET_NO_TELE:
98 if (this->power < 0) {
99 this->o_ptr->curse_flags.set(CurseTraitType::CURSED);
103 case SV_AMULET_RESISTANCE:
105 one_high_resistance(this->o_ptr);
109 this->o_ptr->art_flags.set(TR_RES_POIS);
113 case SV_AMULET_SEARCHING:
114 this->o_ptr->pval = 2 + randint1(6);
115 if (this->power >= 0) {
116 add_esp_weak(this->o_ptr, false);
120 set_bits(this->o_ptr->ident, IDENT_BROKEN);
121 this->o_ptr->curse_flags.set(CurseTraitType::CURSED);
122 this->o_ptr->pval = 0 - (this->o_ptr->pval);
124 case SV_AMULET_THE_MAGI:
125 this->o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, this->level);
126 this->o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, this->level);
127 add_esp_weak(this->o_ptr, false);
130 set_bits(this->o_ptr->ident, IDENT_BROKEN);
131 this->o_ptr->curse_flags.set(CurseTraitType::CURSED);
132 this->o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, this->level));
133 this->o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, this->level));
134 if (this->power > 0) {
135 this->power = 0 - this->power;
139 case SV_AMULET_MAGIC_MASTERY:
140 this->o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, this->level);
141 if (this->power >= 0) {
145 set_bits(this->o_ptr->ident, IDENT_BROKEN);
146 this->o_ptr->curse_flags.set(CurseTraitType::CURSED);
147 this->o_ptr->pval = 0 - this->o_ptr->pval;
152 void AmuletEnchanter::give_ego_index()
154 while (!this->o_ptr->is_ego()) {
155 auto *k_ptr = &baseitems_info[this->o_ptr->k_idx];
156 switch (randint1(21)) {
159 if (k_ptr->flags.has(TR_SLOW_DIGEST)) {
163 this->o_ptr->ego_idx = EgoType::AMU_SLOW_D;
167 if (this->o_ptr->pval) {
171 this->o_ptr->ego_idx = EgoType::AMU_INFRA;
175 if (k_ptr->flags.has(TR_SEE_INVIS)) {
179 this->o_ptr->ego_idx = EgoType::AMU_SEE_INVIS;
183 if (k_ptr->flags.has(TR_HOLD_EXP)) {
187 this->o_ptr->ego_idx = EgoType::AMU_HOLD_EXP;
190 if (k_ptr->flags.has(TR_LEVITATION)) {
194 this->o_ptr->ego_idx = EgoType::AMU_LEVITATION;
199 this->o_ptr->ego_idx = EgoType::AMU_AC;
202 if (k_ptr->flags.has(TR_RES_FIRE)) {
206 if (m_bonus(10, this->level) > 8) {
207 this->o_ptr->ego_idx = EgoType::AMU_RES_FIRE_;
211 this->o_ptr->ego_idx = EgoType::AMU_RES_FIRE;
214 if (k_ptr->flags.has(TR_RES_COLD)) {
218 if (m_bonus(10, this->level) > 8) {
219 this->o_ptr->ego_idx = EgoType::AMU_RES_COLD_;
223 this->o_ptr->ego_idx = EgoType::AMU_RES_COLD;
226 if (k_ptr->flags.has(TR_RES_ELEC)) {
230 if (m_bonus(10, this->level) > 8) {
231 this->o_ptr->ego_idx = EgoType::AMU_RES_ELEC_;
235 this->o_ptr->ego_idx = EgoType::AMU_RES_ELEC;
238 if (k_ptr->flags.has(TR_RES_ACID)) {
242 if (m_bonus(10, this->level) > 8) {
243 this->o_ptr->ego_idx = EgoType::AMU_RES_ACID_;
247 this->o_ptr->ego_idx = EgoType::AMU_RES_ACID;
254 give_high_ego_index();
260 void AmuletEnchanter::give_high_ego_index()
262 switch (this->o_ptr->sval) {
263 case SV_AMULET_TELEPORT:
264 if (m_bonus(10, this->level) > 9) {
265 this->o_ptr->ego_idx = EgoType::AMU_D_DOOR;
270 this->o_ptr->ego_idx = EgoType::AMU_JUMP;
274 this->o_ptr->ego_idx = EgoType::AMU_TELEPORT;
276 case SV_AMULET_RESIST_ACID:
277 if ((m_bonus(10, this->level) > 6) && one_in_(2)) {
278 this->o_ptr->ego_idx = EgoType::AMU_RES_ACID_;
282 case SV_AMULET_SEARCHING:
283 this->o_ptr->ego_idx = EgoType::AMU_STEALTH;
285 case SV_AMULET_BRILLIANCE:
290 this->o_ptr->ego_idx = EgoType::AMU_IDENT;
292 case SV_AMULET_CHARISMA:
297 this->o_ptr->ego_idx = EgoType::AMU_CHARM;
299 case SV_AMULET_THE_MAGI:
304 this->o_ptr->ego_idx = EgoType::AMU_GREAT;
306 case SV_AMULET_RESISTANCE:
311 this->o_ptr->ego_idx = EgoType::AMU_DEFENDER;
313 case SV_AMULET_TELEPATHY:
318 this->o_ptr->ego_idx = EgoType::AMU_DETECTION;
325 void AmuletEnchanter::give_cursed()
327 if (this->o_ptr->to_h > 0) {
328 this->o_ptr->to_h = 0 - this->o_ptr->to_h;
331 if (this->o_ptr->to_d > 0) {
332 this->o_ptr->to_d = 0 - this->o_ptr->to_d;
335 if (this->o_ptr->to_a > 0) {
336 this->o_ptr->to_a = 0 - this->o_ptr->to_a;
339 if (this->o_ptr->pval > 0) {
340 this->o_ptr->pval = 0 - this->o_ptr->pval;
343 while (!this->o_ptr->is_ego()) {
344 auto *k_ptr = &baseitems_info[this->o_ptr->k_idx];
345 switch (randint1(5)) {
347 if (k_ptr->flags.has(TR_DRAIN_EXP)) {
351 this->o_ptr->ego_idx = EgoType::AMU_DRAIN_EXP;
354 this->o_ptr->ego_idx = EgoType::AMU_FOOL;
357 if (k_ptr->flags.has(TR_AGGRAVATE)) {
361 this->o_ptr->ego_idx = EgoType::AMU_AGGRAVATE;
364 if (k_ptr->flags.has(TR_TY_CURSE)) {
368 this->o_ptr->ego_idx = EgoType::AMU_TY_CURSE;
371 this->o_ptr->ego_idx = EgoType::AMU_NAIVETY;
376 set_bits(this->o_ptr->ident, IDENT_BROKEN);
377 this->o_ptr->curse_flags.set({ CurseTraitType::CURSED, CurseTraitType::HEAVY_CURSE });