#include "angband.h"
#include "core.h"
#include "util.h"
-#include "term.h"
+#include "main/sound-definitions-table.h"
+#include "gameterm.h"
#include "monster.h"
#include "monster-status.h"
#include "object-broken.h"
#include "floor.h"
#include "grid.h"
-#include "spells.h"
#include "object-flavor.h"
#include "shoot.h"
#include "snipe.h"
-#include "view-mainwindow.h"
-#include "objectkind.h"
+#include "view/display-main-window.h"
+#include "object/object-kind.h"
#include "targeting.h"
+#include "effect/spells-effect-util.h"
/*!
* @brief 矢弾を射撃した際のスレイ倍率をかけた結果を返す /
{
if ((have_flag(flgs, TR_SLAY_ANIMAL)) && (r_ptr->flags3 & RF3_ANIMAL))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_ANIMAL;
}
if ((have_flag(flgs, TR_KILL_ANIMAL)) && (r_ptr->flags3 & RF3_ANIMAL))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_ANIMAL;
}
if ((have_flag(flgs, TR_SLAY_EVIL)) && (r_ptr->flags3 & RF3_EVIL))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_EVIL;
}
if ((have_flag(flgs, TR_KILL_EVIL)) && (r_ptr->flags3 & RF3_EVIL))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_EVIL;
}
if ((have_flag(flgs, TR_SLAY_HUMAN)) && (r_ptr->flags2 & RF2_HUMAN))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags2 |= RF2_HUMAN;
}
if ((have_flag(flgs, TR_KILL_HUMAN)) && (r_ptr->flags2 & RF2_HUMAN))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags2 |= RF2_HUMAN;
}
if ((have_flag(flgs, TR_SLAY_UNDEAD)) && (r_ptr->flags3 & RF3_UNDEAD))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_UNDEAD;
}
if ((have_flag(flgs, TR_KILL_UNDEAD)) && (r_ptr->flags3 & RF3_UNDEAD))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_UNDEAD;
}
if ((have_flag(flgs, TR_SLAY_DEMON)) && (r_ptr->flags3 & RF3_DEMON))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_DEMON;
}
if ((have_flag(flgs, TR_KILL_DEMON)) && (r_ptr->flags3 & RF3_DEMON))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_DEMON;
}
if ((have_flag(flgs, TR_SLAY_ORC)) && (r_ptr->flags3 & RF3_ORC))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_ORC;
}
if ((have_flag(flgs, TR_KILL_ORC)) && (r_ptr->flags3 & RF3_ORC))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_ORC;
}
if ((have_flag(flgs, TR_SLAY_TROLL)) && (r_ptr->flags3 & RF3_TROLL))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_TROLL;
}
if ((have_flag(flgs, TR_KILL_TROLL)) && (r_ptr->flags3 & RF3_TROLL))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_TROLL;
}
if ((have_flag(flgs, TR_SLAY_GIANT)) && (r_ptr->flags3 & RF3_GIANT))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_GIANT;
}
if ((have_flag(flgs, TR_KILL_GIANT)) && (r_ptr->flags3 & RF3_GIANT))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_GIANT;
}
if ((have_flag(flgs, TR_SLAY_DRAGON)) && (r_ptr->flags3 & RF3_DRAGON))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_DRAGON;
}
if ((have_flag(flgs, TR_KILL_DRAGON)) && (r_ptr->flags3 & RF3_DRAGON))
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_DRAGON;
}
/* Notice immunity */
if (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK)
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK);
}
/* Notice immunity */
if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
}
/* Notice immunity */
if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
}
if (r_ptr->flags3 & RF3_HURT_FIRE)
{
if (mult < 25) mult = 25;
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_HURT_FIRE;
}
/* Notice immunity */
if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
}
if (r_ptr->flags3 & RF3_HURT_COLD)
{
if (mult < 25) mult = 25;
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flags3 |= RF3_HURT_COLD;
}
/* Notice immunity */
if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
{
- if (is_original_ap_and_seen(m_ptr))
+ if (is_original_ap_and_seen(sniper_ptr, m_ptr))
{
r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
}
/* Sniper - Cannot shot a single arrow twice */
if ((snipe_type == SP_DOUBLE) && (o_ptr->number < 2)) snipe_type = SP_NONE;
- object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
+ object_desc(shooter_ptr, o_name, o_ptr, OD_OMIT_PREFIX);
/* Use the proper number of shots */
thits = shooter_ptr->num_fire;
project_length = tdis + 1;
/* Get a direction (or cancel) */
- if (!get_aim_dir(&dir))
+ if (!get_aim_dir(shooter_ptr, &dir))
{
free_turn(shooter_ptr);
ty = shooter_ptr->y + 99 * ddy[dir];
/* Check for "target request" */
- if ((dir == 5) && target_okay())
+ if ((dir == 5) && target_okay(shooter_ptr))
{
tx = target_col;
ty = target_row;
}
/* Get projection path length */
- tdis = project_path(path_g, project_length, shooter_ptr->y, shooter_ptr->x, ty, tx, PROJECT_PATH | PROJECT_THRU) - 1;
+ tdis = project_path(shooter_ptr, path_g, project_length, shooter_ptr->y, shooter_ptr->x, ty, tx, PROJECT_PATH | PROJECT_THRU) - 1;
project_length = 0; /* reset to default */
/* Single object */
q_ptr->number = 1;
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_optimize(0 - item);
- }
+ vary_item(shooter_ptr, item, -1);
sound(SOUND_SHOOT);
- handle_stuff();
+ handle_stuff(shooter_ptr);
prev_y = y;
prev_x = x;
shooter_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
/* Destroy the wall */
- cave_alter_feat(ny, nx, FF_HURT_ROCK);
+ cave_alter_feat(shooter_ptr, ny, nx, FF_HURT_ROCK);
hit_body = TRUE;
break;
}
/* Stopped by walls/doors */
- if (!cave_have_flag_bold(ny, nx, FF_PROJECT) && !shooter_ptr->current_floor_ptr->grid_array[ny][nx].m_idx) break;
+ if (!cave_have_flag_bold(shooter_ptr->current_floor_ptr, ny, nx, FF_PROJECT) && !shooter_ptr->current_floor_ptr->grid_array[ny][nx].m_idx) break;
/* Advance the distance */
cur_dis++;
if (snipe_type == SP_LITE)
{
shooter_ptr->current_floor_ptr->grid_array[ny][nx].info |= (CAVE_GLOW);
- note_spot(ny, nx);
- lite_spot(ny, nx);
+ note_spot(shooter_ptr, ny, nx);
+ lite_spot(shooter_ptr, ny, nx);
}
/* The player can see the (on screen) missile */
- if (panel_contains(ny, nx) && player_can_see_bold(ny, nx))
+ if (panel_contains(ny, nx) && player_can_see_bold(shooter_ptr, ny, nx))
{
char c = object_char(q_ptr);
byte a = object_attr(q_ptr);
/* Draw, Hilite, Fresh, Pause, Erase */
- print_rel(c, a, ny, nx);
+ print_rel(shooter_ptr, c, a, ny, nx);
move_cursor_relative(ny, nx);
Term_fresh();
Term_xtra(TERM_XTRA_DELAY, msec);
- lite_spot(ny, nx);
+ lite_spot(shooter_ptr, ny, nx);
Term_fresh();
}
if (snipe_type == SP_EVILNESS)
{
shooter_ptr->current_floor_ptr->grid_array[ny][nx].info &= ~(CAVE_GLOW | CAVE_MARK);
- note_spot(ny, nx);
- lite_spot(ny, nx);
+ note_spot(shooter_ptr, ny, nx);
+ lite_spot(shooter_ptr, ny, nx);
}
prev_y = y;
GAME_TEXT m_name[MAX_NLEN];
/* Get "the monster" or "it" */
- monster_desc(m_name, m_ptr, 0);
+ monster_desc(shooter_ptr, m_name, m_ptr, 0);
msg_format(_("%sが%sに命中した。", "The %s hits %s."), o_name, m_name);
if (m_ptr->ml)
{
- if (!shooter_ptr->image) monster_race_track(m_ptr->ap_r_idx);
- health_track(c_mon_ptr->m_idx);
+ if (!shooter_ptr->image) monster_race_track(shooter_ptr, m_ptr->ap_r_idx);
+ health_track(shooter_ptr, c_mon_ptr->m_idx);
}
}
GAME_TEXT m_name[MAX_NLEN];
/* Get "the monster" or "it" */
- monster_desc(m_name, m_ptr, 0);
+ monster_desc(shooter_ptr, m_name, m_ptr, 0);
tdam = m_ptr->hp + 1;
- msg_format(_("%sの急所に突き刺さった!", "Your shot sticked on a fatal spot of %s!"), m_name);
+ msg_format(_("%sの急所に突き刺さった!", "Your shot hit a fatal spot of %s!"), m_name);
}
else tdam = 1;
}
if (tdam < 0) tdam = 0;
/* Modify the damage */
- tdam = mon_damage_mod(m_ptr, tdam, FALSE);
+ tdam = mon_damage_mod(shooter_ptr, m_ptr, tdam, FALSE);
}
msg_format_wizard(CHEAT_MONSTER,
if (snipe_type == SP_HOLYNESS)
{
shooter_ptr->current_floor_ptr->grid_array[ny][nx].info |= (CAVE_GLOW);
- note_spot(ny, nx);
- lite_spot(ny, nx);
+ note_spot(shooter_ptr, ny, nx);
+ lite_spot(shooter_ptr, ny, nx);
}
/* Hit the monster, check for death */
- if (mon_take_hit(c_mon_ptr->m_idx, tdam, &fear, extract_note_dies(real_r_idx(m_ptr))))
+ if (mon_take_hit(shooter_ptr, c_mon_ptr->m_idx, tdam, &fear, extract_note_dies(real_r_idx(m_ptr))))
{
/* Dead monster */
}
{
GAME_TEXT m_name[MAX_NLEN];
- monster_desc(m_name, m_ptr, 0);
+ monster_desc(shooter_ptr, m_name, m_ptr, 0);
stick_to = TRUE;
- msg_format(_("%sは%sに突き刺さった!", "%^s have stuck into %s!"), o_name, m_name);
+ msg_format(_("%sは%sに突き刺さった!", "%^s is stuck in %s!"), o_name, m_name);
}
- message_pain(c_mon_ptr->m_idx, tdam);
+ message_pain(shooter_ptr, c_mon_ptr->m_idx, tdam);
/* Anger the monster */
- if (tdam > 0) anger_monster(m_ptr);
+ if (tdam > 0) anger_monster(shooter_ptr, m_ptr);
if (fear && m_ptr->ml)
{
GAME_TEXT m_name[MAX_NLEN];
sound(SOUND_FLEE);
- monster_desc(m_name, m_ptr, 0);
+ monster_desc(shooter_ptr, m_name, m_ptr, 0);
msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
}
if (!in_bounds2(shooter_ptr->current_floor_ptr, ny, nx)) break;
/* Stopped by walls/doors */
- if (!player_can_enter(shooter_ptr->current_floor_ptr->grid_array[ny][nx].feat, 0)) break;
+ if (!player_can_enter(shooter_ptr, shooter_ptr->current_floor_ptr->grid_array[ny][nx].feat, 0)) break;
/* Stopped by monsters */
- if (!cave_empty_bold(p_ptr->current_floor_ptr, ny, nx)) break;
+ if (!is_cave_empty_bold(shooter_ptr, ny, nx)) break;
shooter_ptr->current_floor_ptr->grid_array[ny][nx].m_idx = m_idx;
shooter_ptr->current_floor_ptr->grid_array[oy][ox].m_idx = 0;
update_monster(shooter_ptr, c_mon_ptr->m_idx, TRUE);
- lite_spot(ny, nx);
- lite_spot(oy, ox);
+ lite_spot(shooter_ptr, ny, nx);
+ lite_spot(shooter_ptr, oy, ox);
Term_fresh();
Term_xtra(TERM_XTRA_DELAY, msec);
}
/* Chance of breakage (during attacks) */
- j = (hit_body ? breakage_chance(q_ptr, shooter_ptr->pclass == CLASS_ARCHER, snipe_type) : 0);
+ j = (hit_body ? breakage_chance(shooter_ptr, q_ptr, shooter_ptr->pclass == CLASS_ARCHER, snipe_type) : 0);
if (stick_to)
{
MONSTER_IDX m_idx = shooter_ptr->current_floor_ptr->grid_array[y][x].m_idx;
monster_type *m_ptr = &shooter_ptr->current_floor_ptr->m_list[m_idx];
- OBJECT_IDX o_idx = o_pop();
+ OBJECT_IDX o_idx = o_pop(shooter_ptr->current_floor_ptr);
if (!o_idx)
{
- msg_format(_("%sはどこかへ行った。", "The %s have gone to somewhere."), o_name);
+ msg_format(_("%sはどこかへ行った。", "The %s went somewhere."), o_name);
if (object_is_fixed_artifact(q_ptr))
{
a_info[j_ptr->name1].cur_num = 0;
/* Carry object */
m_ptr->hold_o_idx = o_idx;
}
- else if (cave_have_flag_bold(y, x, FF_PROJECT))
+ else if (cave_have_flag_bold(shooter_ptr->current_floor_ptr, y, x, FF_PROJECT))
{
/* Drop (or break) near that location */
- (void)drop_near(q_ptr, j, y, x);
+ (void)drop_near(shooter_ptr, q_ptr, j, y, x);
}
else
{
/* Drop (or break) near that location */
- (void)drop_near(q_ptr, j, prev_y, prev_x);
+ (void)drop_near(shooter_ptr, q_ptr, j, prev_y, prev_x);
}
/* Sniper - Repeat shooting when double shots */
k += shooter_ptr->concent;
/* Hack -- Instant miss or hit */
- if (k <= 5) return (FALSE);
- if (k > 95) return (TRUE);
+ if (k <= 5) return FALSE;
+ if (k > 95) return TRUE;
if (shooter_ptr->pseikaku == SEIKAKU_NAMAKE)
- if (one_in_(20)) return (FALSE);
+ if (one_in_(20)) return FALSE;
/* Never hit */
- if (chance <= 0) return (FALSE);
+ if (chance <= 0) return FALSE;
ac = r_ptr->ac;
if (shooter_ptr->concent)
if (m_ptr->r_idx == MON_GOEMON && !MON_CSLEEP(m_ptr))
{
GAME_TEXT m_name[MAX_NLEN];
- monster_desc(m_name, m_ptr, 0);
+ monster_desc(shooter_ptr, m_name, m_ptr, 0);
msg_format(_("%sは%sを斬り捨てた!", "%s cuts down %s!"), m_name, o_name);
}
- return (FALSE);
+ return FALSE;
}
/* Assume hit */
- return (TRUE);
+ return TRUE;
}
/*!
* @brief 攻撃時クリティカルによるダメージ期待値修正計算(重量と毒針処理) / critical happens at i / 10000
+ * @param shooter_ptr プレーヤーへの参照ポインタ
* @param weight 武器の重量
* @param plus 武器のダメージ修正
* @param dam 基本ダメージ
* @param dokubari 毒針処理か否か
* @return ダメージ期待値
*/
-HIT_POINT calc_expect_crit(WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, bool dokubari)
+HIT_POINT calc_expect_crit(player_type *shooter_ptr, WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, bool dokubari)
{
u32b k, num;
- int i;
-
if (dokubari) return dam;
- i = (weight + (meichuu * 3 + plus * 5) + p_ptr->skill_thn);
+ int i = (weight + (meichuu * 3 + plus * 5) + shooter_ptr->skill_thn);
if (i < 0) i = 0;
k = weight;
if (k > (1300 - 650)) num += (7 * dam / 2 + 25) * MIN(650, k - (1300 - 650));
num /= 650;
- if (p_ptr->pclass == CLASS_NINJA)
+ if (shooter_ptr->pclass == CLASS_NINJA)
{
num *= i;
num += (4444 - i) * dam;