#include "sort.h"
#include "player-status.h"
#include "object-hook.h"
+#include "monster.h"
+#include "monster-status.h"
/*!
* @brief プレイヤーの騎乗/下馬処理判定
/*!
-* @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 = ¤t_floor_ptr->m_list[w1];
- monster_type *m_ptr2 = ¤t_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--)
{
monster_race *r_ptr;
m_ptr = ¤t_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))
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;
*/
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;
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++)
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++;
#endif
if (Dismissed == 0 && all_pets)
msg_print(_("'U'nnamed は、乗馬以外の名前のないペットだけを全て解放します。", "'U'nnamed means all your pets except named pets and your mount."));
+
+ handle_stuff();
}
{
byte y = 1, x = 0;
PET_COMMAND_IDX ctr = 0;
-
- /* Show list */
redraw = TRUE;
if (!use_menu) screen_save();
/*!
-* @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ならば強制的に落馬する
{
grid_type *g_ptr;
- /* Access the location */
y = p_ptr->y + ddy_ddd[i];
x = p_ptr->x + ddx_ddd[i];