OSDN Git Service

[Refactor] #37353 cave_type 構造体を grid_type に改名。 / Rename cave_type structure to grid_...
[hengband/hengband.git] / src / spells1.c
index 5a40f3b..401f331 100644 (file)
 #include "trap.h"
 #include "object-curse.h"
 #include "player-damage.h"
+
+#include "monster.h"
+#include "monster-status.h"
+#include "spells-diceroll.h"
+#include "spells-summon.h"
 #include "monsterrace-hook.h"
+
 #include "melee.h"
 #include "world.h"
+#include "projection.h"
+#include "mutation.h"
+#include "rooms.h"
+#include "artifact.h"
+#include "avatar.h"
+#include "player-status.h"
+#include "realm-hex.h"
 
 
 static int rakubadam_m; /*!< 振り落とされた際のダメージ量 */
@@ -27,81 +40,6 @@ static int rakubadam_p; /*!< 落馬した際のダメージ量 */
 int project_length = 0; /*!< 投射の射程距離 */
 
 
-/*!
- * @brief モンスター魅了用セービングスロー共通部(汎用系)
- * @param pow 魅了パワー
- * @param m_ptr 対象モンスター
- * @return 魅了に抵抗したらTRUE
- */
-static bool_hack common_saving_throw_charm(player_type *player_ptr, HIT_POINT pow, monster_type *m_ptr)
-{
-       monster_race *r_ptr = &r_info[m_ptr->r_idx];
-
-       if(p_ptr->inside_arena) return TRUE;
-
-       /* Memorize a flag */
-       if (r_ptr->flagsr & RFR_RES_ALL)
-       {
-               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
-               return TRUE;
-       }
-
-       if (r_ptr->flags3 & RF3_NO_CONF)
-       {
-               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF);
-               return TRUE;
-       }
-
-       if (r_ptr->flags1 & RF1_QUESTOR || m_ptr->mflag2 & MFLAG2_NOPET) return TRUE;
-
-       pow += (adj_chr_chm[player_ptr->stat_ind[A_CHR]] - 1);
-       if((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) pow = pow * 2 / 3;
-       return (r_ptr->level > randint1((pow - 10) < 1 ? 1 : (pow - 10)) + 5);
-}
-
-/*!
- * @brief モンスター服従用セービングスロー共通部(部族依存系)
- * @param pow 服従パワー
- * @param m_ptr 対象モンスター
- * @return 服従に抵抗したらTRUE
- */
-static bool_hack common_saving_throw_control(player_type *player_ptr, HIT_POINT pow, monster_type *m_ptr)
-{
-       monster_race *r_ptr = &r_info[m_ptr->r_idx];
-
-       if (p_ptr->inside_arena) return TRUE;
-
-       /* Memorize a flag */
-       if (r_ptr->flagsr & RFR_RES_ALL)
-       {
-               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
-               return TRUE;
-       }
-
-       if (r_ptr->flags1 & RF1_QUESTOR || m_ptr->mflag2 & MFLAG2_NOPET) return TRUE;
-
-       pow += adj_chr_chm[player_ptr->stat_ind[A_CHR]] - 1;
-       if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) pow = pow * 2 / 3;
-       return (r_ptr->level > randint1((pow - 10) < 1 ? 1 : (pow - 10)) + 5);
-}
-
-/*!
-* @brief 一部ボルト魔法のビーム化確率を算出する / Prepare standard probability to become beam for fire_bolt_or_beam()
-* @return ビーム化確率(%)
-* @details
-* ハードコーティングによる実装が行われている。
-* メイジは(レベル)%、ハイメイジ、スペルマスターは(レベル)%、それ以外の職業は(レベル/2)%
-*/
-PERCENTAGE beam_chance(void)
-{
-       if (p_ptr->pclass == CLASS_MAGE)
-               return (PERCENTAGE)(p_ptr->lev);
-       if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
-               return (PERCENTAGE)(p_ptr->lev + 10);
-
-       return (PERCENTAGE)(p_ptr->lev / 2);
-}
-
 
 /*!
  * @brief 配置した鏡リストの次を取得する /
@@ -111,9 +49,9 @@ PERCENTAGE beam_chance(void)
  * @param cury 現在の鏡のy座標
  * @param curx 現在の鏡のx座標
  */
-static void next_mirror(int* next_y, int* next_x, int cury, int curx)
+static void next_mirror(POSITION* next_y, POSITION* next_x, POSITION cury, POSITION curx)
 {
-       int mirror_x[10], mirror_y[10]; /* 鏡はもっと少ない */
+       POSITION mirror_x[10], mirror_y[10]; /* 鏡はもっと少ない */
        int mirror_num = 0;                       /* 鏡の数 */
        POSITION x, y;
        int num;
@@ -250,7 +188,7 @@ static TERM_COLOR spell_color(int type)
                SYMBOL_CODE c;
 
                /* Lookup the default colors for this type */
-               cptr s = quark_str(gf_color[type]);
+               concptr s = quark_str(gf_color[type]);
 
                if (!s) return (TERM_WHITE);
 
@@ -327,350 +265,6 @@ u16b bolt_pict(POSITION y, POSITION x, POSITION ny, POSITION nx, EFFECT_ID typ)
 }
 
 
-/*!
- * @brief 始点から終点への経路を返す /
- * Determine the path taken by a projection.
- * @param gp 経路座標リストを返す参照ポインタ
- * @param range 距離
- * @param y1 始点Y座標
- * @param x1 始点X座標
- * @param y2 終点Y座標
- * @param x2 終点X座標
- * @param flg フラグID
- * @return リストの長さ
- * @details
- * <pre>
- * The projection will always start from the grid (y1,x1), and will travel
- * towards the grid (y2,x2), touching one grid per unit of distance along
- * the major axis, and stopping when it enters the destination grid or a
- * wall grid, or has travelled the maximum legal distance of "range".
- *
- * Note that "distance" in this function (as in the "update_view()" code)
- * is defined as "MAX(dy,dx) + MIN(dy,dx)/2", which means that the player
- * actually has an "octagon of projection" not a "circle of projection".
- *
- * The path grids are saved into the grid array pointed to by "gp", and
- * there should be room for at least "range" grids in "gp".  Note that
- * due to the way in which distance is calculated, this function normally
- * uses fewer than "range" grids for the projection path, so the result
- * of this function should never be compared directly to "range".  Note
- * that the initial grid (y1,x1) is never saved into the grid array, not
- * even if the initial grid is also the final grid.  
- *
- * The "flg" flags can be used to modify the behavior of this function.
- *
- * In particular, the "PROJECT_STOP" and "PROJECT_THRU" flags have the same
- * semantics as they do for the "project" function, namely, that the path
- * will stop as soon as it hits a monster, or that the path will continue
- * through the destination grid, respectively.
- *
- * The "PROJECT_JUMP" flag, which for the "project()" function means to
- * start at a special grid (which makes no sense in this function), means
- * that the path should be "angled" slightly if needed to avoid any wall
- * grids, allowing the player to "target" any grid which is in "view".
- * This flag is non-trivial and has not yet been implemented, but could
- * perhaps make use of the "vinfo" array (above).  
- *
- * This function returns the number of grids (if any) in the path.  This
- * function will return zero if and only if (y1,x1) and (y2,x2) are equal.
- *
- * This algorithm is similar to, but slightly different from, the one used
- * by "update_view_los()", and very different from the one used by "los()".
- * </pre>
- */
-sint project_path(u16b *gp, POSITION range, POSITION y1, POSITION x1, POSITION y2, POSITION x2, BIT_FLAGS flg)
-{
-       POSITION y, x;
-
-       int n = 0;
-       int k = 0;
-
-       /* Absolute */
-       POSITION ay, ax;
-
-       /* Offsets */
-       POSITION sy, sx;
-
-       /* Fractions */
-       int frac;
-
-       /* Scale factors */
-       int full, half;
-
-       /* Slope */
-       int m;
-
-       /* No path necessary (or allowed) */
-       if ((x1 == x2) && (y1 == y2)) return (0);
-
-
-       /* Analyze "dy" */
-       if (y2 < y1)
-       {
-               ay = (y1 - y2);
-               sy = -1;
-       }
-       else
-       {
-               ay = (y2 - y1);
-               sy = 1;
-       }
-
-       /* Analyze "dx" */
-       if (x2 < x1)
-       {
-               ax = (x1 - x2);
-               sx = -1;
-       }
-       else
-       {
-               ax = (x2 - x1);
-               sx = 1;
-       }
-
-
-       /* Number of "units" in one "half" grid */
-       half = (ay * ax);
-
-       /* Number of "units" in one "full" grid */
-       full = half << 1;
-
-       /* Vertical */
-       if (ay > ax)
-       {
-               /* Let m = ((dx/dy) * full) = (dx * dx * 2) */
-               m = ax * ax * 2;
-
-               /* Start */
-               y = y1 + sy;
-               x = x1;
-
-               frac = m;
-
-               if (frac > half)
-               {
-                       /* Advance (X) part 2 */
-                       x += sx;
-
-                       /* Advance (X) part 3 */
-                       frac -= full;
-
-                       /* Track distance */
-                       k++;
-               }
-
-               /* Create the projection path */
-               while (1)
-               {
-                       /* Save grid */
-                       gp[n++] = GRID(y, x);
-
-                       /* Hack -- Check maximum range */
-                       if ((n + (k >> 1)) >= range) break;
-
-                       /* Sometimes stop at destination grid */
-                       if (!(flg & (PROJECT_THRU)))
-                       {
-                               if ((x == x2) && (y == y2)) break;
-                       }
-
-                       if (flg & (PROJECT_DISI))
-                       {
-                               if ((n > 0) && cave_stop_disintegration(y, x)) break;
-                       }
-                       else if (flg & (PROJECT_LOS))
-                       {
-                               if ((n > 0) && !cave_los_bold(y, x)) break;
-                       }
-                       else if (!(flg & (PROJECT_PATH)))
-                       {
-                               /* Always stop at non-initial wall grids */
-                               if ((n > 0) && !cave_have_flag_bold(y, x, FF_PROJECT)) break;
-                       }
-
-                       /* Sometimes stop at non-initial monsters/players */
-                       if (flg & (PROJECT_STOP))
-                       {
-                               if ((n > 0) &&
-                                       (player_bold(y, x) || cave[y][x].m_idx != 0))
-                                       break;
-                       }
-
-                       if (!in_bounds(y, x)) break;
-
-                       /* Slant */
-                       if (m)
-                       {
-                               /* Advance (X) part 1 */
-                               frac += m;
-
-                               /* Horizontal change */
-                               if (frac > half)
-                               {
-                                       /* Advance (X) part 2 */
-                                       x += sx;
-
-                                       /* Advance (X) part 3 */
-                                       frac -= full;
-
-                                       /* Track distance */
-                                       k++;
-                               }
-                       }
-
-                       /* Advance (Y) */
-                       y += sy;
-               }
-       }
-
-       /* Horizontal */
-       else if (ax > ay)
-       {
-               /* Let m = ((dy/dx) * full) = (dy * dy * 2) */
-               m = ay * ay * 2;
-
-               /* Start */
-               y = y1;
-               x = x1 + sx;
-
-               frac = m;
-
-               /* Vertical change */
-               if (frac > half)
-               {
-                       /* Advance (Y) part 2 */
-                       y += sy;
-
-                       /* Advance (Y) part 3 */
-                       frac -= full;
-
-                       /* Track distance */
-                       k++;
-               }
-
-               /* Create the projection path */
-               while (1)
-               {
-                       /* Save grid */
-                       gp[n++] = GRID(y, x);
-
-                       /* Hack -- Check maximum range */
-                       if ((n + (k >> 1)) >= range) break;
-
-                       /* Sometimes stop at destination grid */
-                       if (!(flg & (PROJECT_THRU)))
-                       {
-                               if ((x == x2) && (y == y2)) break;
-                       }
-
-                       if (flg & (PROJECT_DISI))
-                       {
-                               if ((n > 0) && cave_stop_disintegration(y, x)) break;
-                       }
-                       else if (flg & (PROJECT_LOS))
-                       {
-                               if ((n > 0) && !cave_los_bold(y, x)) break;
-                       }
-                       else if (!(flg & (PROJECT_PATH)))
-                       {
-                               /* Always stop at non-initial wall grids */
-                               if ((n > 0) && !cave_have_flag_bold(y, x, FF_PROJECT)) break;
-                       }
-
-                       /* Sometimes stop at non-initial monsters/players */
-                       if (flg & (PROJECT_STOP))
-                       {
-                               if ((n > 0) &&
-                                       (player_bold(y, x) || cave[y][x].m_idx != 0))
-                                       break;
-                       }
-
-                       if (!in_bounds(y, x)) break;
-
-                       /* Slant */
-                       if (m)
-                       {
-                               /* Advance (Y) part 1 */
-                               frac += m;
-
-                               /* Vertical change */
-                               if (frac > half)
-                               {
-                                       /* Advance (Y) part 2 */
-                                       y += sy;
-
-                                       /* Advance (Y) part 3 */
-                                       frac -= full;
-
-                                       /* Track distance */
-                                       k++;
-                               }
-                       }
-
-                       /* Advance (X) */
-                       x += sx;
-               }
-       }
-
-       /* Diagonal */
-       else
-       {
-               /* Start */
-               y = y1 + sy;
-               x = x1 + sx;
-
-               /* Create the projection path */
-               while (1)
-               {
-                       /* Save grid */
-                       gp[n++] = GRID(y, x);
-
-                       /* Hack -- Check maximum range */
-                       if ((n + (n >> 1)) >= range) break;
-
-                       /* Sometimes stop at destination grid */
-                       if (!(flg & (PROJECT_THRU)))
-                       {
-                               if ((x == x2) && (y == y2)) break;
-                       }
-
-                       if (flg & (PROJECT_DISI))
-                       {
-                               if ((n > 0) && cave_stop_disintegration(y, x)) break;
-                       }
-                       else if (flg & (PROJECT_LOS))
-                       {
-                               if ((n > 0) && !cave_los_bold(y, x)) break;
-                       }
-                       else if (!(flg & (PROJECT_PATH)))
-                       {
-                               /* Always stop at non-initial wall grids */
-                               if ((n > 0) && !cave_have_flag_bold(y, x, FF_PROJECT)) break;
-                       }
-
-                       /* Sometimes stop at non-initial monsters/players */
-                       if (flg & (PROJECT_STOP))
-                       {
-                               if ((n > 0) &&
-                                       (player_bold(y, x) || cave[y][x].m_idx != 0))
-                                       break;
-                       }
-
-                       if (!in_bounds(y, x)) break;
-
-                       /* Advance (Y) */
-                       y += sy;
-
-                       /* Advance (X) */
-                       x += sx;
-               }
-       }
-
-       /* Length */
-       return (n);
-}
-
-
 
 /*
  * Mega-Hack -- track "affected" monsters (see "project()" comments)
@@ -710,7 +304,7 @@ static POSITION monster_target_y; /*!< モンスターの攻撃目標Y座標 */
  */
 static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ)
 {
-       cave_type *c_ptr = &cave[y][x];
+       grid_type *c_ptr = &cave[y][x];
        feature_type *f_ptr = &f_info[c_ptr->feat];
 
        bool obvious = FALSE;
@@ -725,7 +319,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
 
        if (have_flag(f_ptr->flags, FF_TREE))
        {
-               cptr message;
+               concptr message;
                switch (typ)
                {
                case GF_POIS:
@@ -935,101 +529,58 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
                        break;
                }
 
-               /* Make doors */
                case GF_MAKE_DOOR:
                {
-                       /* Require a "naked" floor grid */
                        if (!cave_naked_bold(y, x)) break;
-
-                       /* Not on the player */
                        if (player_bold(y, x)) break;
-
-                       /* Create a closed door */
                        cave_set_feat(y, x, feat_door[DOOR_DOOR].closed);
-
-                       /* Observe */
                        if (c_ptr->info & (CAVE_MARK)) obvious = TRUE;
-
                        break;
                }
 
-               /* Make traps */
                case GF_MAKE_TRAP:
                {
-                       /* Place a trap */
                        place_trap(y, x);
-
                        break;
                }
 
-               /* Make doors */
                case GF_MAKE_TREE:
                {
-                       /* Require a "naked" floor grid */
                        if (!cave_naked_bold(y, x)) break;
-
-                       /* Not on the player */
                        if (player_bold(y, x)) break;
-
-                       /* Create a closed door */
                        cave_set_feat(y, x, feat_tree);
-
-                       /* Observe */
                        if (c_ptr->info & (CAVE_MARK)) obvious = TRUE;
-
-
                        break;
                }
 
                case GF_MAKE_GLYPH:
                {
-                       /* Require a "naked" floor grid */
                        if (!cave_naked_bold(y, x)) break;
-
-                       /* Create a glyph */
                        c_ptr->info |= CAVE_OBJECT;
                        c_ptr->mimic = feat_glyph;
-
                        note_spot(y, x);
-
                        lite_spot(y, x);
-
                        break;
                }
 
                case GF_STONE_WALL:
                {
-                       /* Require a "naked" floor grid */
                        if (!cave_naked_bold(y, x)) break;
-
-                       /* Not on the player */
                        if (player_bold(y, x)) break;
-
-                       /* Place a wall */
                        cave_set_feat(y, x, feat_granite);
-
                        break;
                }
 
-
                case GF_LAVA_FLOW:
                {
-                       /* Ignore permanent grid */
                        if (have_flag(f_ptr->flags, FF_PERMANENT)) break;
-
-                       /* Shallow Lava */
                        if (dam == 1)
                        {
-                               /* Ignore grid without enough space */
                                if (!have_flag(f_ptr->flags, FF_FLOOR)) break;
-
-                               /* Place a shallow lava */
                                cave_set_feat(y, x, feat_shallow_lava);
                        }
-                       /* Deep Lava */
                        else if (dam)
                        {
-                               /* Place a deep lava */
                                cave_set_feat(y, x, feat_deep_lava);
                        }
                        break;
@@ -1037,22 +588,14 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
 
                case GF_WATER_FLOW:
                {
-                       /* Ignore permanent grid */
                        if (have_flag(f_ptr->flags, FF_PERMANENT)) break;
-
-                       /* Shallow Water */
                        if (dam == 1)
                        {
-                               /* Ignore grid without enough space */
                                if (!have_flag(f_ptr->flags, FF_FLOOR)) break;
-
-                               /* Place a shallow water */
                                cave_set_feat(y, x, feat_shallow_water);
                        }
-                       /* Deep Water */
                        else if (dam)
                        {
-                               /* Place a deep water */
                                cave_set_feat(y, x, feat_deep_water);
                        }
                        break;
@@ -1063,7 +606,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
                case GF_LITE:
                {
                        /* Turn on the light */
-                       if (!(d_info[dungeon_type].flags1 & DF1_DARKNESS))
+                       if (!(d_info[p_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
                        {
                                c_ptr->info |= (CAVE_GLOW);
                                note_spot(y, x);
@@ -1105,7 +648,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
 
                                                if (in_bounds2(by, bx))
                                                {
-                                                       cave_type *cc_ptr = &cave[by][bx];
+                                                       grid_type *cc_ptr = &cave[by][bx];
 
                                                        if (have_flag(f_info[get_feat_mimic(cc_ptr)].flags, FF_GLOW))
                                                        {
@@ -1254,7 +797,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
  */
 static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ)
 {
-       cave_type *c_ptr = &cave[y][x];
+       grid_type *c_ptr = &cave[y][x];
 
        OBJECT_IDX this_o_idx, next_o_idx = 0;
 
@@ -1284,7 +827,7 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
                bool ignore = FALSE;
                bool do_kill = FALSE;
 
-               cptr note_kill = NULL;
+               concptr note_kill = NULL;
 
 #ifndef JP
                /* Get the "plural"-ness */
@@ -1293,8 +836,6 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
 
                /* Acquire next object */
                next_o_idx = o_ptr->next_o_idx;
-
-               /* Extract the flags */
                object_flags(o_ptr, flgs);
 
                /* Check for artifact */
@@ -1636,7 +1177,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
 {
        int tmp;
 
-       cave_type *c_ptr = &cave[y][x];
+       grid_type *c_ptr = &cave[y][x];
 
        monster_type *m_ptr = &m_list[c_ptr->m_idx];
        monster_type *caster_ptr = (who > 0) ? &m_list[who] : NULL;
@@ -1693,10 +1234,10 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
        PARAMETER_VALUE photo = 0;
 
        /* Assume no note */
-       cptr note = NULL;
+       concptr note = NULL;
 
        /* Assume a default death */
-       cptr note_dies = extract_note_dies(real_r_idx(m_ptr));
+       concptr note_dies = extract_note_dies(real_r_idx(m_ptr));
 
        POSITION ty = m_ptr->fy;
        POSITION tx = m_ptr->fx;
@@ -2567,8 +2108,8 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
                        else if (dam > 0)
                        {
                                int b = damroll(5, dam) / 4;
-                               cptr str = (p_ptr->pclass == CLASS_MINDCRAFTER) ? _("超能力パワー", "psychic energy") : _("魔力", "mana");
-                               cptr msg = _("あなたは%sの苦痛を%sに変換した!", 
+                               concptr str = (p_ptr->pclass == CLASS_MINDCRAFTER) ? _("超能力パワー", "psychic energy") : _("魔力", "mana");
+                               concptr msg = _("あなたは%sの苦痛を%sに変換した!", 
                                         (seen ? "You convert %s's pain into %s!" : 
                                                         "You convert %ss pain into %s!"));
                                msg_format(msg, m_name, str);
@@ -4978,7 +4519,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
                                int i = 0;
                                if (one_in_(13))
                                {
-                                       while (i < 6)
+                                       while (i < A_MAX)
                                        {
                                                do
                                                {
@@ -5091,7 +4632,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
  * We return "TRUE" if any "obvious" effects were observed.  XXX XXX Actually,
  * we just assume that the effects were obvious, for historical reasons.
  */
-static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ, BIT_FLAGS flg, int monspell)
+static bool project_p(MONSTER_IDX who, concptr who_name, int r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ, BIT_FLAGS flg, int monspell)
 {
        int k = 0;
        DEPTH rlev = 0;
@@ -5115,7 +4656,7 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO
        char killer[80];
 
        /* Hack -- messages */
-       cptr act = NULL;
+       concptr act = NULL;
 
        int get_damage = 0;
 
@@ -5402,19 +4943,21 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO
                        if (fuzzy) msg_print(_("何か湿ったもので攻撃された!", "You are hit by something wet!"));
                        if (!CHECK_MULTISHADOW())
                        {
-                               if (!p_ptr->resist_sound)
+                               if (!p_ptr->resist_sound && !p_ptr->resist_water)
                                {
                                        set_stun(p_ptr->stun + randint1(40));
                                }
-                               if (!p_ptr->resist_conf)
+                               if (!p_ptr->resist_conf && !p_ptr->resist_water)
                                {
                                        set_confused(p_ptr->confused + randint1(5) + 5);
                                }
 
-                               if (one_in_(5))
+                               if (one_in_(5) && !p_ptr->resist_water)
                                {
                                        inven_damage(set_cold_destroy, 3);
                                }
+
+                               if (p_ptr->resist_water) get_damage /= 4;
                        }
 
                        get_damage = take_hit(DAMAGE_ATTACK, dam, killer, monspell);
@@ -5709,7 +5252,7 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO
                                                msg_print(_("あなたは以前ほど力強くなくなってしまった...。", 
                                                                        "You're not as powerful as you used to be..."));
 
-                                               for (k = 0; k < 6; k++)
+                                               for (k = 0; k < A_MAX; k++)
                                                {
                                                        p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
                                                        if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
@@ -6827,11 +6370,11 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da
 
                for (i = 0; i < path_n; ++i)
                {
-                       int oy = y;
-                       int ox = x;
+                       POSITION oy = y;
+                       POSITION ox = x;
 
-                       int ny = GRID_Y(path_g[i]);
-                       int nx = GRID_X(path_g[i]);
+                       POSITION ny = GRID_Y(path_g[i]);
+                       POSITION nx = GRID_X(path_g[i]);
 
                        /* Advance */
                        y = ny;
@@ -6850,8 +6393,8 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da
                                {
                                        u16b p;
 
-                                       byte a;
-                                       char c;
+                                       TERM_COLOR a;
+                                       SYMBOL_CODE c;
 
                                        /* Obtain the bolt pict */
                                        p = bolt_pict(oy, ox, y, x, typ);
@@ -6989,7 +6532,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da
                                        u16b p;
 
                                        TERM_COLOR a;
-                                       char c;
+                                       SYMBOL_CODE c;
 
                                        /* Obtain the bolt pict */
                                        p = bolt_pict(oy, ox, y, x, typ);
@@ -7132,8 +6675,8 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da
                        {
                                u16b p;
 
-                               byte a;
-                               char c;
+                               TERM_COLOR a;
+                               SYMBOL_CODE c;
 
                                /* Obtain the bolt pict */
                                p = bolt_pict(oy, ox, y, x, typ);
@@ -7295,7 +6838,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da
                                        u16b p;
 
                                        TERM_COLOR a;
-                                       char c;
+                                       SYMBOL_CODE c;
 
                                        drawn = TRUE;
 
@@ -7349,10 +6892,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da
                }
        }
 
-
-       /* Update stuff if needed */
-       if (p_ptr->update) handle_stuff();
-
+       update_creature(p_ptr);
 
        if (flg & PROJECT_KILL)
        {
@@ -7393,8 +6933,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da
                }
        }
 
-       /* Update stuff if needed */
-       if (p_ptr->update) handle_stuff();
+       update_creature(p_ptr);
 
        /* Check objects */
        if (flg & (PROJECT_ITEM))
@@ -7893,4 +7432,26 @@ void seal_of_mirror(HIT_POINT dam)
        }
        return;
 }
-        
+
+
+
+/*!
+ * @brief 領域魔法に応じて技能の名称を返す。
+ * @param tval 魔法書のtval
+ * @return 領域魔法の技能名称を保管した文字列ポインタ
+ */
+concptr spell_category_name(OBJECT_TYPE_VALUE tval)
+{
+       switch (tval)
+       {
+       case TV_HISSATSU_BOOK:
+               return _("必殺技", "art");
+       case TV_LIFE_BOOK:
+               return _("祈り", "prayer");
+       case TV_MUSIC_BOOK:
+               return _("歌", "song");
+       default:
+               return _("呪文", "spell");
+       }
+}
+