OSDN Git Service

クローン地獄での謎のモンスターのバグ修正。このバグは3つのバグの複合だった。
authormogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sat, 22 Jun 2002 10:37:05 +0000 (10:37 +0000)
committermogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sat, 22 Jun 2002 10:37:05 +0000 (10:37 +0000)
・暗い穴の上は召喚不可能だが、モンスターの変身後の配置も不可能になっていた(バグ1)
→ 暗い穴に全てのモンスターが歩いて入れる(バグ2)
→ 変身で配置失敗(1.0.11以前はその後で大抵クラッシュ(バグ3a))
→ (1.1.0RC以降)配置失敗にも関わらず強引にm_list[hack_m_idx_ii]を元のモンスターのデータで上書きしようとする。(バグ3b)
→ hack_m_idx_iiは未定義なので全然関係無い位置のm_listを破壊してしまう。
→ 破壊されたモンスターが元居た位置のcave[y][x].m_idxが残る
   (= 死んでも死なない謎の見えないモンスター(たまたまml==TRUEのとき)、
    または「プレイヤー」(たまたまml==FALSEのとき))。

src/monster1.c
src/monster2.c
src/spells3.c

index 1a99410..61bb578 100644 (file)
@@ -3467,6 +3467,14 @@ msg_format("%^s
  */
 bool monster_can_cross_terrain(byte feat, monster_race *r_ptr)
 {
+       /* Pit */
+       if (feat == FEAT_DARK_PIT)
+       {
+               if (r_ptr->flags7 & RF7_CAN_FLY)
+                       return TRUE;
+               else
+                       return FALSE;
+       }
        /* Deep water */
        if (feat == FEAT_DEEP_WATER)
        {
index 4489a3d..d93974b 100644 (file)
@@ -2748,10 +2748,10 @@ bool place_monster_one(int who, int y, int x, int r_idx, u32b mode)
 
        /* Require empty space (if not ghostly) */
        if (!(!dun_level && (cave[y][x].feat == FEAT_MOUNTAIN) && ((r_ptr->flags8 & RF8_WILD_MOUNTAIN) || (r_ptr->flags7 & RF7_CAN_FLY))) &&
-           !cave_empty_bold2(y, x) &&
+           !(cave_empty_bold2(y, x) || (mode | PM_IGNORE_TERRAIN)) &&
            !((r_ptr->flags2 & RF2_PASS_WALL) &&
-           !(cave_perma_bold(y, x) || cave[y][x].m_idx ||
-           ((y == py) && (x == px))))) return (FALSE);
+              !(cave_perma_bold(y, x) || cave[y][x].m_idx ||
+                ((y == py) && (x == px))))) return (FALSE);
 
        /* Paranoia */
        if (!r_idx) return (FALSE);
index 5d982d4..0bb824f 100644 (file)
@@ -5566,8 +5566,8 @@ bool polymorph_monster(int y, int x)
                else
                {
                        /* Placing the new monster failed */
-                       place_monster_aux(0, y, x, old_r_idx, (mode | PM_NO_KAGE | PM_IGNORE_TERRAIN));
-                       m_list[hack_m_idx_ii] = back_m;
+                       if (place_monster_aux(0, y, x, old_r_idx, (mode | PM_NO_KAGE | PM_IGNORE_TERRAIN)))
+                                m_list[hack_m_idx_ii] = back_m;
                }
 
                if (targeted) target_who = hack_m_idx_ii;