#else
if (!get_check("Are you sure? (Teleport Level)")) return FALSE;
#endif
- (void)teleport_player_level();
+ (void)teleport_level(0);
break;
case 22: /* Word of Recall */
return word_of_recall();
#else
if (!get_check("Are you sure? (Teleport Level)")) return FALSE;
#endif
- (void)teleport_player_level();
+ (void)teleport_level(0);
}
break;
case 13: /* Dimension Door */
#else
if (!get_check("Are you sure? (Teleport Level)")) return FALSE;
#endif
- (void)teleport_player_level();
+ (void)teleport_level(0);
break;
case 27: /* Teleport Away */
if (!get_aim_dir(&dir)) return FALSE;
case SV_SCROLL_TELEPORT_LEVEL:
{
- (void)teleport_player_level();
+ (void)teleport_level(0);
ident = TRUE;
break;
}
extern void teleport_to_player(int m_idx, int power);
extern void teleport_player(int dis);
extern void teleport_player_to(int ny, int nx, bool no_tele);
-extern void teleport_player_level(void);
+extern void teleport_level(int m_idx);
extern bool recall_player(int turns);
extern bool word_of_recall(void);
extern bool reset_recall(void);
break;
case MS_TELE_LEVEL:
{
+ int target_m_idx;
monster_type *m_ptr;
monster_race *r_ptr;
char m_name[80];
if (!target_set(TARGET_KILL)) return FALSE;
- if (!cave[target_row][target_col].m_idx) break;
+ target_m_idx = cave[target_row][target_col].m_idx;
+ if (!target_m_idx) break;
if (!los(py, px, target_row, target_col)) break;
- m_ptr = &m_list[cave[target_row][target_col].m_idx];
+ m_ptr = &m_list[target_m_idx];
r_ptr = &r_info[m_ptr->r_idx];
monster_desc(m_name, m_ptr, 0);
#ifdef JP
- msg_format("%s¤Î¤ò»Ø¤µ¤·¤¿¡£", m_name);
+ msg_format("%^s¤Î¤ò»Ø¤µ¤·¤¿¡£", m_name);
#else
- msg_format("You gesture at %s's feet.", m_name);
+ msg_format("You gesture at %^s's feet.", m_name);
#endif
if ((r_ptr->flagsr & (RFR_EFF_RES_NEXU_MASK | RFR_RES_TELE)) ||
#ifdef JP
msg_print("¤·¤«¤·¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª");
#else
- msg_format("%s are unaffected!", m_name);
-#endif
- }
- else if (!dun_level || one_in_(2))
- {
-#ifdef JP
- msg_format("%s¤Ï¾²¤òÆͤÇˤäÆÄÀ¤ó¤Ç¤¤¤Ã¤¿¡£", m_name);
-#else
- msg_format("%s sink through the floor.", m_name);
-#endif
- delete_monster_idx(cave[target_row][target_col].m_idx);
- }
- else
- {
-#ifdef JP
- msg_format("%s¤ÏÅ·°æ¤òÆͤÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤Ã¤¿¡£",m_name);
-#else
- msg_format("%s rise up through the ceiling.", m_name);
+ msg_format("%^s is unaffected!", m_name);
#endif
- delete_monster_idx(cave[target_row][target_col].m_idx);
}
+ else teleport_level(target_m_idx);
break;
}
case MS_PSY_SPEAR:
/* Remove the "ineffective" spells */
remove_bad_spells(m_idx, &f4, &f5, &f6);
- if (p_ptr->inside_arena)
+ if (p_ptr->inside_arena || p_ptr->inside_battle)
{
f4 &= ~(RF4_SUMMON_MASK);
f5 &= ~(RF5_SUMMON_MASK);
}
else
{
- teleport_player_level();
+ teleport_level(0);
}
learn_spell(MS_TELE_LEVEL);
update_smart_learn(m_idx, DRS_NEXUS);
f5 &= ~(RF5_SUMMON_MASK);
f6 &= ~(RF6_SUMMON_MASK);
}
+
if (p_ptr->inside_battle && !one_in_(3))
{
f6 &= ~(RF6_HEAL);
/* RF6_TELE_LEVEL */
case 160+10:
- /* Not implemented */
- return FALSE;
+ if (known)
+ {
+ if (see_either)
+ {
+#ifdef JP
+ msg_format("%^s¤¬%s¤Î¤ò»Ø¤µ¤·¤¿¡£", m_name, t_name);
+#else
+ msg_format("%^s gestures at %s's feet.", m_name, t_name);
+#endif
+ }
+ else
+ {
+ mon_fight = TRUE;
+ }
+ }
+
+ if (tr_ptr->flagsr & (RFR_EFF_RES_NEXU_MASK | RFR_RES_TELE))
+ {
+#ifdef JP
+ if (see_t) msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", t_name);
+#else
+ if (see_t) msg_format("%^s is unaffected!", t_name);
+#endif
+ }
+ else if ((tr_ptr->flags1 & RF1_QUESTOR) ||
+ (tr_ptr->level > randint1((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10))
+ {
+#ifdef JP
+ if (see_t) msg_format("%^s¤Ï¸úÎϤòÄ·¤ÍÊÖ¤·¤¿¡ª", t_name);
+#else
+ if (see_t) msg_format("%^s resist the effects!", t_name);
+#endif
+ }
+ else teleport_level((t_idx == p_ptr->riding) ? 0 : t_idx);
+
+ wake_up = TRUE;
+ break;
/* RF6_PSY_SPEAR */
case 160+11:
break;
case MS_TELE_LEVEL:
{
+ int target_m_idx;
monster_type *m_ptr;
monster_race *r_ptr;
char m_name[80];
if (!target_set(TARGET_KILL)) return FALSE;
- if (!cave[target_row][target_col].m_idx) break;
+ target_m_idx = cave[target_row][target_col].m_idx;
+ if (!target_m_idx) break;
if (!los(py, px, target_row, target_col)) break;
- m_ptr = &m_list[cave[target_row][target_col].m_idx];
+ m_ptr = &m_list[target_m_idx];
r_ptr = &r_info[m_ptr->r_idx];
monster_desc(m_name, m_ptr, 0);
#ifdef JP
- msg_format("%s¤Î¤ò»Ø¤µ¤·¤¿¡£", m_name);
+ msg_format("%^s¤Î¤ò»Ø¤µ¤·¤¿¡£", m_name);
#else
- msg_format("You gesture at %s's feet.", m_name);
+ msg_format("You gesture at %^s's feet.", m_name);
#endif
if ((r_ptr->flagsr & (RFR_EFF_RES_NEXU_MASK | RFR_RES_TELE)) ||
#ifdef JP
msg_print("¤·¤«¤·¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª");
#else
- msg_format("%s are unaffected!", m_name);
-#endif
- }
- else if (!dun_level || one_in_(2))
- {
-#ifdef JP
- msg_format("%s¤Ï¾²¤òÆͤÇˤäÆÄÀ¤ó¤Ç¤¤¤Ã¤¿¡£", m_name);
-#else
- msg_format("%s sinks through the floor.", m_name);
-#endif
- delete_monster_idx(cave[target_row][target_col].m_idx);
- }
- else
- {
-#ifdef JP
- msg_format("%s¤ÏÅ·°æ¤òÆͤÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤Ã¤¿¡£",m_name);
-#else
- msg_format("%s rises up through the ceiling.", m_name);
+ msg_format("%^s is unaffected!", m_name);
#endif
- delete_monster_idx(cave[target_row][target_col].m_idx);
}
+ else teleport_level(target_m_idx);
break;
}
case MS_PSY_SPEAR:
/*
* Teleport the player one level up or down (random when legal)
+ * Note: If m_idx <= 0, target is player.
*/
-void teleport_player_level(void)
+void teleport_level(int m_idx)
{
- bool go_up;
+ bool go_up;
+ monster_type *m_ptr;
+ char m_name[160];
+ bool see_m = TRUE;
+
+ if (m_idx <= 0) /* To player */
+ {
+#ifdef JP
+ strcpy(m_name, "¤¢¤Ê¤¿");
+#else
+ strcpy(m_name, "you");
+#endif
+ }
+ else /* To monster */
+ {
+ m_ptr = &m_list[m_idx];
+
+ /* Get the monster name (or "it") */
+ monster_desc(m_name, m_ptr, 0);
+
+ see_m = m_ptr->ml;
+ }
/* No effect in arena or quest */
- if (p_ptr->inside_arena || (p_ptr->inside_quest && !random_quest_number(dun_level)) ||
- ((quest_number(dun_level) || (dun_level >= d_info[dungeon_type].maxdepth)) && (dun_level > 1) && ironman_downward))
+ if (p_ptr->inside_arena || p_ptr->inside_battle || (p_ptr->inside_quest && !random_quest_number(dun_level)) ||
+ ((quest_number(dun_level) || (dun_level >= d_info[dungeon_type].maxdepth)) && (dun_level > 1) && ironman_downward && (m_idx <= 0)))
{
#ifdef JP
-msg_print("¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£");
+ if (see_m) msg_print("¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£");
#else
- msg_print("There is no effect.");
+ if (see_m) msg_print("There is no effect.");
#endif
return;
}
- if (p_ptr->anti_tele)
+ if ((m_idx <= 0) && p_ptr->anti_tele) /* To player */
{
#ifdef JP
-msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª");
+ msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª");
#else
msg_print("A mysterious force prevents you from teleporting!");
#endif
-
return;
}
if (randint0(100) < 50) go_up = TRUE;
else go_up = FALSE;
- if (p_ptr->wizard)
+ if ((m_idx <= 0) && p_ptr->wizard)
{
if (get_check("Force to go up? ")) go_up = TRUE;
else if (get_check("Force to go down? ")) go_up = FALSE;
}
/* Down only */
- if (ironman_downward || (dun_level <= d_info[dungeon_type].mindepth))
+ if ((ironman_downward && (m_idx <= 0)) || (dun_level <= d_info[dungeon_type].mindepth))
{
#ifdef JP
-msg_print("¤¢¤Ê¤¿¤Ï¾²¤òÆͤÇˤäÆÄÀ¤ó¤Ç¤¤¤¯¡£");
+ if (see_m) msg_format("%^s¤Ï¾²¤òÆͤÇˤäÆÄÀ¤ó¤Ç¤¤¤¯¡£", m_name);
#else
- msg_print("You sink through the floor.");
+ if (see_m) msg_format("%^s sink%s through the floor.", m_name, (m_idx <= 0) ? "" : "s");
#endif
- if (!dun_level)
+ if (m_idx <= 0) /* To player */
{
- dungeon_type = p_ptr->recall_dungeon;
- p_ptr->oldpy = py;
- p_ptr->oldpx = px;
- }
+ if (!dun_level)
+ {
+ dungeon_type = p_ptr->recall_dungeon;
+ p_ptr->oldpy = py;
+ p_ptr->oldpx = px;
+ }
- if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, 1, NULL);
+ if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, 1, NULL);
- if (autosave_l) do_cmd_save_game(TRUE);
+ if (autosave_l) do_cmd_save_game(TRUE);
- if (!dun_level)
- {
- dun_level = d_info[dungeon_type].mindepth;
- prepare_change_floor_mode(CFM_RAND_PLACE | CFM_CLEAR_ALL);
- }
- else
- {
- prepare_change_floor_mode(CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
- }
+ if (!dun_level)
+ {
+ dun_level = d_info[dungeon_type].mindepth;
+ prepare_change_floor_mode(CFM_RAND_PLACE | CFM_CLEAR_ALL);
+ }
+ else
+ {
+ prepare_change_floor_mode(CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
+ }
- /* Leaving */
- p_ptr->leaving = TRUE;
+ /* Leaving */
+ p_ptr->leaving = TRUE;
+ }
}
/* Up only */
else if (quest_number(dun_level) || (dun_level >= d_info[dungeon_type].maxdepth))
{
#ifdef JP
-msg_print("¤¢¤Ê¤¿¤ÏÅ·°æ¤òÆͤÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤¯¡£");
+ if (see_m) msg_format("%^s¤ÏÅ·°æ¤òÆͤÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤¯¡£", m_name);
#else
- msg_print("You rise up through the ceiling.");
+ if (see_m) msg_format("%^s rise%s up through the ceiling.", m_name, (m_idx <= 0) ? "" : "s");
#endif
- if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, -1, NULL);
+ if (m_idx <= 0) /* To player */
+ {
+ if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, -1, NULL);
- if (autosave_l) do_cmd_save_game(TRUE);
+ if (autosave_l) do_cmd_save_game(TRUE);
- prepare_change_floor_mode(CFM_UP | CFM_RAND_PLACE | CFM_RAND_CONNECT);
+ prepare_change_floor_mode(CFM_UP | CFM_RAND_PLACE | CFM_RAND_CONNECT);
- leave_quest_check();
+ leave_quest_check();
- /* Leaving */
- p_ptr->inside_quest = 0;
- p_ptr->leaving = TRUE;
+ /* Leaving */
+ p_ptr->inside_quest = 0;
+ p_ptr->leaving = TRUE;
+ }
}
else if (go_up)
{
#ifdef JP
-msg_print("¤¢¤Ê¤¿¤ÏÅ·°æ¤òÆͤÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤¯¡£");
+ if (see_m) msg_format("%^s¤ÏÅ·°æ¤òÆͤÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤¯¡£", m_name);
#else
- msg_print("You rise up through the ceiling.");
+ if (see_m) msg_format("%^s rise%s up through the ceiling.", m_name, (m_idx <= 0) ? "" : "s");
#endif
- if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, -1, NULL);
+ if (m_idx <= 0) /* To player */
+ {
+ if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, -1, NULL);
- if (autosave_l) do_cmd_save_game(TRUE);
+ if (autosave_l) do_cmd_save_game(TRUE);
- prepare_change_floor_mode(CFM_UP | CFM_RAND_PLACE | CFM_RAND_CONNECT);
+ prepare_change_floor_mode(CFM_UP | CFM_RAND_PLACE | CFM_RAND_CONNECT);
- /* Leaving */
- p_ptr->leaving = TRUE;
+ /* Leaving */
+ p_ptr->leaving = TRUE;
+ }
}
else
{
#ifdef JP
-msg_print("¤¢¤Ê¤¿¤Ï¾²¤òÆͤÇˤäÆÄÀ¤ó¤Ç¤¤¤¯¡£");
+ if (see_m) msg_format("%^s¤Ï¾²¤òÆͤÇˤäÆÄÀ¤ó¤Ç¤¤¤¯¡£", m_name);
#else
- msg_print("You sink through the floor.");
+ if (see_m) msg_format("%^s sink%s through the floor.", m_name, (m_idx <= 0) ? "" : "s");
#endif
- /* Never reach this code on the surface */
- /* if (!dun_level) dungeon_type = p_ptr->recall_dungeon; */
+ if (m_idx <= 0) /* To player */
+ {
+ /* Never reach this code on the surface */
+ /* if (!dun_level) dungeon_type = p_ptr->recall_dungeon; */
+
+ if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, 1, NULL);
- if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, 1, NULL);
+ if (autosave_l) do_cmd_save_game(TRUE);
- if (autosave_l) do_cmd_save_game(TRUE);
+ prepare_change_floor_mode(CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
- prepare_change_floor_mode(CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
+ /* Leaving */
+ p_ptr->leaving = TRUE;
+ }
+ }
+
+ /* Monster level teleportation is simple deleting now */
+ if (m_idx > 0)
+ {
+ /* Check for quest completion */
+ check_quest_completion(m_ptr);
- /* Leaving */
- p_ptr->leaving = TRUE;
+ delete_monster_idx(m_idx);
}
/* Sound */
}
/* Teleport Level */
- teleport_player_level();
+ teleport_level(0);
break;
}