OSDN Git Service

[Refactor] #40399 Separated apply-magic-armor.c/h from object2.c
[hengband/hengband.git] / src / object / object2.c
index 9adc135..edd589d 100644 (file)
@@ -20,6 +20,7 @@
 #include "main/sound-definitions-table.h"
 #include "monster/monster-race-hook.h"
 #include "monster/monster.h"
+#include "object-enchant/apply-magic-armor.h"
 #include "object-enchant/apply-magic-weapon.h"
 #include "object-enchant/artifact.h"
 #include "object-enchant/item-apply-magic.h"
@@ -680,462 +681,6 @@ void object_absorb(object_type *o_ptr, object_type *j_ptr)
 
 
 /*!
- * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
- * Apply magic to an item known to be "armor"
- * @param owner_ptr プレーヤーへの参照ポインタ
- * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
- * @param level 生成基準階
- * @param power 生成ランク
- * @return なし
- * @details
- * Hack -- note special processing for crown/helm\n
- * Hack -- note special processing for robe of permanence\n
- */
-static void apply_magic_armor(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
-{
-       ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
-       ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
-       if (power > 0)
-       {
-               o_ptr->to_a += toac1;
-               if (power > 1)
-               {
-                       o_ptr->to_a += toac2;
-               }
-       }
-       else if (power < 0)
-       {
-               o_ptr->to_a -= toac1;
-               if (power < -1)
-               {
-                       o_ptr->to_a -= toac2;
-               }
-
-               if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
-       }
-
-       switch (o_ptr->tval)
-       {
-       case TV_DRAG_ARMOR:
-       {
-               /* power > 2 is debug only */
-               if (one_in_(50) || (power > 2))
-                       become_random_artifact(owner_ptr, o_ptr, FALSE);
-               break;
-       }
-       case TV_HARD_ARMOR:
-       case TV_SOFT_ARMOR:
-       {
-               if (power > 1)
-               {
-                       if ((o_ptr->tval == TV_SOFT_ARMOR) &&
-                               (o_ptr->sval == SV_ROBE) &&
-                               (randint0(100) < 15))
-                       {
-                               if (one_in_(5))
-                               {
-                                       o_ptr->name2 = EGO_YOIYAMI;
-                                       o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
-                                       o_ptr->sval = SV_YOIYAMI_ROBE;
-                                       o_ptr->ac = 0;
-                                       o_ptr->to_a = 0;
-                               }
-                               else
-                               {
-                                       o_ptr->name2 = EGO_PERMANENCE;
-                               }
-
-                               break;
-                       }
-
-                       /* power > 2 is debug only */
-                       if (one_in_(20) || (power > 2))
-                       {
-                               become_random_artifact(owner_ptr, o_ptr, FALSE);
-                               break;
-                       }
-
-                       while (TRUE)
-                       {
-                               bool okay_flag = TRUE;
-                               o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
-                               switch (o_ptr->name2)
-                               {
-                               case EGO_DWARVEN:
-                                       if (o_ptr->tval != TV_HARD_ARMOR)
-                                       {
-                                               okay_flag = FALSE;
-                                       }
-
-                                       break;
-                               case EGO_DRUID:
-                                       if (o_ptr->tval != TV_SOFT_ARMOR)
-                                       {
-                                               okay_flag = FALSE;
-                                       }
-
-                                       break;
-                               default:
-                                       break;
-                               }
-
-                               if (okay_flag) break;
-                       }
-
-                       switch (o_ptr->name2)
-                       {
-                       case EGO_RESISTANCE:
-                               if (one_in_(4))
-                                       add_flag(o_ptr->art_flags, TR_RES_POIS);
-                               break;
-                       case EGO_DWARVEN:
-                               o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
-                               o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
-                               break;
-
-                       case EGO_A_DEMON:
-                               if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
-                               one_in_(3) ?
-                                       add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
-                                       one_in_(2) ?
-                                       add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
-                                       add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
-
-                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
-                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
-                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
-                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
-                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
-                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
-                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
-                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
-                               break;
-                       case EGO_A_MORGUL:
-                               if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
-                               if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
-                               if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
-                               if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
-                               if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
-                               if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
-                               break;
-                       default:
-                               break;
-                       }
-               }
-
-               break;
-       }
-       case TV_SHIELD:
-       {
-               if (o_ptr->sval == SV_DRAGON_SHIELD)
-               {
-                       dragon_resist(o_ptr);
-                       if (!one_in_(3)) break;
-               }
-
-               if (power > 1)
-               {
-                       /* power > 2 is debug only */
-                       if (one_in_(20) || (power > 2))
-                       {
-                               become_random_artifact(owner_ptr, o_ptr, FALSE);
-                               break;
-                       }
-
-                       while (TRUE)
-                       {
-                               o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
-                               if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
-                                       && o_ptr->name2 == EGO_S_DWARVEN)
-                               {
-                                       continue;
-                               }
-
-                               break;
-                       }
-
-                       switch (o_ptr->name2)
-                       {
-                       case EGO_ENDURANCE:
-                               if (!one_in_(3)) one_high_resistance(o_ptr);
-                               if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
-                               break;
-                       case EGO_REFLECTION:
-                               if (o_ptr->sval == SV_MIRROR_SHIELD)
-                                       o_ptr->name2 = 0;
-                               break;
-
-                       case EGO_S_DWARVEN:
-                               o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
-                               o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
-                               break;
-                       }
-               }
-
-               break;
-       }
-       case TV_GLOVES:
-       {
-               if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
-               {
-                       dragon_resist(o_ptr);
-                       if (!one_in_(3)) break;
-               }
-
-               if (power > 1)
-               {
-                       /* power > 2 is debug only */
-                       if (one_in_(20) || (power > 2))
-                       {
-                               become_random_artifact(owner_ptr, o_ptr, FALSE);
-                               break;
-                       }
-                       o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
-               }
-               else if (power < -1)
-               {
-                       o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
-               }
-
-               break;
-       }
-
-       case TV_BOOTS:
-       {
-               if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
-               {
-                       dragon_resist(o_ptr);
-                       if (!one_in_(3)) break;
-               }
-
-               if (power > 1)
-               {
-                       /* power > 2 is debug only */
-                       if (one_in_(20) || (power > 2))
-                       {
-                               become_random_artifact(owner_ptr, o_ptr, FALSE);
-                               break;
-                       }
-
-                       o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
-                       switch (o_ptr->name2)
-                       {
-                       case EGO_SLOW_DESCENT:
-                               if (one_in_(2))
-                               {
-                                       one_high_resistance(o_ptr);
-                               }
-
-                               break;
-                       }
-               }
-               else if (power < -1)
-               {
-                       o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
-               }
-
-               break;
-       }
-       case TV_CROWN:
-       {
-               if (power > 1)
-               {
-                       /* power > 2 is debug only */
-                       if (one_in_(20) || (power > 2))
-                       {
-                               become_random_artifact(owner_ptr, o_ptr, FALSE);
-                               break;
-                       }
-
-                       while (TRUE)
-                       {
-                               bool ok_flag = TRUE;
-                               o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
-
-                               switch (o_ptr->name2)
-                               {
-                               case EGO_TELEPATHY:
-                                       if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
-                                       else add_esp_weak(o_ptr, FALSE);
-                                       break;
-                               case EGO_MAGI:
-                               case EGO_MIGHT:
-                               case EGO_REGENERATION:
-                               case EGO_LORDLINESS:
-                               case EGO_BASILISK:
-                                       break;
-                               case EGO_SEEING:
-                                       if (one_in_(3))
-                                       {
-                                               if (one_in_(2)) add_esp_strong(o_ptr);
-                                               else add_esp_weak(o_ptr, FALSE);
-                                       }
-                                       break;
-                               default:
-                                       /* not existing crown (wisdom,lite, etc...) */
-                                       ok_flag = FALSE;
-                               }
-
-                               if (ok_flag)
-                                       break;
-                       }
-
-                       break;
-               }
-               else if (power < -1)
-               {
-                       while (TRUE)
-                       {
-                               bool ok_flag = TRUE;
-                               o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
-
-                               switch (o_ptr->name2)
-                               {
-                               case EGO_ANCIENT_CURSE:
-                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
-                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
-                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
-                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
-                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
-                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
-                                       break;
-                               }
-
-                               if (ok_flag)
-                                       break;
-                       }
-               }
-
-               break;
-       }
-       case TV_HELM:
-       {
-               if (o_ptr->sval == SV_DRAGON_HELM)
-               {
-                       dragon_resist(o_ptr);
-                       if (!one_in_(3)) break;
-               }
-
-               if (power > 1)
-               {
-                       /* power > 2 is debug only */
-                       if (one_in_(20) || (power > 2))
-                       {
-                               become_random_artifact(owner_ptr, o_ptr, FALSE);
-                               break;
-                       }
-
-                       while (TRUE)
-                       {
-                               bool ok_flag = TRUE;
-                               o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
-                               switch (o_ptr->name2)
-                               {
-                               case EGO_BRILLIANCE:
-                               case EGO_DARK:
-                               case EGO_INFRAVISION:
-                               case EGO_H_PROTECTION:
-                                       break;
-                               case EGO_SEEING:
-                                       if (one_in_(7))
-                                       {
-                                               if (one_in_(2)) add_esp_strong(o_ptr);
-                                               else add_esp_weak(o_ptr, FALSE);
-                                       }
-
-                                       break;
-                               case EGO_LITE:
-                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
-                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
-                                       break;
-                               case EGO_H_DEMON:
-                                       if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
-                                       one_in_(3) ?
-                                               add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
-                                               one_in_(2) ?
-                                               add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
-                                               add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
-
-                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
-                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
-                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
-                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
-                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
-                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
-                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
-                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
-                                       break;
-                               default:
-                                       /* not existing helm (Magi, Might, etc...)*/
-                                       ok_flag = FALSE;
-                               }
-                               if (ok_flag)
-                                       break;
-                       }
-
-                       break;
-               }
-               else if (power < -1)
-               {
-                       while (TRUE)
-                       {
-                               bool ok_flag = TRUE;
-                               o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
-
-                               switch (o_ptr->name2)
-                               {
-                               case EGO_ANCIENT_CURSE:
-                                       ok_flag = FALSE;
-                               }
-
-                               if (ok_flag)
-                                       break;
-                       }
-               }
-
-               break;
-       }
-       case TV_CLOAK:
-       {
-               if (power > 1)
-               {
-                       /* power > 2 is debug only */
-                       if (one_in_(20) || (power > 2))
-                       {
-                               become_random_artifact(owner_ptr, o_ptr, FALSE);
-                               break;
-                       }
-                       o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
-
-                       switch (o_ptr->name2)
-                       {
-                       case EGO_BAT:
-                               o_ptr->to_d -= 6;
-                               o_ptr->to_h -= 6;
-                               break;
-                       case EGO_NAZGUL:
-                               o_ptr->to_d -= 3;
-                               o_ptr->to_h -= 3;
-                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
-                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
-                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
-                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
-                               break;
-                       }
-
-               }
-               else if (power < -1)
-               {
-                       o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
-               }
-
-               break;
-       }
-       }
-}
-
-
-/*!
  * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
  * Apply magic to an item known to be a "ring" or "amulet"
  * @param owner_ptr プレーヤーへの参照ポインタ