#include "angband.h"
+#include "melee.h"
+#include "sort.h"
+#include "player-status.h"
+#include "object-hook.h"
+#include "monster.h"
+#include "monster-status.h"
/*!
* @brief プレイヤーの騎乗/下馬処理判定
-* @param c_ptr プレイヤーの移動先マスの構造体参照ポインタ
+* @param g_ptr プレイヤーの移動先マスの構造体参照ポインタ
* @param now_riding TRUEなら下馬処理、FALSEならば騎乗処理
* @return 可能ならばTRUEを返す
*/
-bool player_can_ride_aux(cave_type *c_ptr, bool now_riding)
+bool player_can_ride_aux(grid_type *g_ptr, bool now_riding)
{
bool p_can_enter;
bool old_character_xtra = character_xtra;
/* Hack -- prevent "icky" message */
character_xtra = TRUE;
- if (now_riding) p_ptr->riding = c_ptr->m_idx;
+ if (now_riding) p_ptr->riding = g_ptr->m_idx;
else
{
p_ptr->riding = 0;
p_ptr->riding_ryoute = p_ptr->old_riding_ryoute = FALSE;
}
- calc_bonuses();
+ p_ptr->update |= PU_BONUS;
+ handle_stuff();
- p_can_enter = player_can_enter(c_ptr->feat, CEM_P_CAN_ENTER_PATTERN);
+ p_can_enter = player_can_enter(g_ptr->feat, CEM_P_CAN_ENTER_PATTERN);
p_ptr->riding = old_riding;
if (old_pf_ryoute) p_ptr->pet_extra_flags |= (PF_RYOUTE);
p_ptr->riding_ryoute = old_riding_ryoute;
p_ptr->old_riding_ryoute = old_old_riding_ryoute;
- calc_bonuses();
+ p_ptr->update |= PU_BONUS;
+ handle_stuff();
character_xtra = old_character_xtra;
/*!
-* @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--)
{
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--)
{
- 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++)
{
bool delete_this;
- char friend_name[80];
+ GAME_TEXT friend_name[MAX_NLEN];
bool kakunin;
/* 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));
{
/* Hack -- health bar for this monster */
health_track(pet_ctr);
-
- /* Hack -- handle stuff */
handle_stuff();
msg_format(_("%sを放しますか? [Yes/No/Unnamed (%d体)]", "Dismiss %s? [Yes/No/Unnamed (%d remain)]"), friend_name, max_pet - i);
{
if (record_named_pet && m_ptr->nickname)
{
- char m_name[80];
+ GAME_TEXT m_name[MAX_NLEN];
monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_DISMISS, m_name);
p_ptr->riding = 0;
- /* Update the monsters */
- 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);
- window_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();
}
{
POSITION x, y;
DIRECTION dir = 0;
- cave_type *c_ptr;
+ grid_type *g_ptr;
monster_type *m_ptr;
if (!get_direction(&dir, FALSE, FALSE)) return FALSE;
y = p_ptr->y + ddy[dir];
x = p_ptr->x + ddx[dir];
- c_ptr = &cave[y][x];
+ g_ptr = ¤t_floor_ptr->grid_array[y][x];
if (p_ptr->special_defense & KATA_MUSOU) set_action(ACTION_NONE);
if (p_ptr->riding)
{
/* Skip non-empty grids */
- if (!player_can_ride_aux(c_ptr, FALSE))
+ if (!player_can_ride_aux(g_ptr, FALSE))
{
msg_print(_("そちらには降りられません。", "You cannot go to that direction."));
return FALSE;
if (!pattern_seq(p_ptr->y, p_ptr->x, y, x)) return FALSE;
- if (c_ptr->m_idx)
+ if (g_ptr->m_idx)
{
- p_ptr->energy_use = 100;
+ take_turn(p_ptr, 100);
msg_print(_("モンスターが立ちふさがっている!", "There is a monster in the way!"));
}
else
{
- if (p_ptr->confused)
- {
- msg_print(_("混乱していて乗れない!", "You are too confused!"));
- return FALSE;
- }
+ if (cmd_limit_confused(p_ptr)) return FALSE;
- m_ptr = &m_list[c_ptr->m_idx];
+ m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
- if (!c_ptr->m_idx || !m_ptr->ml)
+ if (!g_ptr->m_idx || !m_ptr->ml)
{
msg_print(_("その場所にはモンスターはいません。", "Here is no monster."));
return FALSE;
if (!pattern_seq(p_ptr->y, p_ptr->x, y, x)) return FALSE;
- if (!player_can_ride_aux(c_ptr, TRUE))
+ if (!player_can_ride_aux(g_ptr, TRUE))
{
/* Feature code (applying "mimic" field) */
- feature_type *f_ptr = &f_info[get_feat_mimic(c_ptr)];
+ feature_type *f_ptr = &f_info[get_feat_mimic(g_ptr)];
#ifdef JP
msg_format("そのモンスターは%sの%sにいる。", f_name + f_ptr->name,
((!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY)) ||
if (r_info[m_ptr->r_idx].level > randint1((p_ptr->skill_exp[GINOU_RIDING] / 50 + p_ptr->lev / 2 + 20)))
{
msg_print(_("うまく乗れなかった。", "You failed to ride."));
- p_ptr->energy_use = 100;
+ take_turn(p_ptr, 100);
return FALSE;
}
if (MON_CSLEEP(m_ptr))
{
- char m_name[80];
+ GAME_TEXT m_name[MAX_NLEN];
monster_desc(m_name, m_ptr, 0);
- (void)set_monster_csleep(c_ptr->m_idx, 0);
+ (void)set_monster_csleep(g_ptr->m_idx, 0);
msg_format(_("%sを起こした。", "You have waked %s up."), m_name);
}
if (p_ptr->action == ACTION_KAMAE) set_action(ACTION_NONE);
- p_ptr->riding = c_ptr->m_idx;
+ p_ptr->riding = g_ptr->m_idx;
/* Hack -- remove tracked monster */
if (p_ptr->riding == p_ptr->health_who) health_track(0);
}
- p_ptr->energy_use = 100;
+ take_turn(p_ptr, 100);
/* Mega-Hack -- Forget the view and lite */
p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
-
- /* Update the monsters */
p_ptr->update |= (PU_BONUS);
-
- /* Redraw map */
p_ptr->redraw |= (PR_MAP | PR_EXTRA);
-
p_ptr->redraw |= (PR_UHEALTH);
- /* Move the player */
(void)move_player_effect(y, x, MPE_HANDLE_STUFF | MPE_ENERGY_USE | MPE_DONT_PICKUP | MPE_DONT_SWAP_MON);
return TRUE;
{
monster_type *m_ptr;
char out_val[20];
- char m_name[80];
+ GAME_TEXT m_name[MAX_NLEN];
bool old_name = FALSE;
bool old_target_pet = target_pet;
}
target_pet = old_target_pet;
- if (cave[target_row][target_col].m_idx)
+ if (current_floor_ptr->grid_array[target_row][target_col].m_idx)
{
- m_ptr = &m_list[cave[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))
{
COMMAND_CODE i = 0;
int num;
int powers[36];
- cptr power_desc[36];
+ concptr power_desc[36];
bool flag, redraw;
char choice;
char out_val[160];
num = 0;
+ if(p_ptr->wild_mode) return;
+
power_desc[num] = _("ペットを放す", "dismiss pets");
powers[num++] = PET_DISMISS;
#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;
powers[num++] = PET_RYOUTE;
}
- else if ((empty_hands(FALSE) != EMPTY_HAND_NONE) && !buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
+ else if ((empty_hands(FALSE) != EMPTY_HAND_NONE) && !has_melee_weapon(INVEN_RARM) && !has_melee_weapon(INVEN_LARM))
{
if (p_ptr->pet_extra_flags & PF_RYOUTE)
{
if (use_menu)
{
- /* Save the screen */
screen_save();
/* Build a prompt */
{
byte y = 1, x = 0;
PET_COMMAND_IDX ctr = 0;
-
- /* Show list */
redraw = TRUE;
-
- /* Save the screen */
if (!use_menu) screen_save();
prt("", y++, x);
{
/* Hide list */
redraw = FALSE;
-
- /* Restore the screen */
screen_load();
}
/* Stop the loop */
flag = TRUE;
}
-
- /* Restore the screen */
if (redraw) screen_load();
/* Abort if needed */
if (!flag)
{
- p_ptr->energy_use = 0;
+ free_turn(p_ptr);
return;
}
for (pet_ctr = 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
{
- cave_type *c_ptr = &cave[target_row][target_col];
- if (c_ptr->m_idx && (m_list[c_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 = cave[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;
for (pet_ctr = 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;
- char m_name[80];
- monster_type *m_ptr = &m_list[p_ptr->riding];
+ GAME_TEXT m_name[MAX_NLEN];
+ 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;
/* Check around the player */
for (i = 0; i < 8; i++)
{
- cave_type *c_ptr;
+ grid_type *g_ptr;
- /* Access the location */
y = p_ptr->y + ddy_ddd[i];
x = p_ptr->x + ddx_ddd[i];
- c_ptr = &cave[y][x];
+ g_ptr = ¤t_floor_ptr->grid_array[y][x];
- if (c_ptr->m_idx) continue;
+ if (g_ptr->m_idx) continue;
/* Skip non-empty grids */
- if (!cave_have_flag_grid(c_ptr, FF_MOVE) && !cave_have_flag_grid(c_ptr, FF_CAN_FLY))
+ if (!cave_have_flag_grid(g_ptr, FF_MOVE) && !cave_have_flag_grid(g_ptr, FF_CAN_FLY))
{
- if (!player_can_ride_aux(c_ptr, FALSE)) continue;
+ if (!player_can_ride_aux(g_ptr, FALSE)) continue;
}
- if (cave_have_flag_grid(c_ptr, FF_PATTERN)) continue;
+ if (cave_have_flag_grid(g_ptr, FF_PATTERN)) continue;
/* Count "safe" grids */
sn++;
p_ptr->pet_extra_flags &= ~(PF_RYOUTE);
p_ptr->riding_ryoute = p_ptr->old_riding_ryoute = FALSE;
- calc_bonuses();
+ p_ptr->update |= (PU_BONUS | PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE | PU_MONSTERS);
+ handle_stuff();
- p_ptr->update |= (PU_BONUS);
-
- p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE | PU_MONSTERS);
p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
-
p_ptr->redraw |= (PR_EXTRA);
/* Update health track of mount */
fall_dam = TRUE;
}
- /* Move the player */
if (sy && !p_ptr->is_dead)
(void)move_player_effect(p_ptr->y, p_ptr->x, MPE_DONT_PICKUP | MPE_DONT_SWAP_MON);