OSDN Git Service

ガラスの地形であることを示す地形フラグGLASSを実装. ガラスの地形は以下
authornothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Thu, 27 May 2004 16:05:37 +0000 (16:05 +0000)
committernothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Thu, 27 May 2004 16:05:37 +0000 (16:05 +0000)
の仕様とした.
* ガラスの地形を叩き開ける (BASH), 掘る (TUNNEL), 岩石に効く魔法を使
  う (HURT_ROCK), 分解する (HURT_DISI) と割れる.
* ドアを叩き開ける時は通常のドアと違いOPENアクションは実行されず, 必
  ずBASHアクションが実行される.
* 破片で50ダメージ以上, 轟音で200ダメージ以上を与えると割れる. ダメー
  ジが蓄積するわけではない.
* ガラスの地形が割れると半径1の破片爆発が発生する. ダメージは中心部で
  も25を上限とする. 破片爆発の "詠唱者" IDには特殊IDを用いる.
* モンスターが地形を破壊した際のメッセージが変わる.
* ガラスの地形が壊れる際のサウンドをlib/xtra/sound/sound.cfgのglass
  エントリで設定できるようにした. このサウンドは鏡が割れた際にも用い
  られる. なお, ガラスのドアを壊した場合は通常のopendoorエントリのサ
  ウンドは用いられない. また, 地形を破壊しても元々メッセージのない部
  分ではサウンドは鳴らない.
* HPが少ない非STUPIDのモンスターはガラスの地形の破壊を試みない.
* ガラスの地形を岩喰いで食べることはできない.

関連して, 以下の変更を含む.
* ガラスの破片が飛び散った位置が視界外かどうか判定するため,
  project_m()の変数see_s_msgを引数に変更. そのsee_s_msgの設定は地形の
  処理以前に行うようにした.
* project_m()で, モンスターが見えていない場合は思い出ウィンドウ再描画
  を行わないように変更. ただしモンスターが死ぬ瞬間には再描画する.
* 壁掘り能力で破壊可能な地形判定をTUNNELではなくHURT_DISIに変更.
* ガラスの床は割れると暗い穴になるように変更.

12 files changed:
lib/edit/f_info.txt
lib/xtra/sound/sound.cfg
src/cave.c
src/cmd1.c
src/cmd2.c
src/defines.h
src/init1.c
src/melee2.c
src/mutation.c
src/spells1.c
src/tables.c
src/variable.c

index e30be5b..98bed59 100644 (file)
@@ -1473,7 +1473,9 @@ J:
 E:glass floor
 G:.:w:LIT
 W:2
-F:LOS | PROJECT | MOVE | PLACE | DROP | FLOOR | CAN_FLY | TELEPORTABLE
+K:DESTROYED:DARK_PIT
+F:LOS | PROJECT | MOVE | PLACE | DROP | FLOOR | CAN_FLY | HURT_DISI |
+F:TELEPORTABLE | GLASS
 
 N:200:OPEN_GLASS_DOOR
 J:³«¤¤¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1483,7 +1485,7 @@ W:10
 K:DESTROYED:*FLOOR*
 K:CLOSE:CLOSED_GLASS_DOOR
 F:LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | CLOSE | DOOR | CAN_FLY |
-F:HURT_DISI | TELEPORTABLE
+F:HURT_DISI | TELEPORTABLE | GLASS
 
 N:201:BROKEN_GLASS_DOOR
 J:²õ¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1492,7 +1494,7 @@ G:':W
 W:10
 K:DESTROYED:*FLOOR*
 F:LOS | PROJECT | MOVE | PLACE | DROP | NOTICE | REMEMBER | CLOSE | DOOR |
-F:CAN_FLY | HURT_DISI | TELEPORTABLE
+F:CAN_FLY | HURT_DISI | TELEPORTABLE | GLASS
 
 N:202:CLOSED_GLASS_DOOR
 J:¥¬¥é¥¹¤Î¥É¥¢
@@ -1504,7 +1506,7 @@ K:OPEN:OPEN_GLASS_DOOR
 K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_1
 F:POWER_0 | LOS | NOTICE | REMEMBER | OPEN | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:203:LOCKED_GLASS_DOOR_1
 J:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1518,7 +1520,7 @@ K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_2
 K:DISARM:CLOSED_GLASS_DOOR
 F:POWER_1 | LOS | NOTICE | REMEMBER | OPEN | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:204:LOCKED_GLASS_DOOR_2
 J:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1532,7 +1534,7 @@ K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_3
 K:DISARM:CLOSED_GLASS_DOOR
 F:POWER_2 | LOS | NOTICE | REMEMBER | OPEN | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:205:LOCKED_GLASS_DOOR_3
 J:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1546,7 +1548,7 @@ K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_4
 K:DISARM:CLOSED_GLASS_DOOR
 F:POWER_3 | LOS | NOTICE | REMEMBER | OPEN | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:206:LOCKED_GLASS_DOOR_4
 J:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1560,7 +1562,7 @@ K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_5
 K:DISARM:CLOSED_GLASS_DOOR
 F:POWER_4 | LOS | NOTICE | REMEMBER | OPEN | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:207:LOCKED_GLASS_DOOR_5
 J:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1574,7 +1576,7 @@ K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_6
 K:DISARM:CLOSED_GLASS_DOOR
 F:POWER_5 | LOS | NOTICE | REMEMBER | OPEN | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:208:LOCKED_GLASS_DOOR_6
 J:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1588,7 +1590,7 @@ K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_7
 K:DISARM:CLOSED_GLASS_DOOR
 F:POWER_6 | LOS | NOTICE | REMEMBER | OPEN | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:209:LOCKED_GLASS_DOOR_7
 J:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1602,7 +1604,7 @@ K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_7
 K:DISARM:CLOSED_GLASS_DOOR
 F:POWER_7 | LOS | NOTICE | REMEMBER | OPEN | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:210:JAMMED_GLASS_DOOR_0
 J:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1615,7 +1617,7 @@ K:OPEN:BROKEN_GLASS_DOOR
 K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_1
 F:POWER_0 | LOS | NOTICE | REMEMBER | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:211:JAMMED_GLASS_DOOR_1
 J:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1628,7 +1630,7 @@ K:OPEN:BROKEN_GLASS_DOOR
 K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_2
 F:POWER_1 | LOS | NOTICE | REMEMBER | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:212:JAMMED_GLASS_DOOR_2
 J:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1641,7 +1643,7 @@ K:OPEN:BROKEN_GLASS_DOOR
 K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_3
 F:POWER_2 | LOS | NOTICE | REMEMBER | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:213:JAMMED_GLASS_DOOR_3
 J:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1654,7 +1656,7 @@ K:OPEN:BROKEN_GLASS_DOOR
 K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_4
 F:POWER_3 | LOS | NOTICE | REMEMBER | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:214:JAMMED_GLASS_DOOR_4
 J:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1667,7 +1669,7 @@ K:OPEN:BROKEN_GLASS_DOOR
 K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_5
 F:POWER_4 | LOS | NOTICE | REMEMBER | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:215:JAMMED_GLASS_DOOR_5
 J:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1680,7 +1682,7 @@ K:OPEN:BROKEN_GLASS_DOOR
 K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_6
 F:POWER_5 | LOS | NOTICE | REMEMBER | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:216:JAMMED_GLASS_DOOR_6
 J:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1693,7 +1695,7 @@ K:OPEN:BROKEN_GLASS_DOOR
 K:BASH:BROKEN_GLASS_DOOR
 K:SPIKE:JAMMED_GLASS_DOOR_7
 F:POWER_6 | LOS | NOTICE | REMEMBER | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:217:JAMMED_GLASS_DOOR_7
 J:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
@@ -1705,7 +1707,7 @@ K:DESTROYED:*FLOOR*
 K:OPEN:BROKEN_GLASS_DOOR
 K:BASH:BROKEN_GLASS_DOOR
 F:POWER_7 | LOS | NOTICE | REMEMBER | BASH | SPIKE | TUNNEL | DOOR |
-F:HURT_ROCK | CAN_PASS | HURT_DISI
+F:HURT_ROCK | CAN_PASS | HURT_DISI | GLASS
 
 N:218:GLASS_WALL
 J:¥¬¥é¥¹¤ÎÊÉ
@@ -1713,7 +1715,8 @@ E:glass wall
 G:#:w:LIT
 W:2
 K:DESTROYED:*FLOOR*
-F:POWER_40 | LOS | REMEMBER | TUNNEL | WALL | HURT_ROCK | CAN_PASS | HURT_DISI
+F:POWER_40 | LOS | REMEMBER | TUNNEL | WALL | HURT_ROCK | CAN_PASS |
+F:HURT_DISI | GLASS
 
 N:219:PERMANENT_GLASS_WALL
 J:±Êµ×¥¬¥é¥¹¤ÎÊÉ
@@ -1721,7 +1724,7 @@ E:permanent glass wall
 G:#:w:LIT
 W:5
 K:UNPERM:GLASS_WALL
-F:REMEMBER | LOS | TUNNEL | WALL | PERMANENT
+F:REMEMBER | LOS | TUNNEL | WALL | PERMANENT | GLASS
 
 #### Curtains (220-221) (for testing) ####
 
index eb3a7f3..f6582b0 100644 (file)
@@ -76,4 +76,5 @@ moan =
 show =
 unused =
 explode =
+glass =
 
index b781a52..7739bf8 100644 (file)
@@ -4747,6 +4747,17 @@ void cave_alter_feat(int y, int x, int action)
 #endif
                }
        }
+
+       if (feature_action_flags[action] & FAF_CRASH_GLASS)
+       {
+               feature_type *old_f_ptr = &f_info[oldfeat];
+
+               if (have_flag(old_f_ptr->flags, FF_GLASS) && character_dungeon)
+               {
+                       project(PROJECT_WHO_GLASS_SHARDS, 1, y, x, MIN(dun_level, 100) / 4, GF_SHARDS,
+                               (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_HIDE | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1);
+               }
+       }
 }
 
 
index 91d49dd..e5181cb 100644 (file)
@@ -3864,7 +3864,7 @@ void move_player(int dir, bool do_pickup, bool break_trap)
 
        /* Player can not walk through "walls"... */
        /* unless in Shadow Form */
-       p_can_kill_walls = p_ptr->kill_wall && have_flag(f_ptr->flags, FF_TUNNEL) &&
+       p_can_kill_walls = p_ptr->kill_wall && have_flag(f_ptr->flags, FF_HURT_DISI) &&
                (!p_can_enter || !have_flag(f_ptr->flags, FF_LOS)) &&
                !have_flag(f_ptr->flags, FF_PERMANENT);
 
index 505fd0a..22b027c 100644 (file)
@@ -1608,6 +1608,9 @@ static bool do_cmd_tunnel_aux(int y, int x)
                        }
 #endif
 
+                       /* Sound */
+                       if (have_flag(f_ptr->flags, FF_GLASS)) sound(SOUND_GLASS);
+
                        /* Remove the feature */
                        cave_alter_feat(y, x, FF_TUNNEL);
 
@@ -2235,12 +2238,15 @@ static bool do_cmd_bash_aux(int y, int x, int dir)
        /* Get grid */
        cave_type       *c_ptr = &cave[y][x];
 
+       /* Get feature */
+       feature_type *f_ptr = &f_info[c_ptr->feat];
+
        /* Hack -- Bash power based on strength */
        /* (Ranges from 3 to 20 to 100 to 200) */
        int bash = adj_str_blow[p_ptr->stat_ind[A_STR]];
 
        /* Extract door power */
-       int temp = f_info[c_ptr->feat].power;
+       int temp = f_ptr->power;
 
        bool            more = FALSE;
 
@@ -2274,9 +2280,11 @@ static bool do_cmd_bash_aux(int y, int x, int dir)
                msg_format("The %s crashes open!", name);
 #endif
 
+               /* Sound */
+               sound(have_flag(f_ptr->flags, FF_GLASS) ? SOUND_GLASS : SOUND_OPENDOOR);
 
                /* Break down the door */
-               if ((randint0(100) < 50) || (feat_state(c_ptr->feat, FF_OPEN) == c_ptr->feat))
+               if ((randint0(100) < 50) || (feat_state(c_ptr->feat, FF_OPEN) == c_ptr->feat) || have_flag(f_ptr->flags, FF_GLASS))
                {
                        cave_alter_feat(y, x, FF_BASH);
                }
@@ -2287,9 +2295,6 @@ static bool do_cmd_bash_aux(int y, int x, int dir)
                        cave_alter_feat(y, x, FF_OPEN);
                }
 
-               /* Sound */
-               sound(SOUND_OPENDOOR);
-
                /* Hack -- Fall through the door */
                move_player(dir, FALSE, FALSE);
        }
index bf1f15a..d98190f 100644 (file)
 #define FF_UNPERM        109
 #define FF_TELEPORTABLE  110
 #define FF_CONVERT       111
+#define FF_GLASS         112
 
-#define FF_FLAG_MAX      112
+#define FF_FLAG_MAX      113
 #define FF_FLAG_SIZE     (1 + ((FF_FLAG_MAX - 1) / 32))
 
 /* Which features are dynamic */
 /*
  * Feature action flags
  */
-#define FAF_DESTROY 0x01
-#define FAF_NO_DROP 0x02
+#define FAF_DESTROY     0x01
+#define FAF_NO_DROP     0x02
+#define FAF_CRASH_GLASS 0x04
 
 
 /*
  * Special caster ID for project()
  */
 #define PROJECT_WHO_UNCTRL_POWER -1
+#define PROJECT_WHO_GLASS_SHARDS -2
 
 
 /*
@@ -4571,11 +4574,12 @@ extern int PlayerUID;
 #define SOUND_SHOW      62 /* A monster makes a "show" attack */
 #define SOUND_UNUSED    63 /* (no sound for gaze attacks) */
 #define SOUND_EXPLODE   64 /* Something (or somebody) explodes */
+#define SOUND_GLASS     65 /* A glass feature was crashed */
 
 /*
  * Mega-Hack -- maximum known sounds
  */
-#define SOUND_MAX 65
+#define SOUND_MAX 66
 
 #define MAX_VIRTUE 18
 
index b137c1e..97e1f72 100644 (file)
@@ -247,6 +247,7 @@ static cptr f_info_flags[] =
        "UNPERM",
        "TELEPORTABLE",
        "CONVERT",
+       "GLASS",
 };
 
 
index 82aac23..4ee3b46 100644 (file)
@@ -2846,12 +2846,26 @@ msg_format("%^s%s", m_name, monmessage);
                        do_move = TRUE;
                }
 
+               /* Possibly a monster to attack */
                else if (c_ptr->m_idx)
                {
-                       /* Possibly a monster to attack */
                        do_move = TRUE;
                }
 
+               /* Monster destroys walls (and doors) */
+               else if ((r_ptr->flags2 & RF2_KILL_WALL) &&
+                        (can_cross ? !have_flag(f_ptr->flags, FF_LOS) : !is_riding_mon) &&
+                        have_flag(f_ptr->flags, FF_HURT_DISI) && !have_flag(f_ptr->flags, FF_PERMANENT) &&
+                        (!have_flag(f_ptr->flags, FF_GLASS) || (r_ptr->flags2 & RF2_STUPID) || (m_ptr->hp >= MAX(m_ptr->maxhp / 3, 200))))
+               {
+                       /* Eat through walls/doors/rubble */
+                       do_move = TRUE;
+                       if (!can_cross) must_alter_to_move = TRUE;
+
+                       /* Monster destroyed a wall (later) */
+                       did_kill_wall = TRUE;
+               }
+
                /* Floor is open? */
                else if (can_cross)
                {
@@ -2865,25 +2879,6 @@ msg_format("%^s%s", m_name, monmessage);
                                /* Monster went through a wall */
                                did_pass_wall = TRUE;
                        }
-
-                       if ((r_ptr->flags2 & RF2_KILL_WALL) && have_flag(f_ptr->flags, FF_TUNNEL) &&
-                           !have_flag(f_ptr->flags, FF_LOS) && !have_flag(f_ptr->flags, FF_PERMANENT))
-                       {
-                               /* Monster destroyed a wall (later) */
-                               did_kill_wall = TRUE;
-                       }
-               }
-
-               /* Monster destroys walls (and doors) */
-               else if ((r_ptr->flags2 & RF2_KILL_WALL) && !is_riding_mon &&
-                        have_flag(f_ptr->flags, FF_TUNNEL) && !have_flag(f_ptr->flags, FF_PERMANENT))
-               {
-                       /* Eat through walls/doors/rubble */
-                       do_move = TRUE;
-                       must_alter_to_move = TRUE;
-
-                       /* Monster destroyed a wall (later) */
-                       did_kill_wall = TRUE;
                }
 
                /* Handle doors and secret doors */
@@ -2937,10 +2932,17 @@ msg_format("%^s%s", m_name, monmessage);
                                if (randint0(m_ptr->hp / 10) > f_ptr->power)
                                {
                                        /* Message */
+                                       if (have_flag(f_ptr->flags, FF_GLASS))
+#ifdef JP
+                                               msg_print("¥¬¥é¥¹¤¬ºÕ¤±¤ë²»¤¬¤·¤¿¡ª");
+#else
+                                               msg_print("You hear a glass was crashed!");
+#endif
+                                       else
 #ifdef JP
-                                       msg_print("¥É¥¢¤ò᤭³«¤±¤ë²»¤¬¤·¤¿¡ª");
+                                               msg_print("¥É¥¢¤ò᤭³«¤±¤ë²»¤¬¤·¤¿¡ª");
 #else
-                                       msg_print("You hear a door burst open!");
+                                               msg_print("You hear a door burst open!");
 #endif
 
                                        /* Disturb (sometimes) */
@@ -2960,9 +2962,19 @@ msg_format("%^s%s", m_name, monmessage);
                        if (did_open_door || did_bash_door)
                        {
                                /* Break down the door */
-                               if (did_bash_door && ((randint0(100) < 50) || (feat_state(c_ptr->feat, FF_OPEN) == c_ptr->feat)))
+                               if (did_bash_door && ((randint0(100) < 50) || (feat_state(c_ptr->feat, FF_OPEN) == c_ptr->feat) || have_flag(f_ptr->flags, FF_GLASS)))
                                {
                                        cave_alter_feat(ny, nx, FF_BASH);
+
+                                       if (!m_ptr->r_idx) /* Killed by shards of glass, etc. */
+                                       {
+                                               /* Update some things */
+                                               p_ptr->update |= (PU_FLOW);
+                                               p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+                                               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_BASH_DOOR);
+
+                                               return;
+                                       }
                                }
 
                                /* Open the door */
@@ -3172,14 +3184,32 @@ msg_format("%^s%s", m_name, monmessage);
                {
                        if (one_in_(GRINDNOISE))
                        {
+                               if (have_flag(f_ptr->flags, FF_GLASS))
 #ifdef JP
-                               msg_print("¥®¥·¥®¥·¤¤¤¦²»¤¬Ê¹¤³¤¨¤ë¡£");
+                                       msg_print("²¿¤«¤ÎºÕ¤±¤ë²»¤¬Ê¹¤³¤¨¤ë¡£");
 #else
-                               msg_print("There is a grinding sound.");
+                                       msg_print("There is a crashing sound.");
+#endif
+                               else
+#ifdef JP
+                                       msg_print("¥®¥·¥®¥·¤¤¤¦²»¤¬Ê¹¤³¤¨¤ë¡£");
+#else
+                                       msg_print("There is a grinding sound.");
 #endif
                        }
 
                        cave_alter_feat(ny, nx, FF_HURT_DISI);
+
+                       if (!m_ptr->r_idx) /* Killed by shards of glass, etc. */
+                       {
+                               /* Update some things */
+                               p_ptr->update |= (PU_FLOW);
+                               p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+                               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_KILL_WALL);
+
+                               return;
+                       }
+
                        f_ptr = &f_info[c_ptr->feat];
 
                        /* Note changes to viewable region */
index 2ea3d92..14fe6da 100644 (file)
@@ -3465,17 +3465,18 @@ bool mutation_power_aux(u32b power)
                        {
                                int x, y;
                                cave_type *c_ptr;
-                               feature_type *f_ptr;
+                               feature_type *f_ptr, *mimic_f_ptr;
 
                                if (!get_rep_dir2(&dir)) return FALSE;
                                y = py + ddy[dir];
                                x = px + ddx[dir];
                                c_ptr = &cave[y][x];
                                f_ptr = &f_info[c_ptr->feat];
+                               mimic_f_ptr = &f_info[get_feat_mimic(c_ptr)];
 
                                if (music_singing_any()) stop_singing();
 
-                               if (!have_flag(f_info[get_feat_mimic(c_ptr)].flags, FF_HURT_ROCK))
+                               if (!have_flag(mimic_f_ptr->flags, FF_HURT_ROCK))
                                {
 #ifdef JP
                                        msg_print("¤³¤ÎÃÏ·Á¤Ï¿©¤Ù¤é¤ì¤Ê¤¤¡£");
@@ -3487,9 +3488,9 @@ bool mutation_power_aux(u32b power)
                                else if (have_flag(f_ptr->flags, FF_PERMANENT))
                                {
 #ifdef JP
-                                       msg_format("¤¤¤Æ¤Ã¡ª¤³¤Î%s¤Ï¤¢¤Ê¤¿¤Î»õ¤è¤ê¹Å¤¤¡ª", f_name + f_info[get_feat_mimic(c_ptr)].name);
+                                       msg_format("¤¤¤Æ¤Ã¡ª¤³¤Î%s¤Ï¤¢¤Ê¤¿¤Î»õ¤è¤ê¹Å¤¤¡ª", f_name + mimic_f_ptr->name);
 #else
-                                       msg_format("Ouch!  This %s is harder than your teeth!", f_name + f_info[get_feat_mimic(c_ptr)].name);
+                                       msg_format("Ouch!  This %s is harder than your teeth!", f_name + mimic_f_ptr->name);
 #endif
                                        break;
                                }
@@ -3514,6 +3515,15 @@ bool mutation_power_aux(u32b power)
 #endif
                                        break;
                                }
+                               else if (have_flag(f_ptr->flags, FF_GLASS))
+                               {
+#ifdef JP
+                                       msg_print("¥¬¥é¥¹¤ÎÌ£¤Ï¹¥¤­¤¸¤ã¤Ê¤¤¡ª");
+#else
+                                       msg_print("You don't like the glassy taste!");
+#endif
+                                       break;
+                               }
                                else if (have_flag(f_ptr->flags, FF_DOOR) || have_flag(f_ptr->flags, FF_CAN_DIG))
                                {
                                        (void)set_food(p_ptr->food + 3000);
@@ -3525,9 +3535,9 @@ bool mutation_power_aux(u32b power)
                                else
                                {
 #ifdef JP
-                                       msg_format("¤³¤Î%s¤Ï¤È¤Æ¤â¤ª¤¤¤·¤¤¡ª", f_name + f_info[get_feat_mimic(c_ptr)].name);
+                                       msg_format("¤³¤Î%s¤Ï¤È¤Æ¤â¤ª¤¤¤·¤¤¡ª", f_name + mimic_f_ptr->name);
 #else
-                                       msg_format("This %s is very filling!", f_name + f_info[get_feat_mimic(c_ptr)].name);
+                                       msg_format("This %s is very filling!", f_name + mimic_f_ptr->name);
 #endif
                                        (void)set_food(p_ptr->food + 10000);
                                }
index 473af57..bcaffd3 100644 (file)
@@ -1112,11 +1112,33 @@ static bool project_f(int who, int r, int y, int x, int dam, int typ)
 #else
                                msg_print("The mirror was crashed!");
 #endif
+                               sound(SOUND_GLASS);
                                remove_mirror(y, x);
                                project(0, 2, y, x, p_ptr->lev / 2 + 5, GF_SHARDS, (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1);
                        }
+
+                       if (have_flag(f_ptr->flags, FF_GLASS) && !have_flag(f_ptr->flags, FF_PERMANENT) && (dam >= 50))
+                       {
+                               /* Message */
+                               if (known && (c_ptr->info & CAVE_MARK))
+                               {
+#ifdef JP
+                                       msg_format("%s¤¬³ä¤ì¤¿¡ª", f_name + f_info[get_feat_mimic(c_ptr)].name);
+#else
+                                       msg_format("The %s was crashed!", f_name + f_info[get_feat_mimic(c_ptr)].name);
+#endif
+                                       sound(SOUND_GLASS);
+                               }
+
+                               /* Destroy the wall */
+                               cave_alter_feat(y, x, FF_HURT_ROCK);
+
+                               /* Update some things */
+                               p_ptr->update |= (PU_FLOW);
+                       }
                        break;
                }
+
                case GF_SOUND:
                {
                        if (is_mirror_grid(c_ptr) && p_ptr->lev < 40)
@@ -1126,9 +1148,30 @@ static bool project_f(int who, int r, int y, int x, int dam, int typ)
 #else
                                msg_print("The mirror was crashed!");
 #endif
+                               sound(SOUND_GLASS);
                                remove_mirror(y, x);
                                project(0, 2, y, x, p_ptr->lev / 2 + 5, GF_SHARDS, (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1);
                        }
+
+                       if (have_flag(f_ptr->flags, FF_GLASS) && !have_flag(f_ptr->flags, FF_PERMANENT) && (dam >= 200))
+                       {
+                               /* Message */
+                               if (known && (c_ptr->info & CAVE_MARK))
+                               {
+#ifdef JP
+                                       msg_format("%s¤¬³ä¤ì¤¿¡ª", f_name + f_info[get_feat_mimic(c_ptr)].name);
+#else
+                                       msg_format("The %s was crashed!", f_name + f_info[get_feat_mimic(c_ptr)].name);
+#endif
+                                       sound(SOUND_GLASS);
+                               }
+
+                               /* Destroy the wall */
+                               cave_alter_feat(y, x, FF_HURT_ROCK);
+
+                               /* Update some things */
+                               p_ptr->update |= (PU_FLOW);
+                       }
                        break;
                }
 
@@ -1639,7 +1682,7 @@ msg_format("%s
  * We attempt to return "TRUE" if the player saw anything "useful" happen.
  */
 /* "flg" was added. */
-static bool project_m(int who, int r, int y, int x, int dam, int typ , int flg)
+static bool project_m(int who, int r, int y, int x, int dam, int typ, int flg, bool see_s_msg)
 {
        int tmp;
 
@@ -1664,9 +1707,6 @@ static bool project_m(int who, int r, int y, int x, int dam, int typ , int flg)
        /* Can the player know about this effect? */
        bool known = ((m_ptr->cdis <= MAX_SIGHT) || p_ptr->inside_battle);
 
-       /* Can the player see the source of this effect? */
-       bool see_s_msg = ((who <= 0) || is_seen(caster_ptr));
-
        /* Were the effects "irrelevant"? */
        bool skipped = FALSE;
 
@@ -6206,14 +6246,14 @@ msg_print("
        /* XXX XXX XXX Verify this code */
 
        /* Update the monster */
-       update_mon(c_ptr->m_idx, FALSE);
+       if (m_ptr->r_idx) update_mon(c_ptr->m_idx, FALSE);
 
        /* Redraw the monster grid */
        lite_spot(y, x);
 
 
        /* Update monster recall window */
-       if (p_ptr->monster_race_idx == m_ptr->r_idx)
+       if ((p_ptr->monster_race_idx == m_ptr->r_idx) && (seen || !m_ptr->r_idx))
        {
                /* Window stuff */
                p_ptr->window |= (PW_MONSTER);
@@ -6413,6 +6453,14 @@ static bool project_p(int who, cptr who_name, int r, int y, int x, int dam, int
 #endif
                        break;
 
+               case PROJECT_WHO_GLASS_SHARDS:
+#ifdef JP
+                       strcpy(killer, "¥¬¥é¥¹¤ÎÇËÊÒ");
+#else
+                       strcpy(killer, "shards of glass");
+#endif
+                       break;
+
                default:
 #ifdef JP
                        strcpy(killer, "æ«");
@@ -8203,6 +8251,9 @@ bool project(int who, int rad, int y, int x, int dam, int typ, int flg, int mons
        /* Attacker's name (prepared before polymorph)*/
        char who_name[80];
 
+       /* Can the player see the source of this effect? */
+       bool see_s_msg = TRUE;
+
        /* Initialize by null string */
        who_name[0] = '\0';
 
@@ -8405,7 +8456,7 @@ bool project(int who, int rad, int y, int x, int dam, int typ, int flg, int mons
                                {
                                        y = GRID_Y(path_g[j]);
                                        x = GRID_X(path_g[j]);
-                                       if(project_m(0,0,y,x,dam,GF_SEEKER,flg))notice=TRUE;
+                                       if(project_m(0,0,y,x,dam,GF_SEEKER,flg,TRUE))notice=TRUE;
                                        if(!who && (project_m_n==1) && !jump ){
                                          if(cave[project_m_y][project_m_x].m_idx >0 ){
                                            monster_type *m_ptr = &m_list[cave[project_m_y][project_m_x].m_idx];
@@ -8427,7 +8478,7 @@ bool project(int who, int rad, int y, int x, int dam, int typ, int flg, int mons
                        int x,y;
                        y = GRID_Y(path_g[i]);
                        x = GRID_X(path_g[i]);
-                       if(project_m(0,0,y,x,dam,GF_SEEKER,flg))
+                       if(project_m(0,0,y,x,dam,GF_SEEKER,flg,TRUE))
                          notice=TRUE;
                        if(!who && (project_m_n==1) && !jump ){
                          if(cave[project_m_y][project_m_x].m_idx >0 ){
@@ -8557,7 +8608,7 @@ bool project(int who, int rad, int y, int x, int dam, int typ, int flg, int mons
                        int x,y;
                        y = GRID_Y(path_g[i]);
                        x = GRID_X(path_g[i]);
-                       (void)project_m(0,0,y,x,dam,GF_SUPER_RAY,flg);
+                       (void)project_m(0,0,y,x,dam,GF_SUPER_RAY,flg,TRUE);
                        if(!who && (project_m_n==1) && !jump ){
                          if(cave[project_m_y][project_m_x].m_idx >0 ){
                            monster_type *m_ptr = &m_list[cave[project_m_y][project_m_x].m_idx];
@@ -8841,6 +8892,13 @@ bool project(int who, int rad, int y, int x, int dam, int typ, int flg, int mons
        if (p_ptr->update) update_stuff();
 
 
+       if (flg & PROJECT_KILL)
+       {
+               see_s_msg = (who > 0) ? is_seen(&m_list[who]) :
+                       (!who ? TRUE : player_can_see_bold(y1, x1));
+       }
+
+
        /* Check features */
        if (flg & (PROJECT_GRID))
        {
@@ -9067,7 +9125,7 @@ bool project(int who, int rad, int y, int x, int dam, int typ, int flg, int mons
                        }
 
                        /* Affect the monster in the grid */
-                       if (project_m(who, effective_dist, y, x, dam, typ,flg)) notice = TRUE;
+                       if (project_m(who, effective_dist, y, x, dam, typ, flg, see_s_msg)) notice = TRUE;
                }
 
 
@@ -9333,7 +9391,7 @@ bool binding_field( int dam )
                        {
                                if (player_has_los_bold(y, x) && projectable(py, px, y, x)) {
                                        (void)project_m(0,0,y,x,dam,GF_MANA,
-                                         (PROJECT_GRID|PROJECT_ITEM|PROJECT_KILL|PROJECT_JUMP));
+                                         (PROJECT_GRID|PROJECT_ITEM|PROJECT_KILL|PROJECT_JUMP),TRUE);
                                }
                        }
                }
@@ -9361,7 +9419,7 @@ void seal_of_mirror( int dam )
                        if( is_mirror_grid(&cave[y][x]))
                        {
                                if(project_m(0,0,y,x,dam,GF_GENOCIDE,
-                                                        (PROJECT_GRID|PROJECT_ITEM|PROJECT_KILL|PROJECT_JUMP)))
+                                                        (PROJECT_GRID|PROJECT_ITEM|PROJECT_KILL|PROJECT_JUMP),TRUE))
                                {
                                        if( !cave[y][x].m_idx )
                                        {
index 9d70ec3..9a89f59 100644 (file)
@@ -7144,11 +7144,11 @@ byte feature_action_flags[FF_FLAG_MAX] =
        0, /* REMEMBER */
        0, /* OPEN */
        0, /* CLOSE */
-       0, /* BASH */
+       FAF_CRASH_GLASS, /* BASH */
        0, /* SPIKE */
        FAF_DESTROY, /* DISARM */
        0, /* STORE */
-       FAF_DESTROY, /* TUNNEL */
+       FAF_DESTROY | FAF_CRASH_GLASS, /* TUNNEL */
        0, /* MAY_HAVE_GOLD */
        0, /* HAS_GOLD */
        0, /* HAS_ITEM */
@@ -7179,7 +7179,7 @@ byte feature_action_flags[FF_FLAG_MAX] =
        0, /* SHALLOW */
        0, /* DEEP */
        0, /* FILLED */
-       FAF_DESTROY, /* HURT_ROCK */
+       FAF_DESTROY | FAF_CRASH_GLASS, /* HURT_ROCK */
        0, /* HURT_FIRE */
        0, /* HURT_COLD */
        0, /* HURT_ACID */
@@ -7234,7 +7234,7 @@ byte feature_action_flags[FF_FLAG_MAX] =
        0, /* SPREAD */
 
        0, /* SPECIAL */
-       FAF_DESTROY | FAF_NO_DROP, /* HURT_DISI */
+       FAF_DESTROY | FAF_NO_DROP | FAF_CRASH_GLASS, /* HURT_DISI */
        0, /* QUEST_ENTER */
        0, /* QUEST_EXIT */
        0, /* QUEST */
@@ -7249,4 +7249,5 @@ byte feature_action_flags[FF_FLAG_MAX] =
        0, /* UNPERM */
        0, /* TELEPORTABLE */
        0, /* CONVERT */
+       0, /* GLASS */
 };
index c300cf5..bb3242a 100644 (file)
@@ -646,6 +646,7 @@ char angband_sound_name[SOUND_MAX][16] =
        "show",
        "unused",
        "explode",
+       "glass",
 };