OSDN Git Service

[Implement] #37285 量子生物が確率的に消滅する処理を変更し、ユニークならばショートテレポートまたはテレポートアウェイ (距離10)が発動するようにした...
[hengband/hengband.git] / src / monster-process.c
index 0b4ff9f..1a38a1e 100644 (file)
@@ -220,9 +220,6 @@ static bool get_enemy_dir(player_type *target_ptr, MONSTER_IDX m_idx, int *mm)
 static bool mon_will_run(player_type *target_ptr, MONSTER_IDX m_idx)
 {
        monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx];
-
-#ifdef ALLOW_TERROR
-
        monster_race *r_ptr = &r_info[m_ptr->r_idx];
 
        PLAYER_LEVEL p_lev;
@@ -231,8 +228,6 @@ static bool mon_will_run(player_type *target_ptr, MONSTER_IDX m_idx)
        HIT_POINT m_chp, m_mhp;
        u32b p_val, m_val;
 
-#endif
-
        /* Friends can be commanded to avoid the player */
        if (is_pet(m_ptr))
        {
@@ -247,8 +242,6 @@ static bool mon_will_run(player_type *target_ptr, MONSTER_IDX m_idx)
        /* All "afraid" monsters will run away */
        if (MON_MONFEAR(m_ptr)) return TRUE;
 
-#ifdef ALLOW_TERROR
-
        /* Nearby monsters will not become terrified */
        if (m_ptr->cdis <= 5) return FALSE;
 
@@ -277,8 +270,6 @@ static bool mon_will_run(player_type *target_ptr, MONSTER_IDX m_idx)
        /* Strong players scare strong monsters */
        if (p_val * m_mhp > m_val * p_mhp) return TRUE;
 
-#endif
-
        return FALSE;
 }
 
@@ -1316,30 +1307,54 @@ void process_monster(player_type *target_ptr, MONSTER_IDX m_idx)
                if (!randint0(2)) return;
 
                /* Sometimes die */
-               if (!randint0((m_idx % 100) + 10) && !(r_ptr->flags1 & RF1_QUESTOR))
+               if (!randint0((m_idx % 100) + 10))
                {
-                       bool sad = FALSE;
-
-                       if (is_pet(m_ptr) && !(m_ptr->ml)) sad = TRUE;
-
-                       if (see_m)
+                       if ((r_ptr->flags1 & RF1_UNIQUE) == 0)
                        {
-                               GAME_TEXT m_name[MAX_NLEN];
-                               monster_desc(target_ptr, m_name, m_ptr, 0);
+                               if (!(r_ptr->flags1 & RF1_QUESTOR))
+                               {
+                                       if (see_m)
+                                       {
+                                               GAME_TEXT m_name[MAX_NLEN];
+                                               monster_desc(target_ptr, m_name, m_ptr, 0);
+                                               msg_format(_("%sは消え去った!", "%^s disappears!"), m_name);
+                                       }
+
+                                       monster_death(target_ptr, m_idx, FALSE);
+                                       delete_monster_idx(target_ptr, m_idx);
+                                       if (is_pet(m_ptr) && !(m_ptr->ml))
+                                       {
+                                               msg_print(_("少しの間悲しい気分になった。", "You feel sad for a moment."));
+                                       }
 
-                               msg_format(_("%sは消え去った!", "%^s disappears!"), m_name);
+                                       return;
+                               }
                        }
+                       else
+                       {
+                               if (see_m)
+                               {
+                                       GAME_TEXT m_name[MAX_NLEN];
+                                       monster_desc(target_ptr, m_name, m_ptr, 0);
+                                       msg_format(_("%sは量子的効果を起こした!", "%^s produced a quantum effect!"), m_name);
+                               }
+                               else
+                               {
+                                       msg_print(_("量子的効果が起こった!", "A quantum effect was produced!"));
+                               }
 
-                       /* Generate treasure, etc */
-                       monster_death(target_ptr, m_idx, FALSE);
+                               bool target = one_in_(2);
+                               const int blink = 32 * 5 + 4;
+                               if (target)
+                               {
+                                       (void)monspell_to_monster(target_ptr, blink, m_ptr->fy, m_ptr->fx, m_idx, m_idx);
 
-                       delete_monster_idx(target_ptr, m_idx);
-                       if (sad)
-                       {
-                               msg_print(_("少しの間悲しい気分になった。", "You feel sad for a moment."));
+                               }
+                               else
+                               {
+                                       teleport_player_away(m_idx, target_ptr, 10, TRUE);
+                               }
                        }
-
-                       return;
                }
        }
 
@@ -1361,7 +1376,7 @@ void process_monster(player_type *target_ptr, MONSTER_IDX m_idx)
                        if (is_riding_mon && riding_pinch < 2)
                        {
                                msg_format(_("%sは傷の痛さの余りあなたの束縛から逃れようとしている。",
-                                       "%^s seems to be in so much pain and trying to escape from your restriction."), m_name);
+                                       "%^s seems to be in so much pain and tries to escape from your restriction."), m_name);
                                riding_pinch++;
                                disturb(target_ptr, TRUE, TRUE);
                        }
@@ -1851,7 +1866,7 @@ void process_monster(player_type *target_ptr, MONSTER_IDX m_idx)
                                if (check_hp_for_feat_destruction(f_ptr, m_ptr) && (randint0(m_ptr->hp / 10) > f_ptr->power))
                                {
                                        if (have_flag(f_ptr->flags, FF_GLASS))
-                                               msg_print(_("ガラスが砕ける音がした!", "You hear a glass was crashed!"));
+                                               msg_print(_("ガラスが砕ける音がした!", "You hear glass breaking!"));
                                        else
                                                msg_print(_("ドアを叩き開ける音がした!", "You hear a door burst open!"));
 
@@ -2196,8 +2211,10 @@ void process_monster(player_type *target_ptr, MONSTER_IDX m_idx)
 
                /* Take or Kill objects on the floor */
                bool is_takable_or_killable = g_ptr->o_idx > 0;
-               is_takable_or_killable &= (r_ptr->flags2 & (RF2_TAKE_ITEM | RF2_KILL_ITEM));
-               is_takable_or_killable &= !is_pet(m_ptr) || ((target_ptr->pet_extra_flags & PF_PICKUP_ITEMS) && (r_ptr->flags2 & RF2_TAKE_ITEM));
+               is_takable_or_killable &= (r_ptr->flags2 & (RF2_TAKE_ITEM | RF2_KILL_ITEM)) != 0;
+               bool is_pickup_items = (target_ptr->pet_extra_flags & PF_PICKUP_ITEMS) != 0;
+               is_pickup_items &= (r_ptr->flags2 & RF2_TAKE_ITEM) != 0;
+               is_takable_or_killable &= !is_pet(m_ptr) || is_pickup_items;
                if (!is_takable_or_killable)
                {
                        if (do_turn) break;