OSDN Git Service

モンスターのテレポートレベルに関する変更.
authornothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Fri, 4 Jul 2003 08:45:24 +0000 (08:45 +0000)
committernothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Fri, 4 Jul 2003 08:45:24 +0000 (08:45 +0000)
* アリーナ及びモンスター格闘場のモンスターは使用しないようにした.
* クエスト内, 鉄人モードのプレイヤー対象といった状況では反テレポート
  がなくともテレポートレベルは無効であるので, SMARTなモンスターはその
  条件を読み取りテレポートレベルを使わないものとした.

src/defines.h
src/mspells1.c
src/mspells2.c
src/spells3.c

index c8eabea..ff8fb77 100644 (file)
@@ -5273,6 +5273,13 @@ extern int PlayerUID;
 #define IS_TIM_ESP() (p_ptr->tim_esp || music_singing(MUSIC_MIND))
 #define IS_TIM_STEALTH() (p_ptr->tim_stealth || music_singing(MUSIC_STEALTH))
 
+/* Is "teleport level" ineffective to this target? */
+#define TELE_LEVEL_IS_INEFF(TARGET) \
+       (p_ptr->inside_arena || p_ptr->inside_battle || \
+        (p_ptr->inside_quest && !random_quest_number(dun_level)) || \
+        (((TARGET) <= 0) && (quest_number(dun_level) || (dun_level >= d_info[dungeon_type].maxdepth)) && \
+         (dun_level >= 1) && ironman_downward))
+
 /*
  * World Score -- internet resource value
  */
index 362eefd..c9c54f6 100644 (file)
@@ -1416,20 +1416,28 @@ bool make_attack_spell(int m_idx)
                f6 &= (RF6_NOMAGIC_MASK);
        }
 
-       /* Hack -- allow "desperate" spells */
-       if ((r_ptr->flags2 & (RF2_SMART)) &&
-               (m_ptr->hp < m_ptr->maxhp / 10) &&
-               (randint0(100) < 50))
+       if (r_ptr->flags2 & RF2_SMART)
        {
-               /* Require intelligent spells */
-               f4 &= (RF4_INT_MASK);
-               f5 &= (RF5_INT_MASK);
-               f6 &= (RF6_INT_MASK);
+               /* Hack -- allow "desperate" spells */
+               if ((m_ptr->hp < m_ptr->maxhp / 10) &&
+                       (randint0(100) < 50))
+               {
+                       /* Require intelligent spells */
+                       f4 &= (RF4_INT_MASK);
+                       f5 &= (RF5_INT_MASK);
+                       f6 &= (RF6_INT_MASK);
+               }
 
-               /* No spells left */
-               if (!f4 && !f5 && !f6) return (FALSE);
+               /* Hack -- decline "teleport level" in some case */
+               if ((f6 & RF6_TELE_LEVEL) && TELE_LEVEL_IS_INEFF(0))
+               {
+                       f6 &= ~(RF6_TELE_LEVEL);
+               }
        }
 
+       /* No spells left */
+       if (!f4 && !f5 && !f6) return (FALSE);
+
        /* Remove the "ineffective" spells */
        remove_bad_spells(m_idx, &f4, &f5, &f6);
 
@@ -1437,40 +1445,41 @@ bool make_attack_spell(int m_idx)
        {
                f4 &= ~(RF4_SUMMON_MASK);
                f5 &= ~(RF5_SUMMON_MASK);
-               f6 &= ~(RF6_SUMMON_MASK);
+               f6 &= ~(RF6_SUMMON_MASK | RF6_TELE_LEVEL);
        }
 
        /* No spells left */
        if (!f4 && !f5 && !f6) return (FALSE);
 
-       /* Check for a clean bolt shot */
-       if (((f4 & RF4_BOLT_MASK) ||
-            (f5 & RF5_BOLT_MASK) ||
-            (f6 & RF6_BOLT_MASK)) &&
-           !(r_ptr->flags2 & RF2_STUPID) &&
-           !clean_shot(m_ptr->fy, m_ptr->fx, py, px, FALSE))
+       if (!(r_ptr->flags2 & RF2_STUPID))
        {
-               /* Remove spells that will only hurt friends */
-               f4 &= ~(RF4_BOLT_MASK);
-               f5 &= ~(RF5_BOLT_MASK);
-               f6 &= ~(RF6_BOLT_MASK);
-       }
+               /* Check for a clean bolt shot */
+               if (((f4 & RF4_BOLT_MASK) ||
+                    (f5 & RF5_BOLT_MASK) ||
+                    (f6 & RF6_BOLT_MASK)) &&
+                   !clean_shot(m_ptr->fy, m_ptr->fx, py, px, FALSE))
+               {
+                       /* Remove spells that will only hurt friends */
+                       f4 &= ~(RF4_BOLT_MASK);
+                       f5 &= ~(RF5_BOLT_MASK);
+                       f6 &= ~(RF6_BOLT_MASK);
+               }
 
-       /* Check for a possible summon */
-       if (((f4 & RF4_SUMMON_MASK) ||
-            (f5 & RF5_SUMMON_MASK) ||
-            (f6 & RF6_SUMMON_MASK)) &&
-           !(r_ptr->flags2 & RF2_STUPID) &&
-           !(summon_possible(y, x)))
-       {
-               /* Remove summoning spells */
-               f4 &= ~(RF4_SUMMON_MASK);
-               f5 &= ~(RF5_SUMMON_MASK);
-               f6 &= ~(RF6_SUMMON_MASK);
-       }
+               /* Check for a possible summon */
+               if (((f4 & RF4_SUMMON_MASK) ||
+                    (f5 & RF5_SUMMON_MASK) ||
+                    (f6 & RF6_SUMMON_MASK)) &&
+                   !(summon_possible(y, x)))
+               {
+                       /* Remove summoning spells */
+                       f4 &= ~(RF4_SUMMON_MASK);
+                       f5 &= ~(RF5_SUMMON_MASK);
+                       f6 &= ~(RF6_SUMMON_MASK);
+               }
 
-       /* No spells left */
-       if (!f4 && !f5 && !f6) return (FALSE);
+               /* No spells left */
+               if (!f4 && !f5 && !f6) return (FALSE);
+       }
 
        /* Extract the "inate" spells */
        for (k = 0; k < 32; k++)
index 1014a1b..68e23e2 100644 (file)
@@ -328,7 +328,7 @@ bool monst_spell_monst(int m_idx)
        {
                f4 &= ~(RF4_SUMMON_MASK);
                f5 &= ~(RF5_SUMMON_MASK);
-               f6 &= ~(RF6_SUMMON_MASK);
+               f6 &= ~(RF6_SUMMON_MASK | RF6_TELE_LEVEL);
        }
 
        if (p_ptr->inside_battle && !one_in_(3))
@@ -452,40 +452,49 @@ bool monst_spell_monst(int m_idx)
 
        /* Remove some spells if necessary */
 
-       /* Check for a clean bolt shot */
-       if (((f4 & RF4_BOLT_MASK) ||
-            (f5 & RF5_BOLT_MASK) ||
-            (f6 & RF6_BOLT_MASK)) &&
-           !(r_ptr->flags2 & RF2_STUPID) &&
-           !clean_shot(m_ptr->fy, m_ptr->fx, t_ptr->fy, t_ptr->fx, pet))
+       if (!(r_ptr->flags2 & RF2_STUPID))
        {
-               f4 &= ~(RF4_BOLT_MASK);
-               f5 &= ~(RF5_BOLT_MASK);
-               f6 &= ~(RF6_BOLT_MASK);
-       }
+               /* Check for a clean bolt shot */
+               if (((f4 & RF4_BOLT_MASK) ||
+                    (f5 & RF5_BOLT_MASK) ||
+                    (f6 & RF6_BOLT_MASK)) &&
+                   !clean_shot(m_ptr->fy, m_ptr->fx, t_ptr->fy, t_ptr->fx, pet))
+               {
+                       f4 &= ~(RF4_BOLT_MASK);
+                       f5 &= ~(RF5_BOLT_MASK);
+                       f6 &= ~(RF6_BOLT_MASK);
+               }
 
-       /* Check for a possible summon */
-       if (((f4 & RF4_SUMMON_MASK) ||
-            (f5 & RF5_SUMMON_MASK) ||
-            (f6 & RF6_SUMMON_MASK)) &&
-           !(r_ptr->flags2 & RF2_STUPID) &&
-           !(summon_possible(t_ptr->fy, t_ptr->fx)))
-       {
-               /* Remove summoning spells */
-               f4 &= ~(RF4_SUMMON_MASK);
-               f5 &= ~(RF5_SUMMON_MASK);
-               f6 &= ~(RF6_SUMMON_MASK);
+               /* Check for a possible summon */
+               if (((f4 & RF4_SUMMON_MASK) ||
+                    (f5 & RF5_SUMMON_MASK) ||
+                    (f6 & RF6_SUMMON_MASK)) &&
+                   !(summon_possible(t_ptr->fy, t_ptr->fx)))
+               {
+                       /* Remove summoning spells */
+                       f4 &= ~(RF4_SUMMON_MASK);
+                       f5 &= ~(RF5_SUMMON_MASK);
+                       f6 &= ~(RF6_SUMMON_MASK);
+               }
        }
 
-       /* Hack -- allow "desperate" spells */
-       if ((r_ptr->flags2 & RF2_SMART) &&
-           (m_ptr->hp < m_ptr->maxhp / 10) &&
-           (randint0(100) < 50))
+       if (r_ptr->flags2 & RF2_SMART)
        {
-               /* Require intelligent spells */
-               f4 &= (RF4_INT_MASK);
-               f5 &= (RF5_INT_MASK);
-               f6 &= (RF6_INT_MASK);
+               /* Hack -- allow "desperate" spells */
+               if ((m_ptr->hp < m_ptr->maxhp / 10) &&
+                   (randint0(100) < 50))
+               {
+                       /* Require intelligent spells */
+                       f4 &= (RF4_INT_MASK);
+                       f5 &= (RF5_INT_MASK);
+                       f6 &= (RF6_INT_MASK);
+               }
+
+               /* Hack -- decline "teleport level" in some case */
+               if ((f6 & RF6_TELE_LEVEL) && TELE_LEVEL_IS_INEFF((t_idx == p_ptr->riding) ? 0 : t_idx))
+               {
+                       f6 &= ~(RF6_TELE_LEVEL);
+               }
        }
 
        /* No spells left */
index f4e8bf9..37cedfa 100644 (file)
@@ -542,9 +542,8 @@ void teleport_level(int m_idx)
                see_m = m_ptr->ml;
        }
 
-       /* No effect in arena or quest */
-       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)))
+       /* No effect in some case */
+       if (TELE_LEVEL_IS_INEFF(m_idx))
        {
 #ifdef JP
                if (see_m) msg_print("¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£");