OSDN Git Service

[Refactor] #39076 "inventory_list" の 置換処理で誤ったコメントを修正/削除. / Fix and delete wrong repla...
[hengband/hengband.git] / src / object2.c
index 8d4fd47..7c2be2a 100644 (file)
  */
 
 #include "angband.h"
+#include "util.h"
+#include "world.h"
+#include "term.h"
+
+#include "object.h"
+
+#include "cmd-dump.h"
+#include "cmd-spell.h"
+#include "spells.h"
+#include "dungeon.h"
+#include "floor.h"
+#include "grid.h"
+#include "objectkind.h"
+#include "object-boost.h"
+#include "object-ego.h"
+#include "object-flavor.h"
 #include "object-hook.h"
 #include "object-curse.h"
+#include "objectkind-hook.h"
 #include "artifact.h"
+#include "feature.h"
 #include "player-status.h"
-
-static void one_sustain(object_type *o_ptr);
-
-
-static concptr const kaji_tips[5] =
-{
-#ifdef JP
-       "現在持っているエッセンスの一覧を表示する。",
-       "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
-       "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
-       "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
-       "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
-#else
-       "Display essences you have.",
-       "Extract essences from an item. The item become non magical.",
-       "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
-       "Add essences to an item. The improved items or artifacts cannot be reimprove.",
-       "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
-#endif
-};
-
-/*!
- * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain
- * @details 重複の抑止はない。
- * @param o_ptr 対象のオブジェクト構造体ポインタ
- * @return なし
- */
-static void one_sustain(object_type *o_ptr)
-{
-       switch (randint0(A_MAX))
-       {
-       case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
-       case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
-       case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
-       case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
-       case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
-       case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
-       }
-}
+#include "player-move.h"
+#include "player-effects.h"
+#include "player-class.h"
+#include "player-personality.h"
+#include "monster.h"
+#include "monsterrace-hook.h"
+#include "object-ego.h"
+#include "view-mainwindow.h"
 
 /*!
  * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
@@ -69,23 +56,18 @@ void excise_object_idx(OBJECT_IDX o_idx)
        OBJECT_IDX prev_o_idx = 0;
 
        /* Object */
-       j_ptr = &o_list[o_idx];
+       j_ptr = &p_ptr->current_floor_ptr->o_list[o_idx];
 
-       /* Monster */
-       if (j_ptr->held_m_idx)
+       if (OBJECT_IS_HELD_MONSTER(j_ptr))
        {
                monster_type *m_ptr;
-
-               /* Monster */
-               m_ptr = &m_list[j_ptr->held_m_idx];
+               m_ptr = &p_ptr->current_floor_ptr->m_list[j_ptr->held_m_idx];
 
                /* Scan all objects in the grid */
                for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
                {
                        object_type *o_ptr;
-                       o_ptr = &o_list[this_o_idx];
-
-                       /* Acquire next object */
+                       o_ptr = &p_ptr->current_floor_ptr->o_list[this_o_idx];
                        next_o_idx = o_ptr->next_o_idx;
 
                        if (this_o_idx == o_idx)
@@ -103,7 +85,7 @@ void excise_object_idx(OBJECT_IDX o_idx)
                                        object_type *k_ptr;
 
                                        /* Previous object */
-                                       k_ptr = &o_list[prev_o_idx];
+                                       k_ptr = &p_ptr->current_floor_ptr->o_list[prev_o_idx];
 
                                        /* Remove from list */
                                        k_ptr->next_o_idx = next_o_idx;
@@ -128,15 +110,13 @@ void excise_object_idx(OBJECT_IDX o_idx)
                POSITION y = j_ptr->iy;
                POSITION x = j_ptr->ix;
 
-               g_ptr = &grid_array[y][x];
+               g_ptr = &p_ptr->current_floor_ptr->grid_array[y][x];
 
                /* Scan all objects in the grid */
                for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
                {
                        object_type *o_ptr;
-                       o_ptr = &o_list[this_o_idx];
-
-                       /* Acquire next object */
+                       o_ptr = &p_ptr->current_floor_ptr->o_list[this_o_idx];
                        next_o_idx = o_ptr->next_o_idx;
 
                        if (this_o_idx == o_idx)
@@ -154,7 +134,7 @@ void excise_object_idx(OBJECT_IDX o_idx)
                                        object_type *k_ptr;
 
                                        /* Previous object */
-                                       k_ptr = &o_list[prev_o_idx];
+                                       k_ptr = &p_ptr->current_floor_ptr->o_list[prev_o_idx];
 
                                        /* Remove from list */
                                        k_ptr->next_o_idx = next_o_idx;
@@ -188,23 +168,20 @@ void delete_object_idx(OBJECT_IDX o_idx)
        excise_object_idx(o_idx);
 
        /* Object */
-       j_ptr = &o_list[o_idx];
+       j_ptr = &p_ptr->current_floor_ptr->o_list[o_idx];
 
        /* Dungeon floor */
-       if (!(j_ptr->held_m_idx))
+       if (!OBJECT_IS_HELD_MONSTER(j_ptr))
        {
                POSITION y, x;
-
                y = j_ptr->iy;
                x = j_ptr->ix;
-
-               /* Visual update */
                lite_spot(y, x);
        }
        object_wipe(j_ptr);
 
        /* Count objects */
-       o_cnt--;
+       p_ptr->current_floor_ptr->o_cnt--;
 }
 
 
@@ -221,28 +198,25 @@ void delete_object(POSITION y, POSITION x)
        OBJECT_IDX this_o_idx, next_o_idx = 0;
 
        /* Refuse "illegal" locations */
-       if (!in_bounds(y, x)) return;
+       if (!in_bounds(p_ptr->current_floor_ptr, y, x)) return;
 
-       g_ptr = &grid_array[y][x];
+       g_ptr = &p_ptr->current_floor_ptr->grid_array[y][x];
 
        /* Scan all objects in the grid */
        for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
        {
                object_type *o_ptr;
-               o_ptr = &o_list[this_o_idx];
-
-               /* Acquire next object */
+               o_ptr = &p_ptr->current_floor_ptr->o_list[this_o_idx];
                next_o_idx = o_ptr->next_o_idx;
                object_wipe(o_ptr);
 
                /* Count objects */
-               o_cnt--;
+               p_ptr->current_floor_ptr->o_cnt--;
        }
 
        /* Objects are gone */
        g_ptr->o_idx = 0;
 
-       /* Visual update */
        lite_spot(y, x);
 }
 
@@ -264,9 +238,9 @@ static void compact_objects_aux(OBJECT_IDX i1, OBJECT_IDX i2)
        if (i1 == i2) return;
 
        /* Repair objects */
-       for (i = 1; i < o_max; i++)
+       for (i = 1; i < p_ptr->current_floor_ptr->o_max; i++)
        {
-               o_ptr = &o_list[i];
+               o_ptr = &p_ptr->current_floor_ptr->o_list[i];
 
                /* Skip "dead" objects */
                if (!o_ptr->k_idx) continue;
@@ -278,15 +252,12 @@ static void compact_objects_aux(OBJECT_IDX i1, OBJECT_IDX i2)
                        o_ptr->next_o_idx = i2;
                }
        }
-       o_ptr = &o_list[i1];
+       o_ptr = &p_ptr->current_floor_ptr->o_list[i1];
 
-       /* Monster */
-       if (o_ptr->held_m_idx)
+       if (OBJECT_IS_HELD_MONSTER(o_ptr))
        {
                monster_type *m_ptr;
-
-               /* Acquire monster */
-               m_ptr = &m_list[o_ptr->held_m_idx];
+               m_ptr = &p_ptr->current_floor_ptr->m_list[o_ptr->held_m_idx];
 
                /* Repair monster */
                if (m_ptr->hold_o_idx == i1)
@@ -306,7 +277,7 @@ static void compact_objects_aux(OBJECT_IDX i1, OBJECT_IDX i2)
                x = o_ptr->ix;
 
                /* Acquire grid */
-               g_ptr = &grid_array[y][x];
+               g_ptr = &p_ptr->current_floor_ptr->grid_array[y][x];
 
                /* Repair grid */
                if (g_ptr->o_idx == i1)
@@ -317,7 +288,7 @@ static void compact_objects_aux(OBJECT_IDX i1, OBJECT_IDX i2)
        }
 
        /* Structure copy */
-       o_list[i2] = o_list[i1];
+       p_ptr->current_floor_ptr->o_list[i2] = p_ptr->current_floor_ptr->o_list[i1];
 
        /* Wipe the hole */
        object_wipe(o_ptr);
@@ -367,23 +338,19 @@ void compact_objects(int size)
                cur_dis = 5 * (20 - cnt);
 
                /* Examine the objects */
-               for (i = 1; i < o_max; i++)
+               for (i = 1; i < p_ptr->current_floor_ptr->o_max; i++)
                {
-                       o_ptr = &o_list[i];
+                       o_ptr = &p_ptr->current_floor_ptr->o_list[i];
 
-                       /* Skip dead objects */
-                       if (!o_ptr->k_idx) continue;
+                       if (!OBJECT_IS_VALID(o_ptr)) continue;
 
                        /* Hack -- High level objects start out "immune" */
                        if (k_info[o_ptr->k_idx].level > cur_lev) continue;
 
-                       /* Monster */
-                       if (o_ptr->held_m_idx)
+                       if (OBJECT_IS_HELD_MONSTER(o_ptr))
                        {
                                monster_type *m_ptr;
-
-                               /* Acquire monster */
-                               m_ptr = &m_list[o_ptr->held_m_idx];
+                               m_ptr = &p_ptr->current_floor_ptr->m_list[o_ptr->held_m_idx];
 
                                y = m_ptr->fy;
                                x = m_ptr->fx;
@@ -421,95 +388,21 @@ void compact_objects(int size)
 
 
        /* Excise dead objects (backwards!) */
-       for (i = o_max - 1; i >= 1; i--)
+       for (i = p_ptr->current_floor_ptr->o_max - 1; i >= 1; i--)
        {
-               o_ptr = &o_list[i];
+               o_ptr = &p_ptr->current_floor_ptr->o_list[i];
 
                /* Skip real objects */
                if (o_ptr->k_idx) continue;
 
                /* Move last object into open hole */
-               compact_objects_aux(o_max - 1, i);
-
-               /* Compress "o_max" */
-               o_max--;
-       }
-}
-
-
-/*!
- * @brief グローバルオブジェクト配列を初期化する /
- * Delete all the items when player leaves the level
- * @note we do NOT visually reflect these (irrelevant) changes
- * @details
- * Hack -- we clear the "g_ptr->o_idx" field for every grid,
- * and the "m_ptr->next_o_idx" field for every monster, since
- * we know we are clearing every object.  Technically, we only
- * clear those fields for grids/monsters containing objects,
- * and we clear it once for every such object.
- * @return なし
- */
-void wipe_o_list(void)
-{
-       int i;
-
-       /* Delete the existing objects */
-       for (i = 1; i < o_max; i++)
-       {
-               object_type *o_ptr = &o_list[i];
-
-               /* Skip dead objects */
-               if (!o_ptr->k_idx) continue;
-
-               /* Mega-Hack -- preserve artifacts */
-               if (!character_dungeon || preserve_mode)
-               {
-                       /* Hack -- Preserve unknown artifacts */
-                       if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
-                       {
-                               /* Mega-Hack -- Preserve the artifact */
-                               a_info[o_ptr->name1].cur_num = 0;
-                       }
-               }
-
-               /* Monster */
-               if (o_ptr->held_m_idx)
-               {
-                       monster_type *m_ptr;
-
-                       /* Monster */
-                       m_ptr = &m_list[o_ptr->held_m_idx];
-
-                       /* Hack -- see above */
-                       m_ptr->hold_o_idx = 0;
-               }
-
-               /* Dungeon */
-               else
-               {
-                       grid_type *g_ptr;
+               compact_objects_aux(p_ptr->current_floor_ptr->o_max - 1, i);
 
-                       /* Access location */
-                       POSITION y = o_ptr->iy;
-                       POSITION x = o_ptr->ix;
-
-                       /* Access grid */
-                       g_ptr = &grid_array[y][x];
-
-                       /* Hack -- see above */
-                       g_ptr->o_idx = 0;
-               }
-               object_wipe(o_ptr);
+               /* Compress "p_ptr->current_floor_ptr->o_max" */
+               p_ptr->current_floor_ptr->o_max--;
        }
-
-       /* Reset "o_max" */
-       o_max = 1;
-
-       /* Reset "o_cnt" */
-       o_cnt = 0;
 }
 
-
 /*!
  * @brief グローバルオブジェクト配列から空きを取得する /
  * Acquires and returns the index of a "free" object.
@@ -523,16 +416,16 @@ OBJECT_IDX o_pop(void)
        OBJECT_IDX i;
 
        /* Initial allocation */
-       if (o_max < max_o_idx)
+       if (p_ptr->current_floor_ptr->o_max < current_world_ptr->max_o_idx)
        {
                /* Get next space */
-               i = o_max;
+               i = p_ptr->current_floor_ptr->o_max;
 
                /* Expand object array */
-               o_max++;
+               p_ptr->current_floor_ptr->o_max++;
 
                /* Count objects */
-               o_cnt++;
+               p_ptr->current_floor_ptr->o_cnt++;
 
                /* Use this object */
                return (i);
@@ -540,16 +433,16 @@ OBJECT_IDX o_pop(void)
 
 
        /* Recycle dead objects */
-       for (i = 1; i < o_max; i++)
+       for (i = 1; i < p_ptr->current_floor_ptr->o_max; i++)
        {
                object_type *o_ptr;
-               o_ptr = &o_list[i];
+               o_ptr = &p_ptr->current_floor_ptr->o_list[i];
 
                /* Skip live objects */
                if (o_ptr->k_idx) continue;
 
                /* Count objects */
-               o_cnt++;
+               p_ptr->current_floor_ptr->o_cnt++;
 
                /* Use this object */
                return (i);
@@ -557,11 +450,15 @@ OBJECT_IDX o_pop(void)
 
 
        /* Warn the player (except during dungeon creation) */
-       if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
+       if (current_world_ptr->character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
 
        return (0);
 }
 
+/*
+ * Hack -- function hook to restrict "get_obj_num_prep()" function
+ */
+bool(*get_obj_num_hook)(KIND_OBJECT_IDX k_idx);
 
 /*!
  * @brief オブジェクト生成テーブルに生成制約を加える /
@@ -617,7 +514,7 @@ static errr get_obj_num_prep(void)
  * Note that if no objects are "appropriate", then this function will\n
  * fail, and return zero, but this should *almost* never happen.\n
  */
-OBJECT_IDX get_obj_num(DEPTH level)
+OBJECT_IDX get_obj_num(DEPTH level, BIT_FLAGS mode)
 {
        int i, j, p;
        KIND_OBJECT_IDX k_idx;
@@ -650,14 +547,12 @@ OBJECT_IDX get_obj_num(DEPTH level)
                /* Default */
                table[i].prob3 = 0;
 
-               /* Access the index */
                k_idx = table[i].index;
 
                /* Access the actual kind */
                k_ptr = &k_info[k_idx];
 
-               /* Hack -- prevent embedded chests */
-               if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
+               if ((mode & AM_FORBID_CHEST) && (k_ptr->tval == TV_CHEST)) continue;
 
                /* Accept */
                table[i].prob3 = table[i].prob2;
@@ -736,7 +631,6 @@ OBJECT_IDX get_obj_num(DEPTH level)
        return (table[i].index);
 }
 
-
 /*!
  * @brief オブジェクトを鑑定済にする /
  * Known is true when the "attributes" of an object are "known".
@@ -796,7 +690,7 @@ void object_aware(object_type *o_ptr)
                q_ptr->number = 1;
                object_desc(o_name, q_ptr, OD_NAME_ONLY);
                
-               do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
+               exe_write_diary(p_ptr, NIKKI_HANMEI, 0, o_name);
        }
 }
 
@@ -1479,40 +1373,6 @@ PRICE object_value(object_type *o_ptr)
 
 
 
-/*!
- * @brief 破壊可能なアイテムかを返す /
- * Determines whether an object can be destroyed, and makes fake inscription.
- * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
- * @return オブジェクトが破壊可能ならばTRUEを返す
- */
-bool can_player_destroy_object(object_type *o_ptr)
-{
-       /* Artifacts cannot be destroyed */
-       if (!object_is_artifact(o_ptr)) return TRUE;
-
-       /* If object is unidentified, makes fake inscription */
-       if (!object_is_known(o_ptr))
-       {
-               byte feel = FEEL_SPECIAL;
-
-               /* Hack -- Handle icky artifacts */
-               if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
-
-               /* Hack -- inscribe the artifact */
-               o_ptr->feeling = feel;
-
-               /* We have "felt" it (again) */
-               o_ptr->ident |= (IDENT_SENSE);
-               p_ptr->update |= (PU_COMBINE);
-               p_ptr->window |= (PW_INVEN | PW_EQUIP);
-
-               return FALSE;
-       }
-
-       /* Identified artifact -- Nothing to do */
-       return FALSE;
-}
-
 
 /*!
  * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
@@ -2018,90 +1878,6 @@ void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
 
 
 /*!
- * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
- * Help determine an "enchantment bonus" for an object.
- * @param max ボーナス値の限度
- * @param level ボーナス値に加味する基準生成階
- * @return 算出されたボーナス値
- * @details
- * To avoid floating point but still provide a smooth distribution of bonuses,\n
- * we simply round the results of division in such a way as to "average" the\n
- * correct floating point value.\n
- *\n
- * This function has been changed.  It uses "randnor()" to choose values from\n
- * a normal distribution, whose mean moves from zero towards the max as the\n
- * level increases, and whose standard deviation is equal to 1/4 of the max,\n
- * and whose values are forced to lie between zero and the max, inclusive.\n
- *\n
- * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
- * rare to get the "full" enchantment on an object, even a deep levels.\n
- *\n
- * It is always possible (albeit unlikely) to get the "full" enchantment.\n
- *\n
- * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
- *\n
- *   N       0     1     2     3     4     5     6     7     8     9    10\n
- * ---    ----  ----  ----  ----  ----  ----  ----  ----  ----  ----  ----\n
- *   0   66.37 13.01  9.73  5.47  2.89  1.31  0.72  0.26  0.12  0.09  0.03\n
- *   8   46.85 24.66 12.13  8.13  4.20  2.30  1.05  0.36  0.19  0.08  0.05\n
- *  16   30.12 27.62 18.52 10.52  6.34  3.52  1.95  0.90  0.31  0.15  0.05\n
- *  24   22.44 15.62 30.14 12.92  8.55  5.30  2.39  1.63  0.62  0.28  0.11\n
- *  32   16.23 11.43 23.01 22.31 11.19  7.18  4.46  2.13  1.20  0.45  0.41\n
- *  40   10.76  8.91 12.80 29.51 16.00  9.69  5.90  3.43  1.47  0.88  0.65\n
- *  48    7.28  6.81 10.51 18.27 27.57 11.76  7.85  4.99  2.80  1.22  0.94\n
- *  56    4.41  4.73  8.52 11.96 24.94 19.78 11.06  7.18  3.68  1.96  1.78\n
- *  64    2.81  3.07  5.65  9.17 13.01 31.57 13.70  9.30  6.04  3.04  2.64\n
- *  72    1.87  1.99  3.68  7.15 10.56 20.24 25.78 12.17  7.52  4.42  4.62\n
- *  80    1.02  1.23  2.78  4.75  8.37 12.04 27.61 18.07 10.28  6.52  7.33\n
- *  88    0.70  0.57  1.56  3.12  6.34 10.06 15.76 30.46 12.58  8.47 10.38\n
- *  96    0.27  0.60  1.25  2.28  4.30  7.60 10.77 22.52 22.51 11.37 16.53\n
- * 104    0.22  0.42  0.77  1.36  2.62  5.33  8.93 13.05 29.54 15.23 22.53\n
- * 112    0.15  0.20  0.56  0.87  2.00  3.83  6.86 10.06 17.89 27.31 30.27\n
- * 120    0.03  0.11  0.31  0.46  1.31  2.48  4.60  7.78 11.67 25.53 45.72\n
- * 128    0.02  0.01  0.13  0.33  0.83  1.41  3.24  6.17  9.57 14.22 64.07\n
- */
-int m_bonus(int max, DEPTH level)
-{
-       int bonus, stand, extra, value;
-
-
-       /* Paranoia -- enforce maximal "level" */
-       if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
-
-
-       /* The "bonus" moves towards the max */
-       bonus = ((max * level) / MAX_DEPTH);
-
-       /* Hack -- determine fraction of error */
-       extra = ((max * level) % MAX_DEPTH);
-
-       /* Hack -- simulate floating point computations */
-       if (randint0(MAX_DEPTH) < extra) bonus++;
-
-
-       /* The "stand" is equal to one quarter of the max */
-       stand = (max / 4);
-
-       /* Hack -- determine fraction of error */
-       extra = (max % 4);
-
-       /* Hack -- simulate floating point computations */
-       if (randint0(4) < extra) stand++;
-
-
-       /* Choose an "interesting" value */
-       value = randnor(bonus, stand);
-
-       /* Enforce the minimum value */
-       if (value < 0) return (0);
-
-       /* Enforce the maximum value */
-       if (value > max) return (max);
-       return (value);
-}
-
-
-/*!
  * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
  * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
  * @return なし
@@ -2175,7 +1951,7 @@ static byte get_random_ego(byte slot, bool good)
  * Hack -- note special base damage dice boosting\n
  * Hack -- note special processing for weapon/digger\n
  */
-static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
+void apply_magic_weapon(object_type *o_ptr, DEPTH level, int power)
 {
        HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
        HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
@@ -2185,8 +1961,8 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
 
        if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
        {
-               tohit2 = (tohit2+1)/2;
-               todam2 = (todam2+1)/2;
+               tohit2 = (tohit2 + 1) / 2;
+               todam2 = (todam2 + 1) / 2;
        }
 
        /* Good */
@@ -2226,7 +2002,6 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
 
        if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
 
-       /* Analyze type */
        switch (o_ptr->tval)
        {
                case TV_DIGGING:
@@ -2235,7 +2010,7 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
                        if (power > 1)
                        {
                                if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
-                                       create_artifact(o_ptr, FALSE);
+                                       become_random_artifact(o_ptr, FALSE);
                                else
                                        /* Special Ego-item */
                                        o_ptr->name2 = EGO_DIGGING;
@@ -2258,7 +2033,6 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
                        break;
                }
 
-
                case TV_HAFTED:
                case TV_POLEARM:
                case TV_SWORD:
@@ -2268,7 +2042,7 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
                        {
                                if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
                                {
-                                       create_artifact(o_ptr, FALSE);
+                                       become_random_artifact(o_ptr, FALSE);
                                        break;
                                }
                                while (1)
@@ -2312,16 +2086,14 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
                                                do
                                                {
                                                        o_ptr->dd++;
-                                               }
-                                               while (one_in_(o_ptr->dd));
-                                               
+                                               } while (one_in_(o_ptr->dd));
+
                                                do
                                                {
                                                        o_ptr->ds++;
-                                               }
-                                               while (one_in_(o_ptr->ds));
+                                               } while (one_in_(o_ptr->ds));
                                        }
-                                       
+
                                        if (one_in_(5))
                                        {
                                                add_flag(o_ptr->art_flags, TR_BRAND_POIS);
@@ -2359,15 +2131,15 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
                                                add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
                                        break;
                                case EGO_DEMON:
-                                       
-                                       if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
-                                       one_in_(3) ? 
+
+                                       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);
-                                               
-                                       
+                                               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_CHAOTIC);
                                        if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
                                        if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
@@ -2391,7 +2163,7 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
                                /* Roll for ego-item */
                                if (randint0(MAX_DEPTH) < level)
                                {
-                                       while(1)
+                                       while (1)
                                        {
                                                o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
                                                if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
@@ -2402,16 +2174,18 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
                                        }
                                        switch (o_ptr->name2)
                                        {
-                                       case EGO_MORGUL:
-                                               if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
-                                               if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
-                                       case EGO_WEIRD:
-                                               if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
-                                               if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
-                                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
-                                               if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
-                                               if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
-                                               if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
+                                               case EGO_MORGUL:
+                                                       if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
+                                                       if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+                                                       break;
+                                               case EGO_WEIRD:
+                                                       if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
+                                                       if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
+                                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
+                                                       if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
+                                                       if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
+                                                       if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
+                                                       break;
                                        }
                                }
                        }
@@ -2427,7 +2201,7 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
                        {
                                if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
                                {
-                                       create_artifact(o_ptr, FALSE);
+                                       become_random_artifact(o_ptr, FALSE);
                                        break;
                                }
                                o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
@@ -2446,7 +2220,7 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
                        {
                                if (power > 2) /* power > 2 is debug only */
                                {
-                                       create_artifact(o_ptr, FALSE);
+                                       become_random_artifact(o_ptr, FALSE);
                                        break;
                                }
 
@@ -2482,77 +2256,6 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
 }
 
 /*!
- * @brief ドラゴン装備にランダムな耐性を与える
- * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
- * @return なし
- */
-static void dragon_resist(object_type * o_ptr)
-{
-       do
-       {
-               if (one_in_(4))
-                       one_dragon_ele_resistance(o_ptr);
-               else
-                       one_high_resistance(o_ptr);
-       }
-       while (one_in_(2));
-}
-
-/*!
- * @brief オブジェクトにランダムな強いESPを与える
- * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
- * @return なし
- */
-static bool add_esp_strong(object_type *o_ptr)
-{
-       bool nonliv = FALSE;
-
-       switch (randint1(3))
-       {
-       case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
-       case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
-       case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
-       }
-
-       return nonliv;
-}
-
-/*!
- * @brief オブジェクトにランダムな弱いESPを与える
- * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
- * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
- * @return なし
- */
-static void add_esp_weak(object_type *o_ptr, bool extra)
-{
-       int i;
-       u32b weak_esp_list[] = {
-               TR_ESP_ANIMAL,
-               TR_ESP_UNDEAD,
-               TR_ESP_DEMON,
-               TR_ESP_ORC,
-               TR_ESP_TROLL,
-               TR_ESP_GIANT,
-               TR_ESP_DRAGON,
-               TR_ESP_HUMAN,
-               TR_ESP_GOOD,
-               TR_ESP_UNIQUE,
-       };
-       const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
-       const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
-
-       /* Add unduplicated weak esp flags randomly */
-       for (i = 0; i < add_count; ++ i)
-       {
-               int choice = rand_range(i, MAX_ESP_WEAK - 1);
-
-               add_flag(o_ptr->art_flags, weak_esp_list[choice]);
-               weak_esp_list[choice] = weak_esp_list[i];
-       }
-}
-
-
-/*!
  * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
  * Apply magic to an item known to be "armor"
  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
@@ -2599,14 +2302,12 @@ static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
                if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
        }
 
-
-       /* Analyze type */
        switch (o_ptr->tval)
        {
                case TV_DRAG_ARMOR:
                {
                        if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
-                               create_artifact(o_ptr, FALSE);
+                               become_random_artifact(o_ptr, FALSE);
                        break;
                }
 
@@ -2638,7 +2339,7 @@ static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
 
                                if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
                                {
-                                       create_artifact(o_ptr, FALSE);
+                                       become_random_artifact(o_ptr, FALSE);
                                        break;
                                }
 
@@ -2726,7 +2427,7 @@ static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
                        {
                                if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
                                {
-                                       create_artifact(o_ptr, FALSE);
+                                       become_random_artifact(o_ptr, FALSE);
                                        break;
                                }
                                
@@ -2772,7 +2473,7 @@ static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
                        {
                                if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
                                {
-                                       create_artifact(o_ptr, FALSE);
+                                       become_random_artifact(o_ptr, FALSE);
                                        break;
                                }
                                o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
@@ -2799,7 +2500,7 @@ static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
                        {
                                if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
                                {
-                                       create_artifact(o_ptr, FALSE);
+                                       become_random_artifact(o_ptr, FALSE);
                                        break;
                                }
                                o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
@@ -2830,7 +2531,7 @@ static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
                        {
                                if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
                                {
-                                       create_artifact(o_ptr, FALSE);
+                                       become_random_artifact(o_ptr, FALSE);
                                        break;
                                }
                                while (1)
@@ -2906,7 +2607,7 @@ static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
                        {
                                if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
                                {
-                                       create_artifact(o_ptr, FALSE);
+                                       become_random_artifact(o_ptr, FALSE);
                                        break;
                                }
                                while (1)
@@ -2984,7 +2685,7 @@ static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
                        {
                                if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
                                {
-                                       create_artifact(o_ptr, FALSE);
+                                       become_random_artifact(o_ptr, FALSE);
                                        break;
                                }
                                o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
@@ -3333,7 +3034,7 @@ static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
                        {
                                o_ptr->pval = MIN(o_ptr->pval, 4);
                                /* Randart amulet */
-                               create_artifact(o_ptr, FALSE);
+                               become_random_artifact(o_ptr, FALSE);
                        }
                        else if ((power == 2) && one_in_(2))
                        {
@@ -3665,7 +3366,7 @@ static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
                        {
                                o_ptr->pval = MIN(o_ptr->pval, 4);
                                /* Randart amulet */
-                               create_artifact(o_ptr, FALSE);
+                               become_random_artifact(o_ptr, FALSE);
                        }
                        else if ((power == 2) && one_in_(2))
                        {
@@ -3808,26 +3509,6 @@ static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
        }
 }
 
-/*!
- * @brief モンスターが人形のベースにできるかを返す
- * @param r_idx チェックしたいモンスター種族のID
- * @return 人形にできるならTRUEを返す
- */
-static bool item_monster_okay(MONRACE_IDX r_idx)
-{
-       monster_race *r_ptr = &r_info[r_idx];
-
-       /* No uniques */
-       if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
-       if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
-       if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
-       if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
-       if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
-       if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
-
-       return (TRUE);
-}
-
 
 /*!
  * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
@@ -3888,7 +3569,7 @@ static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
 
                        if (power > 2) /* power > 2 is debug only */
                        {
-                               create_artifact(o_ptr, FALSE);
+                               become_random_artifact(o_ptr, FALSE);
                        }
                        else if ((power == 2) || ((power == 1) && one_in_(3)))
                        {
@@ -3981,7 +3662,7 @@ static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
 
                                r_ptr = &r_info[i];
 
-                               check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
+                               check = (p_ptr->current_floor_ptr->dun_level < r_ptr->level) ? (r_ptr->level - p_ptr->current_floor_ptr->dun_level) : 0;
 
                                /* Ignore dead monsters */
                                if (!r_ptr->rarity) continue;
@@ -4027,11 +3708,11 @@ static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
                        /* Pick a random non-unique monster race */
                        while (1)
                        {
-                               i = get_mon_num(dun_level);
+                               i = get_mon_num(p_ptr->current_floor_ptr->dun_level);
 
                                r_ptr = &r_info[i];
 
-                               check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
+                               check = (p_ptr->current_floor_ptr->dun_level < r_ptr->level) ? (r_ptr->level - p_ptr->current_floor_ptr->dun_level) : 0;
 
                                /* Ignore dead monsters */
                                if (!r_ptr->rarity) continue;
@@ -4095,7 +3776,7 @@ static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
                        o_ptr->pval = randint1(obj_level);
                        if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
 
-                       o_ptr->xtra3 = dun_level + 5;
+                       o_ptr->xtra3 = p_ptr->current_floor_ptr->dun_level + 5;
 
                        /* Never exceed "difficulty" of 55 to 59 */
                        if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
@@ -4251,7 +3932,7 @@ void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
                a_ptr->cur_num = 1;
 
                /* Hack -- Memorize location of artifact in saved floors */
-               if (character_dungeon)
+               if (current_world_ptr->character_dungeon)
                        a_ptr->floor_id = p_ptr->floor_id;
 
                /* Extract the other fields */
@@ -4296,19 +3977,19 @@ void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
                case TV_ARROW:
                case TV_BOLT:
                {
-                       if (power) a_m_aux_1(o_ptr, lev, power);
+                       if (power) apply_magic_weapon(o_ptr, lev, power);
                        break;
                }
 
                case TV_POLEARM:
                {
-                       if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
+                       if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) apply_magic_weapon(o_ptr, lev, power);
                        break;
                }
 
                case TV_SWORD:
                {
-                       if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
+                       if (power && !(o_ptr->sval == SV_DOKUBARI)) apply_magic_weapon(o_ptr, lev, power);
                        break;
                }
 
@@ -4543,92 +4224,6 @@ void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
 
 
 /*!
- * @brief ベースアイテムが上質として扱われるかどうかを返す。
- * Hack -- determine if a template is "good"
- * @param k_idx 判定したいベースアイテムのID
- * @return ベースアイテムが上質ならばTRUEを返す。
- */
-static bool kind_is_good(KIND_OBJECT_IDX k_idx)
-{
-       object_kind *k_ptr = &k_info[k_idx];
-
-       /* Analyze the item type */
-       switch (k_ptr->tval)
-       {
-               /* Armor -- Good unless damaged */
-               case TV_HARD_ARMOR:
-               case TV_SOFT_ARMOR:
-               case TV_DRAG_ARMOR:
-               case TV_SHIELD:
-               case TV_CLOAK:
-               case TV_BOOTS:
-               case TV_GLOVES:
-               case TV_HELM:
-               case TV_CROWN:
-               {
-                       if (k_ptr->to_a < 0) return (FALSE);
-                       return (TRUE);
-               }
-
-               /* Weapons -- Good unless damaged */
-               case TV_BOW:
-               case TV_SWORD:
-               case TV_HAFTED:
-               case TV_POLEARM:
-               case TV_DIGGING:
-               {
-                       if (k_ptr->to_h < 0) return (FALSE);
-                       if (k_ptr->to_d < 0) return (FALSE);
-                       return (TRUE);
-               }
-
-               /* Ammo -- Arrows/Bolts are good */
-               case TV_BOLT:
-               case TV_ARROW:
-               {
-                       return (TRUE);
-               }
-
-               /* Books -- High level books are good (except Arcane books) */
-               case TV_LIFE_BOOK:
-               case TV_SORCERY_BOOK:
-               case TV_NATURE_BOOK:
-               case TV_CHAOS_BOOK:
-               case TV_DEATH_BOOK:
-               case TV_TRUMP_BOOK:
-               case TV_CRAFT_BOOK:
-               case TV_DAEMON_BOOK:
-               case TV_CRUSADE_BOOK:
-               case TV_MUSIC_BOOK:
-               case TV_HISSATSU_BOOK:
-               case TV_HEX_BOOK:
-               {
-                       if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
-                       return (FALSE);
-               }
-
-               /* Rings -- Rings of Speed are good */
-               case TV_RING:
-               {
-                       if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
-                       if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
-                       return (FALSE);
-               }
-
-               /* Amulets -- Amulets of the Magi and Resistance are good */
-               case TV_AMULET:
-               {
-                       if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
-                       if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
-                       return (FALSE);
-               }
-       }
-
-       /* Assume not good */
-       return (FALSE);
-}
-
-/*!
  * @brief 生成階に応じたベースアイテムの生成を行う。
  * Attempt to make an object (normal or good/great)
  * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
@@ -4636,7 +4231,7 @@ static bool kind_is_good(KIND_OBJECT_IDX k_idx)
  * @return 生成に成功したらTRUEを返す。
  * @details
  * This routine plays nasty games to generate the "special artifacts".\n
- * This routine uses "object_level" for the "generation level".\n
+ * This routine uses "p_ptr->current_floor_ptr->object_level" for the "generation level".\n
  * We assume that the given object has been "wiped".\n
  */
 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
@@ -4649,7 +4244,7 @@ bool make_object(object_type *j_ptr, BIT_FLAGS mode)
        prob = ((mode & AM_GOOD) ? 10 : 1000);
 
        /* Base level for the object */
-       base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
+       base = ((mode & AM_GOOD) ? (p_ptr->current_floor_ptr->object_level + 10) : p_ptr->current_floor_ptr->object_level);
 
 
        /* Generate a special object, or a normal object */
@@ -4668,7 +4263,7 @@ bool make_object(object_type *j_ptr, BIT_FLAGS mode)
                if (get_obj_num_hook) get_obj_num_prep();
 
                /* Pick a random object */
-               k_idx = get_obj_num(base);
+               k_idx = get_obj_num(base, mode);
 
                /* Restricted objects */
                if (get_obj_num_hook)
@@ -4688,7 +4283,7 @@ bool make_object(object_type *j_ptr, BIT_FLAGS mode)
        }
 
        /* Apply magic (allow artifacts) */
-       apply_magic(j_ptr, object_level, mode);
+       apply_magic(j_ptr, p_ptr->current_floor_ptr->object_level, mode);
 
        /* Hack -- generate multiple spikes/missiles */
        switch (j_ptr->tval)
@@ -4719,7 +4314,7 @@ bool make_object(object_type *j_ptr, BIT_FLAGS mode)
  * @return 生成に成功したらTRUEを返す。
  * @details
  * This routine plays nasty games to generate the "special artifacts".\n
- * This routine uses "object_level" for the "generation level".\n
+ * This routine uses "p_ptr->current_floor_ptr->object_level" for the "generation level".\n
  * This routine requires a clean floor grid destination.\n
  */
 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
@@ -4727,17 +4322,17 @@ void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
        OBJECT_IDX o_idx;
 
        /* Acquire grid */
-       grid_type *g_ptr = &grid_array[y][x];
+       grid_type *g_ptr = &p_ptr->current_floor_ptr->grid_array[y][x];
 
        object_type forge;
        object_type *q_ptr;
 
 
        /* Paranoia -- check bounds */
-       if (!in_bounds(y, x)) return;
+       if (!in_bounds(p_ptr->current_floor_ptr, y, x)) return;
 
        /* Require floor space */
-       if (!cave_drop_bold(y, x)) return;
+       if (!cave_drop_bold(p_ptr->current_floor_ptr, y, x)) return;
 
        /* Avoid stacking on other objects */
        if (g_ptr->o_idx) return;
@@ -4748,15 +4343,13 @@ void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
        /* Make an object (if possible) */
        if (!make_object(q_ptr, mode)) return;
 
-
-       /* Make an object */
        o_idx = o_pop();
 
        /* Success */
        if (o_idx)
        {
                object_type *o_ptr;
-               o_ptr = &o_list[o_idx];
+               o_ptr = &p_ptr->current_floor_ptr->o_list[o_idx];
 
                /* Structure Copy */
                object_copy(o_ptr, q_ptr);
@@ -4767,11 +4360,8 @@ void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
                /* Build a stack */
                o_ptr->next_o_idx = g_ptr->o_idx;
 
-               /* Place the object */
                g_ptr->o_idx = o_idx;
-
                note_spot(y, x);
-
                lite_spot(y, x);
        }
        else
@@ -4785,6 +4375,8 @@ void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
 }
 
 
+OBJECT_SUBTYPE_VALUE coin_type;        /* Hack -- force coin type */
+
 /*!
  * @brief 生成階に応じた財宝オブジェクトの生成を行う。
  * Make a treasure object
@@ -4799,12 +4391,12 @@ bool make_gold(object_type *j_ptr)
        s32b base;
 
        /* Hack -- Pick a Treasure variety */
-       i = ((randint1(object_level + 2) + 2) / 2) - 1;
+       i = ((randint1(p_ptr->current_floor_ptr->object_level + 2) + 2) / 2) - 1;
 
        /* Apply "extra" magic */
        if (one_in_(GREAT_OBJ))
        {
-               i += randint1(object_level + 1);
+               i += randint1(p_ptr->current_floor_ptr->object_level + 1);
        }
 
        /* Hack -- Creeping Coins only generate "themselves" */
@@ -4841,17 +4433,17 @@ void place_gold(POSITION y, POSITION x)
        OBJECT_IDX o_idx;
 
        /* Acquire grid */
-       grid_type *g_ptr = &grid_array[y][x];
+       grid_type *g_ptr = &p_ptr->current_floor_ptr->grid_array[y][x];
 
        object_type forge;
        object_type *q_ptr;
 
 
        /* Paranoia -- check bounds */
-       if (!in_bounds(y, x)) return;
+       if (!in_bounds(p_ptr->current_floor_ptr, y, x)) return;
 
        /* Require floor space */
-       if (!cave_drop_bold(y, x)) return;
+       if (!cave_drop_bold(p_ptr->current_floor_ptr, y, x)) return;
 
        /* Avoid stacking on other objects */
        if (g_ptr->o_idx) return;
@@ -4862,16 +4454,13 @@ void place_gold(POSITION y, POSITION x)
        /* Make some gold */
        if (!make_gold(q_ptr)) return;
 
-       /* Make an object */
        o_idx = o_pop();
 
        /* Success */
        if (o_idx)
        {
                object_type *o_ptr;
-               o_ptr = &o_list[o_idx];
-
-               /* Copy the object */
+               o_ptr = &p_ptr->current_floor_ptr->o_list[o_idx];
                object_copy(o_ptr, q_ptr);
 
                /* Save location */
@@ -4881,11 +4470,8 @@ void place_gold(POSITION y, POSITION x)
                /* Build a stack */
                o_ptr->next_o_idx = g_ptr->o_idx;
 
-               /* Place the object */
                g_ptr->o_idx = o_idx;
-
                note_spot(y, x);
-
                lite_spot(y, x);
        }
 }
@@ -4895,12 +4481,12 @@ void place_gold(POSITION y, POSITION x)
  * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
  * Let an object fall to the ground at or near a location.
  * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
- * @param chance ã\83\89ã\83­ã\83\83ã\83\97ã\81®æ\88\90å\8a\9f率(%)
+ * @param chance ã\83\89ã\83­ã\83\83ã\83\97ã\81®æ\88æ»\85率(%)
  * @param y 配置したいフロアのY座標
  * @param x 配置したいフロアのX座標
  * @return 生成に成功したらオブジェクトのIDを返す。
  * @details
- * The initial location is assumed to be "in_bounds()".\n
+ * The initial location is assumed to be "in_bounds(p_ptr->current_floor_ptr, )".\n
  *\n
  * This function takes a parameter "chance".  This is the percentage\n
  * chance that the item will "disappear" instead of drop.  If the object\n
@@ -4949,8 +4535,7 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
 #else
                msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
 #endif
-               /* Debug */
-               if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
+               if (current_world_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
 
                /* Failure */
                return (0);
@@ -4984,17 +4569,16 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
                        ty = y + dy;
                        tx = x + dx;
 
-                       /* Skip illegal grids */
-                       if (!in_bounds(ty, tx)) continue;
+                       if (!in_bounds(p_ptr->current_floor_ptr, ty, tx)) continue;
 
                        /* Require line of projection */
-                       if (!projectable(y, x, ty, tx)) continue;
+                       if (!projectable(p_ptr->current_floor_ptr, y, x, ty, tx)) continue;
 
                        /* Obtain grid */
-                       g_ptr = &grid_array[ty][tx];
+                       g_ptr = &p_ptr->current_floor_ptr->grid_array[ty][tx];
 
                        /* Require floor space */
-                       if (!cave_drop_bold(ty, tx)) continue;
+                       if (!cave_drop_bold(p_ptr->current_floor_ptr, ty, tx)) continue;
 
                        /* No objects */
                        k = 0;
@@ -5003,9 +4587,7 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
                        for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
                        {
                                object_type *o_ptr;
-                               o_ptr = &o_list[this_o_idx];
-
-                               /* Acquire next object */
+                               o_ptr = &p_ptr->current_floor_ptr->o_list[this_o_idx];
                                next_o_idx = o_ptr->next_o_idx;
 
                                /* Check for possible combination */
@@ -5017,8 +4599,6 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
 
                        /* Add new object */
                        if (!comb) k++;
-
-                       /* Paranoia */
                        if (k > 99) continue;
 
                        /* Calculate score */
@@ -5054,9 +4634,7 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
                msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
 #endif
 
-
-               /* Debug */
-               if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
+               if (current_world_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
 
                /* Failure */
                return (0);
@@ -5070,15 +4648,14 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
                ty = rand_spread(by, 1);
                tx = rand_spread(bx, 1);
 
-               /* Verify location */
-               if (!in_bounds(ty, tx)) continue;
+               if (!in_bounds(p_ptr->current_floor_ptr, ty, tx)) continue;
 
                /* Bounce to that location */
                by = ty;
                bx = tx;
 
                /* Require floor space */
-               if (!cave_drop_bold(by, bx)) continue;
+               if (!cave_drop_bold(p_ptr->current_floor_ptr, by, bx)) continue;
 
                flag = TRUE;
        }
@@ -5088,12 +4665,12 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
        {
                int candidates = 0, pick;
 
-               for (ty = 1; ty < cur_hgt - 1; ty++)
+               for (ty = 1; ty < p_ptr->current_floor_ptr->height - 1; ty++)
                {
-                       for (tx = 1; tx < cur_wid - 1; tx++)
+                       for (tx = 1; tx < p_ptr->current_floor_ptr->width - 1; tx++)
                        {
                                /* A valid space found */
-                               if (cave_drop_bold(ty, tx)) candidates++;
+                               if (cave_drop_bold(p_ptr->current_floor_ptr, ty, tx)) candidates++;
                        }
                }
 
@@ -5106,8 +4683,7 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
                        msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
 #endif
 
-                       /* Debug */
-                       if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
+                       if (current_world_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
 
                        /* Mega-Hack -- preserve artifacts */
                        if (preserve_mode)
@@ -5127,11 +4703,11 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
                /* Choose a random one */
                pick = randint1(candidates);
 
-               for (ty = 1; ty < cur_hgt - 1; ty++)
+               for (ty = 1; ty < p_ptr->current_floor_ptr->height - 1; ty++)
                {
-                       for (tx = 1; tx < cur_wid - 1; tx++)
+                       for (tx = 1; tx < p_ptr->current_floor_ptr->width - 1; tx++)
                        {
-                               if (cave_drop_bold(ty, tx))
+                               if (cave_drop_bold(p_ptr->current_floor_ptr, ty, tx))
                                {
                                        pick--;
 
@@ -5148,15 +4724,13 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
        }
 
 
-       g_ptr = &grid_array[by][bx];
+       g_ptr = &p_ptr->current_floor_ptr->grid_array[by][bx];
 
        /* Scan objects in that grid for combination */
        for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
        {
                object_type *o_ptr;
-               o_ptr = &o_list[this_o_idx];
-
-               /* Acquire next object */
+               o_ptr = &p_ptr->current_floor_ptr->o_list[this_o_idx];
                next_o_idx = o_ptr->next_o_idx;
 
                /* Check for combination */
@@ -5182,8 +4756,7 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
                msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
 #endif
 
-               /* Debug */
-               if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
+               if (current_world_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
 
                /* Hack -- Preserve artifacts */
                if (object_is_fixed_artifact(j_ptr))
@@ -5199,10 +4772,10 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
        if (!done)
        {
                /* Structure copy */
-               object_copy(&o_list[o_idx], j_ptr);
+               object_copy(&p_ptr->current_floor_ptr->o_list[o_idx], j_ptr);
 
                /* Access new object */
-               j_ptr = &o_list[o_idx];
+               j_ptr = &p_ptr->current_floor_ptr->o_list[o_idx];
 
                /* Locate */
                j_ptr->iy = by;
@@ -5214,7 +4787,6 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
                /* Build a stack */
                j_ptr->next_o_idx = g_ptr->o_idx;
 
-               /* Place the object */
                g_ptr->o_idx = o_idx;
 
                /* Success */
@@ -5227,7 +4799,7 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
 
        /* Mega-Hack -- no message if "dropped" by player */
        /* Message when an object falls under the player */
-       if (chance && player_bold(by, bx))
+       if (chance && player_bold(p_ptr, by, bx))
        {
                msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
        }
@@ -5243,7 +4815,7 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION
  */
 void inven_item_charges(INVENTORY_IDX item)
 {
-       object_type *o_ptr = &inventory[item];
+       object_type *o_ptr = &p_ptr->inventory_list[item];
 
        /* Require staff/wand */
        if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
@@ -5284,7 +4856,7 @@ void inven_item_charges(INVENTORY_IDX item)
  */
 void inven_item_describe(INVENTORY_IDX item)
 {
-       object_type *o_ptr = &inventory[item];
+       object_type *o_ptr = &p_ptr->inventory_list[item];
        GAME_TEXT o_name[MAX_NLEN];
 
        object_desc(o_name, o_ptr, 0);
@@ -5307,6 +4879,22 @@ void inven_item_describe(INVENTORY_IDX item)
 
 }
 
+void vary_item(INVENTORY_IDX item, ITEM_NUMBER num)
+{
+       if (item >= 0)
+       {
+               inven_item_increase(item, num);
+               inven_item_describe(item);
+               inven_item_optimize(item);
+       }
+       else
+       {
+               floor_item_increase(0 - item, num);
+               floor_item_describe(0 - item);
+               floor_item_optimize(0 - item);
+       }
+}
+
 /*!
  * @brief アイテムを増減させ残り所持数メッセージを表示する /
  * Increase the "number" of an item in the inventory
@@ -5316,7 +4904,7 @@ void inven_item_describe(INVENTORY_IDX item)
  */
 void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
 {
-       object_type *o_ptr = &inventory[item];
+       object_type *o_ptr = &p_ptr->inventory_list[item];
 
        /* Apply */
        num += o_ptr->number;
@@ -5337,8 +4925,6 @@ void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
                /* Add the weight */
                p_ptr->total_weight += (num * o_ptr->weight);
                p_ptr->update |= (PU_BONUS);
-
-               /* Recalculate mana XXX */
                p_ptr->update |= (PU_MANA);
                p_ptr->update |= (PU_COMBINE);
                p_ptr->window |= (PW_INVEN | PW_EQUIP);
@@ -5348,10 +4934,10 @@ void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
                {
                        if ((item == INVEN_RARM) || (item == INVEN_LARM))
                        {
-                               if (!has_melee_weapon(INVEN_RARM + INVEN_LARM - item))
+                               if (!has_melee_weapon(p_ptr, INVEN_RARM + INVEN_LARM - item))
                                {
                                        /* Clear all temporary elemental brands */
-                                       set_ele_attack(0, 0);
+                                       set_ele_attack(p_ptr, 0, 0);
                                }
                        }
                }
@@ -5366,7 +4952,7 @@ void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
  */
 void inven_item_optimize(INVENTORY_IDX item)
 {
-       object_type *o_ptr = &inventory[item];
+       object_type *o_ptr = &p_ptr->inventory_list[item];
 
        /* Only optimize real items */
        if (!o_ptr->k_idx) return;
@@ -5380,17 +4966,17 @@ void inven_item_optimize(INVENTORY_IDX item)
                int i;
 
                /* One less item */
-               inven_cnt--;
+               p_ptr->inven_cnt--;
 
                /* Slide everything down */
                for (i = item; i < INVEN_PACK; i++)
                {
                        /* Structure copy */
-                       inventory[i] = inventory[i+1];
+                       p_ptr->inventory_list[i] = p_ptr->inventory_list[i+1];
                }
 
                /* Erase the "final" slot */
-               object_wipe(&inventory[i]);
+               object_wipe(&p_ptr->inventory_list[i]);
 
                p_ptr->window |= (PW_INVEN);
        }
@@ -5399,16 +4985,12 @@ void inven_item_optimize(INVENTORY_IDX item)
        else
        {
                /* One less item */
-               equip_cnt--;
+               p_ptr->equip_cnt--;
 
                /* Erase the empty slot */
-               object_wipe(&inventory[item]);
+               object_wipe(&p_ptr->inventory_list[item]);
                p_ptr->update |= (PU_BONUS);
-
-               /* Recalculate torch */
                p_ptr->update |= (PU_TORCH);
-
-               /* Recalculate mana XXX */
                p_ptr->update |= (PU_MANA);
 
                p_ptr->window |= (PW_EQUIP);
@@ -5425,7 +5007,7 @@ void inven_item_optimize(INVENTORY_IDX item)
  */
 void floor_item_charges(INVENTORY_IDX item)
 {
-       object_type *o_ptr = &o_list[item];
+       object_type *o_ptr = &p_ptr->current_floor_ptr->o_list[item];
 
        /* Require staff/wand */
        if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
@@ -5466,7 +5048,7 @@ void floor_item_charges(INVENTORY_IDX item)
  */
 void floor_item_describe(INVENTORY_IDX item)
 {
-       object_type *o_ptr = &o_list[item];
+       object_type *o_ptr = &p_ptr->current_floor_ptr->o_list[item];
        GAME_TEXT o_name[MAX_NLEN];
 
        object_desc(o_name, o_ptr, 0);
@@ -5497,7 +5079,7 @@ void floor_item_describe(INVENTORY_IDX item)
  */
 void floor_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
 {
-       object_type *o_ptr = &o_list[item];
+       object_type *o_ptr = &p_ptr->current_floor_ptr->o_list[item];
 
        /* Apply */
        num += o_ptr->number;
@@ -5522,7 +5104,7 @@ void floor_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
  */
 void floor_item_optimize(INVENTORY_IDX item)
 {
-       object_type *o_ptr = &o_list[item];
+       object_type *o_ptr = &p_ptr->current_floor_ptr->o_list[item];
 
        /* Paranoia -- be sure it exists */
        if (!o_ptr->k_idx) return;
@@ -5545,14 +5127,12 @@ bool inven_carry_okay(object_type *o_ptr)
        int j;
 
        /* Empty slot? */
-       if (inven_cnt < INVEN_PACK) return (TRUE);
+       if (p_ptr->inven_cnt < INVEN_PACK) return (TRUE);
 
        /* Similar slot? */
        for (j = 0; j < INVEN_PACK; j++)
        {
-               object_type *j_ptr = &inventory[j];
-
-               /* Skip non-objects */
+               object_type *j_ptr = &p_ptr->inventory_list[j];
                if (!j_ptr->k_idx) continue;
 
                /* Check if the two items can be combined */
@@ -5682,9 +5262,7 @@ s16b inven_carry(object_type *o_ptr)
        /* Check for combining */
        for (j = 0; j < INVEN_PACK; j++)
        {
-               j_ptr = &inventory[j];
-
-               /* Skip non-objects */
+               j_ptr = &p_ptr->inventory_list[j];
                if (!j_ptr->k_idx) continue;
 
                /* Hack -- track last item */
@@ -5704,14 +5282,12 @@ s16b inven_carry(object_type *o_ptr)
                }
        }
 
-
-       /* Paranoia */
-       if (inven_cnt > INVEN_PACK) return (-1);
+       if (p_ptr->inven_cnt > INVEN_PACK) return (-1);
 
        /* Find an empty slot */
        for (j = 0; j <= INVEN_PACK; j++)
        {
-               j_ptr = &inventory[j];
+               j_ptr = &p_ptr->inventory_list[j];
 
                /* Use it if found */
                if (!j_ptr->k_idx) break;
@@ -5730,7 +5306,7 @@ s16b inven_carry(object_type *o_ptr)
                /* Scan every occupied slot */
                for (j = 0; j < INVEN_PACK; j++)
                {
-                       if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
+                       if (object_sort_comp(o_ptr, o_value, &p_ptr->inventory_list[j])) break;
                }
 
                /* Use that slot */
@@ -5740,19 +5316,19 @@ s16b inven_carry(object_type *o_ptr)
                for (k = n; k >= i; k--)
                {
                        /* Hack -- Slide the item */
-                       object_copy(&inventory[k+1], &inventory[k]);
+                       object_copy(&p_ptr->inventory_list[k+1], &p_ptr->inventory_list[k]);
                }
 
                /* Wipe the empty slot */
-               object_wipe(&inventory[i]);
+               object_wipe(&p_ptr->inventory_list[i]);
        }
 
 
        /* Copy the item */
-       object_copy(&inventory[i], o_ptr);
+       object_copy(&p_ptr->inventory_list[i], o_ptr);
 
        /* Access new object */
-       j_ptr = &inventory[i];
+       j_ptr = &p_ptr->inventory_list[i];
 
        /* Forget stack */
        j_ptr->next_o_idx = 0;
@@ -5769,7 +5345,7 @@ s16b inven_carry(object_type *o_ptr)
        p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
 
        /* Count the items */
-       inven_cnt++;
+       p_ptr->inven_cnt++;
        p_ptr->update |= (PU_BONUS | PU_COMBINE | PU_REORDER);
        p_ptr->window |= (PW_INVEN);
 
@@ -5805,16 +5381,12 @@ INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
 
 
        /* Get the item to take off */
-       o_ptr = &inventory[item];
-
-       /* Paranoia */
+       o_ptr = &p_ptr->inventory_list[item];
        if (amt <= 0) return (-1);
 
        /* Verify */
        if (amt > o_ptr->number) amt = o_ptr->number;
        q_ptr = &forge;
-
-       /* Obtain a local object */
        object_copy(q_ptr, o_ptr);
 
        /* Modify quantity */
@@ -5884,7 +5456,7 @@ void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
        GAME_TEXT o_name[MAX_NLEN];
 
        /* Access original object */
-       o_ptr = &inventory[item];
+       o_ptr = &p_ptr->inventory_list[item];
 
        /* Error check */
        if (amt <= 0) return;
@@ -5899,7 +5471,7 @@ void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
                item = inven_takeoff(item, amt);
 
                /* Access original object */
-               o_ptr = &inventory[item];
+               o_ptr = &p_ptr->inventory_list[item];
        }
 
        q_ptr = &forge;
@@ -5921,10 +5493,7 @@ void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
        /* Drop it near the player */
        (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
 
-       /* Modify, Describe, Optimize */
-       inven_item_increase(item, -amt);
-       inven_item_describe(item);
-       inven_item_optimize(item);
+       vary_item(item, -amt);
 }
 
 
@@ -5935,7 +5504,7 @@ void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
  * @details
  * Note special handling of the "overflow" slot
  */
-void combine_pack(void)
+void combine_pack(player_type *owner_ptr)
 {
        int             i, j, k;
        object_type *o_ptr;
@@ -5949,7 +5518,7 @@ void combine_pack(void)
                /* Combine the pack (backwards) */
                for (i = INVEN_PACK; i > 0; i--)
                {
-                       o_ptr = &inventory[i];
+                       o_ptr = &owner_ptr->inventory_list[i];
 
                        /* Skip empty items */
                        if (!o_ptr->k_idx) continue;
@@ -5959,7 +5528,7 @@ void combine_pack(void)
                        {
                                int max_num;
 
-                               j_ptr = &inventory[j];
+                               j_ptr = &owner_ptr->inventory_list[j];
 
                                /* Skip empty items */
                                if (!j_ptr->k_idx) continue;
@@ -5982,17 +5551,17 @@ void combine_pack(void)
                                                object_absorb(j_ptr, o_ptr);
 
                                                /* One object is gone */
-                                               inven_cnt--;
+                                               owner_ptr->inven_cnt--;
 
                                                /* Slide everything down */
                                                for (k = i; k < INVEN_PACK; k++)
                                                {
                                                        /* Structure copy */
-                                                       inventory[k] = inventory[k+1];
+                                                       owner_ptr->inventory_list[k] = owner_ptr->inventory_list[k+1];
                                                }
 
                                                /* Erase the "final" slot */
-                                               object_wipe(&inventory[k]);
+                                               object_wipe(&owner_ptr->inventory_list[k]);
                                        }
                                        else
                                        {
@@ -6020,7 +5589,7 @@ void combine_pack(void)
                                                }
                                        }
 
-                                       p_ptr->window |= (PW_INVEN);
+                                       owner_ptr->window |= (PW_INVEN);
 
                                        /* Take note */
                                        combined = TRUE;
@@ -6056,9 +5625,9 @@ void reorder_pack(void)
        for (i = 0; i < INVEN_PACK; i++)
        {
                /* Mega-Hack -- allow "proper" over-flow */
-               if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
+               if ((i == INVEN_PACK) && (p_ptr->inven_cnt == INVEN_PACK)) break;
 
-               o_ptr = &inventory[i];
+               o_ptr = &p_ptr->inventory_list[i];
 
                /* Skip empty slots */
                if (!o_ptr->k_idx) continue;
@@ -6069,7 +5638,7 @@ void reorder_pack(void)
                /* Scan every occupied slot */
                for (j = 0; j < INVEN_PACK; j++)
                {
-                       if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
+                       if (object_sort_comp(o_ptr, o_value, &p_ptr->inventory_list[j])) break;
                }
 
                /* Never move down */
@@ -6080,17 +5649,17 @@ void reorder_pack(void)
                q_ptr = &forge;
 
                /* Save a copy of the moving item */
-               object_copy(q_ptr, &inventory[i]);
+               object_copy(q_ptr, &p_ptr->inventory_list[i]);
 
                /* Slide the objects */
                for (k = i; k > j; k--)
                {
                        /* Slide the item */
-                       object_copy(&inventory[k], &inventory[k-1]);
+                       object_copy(&p_ptr->inventory_list[k], &p_ptr->inventory_list[k-1]);
                }
 
                /* Insert the moving item */
-               object_copy(&inventory[j], q_ptr);
+               object_copy(&p_ptr->inventory_list[j], q_ptr);
 
                p_ptr->window |= (PW_INVEN);
        }
@@ -6170,2036 +5739,19 @@ void display_koff(KIND_OBJECT_IDX k_idx)
                }
 
                /* Print spells */
-               print_spells(0, spells, num, 2, 0, use_realm);
+               print_spells(p_ptr, 0, spells, num, 2, 0, use_realm);
        }
 }
 
+
 /*!
- * @brief 警告を放つアイテムを選択する /
- * Choose one of items that have warning flag
- * Calculate spell damages
- * @return 警告を行う
+ * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
+ * Torches have special abilities when they are flaming.
+ * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
+ * @param flgs 特別に追加するフラグを返す参照ポインタ
+ * @return なし
  */
-object_type *choose_warning_item(void)
-{
-       int i;
-       int choices[INVEN_TOTAL - INVEN_RARM];
-       int number = 0;
-
-       /* Paranoia -- Player has no warning ability */
-       if (!p_ptr->warning) return NULL;
-
-       /* Search Inventory */
-       for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
-       {
-               BIT_FLAGS flgs[TR_FLAG_SIZE];
-               object_type *o_ptr = &inventory[i];
-
-               object_flags(o_ptr, flgs);
-               if (have_flag(flgs, TR_WARNING))
-               {
-                       choices[number] = i;
-                       number++;
-               }
-       }
-
-       /* Choice one of them */
-       return number ? &inventory[choices[randint0(number)]] : NULL;
-}
-
-/*!
- * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
- * Calculate spell damages
- * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
- * @param typ 効果属性のID
- * @param dam 基本ダメージ
- * @param max 算出した最大ダメージを返すポインタ
- * @return なし
- */
-static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
-{
-       monster_race *r_ptr = &r_info[m_ptr->r_idx];
-       int          rlev = r_ptr->level;
-       bool         ignore_wraith_form = FALSE;
-
-       /* Vulnerability, resistance and immunity */
-       switch (typ)
-       {
-       case GF_ELEC:
-               if (p_ptr->immune_elec)
-               {
-                       dam = 0;
-                       ignore_wraith_form = TRUE;
-               }
-               else
-               {
-                       if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
-                       if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
-                       if (prace_is_(RACE_ANDROID)) dam += dam / 3;
-                       if (p_ptr->resist_elec) dam = (dam + 2) / 3;
-                       if (IS_OPPOSE_ELEC())
-                               dam = (dam + 2) / 3;
-               }
-               break;
-
-       case GF_POIS:
-               if (p_ptr->resist_pois) dam = (dam + 2) / 3;
-               if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
-               break;
-
-       case GF_ACID:
-               if (p_ptr->immune_acid)
-               {
-                       dam = 0;
-                       ignore_wraith_form = TRUE;
-               }
-               else
-               {
-                       if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
-                       if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
-                       if (p_ptr->resist_acid) dam = (dam + 2) / 3;
-                       if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
-               }
-               break;
-
-       case GF_COLD:
-       case GF_ICE:
-               if (p_ptr->immune_cold)
-               {
-                       dam = 0;
-                       ignore_wraith_form = TRUE;
-               }
-               else
-               {
-                       if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
-                       if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
-                       if (p_ptr->resist_cold) dam = (dam + 2) / 3;
-                       if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
-               }
-               break;
-
-       case GF_FIRE:
-               if (p_ptr->immune_fire)
-               {
-                       dam = 0;
-                       ignore_wraith_form = TRUE;
-               }
-               else
-               {
-                       if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
-                       if (prace_is_(RACE_ENT)) dam += dam / 3;
-                       if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
-                       if (p_ptr->resist_fire) dam = (dam + 2) / 3;
-                       if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
-               }
-               break;
-
-       case GF_PSY_SPEAR:
-               ignore_wraith_form = TRUE;
-               break;
-
-       case GF_ARROW:
-               if (!p_ptr->blind &&
-                   ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
-                    (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
-               {
-                       dam = 0;
-                       ignore_wraith_form = TRUE;
-               }
-               break;
-
-       case GF_LITE:
-               if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
-               if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
-               else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
-
-               /*
-                * Cannot use "ignore_wraith_form" strictly (for "random one damage")
-                * "dam *= 2;" for later "dam /= 2"
-                */
-               if (p_ptr->wraith_form) dam *= 2;
-               break;
-
-       case GF_DARK:
-               if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
-               {
-                       dam = 0;
-                       ignore_wraith_form = TRUE;
-               }
-               else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
-               break;
-
-       case GF_SHARDS:
-               if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
-               break;
-
-       case GF_SOUND:
-               if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
-               break;
-
-       case GF_CONFUSION:
-               if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
-               break;
-
-       case GF_CHAOS:
-               if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
-               break;
-
-       case GF_NETHER:
-               if (prace_is_(RACE_SPECTRE))
-               {
-                       dam = 0;
-                       ignore_wraith_form = TRUE;
-               }
-               else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
-               break;
-
-       case GF_DISENCHANT:
-               if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
-               break;
-
-       case GF_NEXUS:
-               if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
-               break;
-
-       case GF_TIME:
-               if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
-               break;
-
-       case GF_GRAVITY:
-               if (p_ptr->levitation) dam = (dam * 2) / 3;
-               break;
-
-       case GF_ROCKET:
-               if (p_ptr->resist_shard) dam /= 2;
-               break;
-
-       case GF_NUKE:
-               if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
-               if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
-               break;
-
-       case GF_DEATH_RAY:
-               if (p_ptr->mimic_form)
-               {
-                       if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
-                       {
-                               dam = 0;
-                               ignore_wraith_form = TRUE;
-                       }
-               }
-               else
-               {
-                       switch (p_ptr->prace)
-                       {
-                       case RACE_GOLEM:
-                       case RACE_SKELETON:
-                       case RACE_ZOMBIE:
-                       case RACE_VAMPIRE:
-                       case RACE_DEMON:
-                       case RACE_SPECTRE:
-                               dam = 0;
-                               ignore_wraith_form = TRUE;
-                               break;
-                       }
-               }
-               break;
-
-       case GF_HOLY_FIRE:
-               if (p_ptr->align > 10) dam /= 2;
-               else if (p_ptr->align < -10) dam *= 2;
-               break;
-
-       case GF_HELL_FIRE:
-               if (p_ptr->align > 10) dam *= 2;
-               break;
-
-       case GF_MIND_BLAST:
-       case GF_BRAIN_SMASH:
-               if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
-               {
-                       dam = 0;
-                       ignore_wraith_form = TRUE;
-               }
-               break;
-
-       case GF_CAUSE_1:
-       case GF_CAUSE_2:
-       case GF_CAUSE_3:
-       case GF_HAND_DOOM:
-               if (100 + rlev / 2 <= p_ptr->skill_sav)
-               {
-                       dam = 0;
-                       ignore_wraith_form = TRUE;
-               }
-               break;
-
-       case GF_CAUSE_4:
-               if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
-               {
-                       dam = 0;
-                       ignore_wraith_form = TRUE;
-               }
-               break;
-       }
-
-       if (p_ptr->wraith_form && !ignore_wraith_form)
-       {
-               dam /= 2;
-               if (!dam) dam = 1;
-       }
-
-       if (dam > *max) *max = dam;
-}
-
-/*!
-* @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
-* Calculate spell damages
-* @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
-* @param typ 効果属性のID
-* @param m_idx 魔法を行使するモンスターのID
-* @param max 算出した最大ダメージを返すポインタ
-* @return なし
-*/
-void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
-{
-    monster_type *m_ptr = &m_list[m_idx];
-    HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
-    spell_damcalc(m_ptr, typ, dam, max);
-}
-
-/*!
- * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
- * Calculate blow damages
- * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
- * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
- * @return 算出された最大ダメージを返す。
- */
-static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
-{
-       int  dam = blow_ptr->d_dice * blow_ptr->d_side;
-       int  dummy_max = 0;
-       bool check_wraith_form = TRUE;
-
-       if (blow_ptr->method != RBM_EXPLODE)
-       {
-               ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
-
-               switch (blow_ptr->effect)
-               {
-               case RBE_SUPERHURT:
-               {
-                       int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
-                       dam = MAX(dam, tmp_dam * 2);
-                       break;
-               }
-
-               case RBE_HURT:
-               case RBE_SHATTER:
-                       dam -= (dam * ((ac < 150) ? ac : 150) / 250);
-                       break;
-
-               case RBE_ACID:
-                       spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
-                       dam = dummy_max;
-                       check_wraith_form = FALSE;
-                       break;
-
-               case RBE_ELEC:
-                       spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
-                       dam = dummy_max;
-                       check_wraith_form = FALSE;
-                       break;
-
-               case RBE_FIRE:
-                       spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
-                       dam = dummy_max;
-                       check_wraith_form = FALSE;
-                       break;
-
-               case RBE_COLD:
-                       spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
-                       dam = dummy_max;
-                       check_wraith_form = FALSE;
-                       break;
-
-               case RBE_DR_MANA:
-                       dam = 0;
-                       check_wraith_form = FALSE;
-                       break;
-               }
-
-               if (check_wraith_form && p_ptr->wraith_form)
-               {
-                       dam /= 2;
-                       if (!dam) dam = 1;
-               }
-       }
-       else
-       {
-               dam = (dam + 1) / 2;
-               spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
-               dam = dummy_max;
-       }
-
-       return dam;
-}
-
-/*!
- * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
- * Examine the grid (xx,yy) and warn the player if there are any danger
- * @param xx 危険性を調査するマスのX座標
- * @param yy 危険性を調査するマスのY座標
- * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
- */
-bool process_warning(POSITION xx, POSITION yy)
-{
-       POSITION mx, my;
-       grid_type *g_ptr;
-       GAME_TEXT o_name[MAX_NLEN];
-
-#define WARNING_AWARE_RANGE 12
-       int dam_max = 0;
-       static int old_damage = 0;
-
-       for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
-       {
-               for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
-               {
-                       int dam_max0 = 0;
-                       monster_type *m_ptr;
-                       monster_race *r_ptr;
-
-                       if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
-
-                       g_ptr = &grid_array[my][mx];
-
-                       if (!g_ptr->m_idx) continue;
-
-                       m_ptr = &m_list[g_ptr->m_idx];
-
-                       if (MON_CSLEEP(m_ptr)) continue;
-                       if (!is_hostile(m_ptr)) continue;
-
-                       r_ptr = &r_info[m_ptr->r_idx];
-
-                       /* Monster spells (only powerful ones)*/
-                       if (projectable(my, mx, yy, xx))
-            {
-                               BIT_FLAGS f4 = r_ptr->flags4;
-                               BIT_FLAGS f5 = r_ptr->a_ability_flags1;
-                               BIT_FLAGS f6 = r_ptr->a_ability_flags2;
-
-                               if (!(d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC))
-                               {
-                                       if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0);
-                                       if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, g_ptr->m_idx, &dam_max0);
-                                       if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, g_ptr->m_idx, &dam_max0);
-                                       if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, g_ptr->m_idx, &dam_max0);
-                                       if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, g_ptr->m_idx, &dam_max0);
-                                       if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, g_ptr->m_idx, &dam_max0);
-                               }
-                               if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, g_ptr->m_idx, &dam_max0);
-                               if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, g_ptr->m_idx, &dam_max0);
-                       }
-
-                       /* Monster melee attacks */
-                       if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE))
-                       {
-                               if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
-                               {
-                                       int m;
-                                       int dam_melee = 0;
-                                       for (m = 0; m < 4; m++)
-                                       {
-                                               /* Skip non-attacks */
-                                               if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
-
-                                               /* Extract the attack info */
-                                               dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
-                                               if (r_ptr->blow[m].method == RBM_EXPLODE) break;
-                                       }
-                                       if (dam_melee > dam_max0) dam_max0 = dam_melee;
-                               }
-                       }
-
-                       /* Contribution from this monster */
-                       dam_max += dam_max0;
-               }
-       }
-
-       /* Prevent excessive warning */
-       if (dam_max > old_damage)
-       {
-               old_damage = dam_max * 3 / 2;
-
-               if (dam_max > p_ptr->chp / 2)
-               {
-                       object_type *o_ptr = choose_warning_item();
-
-                       if (o_ptr)
-                object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-            else 
-                strcpy(o_name, _("体", "body")); /* Warning ability without item */
-            msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
-
-                       disturb(FALSE, TRUE);
-            return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
-               }
-       }
-       else old_damage = old_damage / 2;
-
-       g_ptr = &grid_array[yy][xx];
-       if (((!easy_disarm && is_trap(g_ptr->feat))
-           || (g_ptr->mimic && is_trap(g_ptr->feat))) && !one_in_(13))
-       {
-               object_type *o_ptr = choose_warning_item();
-
-               if (o_ptr) 
-            object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-        else
-            strcpy(o_name, _("体", "body")); /* Warning ability without item */
-        msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
-               disturb(FALSE, TRUE);
-        return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
-       }
-
-       return TRUE;
-}
-
-/*!
- * エッセンス情報の構造体 / A structure for smithing
- */
-typedef struct {
-       int add;       /* TR flag number or special essence id */
-       concptr add_name; /* Name of this ability */
-       ESSENCE_IDX type;      /* Menu number */
-       int essence;   /* Index for carrying essences */
-       int value;     /* Needed value to add this ability */
-} essence_type;
-
-
-/*!
- * エッセンス情報テーブル Smithing type data for Weapon smith
- */
-#ifdef JP
-static essence_type essence_info[] = 
-{
-       {TR_STR, "腕力", 4, TR_STR, 20},
-       {TR_INT, "知能", 4, TR_INT, 20},
-       {TR_WIS, "賢さ", 4, TR_WIS, 20},
-       {TR_DEX, "器用さ", 4, TR_DEX, 20},
-       {TR_CON, "耐久力", 4, TR_CON, 20},
-       {TR_CHR, "魅力", 4, TR_CHR, 20},
-       {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
-       {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
-       {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
-       {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
-       {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
-       {TR_SPEED, "スピード", 4, TR_SPEED, 12},
-       {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
-       {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
-       {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
-       {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
-       {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
-       {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
-       {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
-       {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
-       {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
-       {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
-       {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
-       {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
-       {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
-       {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
-       {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
-       {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
-       {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
-       {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
-       {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
-       {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
-       {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
-       {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
-       {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
-       {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
-       {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
-       {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
-       {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
-       {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
-       {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
-       {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
-       {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
-       {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
-       {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
-       {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
-       {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
-       {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
-       {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
-       {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
-       {TR_SH_FIRE, "", 0, -2, 0},
-       {TR_SH_ELEC, "", 0, -2, 0},
-       {TR_SH_COLD, "", 0, -2, 0},
-       {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
-       {TR_WARNING, "警告", 3, TR_WARNING, 20},
-       {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
-       {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
-       {TR_LITE_2, "", 0, -2, 0},
-       {TR_LITE_3, "", 0, -2, 0},
-       {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
-       {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
-       {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
-       {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
-       {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
-
-       {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
-       {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
-       {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
-       {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
-       {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
-       {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
-       {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
-       {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
-       {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
-       {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
-       {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
-       {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
-       {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
-       {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},       
-       {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
-       {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
-       {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
-       {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
-
-       {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
-       {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40}, 
-       {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},       
-       {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},     
-       {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},   
-       {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},       
-       {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
-       {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
-
-       {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
-       {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
-       {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
-       {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
-       {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
-       {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
-       {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
-       {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
-       {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
-       {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
-       {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
-       {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
-
-       {-1, NULL, 0, -1, 0}
-};
-#else
-static essence_type essence_info[] = 
-{
-       {TR_STR, "strength", 4, TR_STR, 20},
-       {TR_INT, "intelligence", 4, TR_INT, 20},
-       {TR_WIS, "wisdom", 4, TR_WIS, 20},
-       {TR_DEX, "dexterity", 4, TR_DEX, 20},
-       {TR_CON, "constitution", 4, TR_CON, 20},
-       {TR_CHR, "charisma", 4, TR_CHR, 20},
-       {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
-       {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
-       {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
-       {TR_INFRA, "infravision", 4, TR_INFRA, 15},
-       {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
-       {TR_SPEED, "speed", 4, TR_SPEED, 12},
-       {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
-       {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
-       {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
-       {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
-       {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
-       {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
-       {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
-       {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
-       {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
-       {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
-       {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
-       {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
-       {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
-       {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
-       {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
-       {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
-       {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
-       {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
-       {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
-       {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
-       {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
-       {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
-       {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
-       {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
-       {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
-       {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
-       {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
-       {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
-       {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
-       {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
-       {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
-       {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
-       {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
-       {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
-       {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
-       {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
-       {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
-       {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
-       {TR_SH_FIRE, "", 0, -2, 0},
-       {TR_SH_ELEC, "", 0, -2, 0},
-       {TR_SH_COLD, "", 0, -2, 0},
-       {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
-       {TR_WARNING, "warning", 3, TR_WARNING, 20},
-       {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
-       {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
-       {TR_LITE_2, "", 0, -2, 0},
-       {TR_LITE_3, "", 0, -2, 0},
-       {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
-       {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
-       {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
-       {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
-       {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
-
-       {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
-       {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
-       {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
-       {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
-       {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
-       {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
-       {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
-       {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
-       {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
-       {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
-       {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
-       {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
-       {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
-       {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},       
-       {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
-       {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
-       {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
-       {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
-
-       {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
-       {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40}, 
-       {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},       
-       {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},     
-       {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},   
-       {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},       
-       {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
-       {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
-
-       {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
-       {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
-       {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
-       {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
-       {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
-       {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
-       {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
-       {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
-       {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
-       {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
-       {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
-       {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
-
-       {-1, NULL, 0, -1, 0}
-};
-#endif
-
-
-/*!
- * エッセンス名テーブル / Essense names for Weapon smith
- */
-#ifdef JP
-concptr essence_name[] = 
-{
-       "腕力",
-       "知能",
-       "賢さ",
-       "器用さ",
-       "耐久力",
-       "魅力",
-       "魔力支配",
-       "",
-       "隠密",
-       "探索",
-       "赤外線視力",
-       "採掘",
-       "スピード",
-       "追加攻撃",
-       "カオス攻撃",
-       "吸血攻撃",
-       "動物倍打",
-       "邪悪倍打",
-       "不死倍打",
-       "悪魔倍打",
-       "オーク倍打",
-       "トロル倍打",
-       "巨人倍打",
-       "竜倍打",
-       "",
-       "",
-       "地震",
-       "毒殺",
-       "溶解",
-       "電撃",
-       "焼棄",
-       "凍結",
-       "能力維持",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "免疫",
-       "",
-       "",
-       "",
-       "",
-       "反射",
-       "麻痺知らず",
-       "経験値維持",
-       "耐酸",
-       "耐電撃",
-       "耐火炎",
-       "耐冷気",
-       "耐毒",
-       "耐恐怖",
-       "耐閃光",
-       "耐暗黒",
-       "耐盲目",
-       "耐混乱",
-       "耐轟音",
-       "耐破片",
-       "耐地獄",
-       "耐因果混乱",
-       "耐カオス",
-       "耐劣化",
-       "",
-       "",
-       "人間倍打",
-       "",
-       "",
-       "反魔法",
-       "",
-       "",
-       "警告",
-       "",
-       "",
-       "",
-       "浮遊",
-       "永久光源",
-       "可視透明",
-       "テレパシー",
-       "遅消化",
-       "急速回復",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "テレポート",
-       "",
-       "",
-       "攻撃",
-       "防御",
-
-       NULL
-};
-
-#else
-
-concptr essence_name[] = 
-{
-       "strength",
-       "intelligen.",
-       "wisdom",
-       "dexterity",
-       "constitut.",
-       "charisma",
-       "magic mast.",
-       "",
-       "stealth",
-       "serching",
-       "infravision",
-       "digging",
-       "speed",
-       "extra atk",
-       "chaos brand",
-       "vampiric",
-       "slay animal",
-       "slay evil",
-       "slay undead",
-       "slay demon",
-       "slay orc",
-       "slay troll",
-       "slay giant",
-       "slay dragon",
-       "",
-       "",
-       "quake",
-       "pois. brand",
-       "acid brand",
-       "elec. brand",
-       "fire brand",
-       "cold brand",
-       "sustain",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "immunity",
-       "",
-       "",
-       "",
-       "",
-       "reflection",
-       "free action",
-       "hold exp",
-       "res. acid",
-       "res. elec.",
-       "res. fire",
-       "res. cold",
-       "res. poison",
-       "res. fear",
-       "res. light",
-       "res. dark",
-       "res. blind",
-       "res.confuse",
-       "res. sound",
-       "res. shard",
-       "res. nether",
-       "res. nexus",
-       "res. chaos",
-       "res. disen.",
-       "",
-       "",
-       "slay human",
-       "",
-       "",
-       "anti magic",
-       "",
-       "",
-       "warning",
-       "",
-       "",
-       "",
-       "levitation",
-       "perm. light",
-       "see invis.",
-       "telepathy",
-       "slow dige.",
-       "regen.",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "teleport",
-       "",
-       "",
-       "weapon enc.",
-       "armor enc.",
-
-       NULL
-};
-#endif
-
-/*!
- * @brief 所持しているエッセンス一覧を表示する
- * @return なし
- */
-static void display_essence(void)
-{
-       int i, num = 0;
-
-       screen_save();
-       for (i = 1; i < 22; i++)
-       {
-               prt("",i,0);
-       }
-       prt(_("エッセンス   個数     エッセンス   個数     エッセンス   個数", 
-                 "Essence      Num      Essence      Num      Essence      Num "), 1, 8);
-       for (i = 0; essence_name[i]; i++)
-       {
-               if (!essence_name[i][0]) continue;
-               prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
-               num++;
-       }
-       prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
-       (void)inkey();
-       screen_load();
-       return;
-}
-
-/*!
- * @brief エッセンスの抽出処理
- * @return なし
- */
-static void drain_essence(void)
-{
-       int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
-       int i;
-       OBJECT_IDX item;
-       int dec = 4;
-       bool observe = FALSE;
-       int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
-       TIME_EFFECT old_timeout;
-       BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
-       object_type *o_ptr;
-       concptr q, s;
-       POSITION iy, ix;
-       byte_hack marked;
-       ITEM_NUMBER number;
-       OBJECT_IDX next_o_idx;
-       WEIGHT weight;
-
-       for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
-               drain_value[i] = 0;
-
-       item_tester_hook = object_is_weapon_armour_ammo;
-
-       q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
-       s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
-
-       o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
-       if (!o_ptr) return;
-
-       if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
-       {
-               GAME_TEXT o_name[MAX_NLEN];
-               object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-               if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
-       }
-
-       take_turn(p_ptr, 100);;
-
-       object_flags(o_ptr, old_flgs);
-       if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
-       if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
-       if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
-       if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
-       if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
-       if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
-       if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
-       if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
-       if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
-
-       old_to_a = o_ptr->to_a;
-       old_ac = o_ptr->ac;
-       old_to_h = o_ptr->to_h;
-       old_to_d = o_ptr->to_d;
-       old_ds = o_ptr->ds;
-       old_dd = o_ptr->dd;
-       old_pval = o_ptr->pval;
-       old_name2 = o_ptr->name2;
-       old_timeout = o_ptr->timeout;
-       if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
-       if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
-       if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
-       if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
-       if (have_flag(old_flgs, TR_NO_TELE)) dec--;
-       if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
-       if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
-       if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
-       if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
-       if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
-       if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
-       if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
-       if (have_flag(old_flgs, TR_COWARDICE)) dec--;
-       if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
-       if (have_flag(old_flgs, TR_LOW_AC)) dec--;
-       if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
-       if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
-       if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
-       if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
-       
-       iy = o_ptr->iy;
-       ix = o_ptr->ix;
-       next_o_idx = o_ptr->next_o_idx;
-       marked = o_ptr->marked;
-       weight = o_ptr->weight;
-       number = o_ptr->number;
-
-       object_prep(o_ptr, o_ptr->k_idx);
-
-       o_ptr->iy=iy;
-       o_ptr->ix=ix;
-       o_ptr->next_o_idx=next_o_idx;
-       o_ptr->marked=marked;
-       o_ptr->number = number;
-       if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
-       if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
-       o_ptr->ident |= (IDENT_MENTAL);
-       object_aware(o_ptr);
-       object_known(o_ptr);
-
-       object_flags(o_ptr, new_flgs);
-
-       for (i = 0; essence_info[i].add_name; i++)
-       {
-               essence_type *es_ptr = &essence_info[i];
-               PARAMETER_VALUE pval = 0;
-
-               if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
-                       pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
-
-               if (es_ptr->add < TR_FLAG_MAX &&
-                   (!have_flag(new_flgs, es_ptr->add) || pval) &&
-                   have_flag(old_flgs, es_ptr->add))
-               {
-                       if (pval)
-                       {
-                               drain_value[es_ptr->essence] += 10 * pval;
-                       }
-                       else if (es_ptr->essence != -2)
-                       {
-                               drain_value[es_ptr->essence] += 10;
-                       }
-                       else if (es_ptr->add == TR_SH_FIRE)
-                       {
-                               drain_value[TR_BRAND_FIRE] += 10;
-                               drain_value[TR_RES_FIRE] += 10;
-                       }
-                       else if (es_ptr->add == TR_SH_ELEC)
-                       {
-                               drain_value[TR_BRAND_ELEC] += 10;
-                               drain_value[TR_RES_ELEC] += 10;
-                       }
-                       else if (es_ptr->add == TR_SH_COLD)
-                       {
-                               drain_value[TR_BRAND_COLD] += 10;
-                               drain_value[TR_RES_COLD] += 10;
-                       }
-                       else if (es_ptr->add == TR_LITE_2)
-                       {
-                               drain_value[TR_LITE_1] += 20;
-                       }
-                       else if (es_ptr->add == TR_LITE_3)
-                       {
-                               drain_value[TR_LITE_1] += 30;
-                       }
-               }
-       }
-
-       if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
-       {
-               drain_value[TR_INT] += 5;
-               drain_value[TR_WIS] += 5;
-       }
-       if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
-       {
-               drain_value[TR_BRAND_POIS] += 5;
-               drain_value[TR_BRAND_ACID] += 5;
-               drain_value[TR_BRAND_ELEC] += 5;
-               drain_value[TR_BRAND_FIRE] += 5;
-               drain_value[TR_BRAND_COLD] += 5;
-       }
-       if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
-       {
-               drain_value[TR_INT] += 10;
-       }
-       if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
-       {
-               drain_value[TR_STR] += 10;
-       }
-       if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
-       {
-               drain_value[TR_DEX] += 10;
-       }
-       if (old_name2 == EGO_2WEAPON)
-       {
-               drain_value[TR_DEX] += 20;
-       }
-       if (object_is_weapon_ammo(o_ptr))
-       {
-               if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
-
-               if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
-       }
-       if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
-       if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
-       if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
-       if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
-
-       for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
-       {
-               drain_value[i] *= number;
-               drain_value[i] = drain_value[i] * dec / 4;
-               drain_value[i] = MAX(drain_value[i], 0);
-               if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
-               if (drain_value[i])
-               {
-                       observe = TRUE;
-               }
-       }
-       if (!observe)
-       {
-               msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
-       }
-       else
-       {
-               msg_print(_("抽出したエッセンス:", "Extracted essences:"));
-
-               for (i = 0; essence_name[i]; i++)
-               {
-                       if (!essence_name[i][0]) continue;
-                       if (!drain_value[i]) continue;
-
-                       p_ptr->magic_num1[i] += drain_value[i];
-                       p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
-                       msg_print(NULL);
-                       msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
-               }
-       }
-
-       /* Apply autodestroy/inscription to the drained item */
-       autopick_alter_item(item, TRUE);
-       p_ptr->update |= (PU_COMBINE | PU_REORDER);
-       p_ptr->window |= (PW_INVEN);
-}
-
-/*!
- * @brief 付加するエッセンスの大別を選択する
- * @return 選んだエッセンスの大別ID
- */
-static COMMAND_CODE choose_essence(void)
-{
-       COMMAND_CODE mode = 0;
-       char choice;
-       COMMAND_CODE menu_line = (use_menu ? 1 : 0);
-
-#ifdef JP
-       concptr menu_name[] = {
-               "武器属性", 
-               "耐性",
-               "能力",
-               "数値",
-               "スレイ",
-               "ESP",
-               "その他"
-       };
-#else
-       concptr menu_name[] = {
-               "Brand weapon",
-               "Resistance",
-               "Ability",
-               "Magic number", 
-               "Slay",
-               "ESP",
-               "Others"
-       };
-#endif
-       const COMMAND_CODE mode_max = 7;
-
-       if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
-               return mode;
-       mode = 0;
-       if (use_menu)
-       {
-               screen_save();
-
-               while(!mode)
-               {
-                       int i;
-                       for (i = 0; i < mode_max; i++)
-#ifdef JP
-                               prt(format(" %s %s", (menu_line == 1+i) ? "》" : "  ", menu_name[i]), 2 + i, 14);
-                       prt("どの種類のエッセンス付加を行いますか?", 0, 0);
-#else
-                               prt(format(" %s %s", (menu_line == 1+i) ? "> " : "  ", menu_name[i]), 2 + i, 14);
-                       prt("Choose from menu.", 0, 0);
-#endif
-
-                       choice = inkey();
-                       switch(choice)
-                       {
-                       case ESCAPE:
-                       case 'z':
-                       case 'Z':
-                               screen_load();
-                               return 0;
-                       case '2':
-                       case 'j':
-                       case 'J':
-                               menu_line++;
-                               break;
-                       case '8':
-                       case 'k':
-                       case 'K':
-                               menu_line += mode_max - 1;
-                               break;
-                       case '\r':
-                       case '\n':
-                       case 'x':
-                       case 'X':
-                               mode = menu_line;
-                               break;
-                       }
-                       if (menu_line > mode_max) menu_line -= mode_max;
-               }
-               screen_load();
-       }
-       else
-       {
-               screen_save();
-               while (!mode)
-               {
-                       int i;
-
-                       for (i = 0; i < mode_max; i++)
-                               prt(format("  %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
-
-                       if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
-                       {
-                               screen_load();
-                               return 0;
-                       }
-
-                       if (isupper(choice)) choice = (char)tolower(choice);
-
-                       if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
-                               mode = (int)choice - 'a' + 1;
-               }
-               screen_load();
-       }
-
-       repeat_push(mode);
-       return mode;
-}
-
-/*!
- * @brief エッセンスを実際に付加する
- * @param mode エッセンスの大別ID
- * @return なし
- */
-static void add_essence(ESSENCE_IDX mode)
-{
-       OBJECT_IDX item;
-       int max_num = 0;
-       COMMAND_CODE i;
-       bool flag,redraw;
-       char choice;
-       concptr            q, s;
-       object_type *o_ptr;
-       int ask = TRUE;
-       char out_val[160];
-       int num[22];
-       GAME_TEXT o_name[MAX_NLEN];
-       int use_essence;
-       essence_type *es_ptr;
-       bool able[22] = { 0 };
-
-       int menu_line = (use_menu ? 1 : 0);
-
-       for (i = 0; essence_info[i].add_name; i++)
-       {
-               es_ptr = &essence_info[i];
-
-               if (es_ptr->type != mode) continue;
-               num[max_num++] = i;
-       }
-
-       if (!repeat_pull(&i) || i<0 || i>=max_num)
-       {
-
-       /* Nothing chosen yet */
-       flag = FALSE;
-
-       /* No redraw yet */
-       redraw = FALSE;
-
-       /* Build a prompt */
-       (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
-       if (use_menu) screen_save();
-
-       /* Get a spell from the user */
-
-       choice = (always_show_list || use_menu) ? ESCAPE:1;
-       while (!flag)
-       {
-               if( choice==ESCAPE ) choice = ' '; 
-               else if( !get_com(out_val, &choice, FALSE) )break; 
-
-               if (use_menu && choice != ' ')
-               {
-                       switch(choice)
-                       {
-                               case '0':
-                               {
-                                       screen_load();
-                                       return;
-                               }
-
-                               case '8':
-                               case 'k':
-                               case 'K':
-                               {
-                                       menu_line += (max_num-1);
-                                       break;
-                               }
-
-                               case '2':
-                               case 'j':
-                               case 'J':
-                               {
-                                       menu_line++;
-                                       break;
-                               }
-
-                               case '4':
-                               case 'h':
-                               case 'H':
-                               {
-                                       menu_line = 1;
-                                       break;
-                               }
-                               case '6':
-                               case 'l':
-                               case 'L':
-                               {
-                                       menu_line = max_num;
-                                       break;
-                               }
-
-                               case 'x':
-                               case 'X':
-                               case '\r':
-                               case '\n':
-                               {
-                                       i = menu_line - 1;
-                                       ask = FALSE;
-                                       break;
-                               }
-                       }
-                       if (menu_line > max_num) menu_line -= max_num;
-               }
-               /* Request redraw */
-               if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
-               {
-                       /* Show the list */
-                       if (!redraw || use_menu)
-                       {
-                               byte y, x = 10;
-                               int ctr;
-                               char dummy[80], dummy2[80];
-                               byte col;
-
-                               strcpy(dummy, "");
-
-                               /* Show list */
-                               redraw = TRUE;
-                               if (!use_menu) screen_save();
-
-                               for (y = 1; y < 24; y++)
-                                       prt("", y, x);
-
-                               /* Print header(s) */
-#ifdef JP
-                               prt(format("   %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
-
-#else
-                               prt(format("   %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
-#endif
-                               /* Print list */
-                               for (ctr = 0; ctr < max_num; ctr++)
-                               {
-                                       es_ptr = &essence_info[num[ctr]];
-
-                                       if (use_menu)
-                                       {
-                                               if (ctr == (menu_line-1))
-                                                       strcpy(dummy, _("》 ", ">  "));
-                                               else strcpy(dummy, "   ");
-                                               
-                                       }
-                                       /* letter/number for power selection */
-                                       else
-                                       {
-                                               sprintf(dummy, "%c) ",I2A(ctr));
-                                       }
-
-                                       strcat(dummy, es_ptr->add_name);
-
-                                       col = TERM_WHITE;
-                                       able[ctr] = TRUE;
-
-                                       if (es_ptr->essence != -1)
-                                       {
-                                               strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
-                                               if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
-                                       }
-                                       else
-                                       {
-                                               switch(es_ptr->add)
-                                               {
-                                               case ESSENCE_SH_FIRE:
-                                                       strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
-                                                       if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
-                                                       if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
-                                                       break;
-                                               case ESSENCE_SH_ELEC:
-                                                       strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
-                                                       if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
-                                                       if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
-                                                       break;
-                                               case ESSENCE_SH_COLD:
-                                                       strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
-                                                       if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
-                                                       if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
-                                                       break;
-                                               case ESSENCE_RESISTANCE:
-                                                       strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
-                                                       if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
-                                                       if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
-                                                       if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
-                                                       if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
-                                                       break;
-                                               case ESSENCE_SUSTAIN:
-                                                       strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
-                                                       if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
-                                                       if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
-                                                       if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
-                                                       if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
-                                                       break;
-                                               }
-                                       }
-
-                                       if (!able[ctr]) col = TERM_RED;
-
-                                       if (es_ptr->essence != -1)
-                                       {
-                                               sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
-                                       }
-                                       else
-                                       {
-                                               sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
-                                       }
-
-                                       c_prt(col, dummy2, ctr+2, x);
-                               }
-                       }
-
-                       /* Hide the list */
-                       else
-                       {
-                               /* Hide list */
-                               redraw = FALSE;
-                               screen_load();
-                       }
-
-                       /* Redo asking */
-                       continue;
-               }
-
-               if (!use_menu)
-               {
-                       /* Note verify */
-                       ask = (isupper(choice));
-
-                       /* Lowercase */
-                       if (ask) choice = (char)tolower(choice);
-
-                       /* Extract request */
-                       i = (islower(choice) ? A2I(choice) : -1);
-               }
-
-               /* Totally Illegal */
-               if ((i < 0) || (i >= max_num) || !able[i])
-               {
-                       bell();
-                       continue;
-               }
-
-               /* Verify it */
-               if (ask)
-               {
-                       char tmp_val[160];
-
-                       /* Prompt */
-                       (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
-
-                       /* Belay that order */
-                       if (!get_check(tmp_val)) continue;
-               }
-
-               /* Stop the loop */
-               flag = TRUE;
-       }
-       if (redraw) screen_load();
-
-       if (!flag) return;
-
-       repeat_push(i);
-       }
-       es_ptr = &essence_info[num[i]];
-
-       if (es_ptr->add == ESSENCE_SLAY_GLOVE)
-               item_tester_tval = TV_GLOVES;
-       else if (mode == 1 || mode == 5)
-               item_tester_hook = item_tester_hook_melee_ammo;
-       else if (es_ptr->add == ESSENCE_ATTACK)
-               item_tester_hook = object_allow_enchant_weapon;
-       else if (es_ptr->add == ESSENCE_AC)
-               item_tester_hook = object_is_armour;
-       else
-               item_tester_hook = object_is_weapon_armour_ammo;
-
-       q = _("どのアイテムを改良しますか?", "Improve which item? ");
-       s = _("改良できるアイテムがありません。", "You have nothing to improve.");
-
-       o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
-       if (!o_ptr) return;
-
-       if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
-       {
-               msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
-               return;
-       }
-
-       object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-
-       use_essence = es_ptr->value;
-       if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
-       if (o_ptr->number > 1)
-       {
-               use_essence *= o_ptr->number;
-               msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
-       }
-
-       if (es_ptr->essence != -1)
-       {
-               if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
-               {
-                       msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
-                       return;
-               }
-               if (is_pval_flag(es_ptr->add))
-               {
-                       if (o_ptr->pval < 0)
-                       {
-                               msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
-                               return;
-                       }
-                       else if (es_ptr->add == TR_BLOWS)
-                       {
-                               if (o_ptr->pval > 1)
-                               {
-                                       if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
-                               }
-
-                               o_ptr->pval = 1;
-                               msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
-                       }
-                       else if (o_ptr->pval > 0)
-                       {
-                               use_essence *= o_ptr->pval;
-                               msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
-                       }
-                       else
-                       {
-                               char tmp[80];
-                               char tmp_val[160];
-                               PARAMETER_VALUE pval;
-                               PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
-
-                               sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
-                               strcpy(tmp_val, "1");
-
-                               if (!get_string(tmp, tmp_val, 1)) return;
-                               pval = (PARAMETER_VALUE)atoi(tmp_val);
-                               if (pval > limit) pval = limit;
-                               else if (pval < 1) pval = 1;
-                               o_ptr->pval += pval;
-                               use_essence *= pval;
-                               msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
-                       }
-
-                       if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
-                       {
-                               msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
-                               return;
-                       }
-               }
-               else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
-               {
-                       char tmp_val[160];
-                       int val;
-                       HIT_PROB get_to_h;
-                       HIT_POINT get_to_d;
-
-                       strcpy(tmp_val, "1");
-                       if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
-                       val = atoi(tmp_val);
-                       if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
-                       else if (val < 1) val = 1;
-                       use_essence *= val;
-                       msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
-                       if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
-                       {
-                               msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
-                               return;
-                       }
-                       get_to_h = ((val+1)/2+randint0(val/2+1));
-                       get_to_d = ((val+1)/2+randint0(val/2+1));
-                       o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
-                       o_ptr->to_h += get_to_h;
-                       o_ptr->to_d += get_to_d;
-               }
-               p_ptr->magic_num1[es_ptr->essence] -= use_essence;
-               if (es_ptr->add == ESSENCE_ATTACK)
-               {
-                       if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
-                       {
-                               msg_print(_("改良に失敗した。", "You failed to enchant."));
-                               take_turn(p_ptr, 100);;
-                               return;
-                       }
-                       else
-                       {
-                               if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
-                               if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
-                       }
-               }
-               else if (es_ptr->add == ESSENCE_AC)
-               {
-                       if (o_ptr->to_a >= p_ptr->lev/5+5)
-                       {
-                               msg_print(_("改良に失敗した。", "You failed to enchant."));
-                               take_turn(p_ptr, 100);;
-                               return;
-                       }
-                       else
-                       {
-                               if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
-                       }
-               }
-               else
-               {
-                       o_ptr->xtra3 = es_ptr->add + 1;
-               }
-       }
-       else
-       {
-               bool success = TRUE;
-
-               switch(es_ptr->add)
-               {
-               case ESSENCE_SH_FIRE:
-                       if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
-                       {
-                               success = FALSE;
-                               break;
-                       }
-                       p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
-                       p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
-                       break;
-               case ESSENCE_SH_ELEC:
-                       if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
-                       {
-                               success = FALSE;
-                               break;
-                       }
-                       p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
-                       p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
-                       break;
-               case ESSENCE_SH_COLD:
-                       if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
-                       {
-                               success = FALSE;
-                               break;
-                       }
-                       p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
-                       p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
-                       break;
-               case ESSENCE_RESISTANCE:
-               case ESSENCE_SUSTAIN:
-                       if ((p_ptr->magic_num1[TR_RES_ACID] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
-                       {
-                               success = FALSE;
-                               break;
-                       }
-                       p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
-                       p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
-                       p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
-                       p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
-                       break;
-               }
-               if (!success)
-               {
-                       msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
-                       return;
-               }
-               if (es_ptr->add == ESSENCE_SUSTAIN)
-               {
-                       add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
-                       add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
-                       add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
-                       add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
-               }
-               else
-               {
-                       o_ptr->xtra3 = es_ptr->add + 1;
-               }
-       }
-
-       take_turn(p_ptr, 100);
-
-#ifdef JP
-       msg_format(_("%sに%sの能力を付加しました。", "You have added ability of %s to %s."), o_name, es_ptr->add_name);
-#else
-       msg_format(, es_ptr->add_name, o_name);
-#endif
-       p_ptr->update |= (PU_COMBINE | PU_REORDER);
-       p_ptr->window |= (PW_INVEN);
-}
-
-/*!
- * @brief エッセンスを消去する
- * @return なし
- */
-static void erase_essence(void)
-{
-       OBJECT_IDX item;
-       concptr q, s;
-       object_type *o_ptr;
-       GAME_TEXT o_name[MAX_NLEN];
-       BIT_FLAGS flgs[TR_FLAG_SIZE];
-
-       item_tester_hook = object_is_smith;
-
-       q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
-       s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
-
-       o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
-       if (!o_ptr) return;
-
-       object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-       if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
-
-       take_turn(p_ptr, 100);;
-
-       if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE)
-       {
-               o_ptr->to_h -= (o_ptr->xtra4>>8);
-               o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
-               o_ptr->xtra4 = 0;
-               if (o_ptr->to_h < 0) o_ptr->to_h = 0;
-               if (o_ptr->to_d < 0) o_ptr->to_d = 0;
-       }
-       o_ptr->xtra3 = 0;
-       object_flags(o_ptr, flgs);
-       if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
-       msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
-       p_ptr->update |= (PU_COMBINE | PU_REORDER);
-       p_ptr->window |= (PW_INVEN);
-}
-
-/*!
- * @brief 鍛冶コマンドのメインルーチン
- * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
- * @return なし
- */
-void do_cmd_kaji(bool only_browse)
-{
-       COMMAND_CODE mode = 0;
-       char choice;
-
-       COMMAND_CODE menu_line = (use_menu ? 1 : 0);
-
-       if (!only_browse)
-       {
-               if (cmd_limit_confused(p_ptr)) return;
-               if (p_ptr->blind)
-               {
-                       msg_print(_("目が見えなくて作業できない!", "You are blind!"));
-                       return;
-               }
-               if (p_ptr->image)
-               {
-                       msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
-                       return;
-               }
-       }
-
-       if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
-       {
-       if (only_browse) screen_save();
-       do {
-       if (!only_browse) screen_save();
-       if (use_menu)
-       {
-               while(!mode)
-               {
-#ifdef JP
-                       prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : "  "), 2, 14);
-                       prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : "  "), 3, 14);
-                       prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : "  "), 4, 14);
-                       prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : "  "), 5, 14);
-                       prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : "  "), 6, 14);
-                       prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
-#else
-                       prt(format(" %s List essences", (menu_line == 1) ? "> " : "  "), 2, 14);
-                       prt(format(" %s Extract essence", (menu_line == 2) ? "> " : "  "), 3, 14);
-                       prt(format(" %s Remove essence", (menu_line == 3) ? "> " : "  "), 4, 14);
-                       prt(format(" %s Add essence", (menu_line == 4) ? "> " : "  "), 5, 14);
-                       prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : "  "), 6, 14);
-                       prt(format("Choose command from menu."), 0, 0);
-#endif
-                       choice = inkey();
-                       switch(choice)
-                       {
-                       case ESCAPE:
-                       case 'z':
-                       case 'Z':
-                               screen_load();
-                               return;
-                       case '2':
-                       case 'j':
-                       case 'J':
-                               menu_line++;
-                               break;
-                       case '8':
-                       case 'k':
-                       case 'K':
-                               menu_line+= 4;
-                               break;
-                       case '\r':
-                       case '\n':
-                       case 'x':
-                       case 'X':
-                               mode = menu_line;
-                               break;
-                       }
-                       if (menu_line > 5) menu_line -= 5;
-               }
-       }
-
-       else
-       {
-               while (!mode)
-               {
-                       prt(_("  a) エッセンス一覧", "  a) List essences"), 2, 14);
-                       prt(_("  b) エッセンス抽出", "  b) Extract essence"), 3, 14);
-                       prt(_("  c) エッセンス消去", "  c) Remove essence"), 4, 14);
-                       prt(_("  d) エッセンス付加", "  d) Add essence"), 5, 14);
-                       prt(_("  e) 武器/防具強化", "  e) Enchant weapon/armor"), 6, 14);
-#ifdef JP
-                       if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
-#else
-                       if (!get_com("Command :", &choice, TRUE))
-#endif
-                       {
-                               screen_load();
-                               return;
-                       }
-                       switch (choice)
-                       {
-                       case 'A':
-                       case 'a':
-                               mode = 1;
-                               break;
-                       case 'B':
-                       case 'b':
-                               mode = 2;
-                               break;
-                       case 'C':
-                       case 'c':
-                               mode = 3;
-                               break;
-                       case 'D':
-                       case 'd':
-                               mode = 4;
-                               break;
-                       case 'E':
-                       case 'e':
-                               mode = 5;
-                               break;
-                       }
-               }
-       }
-
-       if (only_browse)
-       {
-               char temp[62*5];
-               int line, j;
-
-               /* Clear lines, position cursor  (really should use strlen here) */
-               Term_erase(14, 21, 255);
-               Term_erase(14, 20, 255);
-               Term_erase(14, 19, 255);
-               Term_erase(14, 18, 255);
-               Term_erase(14, 17, 255);
-               Term_erase(14, 16, 255);
-
-               roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
-               for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
-               {
-                       prt(&temp[j], line, 15);
-                       line++;
-               }
-               mode = 0;
-       }
-       if (!only_browse) screen_load();
-       } while (only_browse);
-       repeat_push(mode);
-       }
-       switch(mode)
-       {
-               case 1: display_essence();break;
-               case 2: drain_essence();break;
-               case 3: erase_essence();break;
-               case 4:
-                       mode = choose_essence();
-                       if (mode == 0)
-                               break;
-                       add_essence(mode);
-                       break;
-               case 5: add_essence(10);break;
-       }
-}
-
-
-/*!
- * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
- * Torches have special abilities when they are flaming.
- * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
- * @param flgs 特別に追加するフラグを返す参照ポインタ
- * @return なし
- */
-void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
+void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
 {
        if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
        {
@@ -8246,3 +5798,40 @@ void torch_lost_fuel(object_type *o_ptr)
                if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;
        }
 }
+
+/*!
+ * @brief 射撃武器に対応する矢/弾薬のベースアイテムIDを返す /
+ * @param o_ptr 判定する射撃武器のアイテム情報参照ポインタ
+ * @return 対応する矢/弾薬のベースアイテムID
+ */
+int bow_tval_ammo(object_type *o_ptr)
+{
+       /* Analyze the launcher */
+       switch (o_ptr->sval)
+       {
+       case SV_SLING:
+       {
+               return TV_SHOT;
+       }
+
+       case SV_SHORT_BOW:
+       case SV_LONG_BOW:
+       case SV_NAMAKE_BOW:
+       {
+               return TV_ARROW;
+       }
+
+       case SV_LIGHT_XBOW:
+       case SV_HEAVY_XBOW:
+       {
+               return TV_BOLT;
+       }
+       case SV_CRIMSON:
+       case SV_HARP:
+       {
+               return TV_NO_AMMO;
+       }
+       }
+
+       return 0;
+}