3 * @brief ベースアイテムを強化する処理
8 #include "object-enchant/apply-magic.h"
9 #include "art-definition/art-armor-types.h"
10 #include "dungeon/dungeon.h"
11 #include "floor/floor.h"
12 #include "mutation/mutation-flag-types.h"
13 #include "object-enchant/apply-magic-accessory.h"
14 #include "object-enchant/apply-magic-armor.h"
15 #include "object-enchant/apply-magic-others.h"
16 #include "object-enchant/apply-magic-weapon.h"
17 #include "object-enchant/artifact.h"
18 #include "object-enchant/item-apply-magic.h"
19 #include "object-enchant/object-boost.h"
20 #include "object-enchant/object-curse.h"
21 #include "object-enchant/object-ego.h"
22 #include "object-enchant/special-object-flags.h"
23 #include "object-enchant/tr-types.h"
24 #include "object-enchant/trc-types.h"
25 #include "object-enchant/trg-types.h"
26 #include "object-hook/hook-checker.h"
27 #include "object-hook/hook-enchant.h"
28 #include "object/object-kind.h"
29 #include "sv-definition/sv-armor-types.h"
30 #include "sv-definition/sv-protector-types.h"
31 #include "sv-definition/sv-weapon-types.h"
32 #include "util/bit-flags-calculator.h"
33 #include "world/world.h"
36 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
37 * Complete the "creation" of an object by applying "magic" to the item
38 * @param owner_ptr プレーヤーへの参照ポインタ
39 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
44 * エゴ&アーティファクトの生成、呪い、pval強化
46 void apply_magic(player_type *owner_ptr, object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
48 if (owner_ptr->pseikaku == PERSONALITY_MUNCHKIN)
49 lev += randint0(owner_ptr->lev / 2 + 10);
50 if (lev > MAX_DEPTH - 1)
54 if (f1 > d_info[owner_ptr->dungeon_idx].obj_good)
55 f1 = d_info[owner_ptr->dungeon_idx].obj_good;
58 if ((owner_ptr->pseikaku != PERSONALITY_MUNCHKIN) && (f2 > d_info[owner_ptr->dungeon_idx].obj_great))
59 f2 = d_info[owner_ptr->dungeon_idx].obj_great;
61 if (owner_ptr->muta3 & MUT3_GOOD_LUCK) {
64 } else if (owner_ptr->muta3 & MUT3_BAD_LUCK) {
70 if ((mode & AM_GOOD) || magik(f1)) {
72 if ((mode & AM_GREAT) || magik(f2)) {
74 if (mode & AM_SPECIAL)
77 } else if (magik(f1)) {
82 if (mode & AM_CURSED) {
94 if (mode & (AM_GREAT | AM_SPECIAL))
96 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1)
99 for (int i = 0; i < rolls; i++) {
100 if (make_artifact(owner_ptr, o_ptr))
102 if ((owner_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77)) {
103 if (make_artifact(owner_ptr, o_ptr))
108 if (object_is_fixed_artifact(o_ptr)) {
109 artifact_type *a_ptr = &a_info[o_ptr->name1];
111 if (current_world_ptr->character_dungeon)
112 a_ptr->floor_id = owner_ptr->floor_id;
114 o_ptr->pval = a_ptr->pval;
115 o_ptr->ac = a_ptr->ac;
116 o_ptr->dd = a_ptr->dd;
117 o_ptr->ds = a_ptr->ds;
118 o_ptr->to_a = a_ptr->to_a;
119 o_ptr->to_h = a_ptr->to_h;
120 o_ptr->to_d = a_ptr->to_d;
121 o_ptr->weight = a_ptr->weight;
122 o_ptr->xtra2 = a_ptr->act_idx;
124 if (o_ptr->name1 == ART_MILIM) {
125 if (owner_ptr->pseikaku == PERSONALITY_SEXY) {
131 o_ptr->ident |= (IDENT_BROKEN);
132 if (a_ptr->gen_flags & TRG_CURSED)
133 o_ptr->curse_flags |= (TRC_CURSED);
134 if (a_ptr->gen_flags & TRG_HEAVY_CURSE)
135 o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
136 if (a_ptr->gen_flags & TRG_PERMA_CURSE)
137 o_ptr->curse_flags |= (TRC_PERMA_CURSE);
138 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0))
139 o_ptr->curse_flags |= get_curse(owner_ptr, 0, o_ptr);
140 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1))
141 o_ptr->curse_flags |= get_curse(owner_ptr, 1, o_ptr);
142 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2))
143 o_ptr->curse_flags |= get_curse(owner_ptr, 2, o_ptr);
148 switch (o_ptr->tval) {
156 apply_magic_weapon(owner_ptr, o_ptr, lev, power);
160 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE))
161 apply_magic_weapon(owner_ptr, o_ptr, lev, power);
165 if (power && !(o_ptr->sval == SV_POISON_NEEDLE))
166 apply_magic_weapon(owner_ptr, o_ptr, lev, power);
178 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) || ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
179 o_ptr->pval = randint1(4);
181 if (power || ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) || ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
182 || ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
183 || ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
184 apply_magic_armor(owner_ptr, o_ptr, lev, power);
190 if (!power && (randint0(100) < 50))
192 apply_magic_accessary(owner_ptr, o_ptr, lev, power);
196 apply_magic_others(owner_ptr, o_ptr, power);
201 if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI) && (owner_ptr->pseikaku == PERSONALITY_SEXY)) {
203 add_flag(o_ptr->art_flags, TR_STR);
204 add_flag(o_ptr->art_flags, TR_INT);
205 add_flag(o_ptr->art_flags, TR_WIS);
206 add_flag(o_ptr->art_flags, TR_DEX);
207 add_flag(o_ptr->art_flags, TR_CON);
208 add_flag(o_ptr->art_flags, TR_CHR);
211 if (object_is_ego(o_ptr)) {
212 ego_item_type *e_ptr = &e_info[o_ptr->name2];
214 o_ptr->ident |= (IDENT_BROKEN);
216 if (e_ptr->gen_flags & TRG_CURSED)
217 o_ptr->curse_flags |= (TRC_CURSED);
218 if (e_ptr->gen_flags & TRG_HEAVY_CURSE)
219 o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
220 if (e_ptr->gen_flags & TRG_PERMA_CURSE)
221 o_ptr->curse_flags |= (TRC_PERMA_CURSE);
222 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0))
223 o_ptr->curse_flags |= get_curse(owner_ptr, 0, o_ptr);
224 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1))
225 o_ptr->curse_flags |= get_curse(owner_ptr, 1, o_ptr);
226 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2))
227 o_ptr->curse_flags |= get_curse(owner_ptr, 2, o_ptr);
229 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN))
231 if (e_ptr->gen_flags & (TRG_XTRA_POWER))
233 if (e_ptr->gen_flags & (TRG_XTRA_H_RES))
234 one_high_resistance(o_ptr);
235 if (e_ptr->gen_flags & (TRG_XTRA_E_RES))
236 one_ele_resistance(o_ptr);
237 if (e_ptr->gen_flags & (TRG_XTRA_D_RES))
238 one_dragon_ele_resistance(o_ptr);
239 if (e_ptr->gen_flags & (TRG_XTRA_L_RES))
240 one_lordly_high_resistance(o_ptr);
241 if (e_ptr->gen_flags & (TRG_XTRA_RES))
242 one_resistance(o_ptr);
243 if (e_ptr->gen_flags & (TRG_XTRA_DICE)) {
246 } while (one_in_(o_ptr->dd));
253 o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
255 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL))) {
257 o_ptr->to_h -= randint1(e_ptr->max_to_h);
259 o_ptr->to_d -= randint1(e_ptr->max_to_d);
261 o_ptr->to_a -= randint1(e_ptr->max_to_a);
263 o_ptr->pval -= randint1(e_ptr->max_pval);
265 if (e_ptr->max_to_h) {
266 if (e_ptr->max_to_h > 127)
267 o_ptr->to_h -= randint1(256 - e_ptr->max_to_h);
269 o_ptr->to_h += randint1(e_ptr->max_to_h);
272 if (e_ptr->max_to_d) {
273 if (e_ptr->max_to_d > 127)
274 o_ptr->to_d -= randint1(256 - e_ptr->max_to_d);
276 o_ptr->to_d += randint1(e_ptr->max_to_d);
279 if (e_ptr->max_to_a) {
280 if (e_ptr->max_to_a > 127)
281 o_ptr->to_a -= randint1(256 - e_ptr->max_to_a);
283 o_ptr->to_a += randint1(e_ptr->max_to_a);
286 if (o_ptr->name2 == EGO_ACCURACY) {
287 while (o_ptr->to_h < o_ptr->to_d + 10) {
291 o_ptr->to_h = MAX(o_ptr->to_h, 15);
294 if (o_ptr->name2 == EGO_VELOCITY) {
295 while (o_ptr->to_d < o_ptr->to_h + 10) {
299 o_ptr->to_d = MAX(o_ptr->to_d, 15);
302 if ((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION)) {
303 o_ptr->to_a = MAX(o_ptr->to_a, 15);
306 if (e_ptr->max_pval) {
307 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS))) {
309 if ((lev > 60) && one_in_(3) && ((o_ptr->dd * (o_ptr->ds + 1)) < 15))
311 } else if (o_ptr->name2 == EGO_DEMON) {
312 if (have_flag(o_ptr->art_flags, TR_BLOWS)) {
313 o_ptr->pval += randint1(2);
315 o_ptr->pval += randint1(e_ptr->max_pval);
317 } else if (o_ptr->name2 == EGO_ATTACKS) {
318 o_ptr->pval = randint1(e_ptr->max_pval * lev / 100 + 1);
321 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
322 o_ptr->pval += randint1(2);
323 } else if (o_ptr->name2 == EGO_BAT) {
324 o_ptr->pval = randint1(e_ptr->max_pval);
325 if (o_ptr->sval == SV_ELVEN_CLOAK)
326 o_ptr->pval += randint1(2);
327 } else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG) {
328 o_ptr->pval = randint1(e_ptr->max_pval);
330 o_ptr->pval += randint1(e_ptr->max_pval);
334 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50)) {
335 o_ptr->pval = randint1(o_ptr->pval);
338 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
346 object_kind *k_ptr = &k_info[o_ptr->k_idx];
347 if (!k_info[o_ptr->k_idx].cost)
348 o_ptr->ident |= (IDENT_BROKEN);
350 if (k_ptr->gen_flags & (TRG_CURSED))
351 o_ptr->curse_flags |= (TRC_CURSED);
352 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE))
353 o_ptr->curse_flags |= TRC_HEAVY_CURSE;
354 if (k_ptr->gen_flags & (TRG_PERMA_CURSE))
355 o_ptr->curse_flags |= TRC_PERMA_CURSE;
356 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0))
357 o_ptr->curse_flags |= get_curse(owner_ptr, 0, o_ptr);
358 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1))
359 o_ptr->curse_flags |= get_curse(owner_ptr, 1, o_ptr);
360 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2))
361 o_ptr->curse_flags |= get_curse(owner_ptr, 2, o_ptr);