OSDN Git Service

[Refactor] #37353 cave_type 構造体を grid_type に改名。 / Rename cave_type structure to grid_...
[hengband/hengband.git] / src / spells1.c
index 41d8e48..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; /*!< 振り落とされた際のダメージ量 */
@@ -26,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 配置した鏡リストの次を取得する /
@@ -110,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;
@@ -249,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);
 
@@ -326,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)
@@ -709,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;
@@ -724,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:
@@ -934,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;
@@ -1036,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;
@@ -1062,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);
@@ -1104,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))
                                                        {
@@ -1253,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;
 
@@ -1262,7 +806,7 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
 
        BIT_FLAGS flgs[TR_FLAG_SIZE];
 
-       char o_name[MAX_NLEN];
+       GAME_TEXT o_name[MAX_NLEN];
 
        KIND_OBJECT_IDX k_idx = 0;
        bool is_potion = FALSE;
@@ -1283,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 */
@@ -1292,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 */
@@ -1635,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;
@@ -1686,16 +1228,16 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
        bool heal_leper = FALSE;
 
        /* Hold the monster name */
-       char m_name[80];
+       GAME_TEXT m_name[MAX_NLEN];
        char m_poss[10];
 
        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;
@@ -2566,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);
@@ -4033,7 +3575,6 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
                                                /* Special message */
                                                if (see_s_msg)
                                                {
-                                                       /* Get the monster name */
                                                        monster_desc(killer, caster_ptr, 0);
                                                        msg_format(_("%^sは気分が良さそうだ。", "%^s appears healthier."), killer);
                                                }
@@ -4861,7 +4402,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
 
                if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
                {
-                       char m2_name[80];
+                       char m2_name[MAX_NLEN];
 
                        monster_desc(m2_name, m_ptr, MD_INDEF_VISIBLE);
                        do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_HEAL_LEPER, m2_name);
@@ -4901,11 +4442,9 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
                        if (((dam > 0) || get_angry) && !do_sleep)
                                anger_monster(m_ptr);
 
-                       /* Take note */
                        if ((fear || do_fear) && seen)
                        {
                                sound(SOUND_FLEE);
-
                                msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
                        }
 
@@ -4965,7 +4504,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
                                if (pet) mode |= PM_FORCE_PET;
                                else mode |= (PM_NO_PET | PM_FORCE_FRIENDLY);
 
-                               count += summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (pet ? p_ptr->lev*2/3+randint1(p_ptr->lev/2) : dun_level), 0, mode);
+                               count += summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (pet ? p_ptr->lev*2/3+randint1(p_ptr->lev/2) : dun_level), 0, mode, '\0');
                                if (!one_in_(6)) break;
                        }
                        case 23: case 24: case 25:
@@ -4980,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
                                                {
@@ -5057,8 +4596,6 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P
 
                /* Mark the item as fully known */
                q_ptr->ident |= (IDENT_MENTAL);
-
-               /* Drop it in the dungeon */
                (void)drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
        }
 
@@ -5095,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;
@@ -5113,13 +4650,13 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO
        monster_type *m_ptr = NULL;
 
        /* Monster name (for attacks) */
-       char m_name[80];
+       GAME_TEXT m_name[MAX_NLEN];
 
        /* Monster name (for damage) */
        char killer[80];
 
        /* Hack -- messages */
-       cptr act = NULL;
+       concptr act = NULL;
 
        int get_damage = 0;
 
@@ -5192,12 +4729,8 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO
 
        if (who > 0)
        {
-               /* Get the source monster */
                m_ptr = &m_list[who];
-               /* Extract the monster level */
                rlev = (((&r_info[m_ptr->r_idx])->level >= 1) ? (&r_info[m_ptr->r_idx])->level : 1);
-
-               /* Get the monster name */
                monster_desc(m_name, m_ptr, 0);
 
                /* Get the monster's real name (gotten before polymorph!) */
@@ -5410,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);
@@ -5717,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;
@@ -6163,7 +5698,7 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO
        if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
                && (get_damage > 0) && !p_ptr->is_dead && (who > 0))
        {
-               char m_name_self[80];
+               GAME_TEXT m_name_self[80];
 
                /* hisself */
                monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
@@ -6712,7 +6247,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da
        bool jump = FALSE;
 
        /* Attacker's name (prepared before polymorph)*/
-       char who_name[80];
+       GAME_TEXT who_name[MAX_NLEN];
 
        /* Can the player see the source of this effect? */
        bool see_s_msg = TRUE;
@@ -6835,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;
@@ -6858,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);
@@ -6997,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);
@@ -7140,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);
@@ -7303,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;
 
@@ -7357,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)
        {
@@ -7401,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))
@@ -7701,7 +7232,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da
 
        if (p_ptr->riding)
        {
-               char m_name[80];
+               GAME_TEXT m_name[MAX_NLEN];
 
                monster_desc(m_name, &m_list[p_ptr->riding], 0);
 
@@ -7901,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");
+       }
+}
+