OSDN Git Service

[Refactor] monster_name() で一部 cmd2.c の投擲対象処理を整理。
[hengband/hengband.git] / src / cmd-pet.c
index 46f6fba..a901365 100644 (file)
@@ -3,6 +3,8 @@
 #include "sort.h"
 #include "player-status.h"
 #include "object-hook.h"
+#include "monster.h"
+#include "monster-status.h"
 
 /*!
 * @brief プレイヤーの騎乗/下馬処理判定
@@ -51,63 +53,16 @@ bool player_can_ride_aux(grid_type *g_ptr, bool now_riding)
 
 
 /*!
-* @brief ペットになっているモンスターをソートするための比較処理
-* @param u モンスターの構造体配列
-* @param v 未使用
-* @param a 比較対象のモンスターID1
-* @param b 比較対象のモンスターID2
-* @return 2番目が大ならばTRUEを返す
-*/
-static bool ang_sort_comp_pet_dismiss(vptr u, vptr v, int a, int b)
-{
-       u16b *who = (u16b*)(u);
-
-       int w1 = who[a];
-       int w2 = who[b];
-
-       monster_type *m_ptr1 = &current_floor_ptr->m_list[w1];
-       monster_type *m_ptr2 = &current_floor_ptr->m_list[w2];
-       monster_race *r_ptr1 = &r_info[m_ptr1->r_idx];
-       monster_race *r_ptr2 = &r_info[m_ptr2->r_idx];
-
-       /* Unused */
-       (void)v;
-
-       if (w1 == p_ptr->riding) return TRUE;
-       if (w2 == p_ptr->riding) return FALSE;
-
-       if (m_ptr1->nickname && !m_ptr2->nickname) return TRUE;
-       if (m_ptr2->nickname && !m_ptr1->nickname) return FALSE;
-
-       if (!m_ptr1->parent_m_idx && m_ptr2->parent_m_idx) return TRUE;
-       if (!m_ptr2->parent_m_idx && m_ptr1->parent_m_idx) return FALSE;
-
-       if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return TRUE;
-       if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return FALSE;
-
-       if (r_ptr1->level > r_ptr2->level) return TRUE;
-       if (r_ptr2->level > r_ptr1->level) return FALSE;
-
-       if (m_ptr1->hp > m_ptr2->hp) return TRUE;
-       if (m_ptr2->hp > m_ptr1->hp) return FALSE;
-
-       return w1 <= w2;
-}
-
-
-/*!
 * @brief ペットの維持コスト計算
 * @return 維持コスト(%)
 */
-int calculate_upkeep(void)
+PERCENTAGE calculate_upkeep(void)
 {
-       s32b old_friend_align = friend_align;
        MONSTER_IDX m_idx;
        bool have_a_unique = FALSE;
-       s32b total_friend_levels = 0;
+       DEPTH total_friend_levels = 0;
 
        total_friends = 0;
-       friend_align = 0;
 
        for (m_idx = m_max - 1; m_idx >= 1; m_idx--)
        {
@@ -115,7 +70,7 @@ int calculate_upkeep(void)
                monster_race *r_ptr;
 
                m_ptr = &current_floor_ptr->m_list[m_idx];
-               if (!m_ptr->r_idx) continue;
+               if (!monster_is_valid(m_ptr)) continue;
                r_ptr = &r_info[m_ptr->r_idx];
 
                if (is_pet(m_ptr))
@@ -139,12 +94,9 @@ int calculate_upkeep(void)
                        else
                                total_friend_levels += r_ptr->level;
 
-                       /* Determine pet alignment */
-                       if (r_ptr->flags3 & RF3_GOOD) friend_align += r_ptr->level;
-                       if (r_ptr->flags3 & RF3_EVIL) friend_align -= r_ptr->level;
                }
        }
-       if (old_friend_align != friend_align) p_ptr->update |= (PU_BONUS);
+
        if (total_friends)
        {
                int upkeep_factor;
@@ -163,8 +115,8 @@ int calculate_upkeep(void)
 */
 void do_cmd_pet_dismiss(void)
 {
-       monster_type    *m_ptr;
-       bool            all_pets = FALSE;
+       monster_type *m_ptr;
+       bool all_pets = FALSE;
        MONSTER_IDX pet_ctr;
        int i;
        int Dismissed = 0;
@@ -189,11 +141,7 @@ void do_cmd_pet_dismiss(void)
                        who[max_pet++] = pet_ctr;
        }
 
-       /* Select the sort method */
-       ang_sort_comp = ang_sort_comp_pet_dismiss;
-       ang_sort_swap = ang_sort_swap_hook;
-
-       ang_sort(who, &dummy_why, max_pet);
+       ang_sort(who, &dummy_why, max_pet, ang_sort_comp_pet_dismiss, ang_sort_swap_hook);
 
        /* Process the monsters (backwards) */
        for (i = 0; i < max_pet; i++)
@@ -268,14 +216,14 @@ void do_cmd_pet_dismiss(void)
 
                                p_ptr->riding = 0;
 
-                               p_ptr->update |= (PU_BONUS | PU_MONSTERS);
+                               p_ptr->update |= (PU_MONSTERS);
                                p_ptr->redraw |= (PR_EXTRA | PR_UHEALTH);
                        }
 
                        /* HACK : Add the line to message buffer */
                        msg_format(_("%s を放した。", "Dismissed %s."), friend_name);
+                       p_ptr->update |= (PU_BONUS);
                        p_ptr->window |= (PW_MESSAGE);
-                       handle_stuff();
 
                        delete_monster_idx(pet_ctr);
                        Dismissed++;
@@ -296,6 +244,8 @@ void do_cmd_pet_dismiss(void)
 #endif
        if (Dismissed == 0 && all_pets)
                msg_print(_("'U'nnamed は、乗馬以外の名前のないペットだけを全て解放します。", "'U'nnamed means all your pets except named pets and your mount."));
+
+       handle_stuff();
 }
 
 
@@ -772,8 +722,6 @@ void do_cmd_pet(void)
                                {
                                        byte y = 1, x = 0;
                                        PET_COMMAND_IDX ctr = 0;
-
-                                       /* Show list */
                                        redraw = TRUE;
                                        if (!use_menu) screen_save();
 
@@ -1003,35 +951,6 @@ void do_cmd_pet(void)
 
 
 /*!
-* @brief ペットの善悪属性に応じた維持コストの途中計算処理
-* @param m_ptr 計算基準となるモンスターの構造体参照ポインタ
-* @param inc m_ptrで指定したモンスターを維持コスト計算に加えるならTRUE、外すならFALSEを指定
-* @return なし
-*/
-void check_pets_num_and_align(monster_type *m_ptr, bool inc)
-{
-       s32b old_friend_align = friend_align;
-       monster_race *r_ptr = &r_info[m_ptr->r_idx];
-
-       if (inc)
-       {
-               total_friends++;
-               if (r_ptr->flags3 & RF3_GOOD) friend_align += r_ptr->level;
-               if (r_ptr->flags3 & RF3_EVIL) friend_align -= r_ptr->level;
-       }
-       else
-       {
-               total_friends--;
-               if (r_ptr->flags3 & RF3_GOOD) friend_align -= r_ptr->level;
-               if (r_ptr->flags3 & RF3_EVIL) friend_align += r_ptr->level;
-       }
-
-       if (old_friend_align != friend_align) p_ptr->update |= (PU_BONUS);
-}
-
-
-
-/*!
 * @brief プレイヤーの落馬判定処理
 * @param dam 落馬判定を発した際に受けたダメージ量
 * @param force TRUEならば強制的に落馬する
@@ -1089,7 +1008,6 @@ bool rakuba(HIT_POINT dam, bool force)
                {
                        grid_type *g_ptr;
 
-                       /* Access the location */
                        y = p_ptr->y + ddy_ddd[i];
                        x = p_ptr->x + ddx_ddd[i];