の仕様とした.
* ガラスの地形を叩き開ける (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に変更.
* ガラスの床は割れると暗い穴になるように変更.
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:³«¤¤¤¿¥¬¥é¥¹¤Î¥É¥¢
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:²õ¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¥¬¥é¥¹¤Î¥É¥¢
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:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¸°¤Î¤«¤«¤Ã¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¤¯¤µ¤Ó¤¬ÂǤ¿¤ì¤¿¥¬¥é¥¹¤Î¥É¥¢
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:¥¬¥é¥¹¤ÎÊÉ
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:±Êµ×¥¬¥é¥¹¤ÎÊÉ
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) ####
show =
unused =
explode =
+glass =
#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);
+ }
+ }
}
/* 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);
}
#endif
+ /* Sound */
+ if (have_flag(f_ptr->flags, FF_GLASS)) sound(SOUND_GLASS);
+
/* Remove the feature */
cave_alter_feat(y, x, FF_TUNNEL);
/* 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;
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);
}
cave_alter_feat(y, x, FF_OPEN);
}
- /* Sound */
- sound(SOUND_OPENDOOR);
-
/* Hack -- Fall through the door */
move_player(dir, FALSE, FALSE);
}
#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
/*
#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
"UNPERM",
"TELEPORTABLE",
"CONVERT",
+ "GLASS",
};
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)
{
/* 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 */
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) */
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 */
{
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 */
{
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("¤³¤ÎÃÏ·Á¤Ï¿©¤Ù¤é¤ì¤Ê¤¤¡£");
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;
}
#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);
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);
}
#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)
#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;
}
* 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;
/* 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;
/* 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);
#endif
break;
+ case PROJECT_WHO_GLASS_SHARDS:
+#ifdef JP
+ strcpy(killer, "¥¬¥é¥¹¤ÎÇËÊÒ");
+#else
+ strcpy(killer, "shards of glass");
+#endif
+ break;
+
default:
#ifdef JP
strcpy(killer, "æ«");
/* 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';
{
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];
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 ){
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];
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))
{
}
/* 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;
}
{
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);
}
}
}
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 )
{
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 */
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 */
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 */
0, /* UNPERM */
0, /* TELEPORTABLE */
0, /* CONVERT */
+ 0, /* GLASS */
};
"show",
"unused",
"explode",
+ "glass",
};