OSDN Git Service

微少な速度よりも混乱しないコードの方が良いという事で、
[hengbandforosx/hengbandosx.git] / src / xtra2.c
index 3d61649..14215db 100644 (file)
@@ -589,7 +589,7 @@ msg_print("
                cave_set_feat(y, x, FEAT_MORE);
 
                /* Remember to update everything */
-               p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MONSTERS);
+               p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MONSTERS | PU_MON_LITE);
        }
 
        /*
@@ -606,7 +606,7 @@ msg_print("
                        object_wipe(q_ptr);
 
                        /* Make a great object */
-                       make_object(q_ptr, TRUE, TRUE);
+                       make_object(q_ptr, AM_GOOD | AM_GREAT);
 
                        /* Drop it in the dungeon */
                        (void)drop_near(q_ptr, -1, y, x);
@@ -614,6 +614,45 @@ msg_print("
        }
 }
 
+
+/*
+ * Return monster death string
+ */
+cptr extract_note_dies(monster_race *r_ptr)
+{
+       /* Some monsters get "destroyed" */
+       if (!monster_living(r_ptr))
+       {
+               int i;
+
+               for (i = 0; i < 4; i++)
+               {
+                       if (r_ptr->blow[i].method == RBM_EXPLODE)
+                       {
+#ifdef JP
+                               return "¤ÏÇúȯ¤·¤ÆÊ´¡¹¤Ë¤Ê¤Ã¤¿¡£";
+#else
+                               return " explodes into tiny shreds.";
+#endif
+                       }
+               }
+
+#ifdef JP
+               return "¤òÅݤ·¤¿¡£";
+#else
+               return " is destroyed.";
+#endif
+       }
+
+       /* Assume a default death */
+#ifdef JP
+       return "¤Ï»à¤ó¤À¡£";
+#else
+       return " dies.";
+#endif
+}
+
+
 /*
  * Handle the "death" of a monster.
  *
@@ -643,8 +682,7 @@ void monster_death(int m_idx, bool drop_item)
 
        bool visible = (m_ptr->ml || (r_ptr->flags1 & RF1_UNIQUE));
 
-       bool good = (r_ptr->flags1 & RF1_DROP_GOOD) ? TRUE : FALSE;
-       bool great = (r_ptr->flags1 & RF1_DROP_GREAT) ? TRUE : FALSE;
+       u32b mo_mode = 0L;
 
        bool do_gold = (!(r_ptr->flags1 & RF1_ONLY_ITEM));
        bool do_item = (!(r_ptr->flags1 & RF1_ONLY_GOLD));
@@ -661,7 +699,7 @@ void monster_death(int m_idx, bool drop_item)
        if (world_monster) world_monster = FALSE;
 
        /* Notice changes in view */
-       if (r_ptr->flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2 | RF7_SELF_LITE_1 | RF7_SELF_LITE_2))
+       if (r_ptr->flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
        {
                /* Update some things */
                p_ptr->update |= (PU_MON_LITE);
@@ -678,7 +716,7 @@ void monster_death(int m_idx, bool drop_item)
        {
                char m_name[80];
 
-               monster_desc(m_name, m_ptr, 0x08);
+               monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
                do_cmd_write_nikki(NIKKI_NAMED_PET, 3, m_name);
        }
 
@@ -710,11 +748,6 @@ void monster_death(int m_idx, bool drop_item)
        /* Handle the possibility of player vanquishing arena combatant -KMW- */
        if (p_ptr->inside_arena && !is_pet(m_ptr))
        {
-               char m_name[80];
-
-               /* Extract monster name */
-               monster_desc(m_name, m_ptr, 0);
-
                p_ptr->exit_bldg = TRUE;
 
                if (p_ptr->arena_number > MAX_ARENA_MONS)
@@ -742,7 +775,7 @@ msg_print("
                        /* Prepare to make a prize */
                        object_prep(q_ptr, lookup_kind(arena_info[p_ptr->arena_number].tval, arena_info[p_ptr->arena_number].sval));
 
-                       apply_magic(q_ptr, object_level, FALSE, FALSE, FALSE, FALSE);
+                       apply_magic(q_ptr, object_level, AM_NO_FIXED_ART);
 
                        /* Drop it in the dungeon */
                        (void)drop_near(q_ptr, -1, y, x);
@@ -750,7 +783,15 @@ msg_print("
 
                if (p_ptr->arena_number > MAX_ARENA_MONS) p_ptr->arena_number++;
                p_ptr->arena_number++;
-               if (record_arena) do_cmd_write_nikki(NIKKI_ARENA, p_ptr->arena_number, m_name);
+               if (record_arena)
+               {
+                       char m_name[80];
+                       
+                       /* Extract monster name */
+                       monster_desc(m_name, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
+                       
+                       do_cmd_write_nikki(NIKKI_ARENA, p_ptr->arena_number, m_name);
+               }
        }
 
        if (m_idx == p_ptr->riding)
@@ -803,7 +844,7 @@ msg_print("
                /* Prepare to make an object */
                object_prep(q_ptr, lookup_kind(TV_CORPSE, (corpse ? SV_CORPSE : SV_SKELETON)));
 
-               apply_magic(q_ptr, object_level, FALSE, FALSE, FALSE, FALSE);
+               apply_magic(q_ptr, object_level, AM_NO_FIXED_ART);
 
                q_ptr->pval = m_ptr->r_idx;
 
@@ -814,6 +855,9 @@ msg_print("
        /* Drop objects being carried */
        monster_drop_carried_objects(m_ptr);
 
+       if (r_ptr->flags1 & RF1_DROP_GOOD) mo_mode |= AM_GOOD;
+       if (r_ptr->flags1 & RF1_DROP_GREAT) mo_mode |= AM_GREAT;
+
        switch (m_ptr->r_idx)
        {
        case MON_PINK_HORROR:
@@ -856,7 +900,7 @@ msg_print("
                        /* Prepare to make a Blade of Chaos */
                        object_prep(q_ptr, lookup_kind(TV_SWORD, SV_BLADE_OF_CHAOS));
 
-                       apply_magic(q_ptr, object_level, FALSE, FALSE, FALSE, FALSE);
+                       apply_magic(q_ptr, object_level, AM_NO_FIXED_ART | mo_mode);
 
                        /* Drop it in the dungeon */
                        (void)drop_near(q_ptr, -1, y, x);
@@ -882,7 +926,7 @@ msg_print("
                        get_obj_num_prep();
 
                        /* Make a book */
-                       make_object(q_ptr, FALSE, FALSE);
+                       make_object(q_ptr, mo_mode);
 
                        /* Drop it in the dungeon */
                        (void)drop_near(q_ptr, -1, y, x);
@@ -942,9 +986,10 @@ msg_print("
                /* Reward for "lazy" player */
                if (p_ptr->pseikaku == SEIKAKU_NAMAKE)
                {
-                       int a_idx;
+                       int a_idx = 0;
 
                        if (!drop_chosen_item) break;
+
                        do
                        {
                                switch (randint0(3))
@@ -984,7 +1029,7 @@ msg_print("
                q_ptr->name1 = ART_GROND;
 
                /* Mega-Hack -- Actually create "Grond" */
-               apply_magic(q_ptr, -1, TRUE, TRUE, TRUE, FALSE);
+               apply_magic(q_ptr, -1, AM_GOOD | AM_GREAT);
 
                /* Drop it in the dungeon */
                (void)drop_near(q_ptr, -1, y, x);
@@ -999,7 +1044,7 @@ msg_print("
                q_ptr->name1 = ART_CHAOS;
 
                /* Mega-Hack -- Actually create "Chaos" */
-               apply_magic(q_ptr, -1, TRUE, TRUE, TRUE, FALSE);
+               apply_magic(q_ptr, -1, AM_GOOD | AM_GREAT);
 
                /* Drop it in the dungeon */
                (void)drop_near(q_ptr, -1, y, x);
@@ -1030,7 +1075,7 @@ msg_print("
                        /* Prepare to make a Can of Toys */
                        object_prep(q_ptr, lookup_kind(TV_CHEST, SV_CHEST_KANDUME));
 
-                       apply_magic(q_ptr, object_level, FALSE, FALSE, FALSE, FALSE);
+                       apply_magic(q_ptr, object_level, AM_NO_FIXED_ART);
 
                        /* Drop it in the dungeon */
                        (void)drop_near(q_ptr, -1, y, x);
@@ -1065,7 +1110,7 @@ msg_print("
                                get_obj_num_prep();
 
                                /* Make a cloak */
-                               make_object(q_ptr, FALSE, FALSE);
+                               make_object(q_ptr, mo_mode);
 
                                /* Drop it in the dungeon */
                                (void)drop_near(q_ptr, -1, y, x);
@@ -1088,7 +1133,7 @@ msg_print("
                                get_obj_num_prep();
 
                                /* Make a poleweapon */
-                               make_object(q_ptr, FALSE, FALSE);
+                               make_object(q_ptr, mo_mode);
 
                                /* Drop it in the dungeon */
                                (void)drop_near(q_ptr, -1, y, x);
@@ -1111,7 +1156,7 @@ msg_print("
                                get_obj_num_prep();
 
                                /* Make a hard armor */
-                               make_object(q_ptr, FALSE, FALSE);
+                               make_object(q_ptr, mo_mode);
 
                                /* Drop it in the dungeon */
                                (void)drop_near(q_ptr, -1, y, x);
@@ -1134,7 +1179,7 @@ msg_print("
                                get_obj_num_prep();
 
                                /* Make a sword */
-                               make_object(q_ptr, FALSE, FALSE);
+                               make_object(q_ptr, mo_mode);
 
                                /* Drop it in the dungeon */
                                (void)drop_near(q_ptr, -1, y, x);
@@ -1144,7 +1189,7 @@ msg_print("
                break;
        }
 
-       /* Mega-Hack -- drop fixed artifacts */
+       /* Mega-Hack -- drop fixed items */
        if (drop_chosen_item)
        {
                int a_idx = 0;
@@ -1332,21 +1377,20 @@ msg_print("
 
                if ((r_ptr->flags7 & RF7_GUARDIAN) && (d_info[dungeon_type].final_guardian == m_ptr->r_idx))
                {
-                       int k_idx = lookup_kind(TV_SCROLL, SV_SCROLL_ACQUIREMENT); /* Acquirement */;
-
-                       if (d_info[dungeon_type].final_object)
-                               k_idx = d_info[dungeon_type].final_object;
+                       int k_idx = d_info[dungeon_type].final_object ? d_info[dungeon_type].final_object
+                               : lookup_kind(TV_SCROLL, SV_SCROLL_ACQUIREMENT);
 
                        if (d_info[dungeon_type].final_artifact)
                        {
                                int a_idx = d_info[dungeon_type].final_artifact;
-                               if (a_info[a_idx].cur_num == 0)
+                               if (!a_info[a_idx].cur_num)
                                {
                                        /* Create the artifact */
                                        create_named_art(a_idx, y, x);
-
                                        a_info[a_idx].cur_num = 1;
-                                       k_idx = 0;
+
+                                       /* Prevent rewarding both artifact and "default" object */
+                                       if (!d_info[dungeon_type].final_object) k_idx = 0;
                                }
                        }
 
@@ -1358,7 +1402,7 @@ msg_print("
                                /* Prepare to make a reward */
                                object_prep(q_ptr, k_idx);
 
-                               apply_magic(q_ptr, object_level, FALSE, TRUE, FALSE, FALSE);
+                               apply_magic(q_ptr, object_level, AM_NO_FIXED_ART | AM_GOOD);
 
                                /* Drop it in the dungeon */
                                (void)drop_near(q_ptr, -1, y, x);
@@ -1415,7 +1459,7 @@ msg_print("
                else
                {
                        /* Make an object */
-                       if (!make_object(q_ptr, good, great)) continue;
+                       if (!make_object(q_ptr, mo_mode)) continue;
 
                        /* XXX XXX XXX */
                        dump_item++;
@@ -1503,7 +1547,7 @@ int mon_damage_mod(monster_type *m_ptr, int dam, bool is_psy_spear)
 {
        monster_race    *r_ptr = &r_info[m_ptr->r_idx];
 
-       if ((r_ptr->flags3 & RF3_RES_ALL) && dam > 0)
+       if ((r_ptr->flagsr & RFR_RES_ALL) && dam > 0)
        {
                dam /= 100;
                if((dam == 0) && one_in_(3)) dam = 1;
@@ -1698,6 +1742,8 @@ bool mon_take_hit(int m_idx, int dam, bool *fear, cptr note)
        /* Wake it up */
        m_ptr->csleep = 0;
 
+       if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+
        /* Hack - Cancel any special player stealth magics. -LM- */
        if (p_ptr->special_defense & NINJA_S_STEALTH)
        {
@@ -1750,7 +1796,7 @@ bool mon_take_hit(int m_idx, int dam, bool *fear, cptr note)
                }
 
                /* Extract monster name */
-               monster_desc(m_name, m_ptr, 0x100);
+               monster_desc(m_name, m_ptr, MD_TRUE_NAME);
 
                /* Don't kill Amberites */
                if ((r_ptr->flags3 & RF3_AMBERITE) && one_in_(2))
@@ -2051,9 +2097,9 @@ msg_format("%s
 
                /* Prevent bug of chaos patron's reward */
                if (r_ptr->flags7 & RF7_KILL_EXP)
-                       get_exp_from_mon((long)m_ptr->max_maxhp*2, &exp_mon);
+                       get_exp_from_mon((long)exp_mon.max_maxhp*2, &exp_mon);
                else
-                       get_exp_from_mon(((long)m_ptr->max_maxhp+1L) * 9L / 10L, &exp_mon);
+                       get_exp_from_mon(((long)exp_mon.max_maxhp+1L) * 9L / 10L, &exp_mon);
 
                /* Not afraid */
                (*fear) = FALSE;
@@ -2420,9 +2466,8 @@ void verify_panel(void)
 /*
  * Monster health description
  */
-cptr look_mon_desc(int m_idx, u32b mode)
+cptr look_mon_desc(monster_type *m_ptr, u32b mode)
 {
-       monster_type *m_ptr = &m_list[m_idx];
        monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx];
        bool         living;
        int          perc;
@@ -2817,7 +2862,7 @@ static bool target_set_accept(int y, int x)
        if (!(in_bounds(y, x))) return (FALSE);
 
        /* Player grid is always interesting */
-       if ((y == py) && (x == px)) return (TRUE);
+       if (player_bold(y, x)) return (TRUE);
 
 
        /* Handle hallucination */
@@ -2857,7 +2902,7 @@ static bool target_set_accept(int y, int x)
                byte feat;
 
                /* Feature code (applying "mimic" field) */
-               feat = c_ptr->mimic ? c_ptr->mimic : f_info[c_ptr->feat].mimic;
+               feat = f_info[c_ptr->mimic ? c_ptr->mimic : c_ptr->feat].mimic;
 
                /* Notice glyphs */
                if (c_ptr->info & CAVE_OBJECT) return (TRUE);
@@ -3092,7 +3137,7 @@ static int target_set_aux(int y, int x, int mode, cptr info)
 #endif /* ALLOW_EASY_FLOOR */
 
        /* Hack -- under the player */
-       if ((y == py) && (x == px))
+       if (player_bold(y, x))
        {
                /* Description */
 #ifdef JP
@@ -3156,7 +3201,7 @@ static int target_set_aux(int y, int x, int mode, cptr info)
                boring = FALSE;
 
                /* Get the monster name ("a kobold") */
-               monster_desc(m_name, m_ptr, 0x08);
+               monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
 
                /* Hack -- track this monster race */
                monster_race_track(m_ptr->ap_r_idx);
@@ -3210,9 +3255,9 @@ static int target_set_aux(int y, int x, int mode, cptr info)
                        evaluate_monster_exp(acount, m_ptr);
 
 #ifdef JP
-                       sprintf(out_val, "[%s]%s%s(%s)%s%s [r»× %s%s]", acount, s1, m_name, look_mon_desc(c_ptr->m_idx, 0x01), s2, s3, x_info, info);
+                       sprintf(out_val, "[%s]%s%s(%s)%s%s [r»× %s%s]", acount, s1, m_name, look_mon_desc(m_ptr, 0x01), s2, s3, x_info, info);
 #else
-                       sprintf(out_val, "[%s]%s%s%s%s(%s) [r, %s%s]", acount, s1, s2, s3, m_name, look_mon_desc(c_ptr->m_idx, 0x01), x_info, info);
+                       sprintf(out_val, "[%s]%s%s%s%s(%s) [r, %s%s]", acount, s1, s2, s3, m_name, look_mon_desc(m_ptr, 0x01), x_info, info);
 #endif
 
                        prt(out_val, 0, 0);
@@ -3385,7 +3430,6 @@ static int target_set_aux(int y, int x, int mode, cptr info)
                        while (1)
                        {
                                int i, o_idx;
-                               cave_type *c_ptr;
 
                                /* Save screen */
                                screen_save();
@@ -3417,8 +3461,7 @@ static int target_set_aux(int y, int x, int mode, cptr info)
                                }
 
                                /* Get the object being moved. */
-                               c_ptr = &cave[y][x];
-                               o_idx = c_ptr->o_idx;
+                               o_idx = c_ptr->o_idx;
  
                                /* Only rotate a pile of two or more objects. */
                                if (!(o_idx && o_list[o_idx].next_o_idx)) continue;
@@ -3511,7 +3554,7 @@ static int target_set_aux(int y, int x, int mode, cptr info)
 
 
        /* Feature code (applying "mimic" field) */
-       feat = c_ptr->mimic ? c_ptr->mimic : f_info[c_ptr->feat].mimic;
+       feat = f_info[c_ptr->mimic ? c_ptr->mimic : c_ptr->feat].mimic;
 
        /* Require knowledge about grid, or ability to see grid */
        if (!(c_ptr->info & CAVE_MARK) && !player_can_see_bold(y, x))
@@ -5574,8 +5617,8 @@ msg_print("
                case '5':
                case '0':
                        /* illegal place */
-                       if (x == px && y == py) ch = 0;
-                       
+                       if (player_bold(y, x)) ch = 0;
+
                        /* okay place */
                        else success = TRUE;