#include "angband.h"
+#include "util.h"
+
+#include "cmd-dump.h"
+#include "floor.h"
+#include "grid.h"
#include "melee.h"
#include "sort.h"
+#include "player-move.h"
#include "player-status.h"
+#include "player-effects.h"
+#include "player-skill.h"
+#include "player-class.h"
#include "object-hook.h"
+#include "monster.h"
+#include "monster-status.h"
+#include "cmd-pet.h"
+#include "cmd-basic.h"
+#include "view-mainwindow.h"
+#include "targeting.h"
+#include "world.h"
/*!
* @brief プレイヤーの騎乗/下馬処理判定
bool player_can_ride_aux(grid_type *g_ptr, bool now_riding)
{
bool p_can_enter;
- bool old_character_xtra = character_xtra;
+ bool old_character_xtra = current_world_ptr->character_xtra;
MONSTER_IDX old_riding = p_ptr->riding;
bool old_riding_ryoute = p_ptr->riding_ryoute;
bool old_old_riding_ryoute = p_ptr->old_riding_ryoute;
bool old_pf_ryoute = (p_ptr->pet_extra_flags & PF_RYOUTE) ? TRUE : FALSE;
/* Hack -- prevent "icky" message */
- character_xtra = TRUE;
+ current_world_ptr->character_xtra = TRUE;
if (now_riding) p_ptr->riding = g_ptr->m_idx;
else
p_ptr->update |= PU_BONUS;
handle_stuff();
- character_xtra = old_character_xtra;
+ current_world_ptr->character_xtra = old_character_xtra;
return p_can_enter;
}
/*!
-* @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 = &m_list[w1];
- monster_type *m_ptr2 = &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--)
+ for (m_idx = current_floor_ptr->m_max - 1; m_idx >= 1; m_idx--)
{
monster_type *m_ptr;
monster_race *r_ptr;
- m_ptr = &m_list[m_idx];
- if (!m_ptr->r_idx) continue;
+ m_ptr = ¤t_floor_ptr->m_list[m_idx];
+ 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;
Term->scr->cv = 1;
/* Allocate the "who" array */
- C_MAKE(who, max_m_idx, MONSTER_IDX);
+ C_MAKE(who, current_floor_ptr->max_m_idx, MONSTER_IDX);
/* Process the monsters (backwards) */
- for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--)
+ for (pet_ctr = current_floor_ptr->m_max - 1; pet_ctr >= 1; pet_ctr--)
{
- if (is_pet(&m_list[pet_ctr]))
+ if (is_pet(¤t_floor_ptr->m_list[pet_ctr]))
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++)
/* Access the monster */
pet_ctr = who[i];
- m_ptr = &m_list[pet_ctr];
+ m_ptr = ¤t_floor_ptr->m_list[pet_ctr];
delete_this = FALSE;
kakunin = ((pet_ctr == p_ptr->riding) || (m_ptr->nickname));
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++;
Term->scr->cv = cv;
Term_fresh();
- C_KILL(who, max_m_idx, MONSTER_IDX);
+ C_KILL(who, current_floor_ptr->max_m_idx, MONSTER_IDX);
#ifdef JP
msg_format("%d 体のペットを放しました。", 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();
}
if (!get_direction(&dir, FALSE, FALSE)) return FALSE;
y = p_ptr->y + ddy[dir];
x = p_ptr->x + ddx[dir];
- g_ptr = ¤t_floor->grid_array[y][x];
+ g_ptr = ¤t_floor_ptr->grid_array[y][x];
if (p_ptr->special_defense & KATA_MUSOU) set_action(ACTION_NONE);
{
if (cmd_limit_confused(p_ptr)) return FALSE;
- m_ptr = &m_list[g_ptr->m_idx];
+ m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
if (!g_ptr->m_idx || !m_ptr->ml)
{
}
target_pet = old_target_pet;
- if (current_floor->grid_array[target_row][target_col].m_idx)
+ if (current_floor_ptr->grid_array[target_row][target_col].m_idx)
{
- m_ptr = &m_list[current_floor->grid_array[target_row][target_col].m_idx];
+ m_ptr = ¤t_floor_ptr->m_list[current_floor_ptr->grid_array[target_row][target_col].m_idx];
if (!is_pet(m_ptr))
{
#ifdef JP
sprintf(target_buf, "ペットのターゲットを指定 (現在:%s)",
- (pet_t_m_idx ? (p_ptr->image ? "何か奇妙な物" : (r_name + r_info[m_list[pet_t_m_idx].ap_r_idx].name)) : "指定なし"));
+ (pet_t_m_idx ? (p_ptr->image ? "何か奇妙な物" : (r_name + r_info[current_floor_ptr->m_list[pet_t_m_idx].ap_r_idx].name)) : "指定なし"));
#else
sprintf(target_buf, "specify a target of pet (now:%s)",
- (pet_t_m_idx ? (p_ptr->image ? "something strange" : (r_name + r_info[m_list[pet_t_m_idx].ap_r_idx].name)) : "nothing"));
+ (pet_t_m_idx ? (p_ptr->image ? "something strange" : (r_name + r_info[current_floor_ptr->m_list[pet_t_m_idx].ap_r_idx].name)) : "nothing"));
#endif
power_desc[num] = target_buf;
powers[num++] = PET_TARGET;
if (p_ptr->riding)
{
if ((p_ptr->migite && (empty_hands(FALSE) == EMPTY_HAND_LARM) &&
- object_allow_two_hands_wielding(&inventory[INVEN_RARM])) ||
+ object_allow_two_hands_wielding(&p_ptr->inventory_list[INVEN_RARM])) ||
(p_ptr->hidarite && (empty_hands(FALSE) == EMPTY_HAND_RARM) &&
- object_allow_two_hands_wielding(&inventory[INVEN_LARM])))
+ object_allow_two_hands_wielding(&p_ptr->inventory_list[INVEN_LARM])))
{
if (p_ptr->pet_extra_flags & PF_RYOUTE)
{
{
byte y = 1, x = 0;
PET_COMMAND_IDX ctr = 0;
-
- /* Show list */
redraw = TRUE;
if (!use_menu) screen_save();
case PET_DISMISS: /* Dismiss pets */
{
/* Check pets (backwards) */
- for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--)
+ for (pet_ctr = current_floor_ptr->m_max - 1; pet_ctr >= 1; pet_ctr--)
{
/* Player has pet */
- if (is_pet(&m_list[pet_ctr])) break;
+ if (is_pet(¤t_floor_ptr->m_list[pet_ctr])) break;
}
if (!pet_ctr)
if (!target_set(TARGET_KILL)) pet_t_m_idx = 0;
else
{
- grid_type *g_ptr = ¤t_floor->grid_array[target_row][target_col];
- if (g_ptr->m_idx && (m_list[g_ptr->m_idx].ml))
+ grid_type *g_ptr = ¤t_floor_ptr->grid_array[target_row][target_col];
+ if (g_ptr->m_idx && (current_floor_ptr->m_list[g_ptr->m_idx].ml))
{
- pet_t_m_idx = current_floor->grid_array[target_row][target_col].m_idx;
+ pet_t_m_idx = current_floor_ptr->grid_array[target_row][target_col].m_idx;
p_ptr->pet_follow_distance = PET_DESTROY_DIST;
}
else pet_t_m_idx = 0;
if (p_ptr->pet_extra_flags & PF_PICKUP_ITEMS)
{
p_ptr->pet_extra_flags &= ~(PF_PICKUP_ITEMS);
- for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--)
+ for (pet_ctr = current_floor_ptr->m_max - 1; pet_ctr >= 1; pet_ctr--)
{
/* Access the monster */
- m_ptr = &m_list[pet_ctr];
+ m_ptr = ¤t_floor_ptr->m_list[pet_ctr];
if (is_pet(m_ptr))
{
/*!
-* @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ならば強制的に落馬する
int i, y, x, oy, ox;
int sn = 0, sy = 0, sx = 0;
GAME_TEXT m_name[MAX_NLEN];
- monster_type *m_ptr = &m_list[p_ptr->riding];
+ monster_type *m_ptr = ¤t_floor_ptr->m_list[p_ptr->riding];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
bool fall_dam = FALSE;
{
grid_type *g_ptr;
- /* Access the location */
y = p_ptr->y + ddy_ddd[i];
x = p_ptr->x + ddx_ddd[i];
- g_ptr = ¤t_floor->grid_array[y][x];
+ g_ptr = ¤t_floor_ptr->grid_array[y][x];
if (g_ptr->m_idx) continue;