+
+ /* Teleported */
+ return TRUE;
+}
+
+
+/*
+ * "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, 0))
+ {
+ 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, TELEPORT_NONMAGICAL);
+
+ /* 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, TELEPORT_NONMAGICAL);
+ moved = TRUE;
+ tmp_mdeath = py_attack(ny, nx, HISSATSU_NYUSIN);
+
+ break;
+ }
+
+ if (!moved && !player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL);
+
+ 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);
+ }
+ }
+ }