OSDN Git Service

[Refactor] #40416 Separated judge_tereprt_resistance() from exe_player_attack_to_mons...
authorHourier <hourier@users.sourceforge.jp>
Sat, 23 May 2020 10:49:40 +0000 (19:49 +0900)
committerHourier <hourier@users.sourceforge.jp>
Sat, 23 May 2020 10:49:40 +0000 (19:49 +0900)
src/combat/player-attack.c

index 268ded4..5e7d82f 100644 (file)
@@ -365,6 +365,37 @@ static void attack_confuse(player_type *attacker_ptr, player_attack_type *pa_ptr
 }
 
 /*!
+ * @breif カオス武器でのテレポート・アウェイを行うか判定する (抵抗されたら無効)
+ * @param attacker_ptr プレーヤーへの参照ポインタ
+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
+ * @return 抵抗されたらTRUE、アウェイされるならFALSE
+ */
+static bool judge_tereprt_resistance(player_type *attacker_ptr, player_attack_type *pa_ptr)
+{
+    monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
+    if ((r_ptr->flagsr & RFR_RES_TELE) == 0)
+        return FALSE;
+
+    if (r_ptr->flags1 & RF1_UNIQUE) {
+        if (is_original_ap_and_seen(attacker_ptr, pa_ptr->m_ptr))
+            r_ptr->r_flagsr |= RFR_RES_TELE;
+
+        msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), pa_ptr->m_name);
+        return TRUE;
+    }
+    
+    if (r_ptr->level > randint1(100)) {
+        if (is_original_ap_and_seen(attacker_ptr, pa_ptr->m_ptr))
+            r_ptr->r_flagsr |= RFR_RES_TELE;
+
+        msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), pa_ptr->m_name);
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+/*!
  * @brief プレイヤーの打撃処理サブルーチン /
  * Player attacks a (poor, defenseless) creature        -RAK-
  * @param y 攻撃目標のY座標
@@ -451,22 +482,7 @@ void exe_player_attack_to_monster(player_type *attacker_ptr, POSITION y, POSITIO
             attack_confuse(attacker_ptr, m_ptr);
         }
         else if (pa_ptr->chaos_effect == CE_TELE_AWAY) {
-            bool resists_tele = FALSE;
-
-            if (r_ptr->flagsr & RFR_RES_TELE) {
-                if (r_ptr->flags1 & RF1_UNIQUE) {
-                    if (is_original_ap_and_seen(attacker_ptr, m_ptr))
-                        r_ptr->r_flagsr |= RFR_RES_TELE;
-                    msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), pa_ptr->m_name);
-                    resists_tele = TRUE;
-                } else if (r_ptr->level > randint1(100)) {
-                    if (is_original_ap_and_seen(attacker_ptr, m_ptr))
-                        r_ptr->r_flagsr |= RFR_RES_TELE;
-                    msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), pa_ptr->m_name);
-                    resists_tele = TRUE;
-                }
-            }
-
+            bool resists_tele = judge_tereprt_resistance(attacker_ptr, pa_ptr);
             if (!resists_tele) {
                 msg_format(_("%^sは消えた!", "%^s disappears!"), pa_ptr->m_name);
                 teleport_away(attacker_ptr, g_ptr->m_idx, 50, TELEPORT_PASSIVE);