OSDN Git Service

アイテムを拾ったモンスターがカオス的効果やカオス属性等で変身し, 変身
[hengband/hengband.git] / src / spells3.c
index 5850529..68264b9 100644 (file)
@@ -569,7 +569,7 @@ void teleport_away_followable(int m_idx)
 
        teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
 
-       if (old_ml && (old_cdis <= MAX_SIGHT) && !world_monster && los(py, px, oldfy, oldfx))
+       if (old_ml && (old_cdis <= MAX_SIGHT) && !world_monster && !p_ptr->inside_battle && los(py, px, oldfy, oldfx))
        {
                bool follow = FALSE;
 
@@ -794,6 +794,14 @@ void teleport_level(int m_idx)
                /* Check for quest completion */
                check_quest_completion(m_ptr);
 
+               if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
+               {
+                       char m2_name[80];
+
+                       monster_desc(m2_name, m_ptr, MD_INDEF_VISIBLE);
+                       do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_TELE_LEVEL, m2_name);
+               }
+
                delete_monster_idx(m_idx);
        }
 
@@ -1634,7 +1642,7 @@ static bool vanish_dungeon(void)
                                (void)set_monster_csleep(c_ptr->m_idx, 0);
 
                                /* Notice the "waking up" */
-                               if (is_seen(m_ptr))
+                               if (m_ptr->ml)
                                {
                                        /* Acquire the monster name */
                                        monster_desc(m_name, m_ptr, 0);
@@ -2038,7 +2046,7 @@ msg_print("
 
        /* Create a glyph */
        cave[py][px].info |= CAVE_OBJECT;
-       cave[py][px].mimic = FEAT_GLYPH;
+       cave[py][px].mimic = feat_glyph;
 
        /* Notice */
        note_spot(py, px);
@@ -2065,7 +2073,7 @@ msg_print("
 
        /* Create a mirror */
        cave[py][px].info |= CAVE_OBJECT;
-       cave[py][px].mimic = FEAT_MIRROR;
+       cave[py][px].mimic = feat_mirror;
 
        /* Turn on the light */
        cave[py][px].info |= CAVE_GLOW;
@@ -2101,7 +2109,7 @@ msg_print("
 
        /* Create a glyph */
        cave[py][px].info |= CAVE_OBJECT;
-       cave[py][px].mimic = FEAT_MINOR_GLYPH;
+       cave[py][px].mimic = feat_explosive_rune;
 
        /* Notice */
        note_spot(py, px);
@@ -2830,24 +2838,32 @@ bool ident_spell(bool only_equip)
        else
                item_tester_hook = item_tester_hook_identify;
 
-       if (!can_get_item())
+       if (can_get_item())
+       {
+#ifdef JP
+               q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò´ÕÄꤷ¤Þ¤¹¤«? ";
+#else
+               q = "Identify which item? ";
+#endif
+       }
+       else
        {
                if (only_equip)
-               {
                        item_tester_hook = object_is_weapon_armour_ammo;
-               }
                else
-               {
                        item_tester_hook = NULL;
-               }
+
+#ifdef JP
+               q = "¤¹¤Ù¤Æ´ÕÄêºÑ¤ß¤Ç¤¹¡£ ";
+#else
+               q = "All items are identified. ";
+#endif
        }
 
        /* Get an item */
 #ifdef JP
-q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò´ÕÄꤷ¤Þ¤¹¤«? ";
-s = "´ÕÄꤹ¤ë¤Ù¤­¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£";
+       s = "´ÕÄꤹ¤ë¤Ù¤­¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£";
 #else
-       q = "Identify which item? ";
        s = "You have nothing to identify.";
 #endif
 
@@ -3004,21 +3020,33 @@ bool identify_fully(bool only_equip)
        else
                item_tester_hook = item_tester_hook_identify_fully;
 
-       if (!can_get_item())
+       if (can_get_item())
+       {
+#ifdef JP
+               q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò*´ÕÄê*¤·¤Þ¤¹¤«? ";
+#else
+               q = "*Identify* which item? ";
+#endif
+       }
+       else
        {
                if (only_equip)
                        item_tester_hook = object_is_weapon_armour_ammo;
                else
                        item_tester_hook = NULL;
+
+#ifdef JP
+               q = "¤¹¤Ù¤Æ*´ÕÄê*ºÑ¤ß¤Ç¤¹¡£ ";
+#else
+               q = "All items are *identified*. ";
+#endif
        }
 
        /* Get an item */
 #ifdef JP
-q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò´ÕÄꤷ¤Þ¤¹¤«? ";
-s = "´ÕÄꤹ¤ë¤Ù¤­¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£";
+       s = "*´ÕÄê*¤¹¤ë¤Ù¤­¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£";
 #else
-       q = "Identify which item? ";
-       s = "You have nothing to identify.";
+       s = "You have nothing to *identify*.";
 #endif
 
        if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE);
@@ -4776,8 +4804,7 @@ int inven_damage(inven_func typ, int perc)
        object_type *o_ptr;
        char        o_name[MAX_NLEN];
 
-       /* Multishadow effects is determined by turn */
-       if( p_ptr->multishadow && (turn & 1) )return 0;
+       if (CHECK_MULTISHADOW()) return 0;
 
        if (p_ptr->inside_arena) return 0;
 
@@ -4961,15 +4988,18 @@ int acid_dam(int dam, cptr kb_str, int monspell)
        if (p_ptr->resist_acid) dam = (dam + 2) / 3;
        if (double_resist) dam = (dam + 2) / 3;
 
-       if ((!(double_resist || p_ptr->resist_acid)) &&
-           one_in_(HURT_CHANCE))
-               (void)do_dec_stat(A_CHR);
+       if (!CHECK_MULTISHADOW())
+       {
+               if ((!(double_resist || p_ptr->resist_acid)) &&
+                   one_in_(HURT_CHANCE))
+                       (void)do_dec_stat(A_CHR);
 
-       /* If any armor gets hit, defend the player */
-       if (minus_ac()) dam = (dam + 1) / 2;
+               /* If any armor gets hit, defend the player */
+               if (minus_ac()) dam = (dam + 1) / 2;
+       }
 
        /* Take damage */
-       get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
+       get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
 
        /* Inventory damage */
        if (!(double_resist && p_ptr->resist_acid))
@@ -5004,11 +5034,11 @@ int elec_dam(int dam, cptr kb_str, int monspell)
        if (double_resist) dam = (dam + 2) / 3;
 
        if ((!(double_resist || p_ptr->resist_elec)) &&
-           one_in_(HURT_CHANCE))
+           one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW())
                (void)do_dec_stat(A_DEX);
 
        /* Take damage */
-       get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
+       get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
 
        /* Inventory damage */
        if (!(double_resist && p_ptr->resist_elec))
@@ -5044,11 +5074,11 @@ int fire_dam(int dam, cptr kb_str, int monspell)
        if (double_resist) dam = (dam + 2) / 3;
 
        if ((!(double_resist || p_ptr->resist_fire)) &&
-           one_in_(HURT_CHANCE))
+           one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW())
                (void)do_dec_stat(A_STR);
 
        /* Take damage */
-       get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
+       get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
 
        /* Inventory damage */
        if (!(double_resist && p_ptr->resist_fire))
@@ -5083,11 +5113,11 @@ int cold_dam(int dam, cptr kb_str, int monspell)
        if (double_resist) dam = (dam + 2) / 3;
 
        if ((!(double_resist || p_ptr->resist_cold)) &&
-           one_in_(HURT_CHANCE))
+           one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW())
                (void)do_dec_stat(A_STR);
 
        /* Take damage */
-       get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
+       get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell);
 
        /* Inventory damage */
        if (!(double_resist && p_ptr->resist_cold))
@@ -5462,18 +5492,27 @@ bool polymorph_monster(int y, int x)
        if (new_r_idx != old_r_idx)
        {
                u32b mode = 0L;
+               bool preserve_hold_objects = back_m.hold_o_idx ? TRUE : FALSE;
+               s16b this_o_idx, next_o_idx = 0;
 
                /* Get the monsters attitude */
                if (is_friendly(m_ptr)) mode |= PM_FORCE_FRIENDLY;
                if (is_pet(m_ptr)) mode |= PM_FORCE_PET;
                if (m_ptr->mflag2 & MFLAG2_NOPET) mode |= PM_NO_PET;
 
+               /* Mega-hack -- ignore held objects */
+               m_ptr->hold_o_idx = 0;
+
                /* "Kill" the "old" monster */
                delete_monster_idx(c_ptr->m_idx);
 
                /* Create a new monster (no groups) */
                if (place_monster_aux(0, y, x, new_r_idx, mode))
                {
+                       m_list[hack_m_idx_ii].nickname = back_m.nickname;
+                       m_list[hack_m_idx_ii].parent_m_idx = back_m.parent_m_idx;
+                       m_list[hack_m_idx_ii].hold_o_idx = back_m.hold_o_idx;
+
                        /* Success */
                        polymorphed = TRUE;
                }
@@ -5487,6 +5526,35 @@ bool polymorph_monster(int y, int x)
                                /* Re-initialize monster process */
                                mproc_init();
                        }
+                       else preserve_hold_objects = FALSE;
+               }
+
+               /* Mega-hack -- preserve held objects */
+               if (preserve_hold_objects)
+               {
+                       for (this_o_idx = back_m.hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
+                       {
+                               /* Acquire object */
+                               object_type *o_ptr = &o_list[this_o_idx];
+
+                               /* Acquire next object */
+                               next_o_idx = o_ptr->next_o_idx;
+
+                               /* Held by new monster */
+                               o_ptr->held_m_idx = hack_m_idx_ii;
+                       }
+               }
+               else if (back_m.hold_o_idx) /* Failed (paranoia) */
+               {
+                       /* Delete objects */
+                       for (this_o_idx = back_m.hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
+                       {
+                               /* Acquire next object */
+                               next_o_idx = o_list[this_o_idx].next_o_idx;
+
+                               /* Delete the object */
+                               delete_object_idx(this_o_idx);
+                       }
                }
 
                if (targeted) target_who = hack_m_idx_ii;