3 * @brief 防具系のアイテムを強化して(恐らく床に)生成する処理
8 #include "object-enchant/apply-magic-armor.h"
9 #include "artifact/random-art-generator.h"
10 #include "inventory/inventory-slot-types.h"
11 #include "object-enchant/object-boost.h"
12 #include "object-enchant/object-ego.h"
13 #include "object/object-kind-hook.h"
14 #include "object/object-kind.h"
15 #include "object-enchant/tr-types.h"
16 #include "object-enchant/trc-types.h"
17 #include "sv-definition/sv-armor-types.h"
18 #include "sv-definition/sv-protector-types.h"
19 #include "util/bit-flags-calculator.h"
22 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
23 * Apply magic to an item known to be "armor"
24 * @param owner_ptr プレーヤーへの参照ポインタ
25 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
30 * Hack -- note special processing for crown/helm\n
31 * Hack -- note special processing for robe of permanence\n
33 void apply_magic_armor(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
35 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
36 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
42 } else if (power < 0) {
49 o_ptr->curse_flags |= TRC_CURSED;
52 switch (o_ptr->tval) {
54 /* power > 2 is debug only */
55 if (one_in_(50) || (power > 2))
56 become_random_artifact(owner_ptr, o_ptr, FALSE);
62 if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ROBE) && (randint0(100) < 15)) {
64 o_ptr->name2 = EGO_YOIYAMI;
65 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
66 o_ptr->sval = SV_YOIYAMI_ROBE;
70 o_ptr->name2 = EGO_PERMANENCE;
76 /* power > 2 is debug only */
77 if (one_in_(20) || (power > 2)) {
78 become_random_artifact(owner_ptr, o_ptr, FALSE);
83 bool okay_flag = TRUE;
84 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
85 switch (o_ptr->name2) {
87 if (o_ptr->tval != TV_HARD_ARMOR) {
93 if (o_ptr->tval != TV_SOFT_ARMOR) {
106 switch (o_ptr->name2) {
109 add_flag(o_ptr->art_flags, TR_RES_POIS);
112 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
113 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
118 o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
119 one_in_(3) ? add_flag(o_ptr->art_flags, TR_DRAIN_EXP)
120 : one_in_(2) ? add_flag(o_ptr->art_flags, TR_DRAIN_HP) : add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
123 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
125 add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
127 add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
129 add_flag(o_ptr->art_flags, TR_DRAIN_HP);
131 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
133 add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
135 add_flag(o_ptr->art_flags, TR_TY_CURSE);
137 add_flag(o_ptr->art_flags, TR_CALL_DEMON);
141 o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
143 add_flag(o_ptr->art_flags, TR_TY_CURSE);
145 add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
147 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
149 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
151 add_flag(o_ptr->art_flags, TR_NO_TELE);
161 if (o_ptr->sval == SV_DRAGON_SHIELD) {
162 dragon_resist(o_ptr);
168 /* power > 2 is debug only */
169 if (one_in_(20) || (power > 2)) {
170 become_random_artifact(owner_ptr, o_ptr, FALSE);
175 o_ptr->name2 = get_random_ego(INVEN_SUB_HAND, TRUE);
176 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD && o_ptr->name2 == EGO_S_DWARVEN) {
183 switch (o_ptr->name2) {
186 one_high_resistance(o_ptr);
188 add_flag(o_ptr->art_flags, TR_RES_POIS);
191 if (o_ptr->sval == SV_MIRROR_SHIELD)
196 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
197 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
205 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) {
206 dragon_resist(o_ptr);
212 /* power > 2 is debug only */
213 if (one_in_(20) || (power > 2)) {
214 become_random_artifact(owner_ptr, o_ptr, FALSE);
217 o_ptr->name2 = get_random_ego(INVEN_ARMS, TRUE);
218 } else if (power < -1) {
219 o_ptr->name2 = get_random_ego(INVEN_ARMS, FALSE);
226 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) {
227 dragon_resist(o_ptr);
233 /* power > 2 is debug only */
234 if (one_in_(20) || (power > 2)) {
235 become_random_artifact(owner_ptr, o_ptr, FALSE);
239 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
240 switch (o_ptr->name2) {
241 case EGO_SLOW_DESCENT:
243 one_high_resistance(o_ptr);
248 } else if (power < -1) {
249 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
256 /* power > 2 is debug only */
257 if (one_in_(20) || (power > 2)) {
258 become_random_artifact(owner_ptr, o_ptr, FALSE);
264 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
266 switch (o_ptr->name2) {
268 if (add_esp_strong(o_ptr))
269 add_esp_weak(o_ptr, TRUE);
271 add_esp_weak(o_ptr, FALSE);
275 case EGO_REGENERATION:
282 add_esp_strong(o_ptr);
284 add_esp_weak(o_ptr, FALSE);
288 /* not existing crown (wisdom,lite, etc...) */
297 } else if (power < -1) {
300 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
302 switch (o_ptr->name2) {
303 case EGO_ANCIENT_CURSE:
305 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
307 add_flag(o_ptr->art_flags, TR_NO_TELE);
309 add_flag(o_ptr->art_flags, TR_TY_CURSE);
311 add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
313 add_flag(o_ptr->art_flags, TR_DRAIN_HP);
315 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
327 if (o_ptr->sval == SV_DRAGON_HELM) {
328 dragon_resist(o_ptr);
334 /* power > 2 is debug only */
335 if (one_in_(20) || (power > 2)) {
336 become_random_artifact(owner_ptr, o_ptr, FALSE);
342 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
343 switch (o_ptr->name2) {
346 case EGO_INFRAVISION:
347 case EGO_H_PROTECTION:
352 add_esp_strong(o_ptr);
354 add_esp_weak(o_ptr, FALSE);
360 add_flag(o_ptr->art_flags, TR_LITE_1);
362 add_flag(o_ptr->art_flags, TR_LITE_2);
366 o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
367 one_in_(3) ? add_flag(o_ptr->art_flags, TR_DRAIN_EXP)
368 : one_in_(2) ? add_flag(o_ptr->art_flags, TR_DRAIN_HP) : add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
371 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
373 add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
375 add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
377 add_flag(o_ptr->art_flags, TR_DRAIN_HP);
379 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
381 add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
383 add_flag(o_ptr->art_flags, TR_TY_CURSE);
385 add_flag(o_ptr->art_flags, TR_CALL_DEMON);
388 /* not existing helm (Magi, Might, etc...)*/
396 } else if (power < -1) {
399 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
401 switch (o_ptr->name2) {
402 case EGO_ANCIENT_CURSE:
415 /* power > 2 is debug only */
416 if (one_in_(20) || (power > 2)) {
417 become_random_artifact(owner_ptr, o_ptr, FALSE);
420 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
422 switch (o_ptr->name2) {
431 add_flag(o_ptr->art_flags, TR_COWARDICE);
433 add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
435 add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
437 add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
441 } else if (power < -1) {
442 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);