/* Purpose: Spell code (part 2) */
#include "angband.h"
+#include "grid.h"
/*
break;
case CLASS_BEASTMASTER:
#ifdef JP
-info[i++] = "¤¢¤Ê¤¿¤Ï1ɤ¤ÎÀ¸Ì¿¤Î¤¢¤ë¥â¥ó¥¹¥¿¡¼¤ò»ÙÇÛ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£(¥ì¥Ù¥ë/4 MP)";
+info[i++] = "¤¢¤Ê¤¿¤Ï1ÂΤÎÀ¸Ì¿¤Î¤¢¤ë¥â¥ó¥¹¥¿¡¼¤ò»ÙÇÛ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£(¥ì¥Ù¥ë/4 MP)";
#else
info[i++] = "You can dominate a monster (cost level/4).";
#endif
/* Detect evil monsters */
if (r_ptr->flags3 & RF3_EVIL)
{
- /* Take note that they are evil */
- r_ptr->r_flags3 |= (RF3_EVIL);
-
- /* Update monster recall window */
- if (p_ptr->monster_race_idx == m_ptr->r_idx)
+ if (is_original_ap(m_ptr))
{
- /* Window stuff */
- p_ptr->window |= (PW_MONSTER);
+ /* Take note that they are evil */
+ r_ptr->r_flags3 |= (RF3_EVIL);
+
+ /* Update monster recall window */
+ if (p_ptr->monster_race_idx == m_ptr->r_idx)
+ {
+ /* Window stuff */
+ p_ptr->window |= (PW_MONSTER);
+ }
}
/* Repair visibility later */
/* Detect evil monsters */
if (r_ptr->flags3 & (match_flag))
{
- /* Take note that they are something */
- r_ptr->r_flags3 |= (match_flag);
-
- /* Update monster recall window */
- if (p_ptr->monster_race_idx == m_ptr->r_idx)
+ if (is_original_ap(m_ptr))
{
- /* Window stuff */
- p_ptr->window |= (PW_MONSTER);
+ /* Take note that they are something */
+ r_ptr->r_flags3 |= (match_flag);
+
+ /* Update monster recall window */
+ if (p_ptr->monster_race_idx == m_ptr->r_idx)
+ {
+ /* Window stuff */
+ p_ptr->window |= (PW_MONSTER);
+ }
}
/* Repair visibility later */
{
/* Wake up */
m_ptr->csleep = 0;
+ if (r_info[m_ptr->r_idx].flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
sleep = TRUE;
}
if (!is_pet(m_ptr)) m_ptr->mflag2 |= MFLAG2_NOPET;
int msec = delay_factor * delay_factor * delay_factor;
/* Prevent genocide in quest levels */
- if (p_ptr->inside_quest && !random_quest_number(dun_level))
+ if ((p_ptr->inside_quest && !random_quest_number(dun_level)) || p_ptr->inside_arena || p_ptr->inside_battle)
{
return (FALSE);
}
if (m_ptr->csleep)
{
m_ptr->csleep = 0;
+ if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
if (m_ptr->ml && !p_ptr->blind)
{
#ifdef JP
/* Prevent mass genocide in quest levels */
- if (p_ptr->inside_quest && !random_quest_number(dun_level))
+ if ((p_ptr->inside_quest && !random_quest_number(dun_level)) || p_ptr->inside_arena || p_ptr->inside_battle)
{
return (FALSE);
}
if (m_ptr->csleep)
{
m_ptr->csleep = 0;
+ if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
if (m_ptr->ml && !p_ptr->blind)
{
#ifdef JP
/* Prevent mass genocide in quest levels */
- if (p_ptr->inside_quest && !random_quest_number(dun_level))
+ if ((p_ptr->inside_quest && !random_quest_number(dun_level)) || p_ptr->inside_arena || p_ptr->inside_battle)
{
return (FALSE);
}
if (m_ptr->csleep)
{
m_ptr->csleep = 0;
+ if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
if (m_ptr->ml && !p_ptr->blind)
{
#ifdef JP
#ifdef JP
take_hit(DAMAGE_GENO, randint1(3), "¥¢¥ó¥Ç¥Ã¥É¾ÃÌǤμöʸ¤ò¾§¤¨¤¿ÈèÏ«", -1);
#else
- take_hit(DAMAGE_GENO, randint1(3), "the strain of casting Mass Genocide", -1);
+ take_hit(DAMAGE_GENO, randint1(3), "the strain of casting Annihilate Undead", -1);
#endif
}
lite_spot(m_ptr->fy, m_ptr->fx);
}
/* Get "the monster" or "something" */
- monster_desc(m_name, m_ptr, 0x204);
+ monster_desc(m_name, m_ptr, MD_IGNORE_HALLU | MD_INDEF_HIDDEN);
speed = m_ptr->mspeed - 110;
if(m_ptr->fast) speed += 10;
/* Get the monster's alignment */
#ifdef JP
- if ((r_ptr->flags3 & RF3_EVIL) && (r_ptr->flags3 & RF3_GOOD)) align = "籡";
+ if ((r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)) == (RF3_EVIL | RF3_GOOD)) align = "籡";
else if (r_ptr->flags3 & RF3_EVIL) align = "¼Ù°";
else if (r_ptr->flags3 & RF3_GOOD) align = "Á±ÎÉ";
- else if ((m_ptr->sub_align & SUB_ALIGN_EVIL) && (m_ptr->sub_align & SUB_ALIGN_GOOD)) align = "ÃæΩ(Á±°)";
+ else if ((m_ptr->sub_align & (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD)) == (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD)) align = "ÃæΩ(Á±°)";
else if (m_ptr->sub_align & SUB_ALIGN_EVIL) align = "ÃæΩ(¼Ù°)";
else if (m_ptr->sub_align & SUB_ALIGN_GOOD) align = "ÃæΩ(Á±ÎÉ)";
else align = "ÃæΩ";
#else
- if ((r_ptr->flags3 & RF3_EVIL) && (r_ptr->flags3 & RF3_GOOD)) align = "good&evil";
+ if ((r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)) == (RF3_EVIL | RF3_GOOD)) align = "good&evil";
else if (r_ptr->flags3 & RF3_EVIL) align = "evil";
else if (r_ptr->flags3 & RF3_GOOD) align = "good";
- else if ((m_ptr->sub_align & SUB_ALIGN_EVIL) && (m_ptr->sub_align & SUB_ALIGN_GOOD)) align = "neutral(good&evil)";
+ else if ((m_ptr->sub_align & (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD)) == (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD)) align = "neutral(good&evil)";
else if (m_ptr->sub_align & SUB_ALIGN_EVIL) align = "neutral(evil)";
else if (m_ptr->sub_align & SUB_ALIGN_GOOD) align = "neutral(good)";
else align = "neutral";
/* Learn everything about this monster */
if (lore_do_probe(m_ptr->r_idx))
{
-#ifdef JP
- /* Note that we learnt some new flags -Mogami- */
- msg_format("%s¤Ë¤Ä¤¤¤Æ¤µ¤é¤Ë¾Ü¤·¤¯¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£", m_name);
-#else
char buf[80];
/* Get base name of monster */
strcpy(buf, (r_name + r_ptr->name));
+#ifdef JP
+ /* Note that we learnt some new flags -Mogami- */
+ msg_format("%s¤Ë¤Ä¤¤¤Æ¤µ¤é¤Ë¾Ü¤·¤¯¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£", buf);
+#else
/* Pluralize it */
plural_aux(buf);
* Later we may use one function for both "destruction" and
* "earthquake" by using the "full" to select "destruction".
*/
-bool destroy_area(int y1, int x1, int r)
+bool destroy_area(int y1, int x1, int r, bool in_generate)
{
int y, x, k, t;
cave_type *c_ptr;
bool flag = FALSE;
-
/* Prevent destruction of quest levels and town */
if ((p_ptr->inside_quest && is_fixed_quest_idx(p_ptr->inside_quest)) || !dun_level)
{
return (FALSE);
}
+ /* Lose monster light */
+ clear_mon_lite();
+
/* Big area of affect */
for (y = (y1 - r); y <= (y1 + r); y++)
{
for (x = (x1 - r); x <= (x1 + r); x++)
{
- monster_type *m_ptr;
- monster_race *r_ptr;
-
/* Skip illegal grids */
if (!in_bounds(y, x)) continue;
/* Access the grid */
c_ptr = &cave[y][x];
- m_ptr = &m_list[c_ptr->m_idx];
- r_ptr = &r_info[m_ptr->r_idx];
/* Lose room and vault */
- c_ptr->info &= ~(CAVE_ROOM | CAVE_ICKY | CAVE_UNSAFE | CAVE_OBJECT);
+ c_ptr->info &= ~(CAVE_ROOM | CAVE_ICKY);
/* Lose light and knowledge */
c_ptr->info &= ~(CAVE_MARK | CAVE_GLOW);
- /* Hack -- Notice player affect */
- if ((x == px) && (y == py))
+ if (!in_generate) /* Normal */
{
- /* Hurt the player later */
- flag = TRUE;
+ /* Lose unsafety and runes/mirrors */
+ c_ptr->info &= ~(CAVE_UNSAFE);
- /* Do not hurt this grid */
- continue;
+ /* Hack -- Notice player affect */
+ if (player_bold(y, x))
+ {
+ /* Hurt the player later */
+ flag = TRUE;
+
+ /* Process "re-glowing" */
+ if (is_mirror_grid(c_ptr)) c_ptr->info |= CAVE_GLOW;
+
+ /* Do not hurt this grid */
+ continue;
+ }
}
/* Hack -- Skip the epicenter */
- if ((y == y1) && (x == x1)) continue;
-
- if ((r_ptr->flags1 & RF1_QUESTOR))
+ if ((y == y1) && (x == x1))
{
- /* Heal the monster */
- m_list[c_ptr->m_idx].hp = m_list[c_ptr->m_idx].maxhp;
+ /* Process "re-glowing" */
+ if (!in_generate && is_mirror_grid(c_ptr)) c_ptr->info |= CAVE_GLOW;
- /* Try to teleport away quest monsters */
- if (!teleport_away(c_ptr->m_idx, (r * 2) + 1, TRUE)) continue;
+ continue;
}
- else
+
+ if (c_ptr->m_idx)
{
- if (c_ptr->m_idx)
+ monster_type *m_ptr = &m_list[c_ptr->m_idx];
+ monster_race *r_ptr = &r_info[m_ptr->r_idx];
+
+ if (in_generate) /* In generation */
+ {
+ /* Delete the monster (if any) */
+ delete_monster(y, x);
+ }
+ else if (r_ptr->flags1 & RF1_QUESTOR)
+ {
+ /* Heal the monster */
+ m_ptr->hp = m_ptr->maxhp;
+
+ /* Try to teleport away quest monsters */
+ if (!teleport_away(c_ptr->m_idx, (r * 2) + 1, TRUE))
+ {
+ /* Process "re-glowing" */
+ if (is_mirror_grid(c_ptr)) c_ptr->info |= CAVE_GLOW;
+
+ continue;
+ }
+ }
+ else
{
- if (record_named_pet && is_pet(&m_list[c_ptr->m_idx]) && m_list[c_ptr->m_idx].nickname)
+ if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
{
char m_name[80];
- monster_desc(m_name, &m_list[c_ptr->m_idx], 0x08);
+ monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
do_cmd_write_nikki(NIKKI_NAMED_PET, 6, m_name);
}
+
+ /* Delete the monster (if any) */
+ delete_monster(y, x);
}
- /* Delete the monster (if any) */
- delete_monster(y, x);
}
- if (preserve_mode)
+ /* During generation, destroyed artifacts are "preserved" */
+ if (preserve_mode || in_generate)
{
s16b this_o_idx, next_o_idx = 0;
next_o_idx = o_ptr->next_o_idx;
/* Hack -- Preserve unknown artifacts */
- if (artifact_p(o_ptr) && !object_known_p(o_ptr))
+ if (artifact_p(o_ptr) && (!object_known_p(o_ptr) || in_generate))
{
/* Mega-Hack -- Preserve the artifact */
a_info[o_ptr->name1].cur_num = 0;
+
+ if (in_generate && cheat_peek)
+ {
+ char o_name[MAX_NLEN];
+ object_desc_store(o_name, o_ptr, FALSE, 0);
+#ifdef JP
+ msg_format("ÅÁÀâ¤Î¥¢¥¤¥Æ¥à (%s) ¤ÏÀ¸À®Ãæ¤Ë*Ç˲õ*¤µ¤ì¤¿¡£", o_name);
+#else
+ msg_format("Artifact (%s) was *destroyed* during generation.", o_name);
+#endif
+ }
+ }
+ else if (in_generate && cheat_peek && o_ptr->art_name)
+ {
+#ifdef JP
+ msg_print("¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Î1¤Ä¤ÏÀ¸À®Ãæ¤Ë*Ç˲õ*¤µ¤ì¤¿¡£");
+#else
+ msg_print("One of the random artifacts was *destroyed* during generation.");
+#endif
}
}
}
+
+ /* Delete objects */
delete_object(y, x);
- /* Destroy "valid" grids */
+ /* Destroy "non-permanent" grids */
if (!cave_perma_bold(y, x))
{
/* Wall (or floor) type */
t = randint0(200);
- /* Granite */
- if (t < 20)
- {
- /* Create granite wall */
- cave_set_feat(y, x, FEAT_WALL_EXTRA);
- }
-
- /* Quartz */
- else if (t < 70)
+ if (!in_generate) /* Normal */
{
- /* Create quartz vein */
- cave_set_feat(y, x, FEAT_QUARTZ);
+ if (t < 20)
+ {
+ /* Create granite wall */
+ cave_set_feat(y, x, FEAT_WALL_EXTRA);
+ }
+ else if (t < 70)
+ {
+ /* Create quartz vein */
+ cave_set_feat(y, x, FEAT_QUARTZ);
+ }
+ else if (t < 100)
+ {
+ /* Create magma vein */
+ cave_set_feat(y, x, FEAT_MAGMA);
+ }
+ else
+ {
+ /* Create floor */
+ cave_set_feat(y, x, floor_type[randint0(100)]);
+ }
}
-
- /* Magma */
- else if (t < 100)
+ else /* In generation */
{
- /* Create magma vein */
- cave_set_feat(y, x, FEAT_MAGMA);
- }
+ if (t < 20)
+ {
+ /* Create granite wall */
+ place_extra_grid(c_ptr);
+ }
+ else if (t < 70)
+ {
+ /* Create quartz vein */
+ c_ptr->feat = FEAT_QUARTZ;
+ }
+ else if (t < 100)
+ {
+ /* Create magma vein */
+ c_ptr->feat = FEAT_MAGMA;
+ }
+ else
+ {
+ /* Create floor */
+ place_floor_grid(c_ptr);
+ }
- /* Floor */
- else
- {
- /* Create floor */
- cave_set_feat(y, x, floor_type[randint0(100)]);
+ /* Clear garbage of hidden trap or door */
+ c_ptr->mimic = 0;
}
}
}
}
- /* Hack -- Affect player */
- if (flag)
+ if (!in_generate)
{
- /* Message */
+ /* Hack -- Affect player */
+ if (flag)
+ {
+ /* Message */
#ifdef JP
-msg_print("dz¤¨¤ë¤è¤¦¤ÊÁ®¸÷¤¬È¯À¸¤·¤¿¡ª");
+ msg_print("dz¤¨¤ë¤è¤¦¤ÊÁ®¸÷¤¬È¯À¸¤·¤¿¡ª");
#else
- msg_print("There is a searing blast of light!");
+ msg_print("There is a searing blast of light!");
#endif
-
- /* Blind the player */
- if (!p_ptr->resist_blind && !p_ptr->resist_lite)
- {
- /* Become blind */
- (void)set_blind(p_ptr->blind + 10 + randint1(10));
+ /* Blind the player */
+ if (!p_ptr->resist_blind && !p_ptr->resist_lite)
+ {
+ /* Become blind */
+ (void)set_blind(p_ptr->blind + 10 + randint1(10));
+ }
}
- }
- forget_flow();
+ forget_flow();
- /* Mega-Hack -- Forget the view and lite */
- p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
+ /* Mega-Hack -- Forget the view and lite */
+ p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
- /* Update stuff */
- p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
+ /* Update stuff */
+ p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
- /* Update the monsters */
- p_ptr->update |= (PU_MONSTERS);
+ /* Update the monsters */
+ p_ptr->update |= (PU_MONSTERS);
- /* Redraw map */
- p_ptr->redraw |= (PR_MAP);
+ /* Redraw map */
+ p_ptr->redraw |= (PR_MAP);
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+ /* Window stuff */
+ p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+ }
/* Success */
return (TRUE);
c_ptr->info &= ~(CAVE_GLOW | CAVE_MARK);
/* Skip the epicenter */
- if (!dx && !dy) continue;
+ if (!dx && !dy)
+ {
+ /* Process "re-glowing" */
+ if (is_mirror_grid(c_ptr)) c_ptr->info |= CAVE_GLOW;
+
+ continue;
+ }
/* Skip most grids */
- if (randint0(100) < 85) continue;
+ if (randint0(100) < 85)
+ {
+ /* Process "re-glowing" */
+ if (is_mirror_grid(c_ptr)) c_ptr->info |= CAVE_GLOW;
+
+ continue;
+ }
/* Damage this grid */
map[16+yy-cy][16+xx-cx] = TRUE;
/* Hack -- Take note of player damage */
- if ((yy == py) && (xx == px)) hurt = TRUE;
+ if (player_bold(yy, xx)) hurt = TRUE;
}
}
if (map[16+y-cy][16+x-cx]) continue;
if (cave[y][x].m_idx) continue;
- if ((y == py) && (x == px)) continue;
+ if (player_bold(y, x)) continue;
/* Count "safe" grids */
sn++;
{
char m2_name[80];
- monster_desc(m2_name, m_ptr, 0x08);
+ monster_desc(m2_name, m_ptr, MD_INDEF_VISIBLE);
do_cmd_write_nikki(NIKKI_NAMED_PET, 7, m2_name);
}
}
}
}
+ /* Lose monster light */
+ clear_mon_lite();
/* Examine the quaked region */
for (dy = -r; dy <= r; dy++)
c_ptr = &cave[yy][xx];
/* Paranoia -- never affect player */
-/* if ((yy == py) && (xx == px)) continue; */
+/* if (player_bold(yy, xx)) continue; */
/* Destroy location (if valid) */
if (cave_valid_bold(yy, xx))
/* Delete objects */
delete_object(yy, xx);
- /* Clear mirror, runes flag */
- c_ptr->info &= ~CAVE_OBJECT;
-
/* Wall (or floor) type */
t = (floor ? randint0(100) : 200);
if (dam > 800) dam = 800;
project(i, 2+(r_ptr->level/20), m_ptr->fy,
m_ptr->fx, dam, GF_PLASMA,
- PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_MONSTER, -1);
+ PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1);
delete_monster_idx(i);
}
}
/* Wake up! */
m_ptr->csleep = 0;
+ if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+
/* Notice the "waking up" */
if (m_ptr->ml)
{
/* Now, lite them all up at once */
cave_temp_room_lite();
+
+ if (p_ptr->special_defense & NINJA_S_STEALTH)
+ {
+ if (cave[py][px].info & CAVE_GLOW) set_superstealth(FALSE);
+ }
}
/* Lite up the room */
lite_room(py, px);
- if (p_ptr->special_defense & NINJA_S_STEALTH)
- {
- set_superstealth(FALSE);
- }
-
/* Assume seen */
return (TRUE);
}
m_ptr = &m_list[c_ptr->m_idx];
r_ptr = &r_info[m_ptr->r_idx];
- if (r_ptr->flags3 & RF3_RES_TELE)
+ if (r_ptr->flagsr & RFR_RES_TELE)
{
#ifdef JP
msg_print("¥Æ¥ì¥Ý¡¼¥È¤ò¼ÙË⤵¤ì¤¿¡ª");
msg_print("Your teleportation is blocked!");
#endif
+ if (m_ptr->ml && is_original_ap(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
+
m_ptr->csleep = 0;
+ if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+
/* Failure */
return FALSE;
}
verify_panel();
/* Update stuff */
- p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW);
-
- /* Notice changes in view */
- if (r_ptr->flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2 | RF7_SELF_LITE_1 | RF7_SELF_LITE_2))
- {
- /* Update some things */
- p_ptr->update |= (PU_MON_LITE);
- }
+ p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
/* Update the monsters */
p_ptr->update |= (PU_DISTANCE);
/*
- * Cast a bolt spell
- * Stop if we hit a monster, as a "bolt"
- * Affect monsters (not grids or objects)
+ * Cast a bolt spell.
+ * Stop if we hit a monster, as a "bolt".
+ * Affect monsters and grids (not objects).
*/
bool fire_bolt(int typ, int dir, int dam)
{
/*
- * Cast a beam spell
- * Pass through monsters, as a "beam"
- * Affect monsters (not grids or objects)
+ * Cast a beam spell.
+ * Pass through monsters, as a "beam".
+ * Affect monsters, grids and objects.
*/
bool fire_beam(int typ, int dir, int dam)
{
bool dummy = (project(0, 1, py, px, 0, GF_STONE_WALL, flg, -1));
/* Update stuff */
- p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW);
+ p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
/* Update the monsters */
p_ptr->update |= (PU_MONSTERS);
if (randint1(80 + p_ptr->lev) < 70)
{
- while(attempts--)
+ while (attempts--)
{
scatter(&y, &x, py, px, 4, 0);
if (!cave_floor_bold(y, x)) continue;
- if ((y != py) || (x != px)) break;
+ if (!player_bold(y, x)) break;
}
project(0, 0, y, x, 20 + randint1(30), GF_KILL_WALL,
for (i = 0; i < num; i++)
{
- while(1)
+ while (1)
{
scatter(&y, &x, py, px, 10, 0);
- if ((y != py) && (x != px)) break;
+ if (!player_bold(y, x)) break;
}
project(0, 0, y, x, 20 + randint1(30), GF_KILL_WALL,
p_ptr->special_defense &= ~(NINJA_KAWARIMI);
p_ptr->redraw |= (PR_STATUS);
}
+
+
+/*
+ * "Rush Attack" routine for Samurai or Ninja
+ * Return value is for checking "done"
+ */
+bool rush_attack(bool *mdeath)
+{
+ int dir;
+ int tx, ty;
+ int tm_idx = 0;
+ u16b path_g[32];
+ int path_n, i;
+ bool tmp_mdeath = FALSE;
+ bool moved = FALSE;
+
+ if (mdeath) *mdeath = FALSE;
+
+ project_length = 5;
+ if (!get_aim_dir(&dir)) return FALSE;
+
+ /* Use the given direction */
+ tx = px + project_length * ddx[dir];
+ ty = py + project_length * ddy[dir];
+
+ /* Hack -- Use an actual "target" */
+ if ((dir == 5) && target_okay())
+ {
+ tx = target_col;
+ ty = target_row;
+ }
+
+ if (in_bounds(ty, tx)) tm_idx = cave[ty][tx].m_idx;
+
+ path_n = project_path(path_g, project_length, py, px, ty, tx, PROJECT_STOP | PROJECT_KILL);
+ project_length = 0;
+
+ /* No need to move */
+ if (!path_n) return TRUE;
+
+ /* Use ty and tx as to-move point */
+ ty = py;
+ tx = px;
+
+ /* Project along the path */
+ for (i = 0; i < path_n; i++)
+ {
+ monster_type *m_ptr;
+
+ int ny = GRID_Y(path_g[i]);
+ int nx = GRID_X(path_g[i]);
+
+ if (cave_empty_bold(ny, nx) && player_can_enter(cave[ny][nx].feat))
+ {
+ ty = ny;
+ tx = nx;
+
+ /* Go to next grid */
+ continue;
+ }
+
+ if (!cave[ny][nx].m_idx)
+ {
+ if (tm_idx)
+ {
+#ifdef JP
+ msg_print("¼ºÇÔ¡ª");
+#else
+ msg_print("Failed!");
+#endif
+ }
+ else
+ {
+#ifdef JP
+ msg_print("¤³¤³¤Ë¤ÏÆþ¿È¤Ç¤ÏÆþ¤ì¤Ê¤¤¡£");
+#else
+ msg_print("You can't move to that place.");
+#endif
+ }
+
+ /* Exit loop */
+ break;
+ }
+
+ /* Move player before updating the monster */
+ if (!player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE);
+
+ /* Update the monster */
+ update_mon(cave[ny][nx].m_idx, TRUE);
+
+ /* Found a monster */
+ m_ptr = &m_list[cave[ny][nx].m_idx];
+
+ if (tm_idx != cave[ny][nx].m_idx)
+ {
+#ifdef JP
+ msg_format("%s%s¤¬Î©¤Á¤Õ¤µ¤¬¤Ã¤Æ¤¤¤ë¡ª", tm_idx ? "Ê̤Î" : "",
+ m_ptr->ml ? "¥â¥ó¥¹¥¿¡¼" : "²¿¤«");
+#else
+ msg_format("There is %s in the way!", m_ptr->ml ? (tm_idx ? "another monster" : "a monster") : "someone");
+#endif
+ }
+ else if (!player_bold(ty, tx))
+ {
+ /* Hold the monster name */
+ char m_name[80];
+
+ /* Get the monster name (BEFORE polymorphing) */
+ monster_desc(m_name, m_ptr, 0);
+#ifdef JP
+ msg_format("ÁÇÁ᤯%s¤Î²û¤ËÆþ¤ê¹þ¤ó¤À¡ª", m_name);
+#else
+ msg_format("You quickly jump in and attack %s!", m_name);
+#endif
+ }
+
+ if (!player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE);
+ moved = TRUE;
+ tmp_mdeath = py_attack(ny, nx, HISSATSU_NYUSIN);
+
+ break;
+ }
+
+ if (!moved && !player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE);
+
+ if (mdeath) *mdeath = tmp_mdeath;
+ return TRUE;
+}
+
+
+/*
+ * Remove all mirrors in this floor
+ */
+void remove_all_mirrors(bool explode)
+{
+ int x, y;
+
+ for (x = 0; x < cur_wid; x++)
+ {
+ for (y = 0; y < cur_hgt; y++)
+ {
+ if (is_mirror_grid(&cave[y][x]))
+ {
+ remove_mirror(y, x);
+ if (explode)
+ project(0, 2, y, x, p_ptr->lev / 2 + 5, GF_SHARDS,
+ (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1);
+ }
+ }
+ }
+}