OSDN Git Service

[Refactor] #37353 青魔法とものまねのレベルテレポートアウェイを teleport_level_other() に分離。 / Separate telep...
authorDeskull <deskull@users.sourceforge.jp>
Wed, 30 Jan 2019 04:27:47 +0000 (13:27 +0900)
committerDeskull <deskull@users.sourceforge.jp>
Wed, 30 Jan 2019 04:27:47 +0000 (13:27 +0900)
src/externs.h
src/mane.c
src/mspells3.c
src/spells3.c

index bceae5f..1ee9598 100644 (file)
@@ -1009,6 +1009,7 @@ extern void teleport_player(POSITION dis, BIT_FLAGS mode);
 extern void teleport_player_away(MONSTER_IDX m_idx, POSITION dis);
 extern void teleport_player_to(POSITION ny, POSITION nx, BIT_FLAGS mode);
 extern void teleport_away_followable(MONSTER_IDX m_idx);
+extern bool teleport_level_other(player_type *creature_ptr);
 extern void teleport_level(MONSTER_IDX m_idx);
 extern DUNGEON_IDX choose_dungeon(concptr note, POSITION y, POSITION x);
 extern bool recall_player(player_type *creature_ptr, TIME_EFFECT turns);
index 4bfe464..8b27f5d 100644 (file)
@@ -721,31 +721,10 @@ static bool use_mane(int spell)
 
                (void)fire_beam(GF_AWAY_ALL, dir, plev);
                break;
-       case MS_TELE_LEVEL:
-       {
-               IDX target_m_idx;
-               monster_type *m_ptr;
-               monster_race *r_ptr;
-               GAME_TEXT m_name[MAX_NLEN];
 
-               if (!target_set(TARGET_KILL)) return FALSE;
-               target_m_idx = cave[target_row][target_col].m_idx;
-               if (!target_m_idx) break;
-               if (!player_has_los_bold(target_row, target_col)) break;
-               if (!projectable(p_ptr->y, p_ptr->x, target_row, target_col)) break;
-               m_ptr = &m_list[target_m_idx];
-               r_ptr = &r_info[m_ptr->r_idx];
-               monster_desc(m_name, m_ptr, 0);
-               msg_format(_("%^sの足を指さした。", "You gesture at %^s's feet."), m_name);
-
-               if ((r_ptr->flagsr & (RFR_EFF_RES_NEXU_MASK | RFR_RES_TELE)) ||
-                       (r_ptr->flags1 & RF1_QUESTOR) || (r_ptr->level + randint1(50) > plev + randint1(60)))
-               {
-                       msg_print(_("しかし効果がなかった!", "%^s is unaffected!"));
-               }
-               else teleport_level(target_m_idx);
+       case MS_TELE_LEVEL:
+               return teleport_level_other(p_ptr);
                break;
-       }
 
        case MS_PSY_SPEAR:
                if (!get_aim_dir(&dir)) return FALSE;
index 5b4c947..8ce0066 100644 (file)
@@ -1080,31 +1080,11 @@ static bool cast_learned_spell(int spell, bool success)
 
                (void)fire_beam(GF_AWAY_ALL, dir, 100);
                break;
-       case MS_TELE_LEVEL:
-       {
-               MONSTER_IDX target_m_idx;
-               monster_type *m_ptr;
-               monster_race *r_ptr;
-               GAME_TEXT m_name[MAX_NLEN];
-
-               if (!target_set(TARGET_KILL)) return FALSE;
-               target_m_idx = cave[target_row][target_col].m_idx;
-               if (!target_m_idx) break;
-               if (!player_has_los_bold(target_row, target_col)) break;
-               if (!projectable(p_ptr->y, p_ptr->x, target_row, target_col)) break;
-               m_ptr = &m_list[target_m_idx];
-               r_ptr = &r_info[m_ptr->r_idx];
-               monster_desc(m_name, m_ptr, 0);
-        msg_format(_("%^sの足を指さした。", "You gesture at %^s's feet."), m_name);
 
-               if ((r_ptr->flagsr & (RFR_EFF_RES_NEXU_MASK | RFR_RES_TELE)) ||
-                       (r_ptr->flags1 & RF1_QUESTOR) || (r_ptr->level + randint1(50) > plev + randint1(60)))
-               {
-            msg_format(_("しかし効果がなかった!", "%^s is unaffected!"), m_name);
-               }
-               else teleport_level(target_m_idx);
+       case MS_TELE_LEVEL:
+               return teleport_level_other(p_ptr);
                break;
-       }
+
        case MS_PSY_SPEAR:
                if (!get_aim_dir(&dir)) return FALSE;
 
index a1b0d41..85be234 100644 (file)
@@ -553,6 +553,32 @@ void teleport_away_followable(MONSTER_IDX m_idx)
 }
 
 
+bool teleport_level_other(player_type *creature_ptr)
+{
+       MONSTER_IDX target_m_idx;
+       monster_type *m_ptr;
+       monster_race *r_ptr;
+       GAME_TEXT m_name[MAX_NLEN];
+
+       if (!target_set(TARGET_KILL)) return FALSE;
+       target_m_idx = cave[target_row][target_col].m_idx;
+       if (!target_m_idx) return TRUE;
+       if (!player_has_los_bold(target_row, target_col)) return TRUE;
+       if (!projectable(creature_ptr->y, creature_ptr->x, target_row, target_col)) return TRUE;
+       m_ptr = &m_list[target_m_idx];
+       r_ptr = &r_info[m_ptr->r_idx];
+       monster_desc(m_name, m_ptr, 0);
+       msg_format(_("%^sの足を指さした。", "You gesture at %^s's feet."), m_name);
+
+       if ((r_ptr->flagsr & (RFR_EFF_RES_NEXU_MASK | RFR_RES_TELE)) ||
+               (r_ptr->flags1 & RF1_QUESTOR) || (r_ptr->level + randint1(50) > creature_ptr->lev + randint1(60)))
+       {
+               msg_format(_("しかし効果がなかった!", "%^s is unaffected!"), m_name);
+       }
+       else teleport_level(target_m_idx);
+       return TRUE;
+}
+
 /*!
  * @brief プレイヤー及びモンスターをレベルテレポートさせる /
  * Teleport the player one level up or down (random when legal)