* @brief
* 腕力、器用さに応じた攻撃回数テーブル /
* This table is used to help calculate the number of blows the player can
- * make in a single round of attacks (one player current_world_ptr->game_turn) with a normal weapon.
+ * make in a single round of attacks (one player turn) with a normal weapon.
* @details
* <pre>
* This number ranges from a single blow/round for weak players to up to six
* Always miss 5% of the time, Always hit 5% of the time.
* Otherwise, match monster power against player armor.
*/
-static int check_hit(int power, DEPTH level, int stun)
+static int check_hit(player_type *target_ptr, int power, DEPTH level, int stun)
{
int i, k, ac;
if (k < 10) return (k < 5);
i = (power + (level * 3));
- ac = p_ptr->ac + p_ptr->to_a;
- if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
+ ac = target_ptr->ac + target_ptr->to_a;
+ if (target_ptr->special_attack & ATTACK_SUIKEN) ac += (target_ptr->lev * 2);
if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
return (FALSE);
* @param message オーラダメージを受けた際のメッセージ
* @return なし
*/
-static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
- HIT_POINT(*dam_func)(HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
+static void touch_zap_player_aux(monster_type *m_ptr, player_type *touched_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
+ HIT_POINT(*dam_func)(player_type *creature_type, HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
{
monster_race *r_ptr = &r_info[m_ptr->r_idx];
- if ((atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) && !immune)
- {
- GAME_TEXT mon_name[MAX_NLEN];
- int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
+ if (!(atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) || immune) return;
+
+ GAME_TEXT mon_name[MAX_NLEN];
+ int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
- monster_desc(mon_name, m_ptr, MD_WRONGDOER_NAME);
- msg_print(message);
- dam_func(aura_damage, mon_name, -1, TRUE);
+ monster_desc(mon_name, m_ptr, MD_WRONGDOER_NAME);
+ msg_print(message);
+ dam_func(touched_ptr, aura_damage, mon_name, -1, TRUE);
- if (is_original_ap_and_seen(m_ptr))
- {
- atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
- }
-
- handle_stuff();
+ if (is_original_ap_and_seen(m_ptr))
+ {
+ atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
}
+
+ handle_stuff(touched_ptr);
}
/*!
*/
static void touch_zap_player(monster_type *m_ptr, player_type *touched_ptr)
{
- touch_zap_player_aux(m_ptr, touched_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
+ touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
- touch_zap_player_aux(m_ptr, touched_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
+ touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
- touch_zap_player_aux(m_ptr, touched_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
+ touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
elec_dam, _("電撃をくらった!", "You get zapped!"));
}
switch (attack)
{
case MUT2_SCOR_TAIL:
- project(0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
+ project(p_ptr, 0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
*mdeath = (m_ptr->r_idx == 0);
break;
case MUT2_HORNS:
if (!resists_tele)
{
msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
- teleport_away(g_ptr->m_idx, 50, TELEPORT_PASSIVE);
+ teleport_away(attacker_ptr, g_ptr->m_idx, 50, TELEPORT_PASSIVE);
num = num_blow + 1; /* Can't hit it anymore! */
*mdeath = TRUE;
}
if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
!(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
{
- if (polymorph_monster(y, x))
+ if (polymorph_monster(attacker_ptr, y, x))
{
msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
*fear = FALSE;
target_ptr->hold_o_idx = q_ptr->next_o_idx;
q_ptr->next_o_idx = 0;
msg_format(_("%sを奪った。", "You snatched %s."), o_name);
- inven_carry(q_ptr);
+ inven_carry(attacker_ptr, q_ptr);
}
}
}
if (k < 0) k = 0;
take_hit(attacker_ptr, DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
- handle_stuff();
+ handle_stuff(attacker_ptr);
}
else
{
msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
}
}
+
backstab = FALSE;
fuiuchi = FALSE;
}
if (target_ptr->special_defense & KATA_IAI)
{
- msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s move."), m_name);
+ msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s moved."), m_name);
if (py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
}
if ((target_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (target_ptr->lev*3/5+20)))
{
- if (kawarimi(TRUE)) return TRUE;
+ if (kawarimi(target_ptr, TRUE)) return TRUE;
}
/* Assume no blink */
ac = target_ptr->ac + target_ptr->to_a;
/* Monster hits player */
- if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
+ if (!effect || check_hit(target_ptr, power, rlev, MON_STUNNED(m_ptr)))
{
/* Always disturbing */
disturb(target_ptr, TRUE, TRUE);
if (!target_ptr->resist_disen && !CHECK_MULTISHADOW(target_ptr))
{
/* Apply disenchantment */
- if (apply_disenchant(0))
+ if (apply_disenchant(target_ptr, 0))
{
/* Hack -- Update AC */
update_creature(target_ptr);
msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
#endif
chg_virtue(target_ptr, V_SACRIFICE, 1);
- o_idx = o_pop();
+ o_idx = o_pop(target_ptr->current_floor_ptr);
/* Success */
if (o_idx)
}
/* Steal the items */
- inven_item_increase(i, -1);
- inven_item_optimize(i);
+ inven_item_increase(target_ptr, i, -1);
+ inven_item_optimize(target_ptr, i);
obvious = TRUE;
#endif
/* Steal the items */
- inven_item_increase(i, -1);
- inven_item_optimize(i);
+ inven_item_increase(target_ptr, i, -1);
+ inven_item_optimize(target_ptr, i);
obvious = TRUE;
if (explode) break;
obvious = TRUE;
msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
- get_damage += acid_dam(damage, ddesc, -1, FALSE);
+ get_damage += acid_dam(target_ptr, damage, ddesc, -1, FALSE);
update_creature(target_ptr);
update_smart_learn(m_idx, DRS_ACID);
break;
if (explode) break;
obvious = TRUE;
msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
- get_damage += elec_dam(damage, ddesc, -1, FALSE);
+ get_damage += elec_dam(target_ptr, damage, ddesc, -1, FALSE);
update_smart_learn(m_idx, DRS_ELEC);
break;
}
if (explode) break;
obvious = TRUE;
msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
- get_damage += fire_dam(damage, ddesc, -1, FALSE);
+ get_damage += fire_dam(target_ptr, damage, ddesc, -1, FALSE);
update_smart_learn(m_idx, DRS_FIRE);
break;
}
if (explode) break;
obvious = TRUE;
msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
- get_damage += cold_dam(damage, ddesc, -1, FALSE);
+ get_damage += cold_dam(target_ptr, damage, ddesc, -1, FALSE);
update_smart_learn(m_idx, DRS_COLD);
break;
}
if (is_mirror_grid(&p_ptr->current_floor_ptr->grid_array[target_ptr->y][target_ptr->x]))
{
- teleport_player(10, 0L);
+ teleport_player(target_ptr, 10, 0L);
}
}
/* Modify the damage */
dam = mon_damage_mod(m_ptr, dam, FALSE);
- msg_format(_("影のオーラが%^sに反撃した!", "Enveloped shadows attack %^s."), m_name);
+ msg_format(_("影のオーラが%^sに反撃した!", "Enveloping shadows attack %^s."), m_name);
if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
{
blinked = FALSE;
{
o_armed_ptr = &target_ptr->inventory_list[typ[j][0]];
if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
- project(0, 0, m_ptr->fy, m_ptr->fx, (target_ptr->lev * 2), typ[j][1], flg, -1);
+ project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, (target_ptr->lev * 2), typ[j][1], flg, -1);
}
}
}
}
}
-
/* Analyze "visible" monsters only */
if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
{
if (target_ptr->special_defense & NINJA_KAWARIMI)
{
- if (kawarimi(FALSE)) return TRUE;
+ if (kawarimi(target_ptr, FALSE)) return TRUE;
}
}
/* Hex - revenge damage stored */
- revenge_store(get_damage);
+ revenge_store(target_ptr, get_damage);
if ((target_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
&& get_damage > 0 && !target_ptr->is_dead)
msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
#endif
- project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
+ project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
if (target_ptr->tim_eyeeye) set_tim_eyeeye(target_ptr, target_ptr->tim_eyeeye-5, TRUE);
}
monster_desc(m_target_name, m_ptr, 0);
target_ptr->csp -= 7;
- msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
+ msg_format(_("%^sに反撃した!", "Your counterattacked to %s!"), m_target_name);
py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
fear = FALSE;
target_ptr->redraw |= (PR_MANA);
/* Blink away */
if (blinked && alive && !target_ptr->is_dead)
{
- if (teleport_barrier(m_idx))
+ if (teleport_barrier(target_ptr, m_idx))
{
msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
}
else
{
msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
- teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
+ teleport_away(target_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
}
}
/* Always notice cause of death */
- if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !target_ptr->inside_arena)
+ if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !target_ptr->current_floor_ptr->inside_arena)
{
r_ptr->r_deaths++;
}
* @param t_idx 目標側モンスターの参照ID
* @return 実際に打撃処理が行われた場合TRUEを返す
*/
-bool monst_attack_monst(MONSTER_IDX m_idx, MONSTER_IDX t_idx)
+bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx)
{
- monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
- monster_type *t_ptr = &p_ptr->current_floor_ptr->m_list[t_idx];
+ monster_type *m_ptr = &subject_ptr->current_floor_ptr->m_list[m_idx];
+ monster_type *t_ptr = &subject_ptr->current_floor_ptr->m_list[t_idx];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
monster_race *tr_ptr = &r_info[t_ptr->r_idx];
/* Can the player be aware of this attack? */
bool known = (m_ptr->cdis <= MAX_SIGHT) || (t_ptr->cdis <= MAX_SIGHT);
- bool do_silly_attack = (one_in_(2) && p_ptr->image);
+ bool do_silly_attack = (one_in_(2) && subject_ptr->image);
/* Cannot attack self */
if (m_idx == t_idx) return FALSE;
/* Not allowed to attack */
if (r_ptr->flags1 & RF1_NEVER_BLOW) return FALSE;
- if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
+ if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
/* Total armor */
ac = tr_ptr->ac;
if (!see_either && known)
{
- p_ptr->current_floor_ptr->monster_noise = TRUE;
+ subject_ptr->current_floor_ptr->monster_noise = TRUE;
}
- if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(p_ptr, TRUE, TRUE);
+ if (subject_ptr->riding && (m_idx == subject_ptr->riding)) disturb(subject_ptr, TRUE, TRUE);
/* Scan through all four blows */
for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
if (t_ptr->ml)
{
/* Redraw the health bar */
- if (p_ptr->health_who == t_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == t_idx) p_ptr->redraw |= (PR_UHEALTH);
+ if (subject_ptr->health_who == t_idx) subject_ptr->redraw |= (PR_HEALTH);
+ if (subject_ptr->riding == t_idx) subject_ptr->redraw |= (PR_UHEALTH);
}
/* Describe the attack method */
case RBM_EXPLODE:
{
- if (see_either) disturb(p_ptr, TRUE, TRUE);
+ if (see_either) disturb(subject_ptr, TRUE, TRUE);
act = _("爆発した。", "explodes.");
explode = TRUE;
touched = FALSE;
case RBE_EAT_ITEM:
case RBE_EAT_GOLD:
- if ((p_ptr->riding != m_idx) && one_in_(2)) blinked = TRUE;
+ if ((subject_ptr->riding != m_idx) && one_in_(2)) blinked = TRUE;
break;
case RBE_EAT_FOOD:
case RBE_SHATTER:
damage -= (damage * ((ac < 150) ? ac : 150) / 250);
- if (damage > 23) earthquake(p_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
+ if (damage > 23) earthquake(subject_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
break;
case RBE_EXP_10:
/* Do damage if not exploding */
if (!explode)
{
- project(m_idx, 0, t_ptr->fy, t_ptr->fx,
+ project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
damage, pt, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
}
switch (effect_type)
{
case BLOW_EFFECT_TYPE_FEAR:
- project(m_idx, 0, t_ptr->fy, t_ptr->fx,
+ project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
damage, GF_TURN_ALL, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
break;
case BLOW_EFFECT_TYPE_SLEEP:
- project(m_idx, 0, t_ptr->fy, t_ptr->fx,
+ project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
r_ptr->level, GF_OLD_SLEEP, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
break;
if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
/* Redraw (later) if needed */
- if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
+ if (subject_ptr->health_who == m_idx) subject_ptr->redraw |= (PR_HEALTH);
+ if (subject_ptr->riding == m_idx) subject_ptr->redraw |= (PR_UHEALTH);
/* Special message */
if (see_m && did_heal)
msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
}
if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_FIRE;
- project(t_idx, 0, m_ptr->fy, m_ptr->fx,
+ project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
damroll(1 + ((tr_ptr->level) / 26),
1 + ((tr_ptr->level) / 17)),
GF_FIRE, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
msg_format(_("%^sは突然寒くなった!", "%^s is suddenly very cold!"), m_name);
}
if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags3 |= RF3_AURA_COLD;
- project(t_idx, 0, m_ptr->fy, m_ptr->fx,
+ project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
damroll(1 + ((tr_ptr->level) / 26),
1 + ((tr_ptr->level) / 17)),
GF_COLD, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
msg_format(_("%^sは電撃を食らった!", "%^s gets zapped!"), m_name);
}
if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_ELEC;
- project(t_idx, 0, m_ptr->fy, m_ptr->fx,
+ project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
damroll(1 + ((tr_ptr->level) / 26),
1 + ((tr_ptr->level) / 17)),
GF_ELEC, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
/* Blink away */
if (blinked && m_ptr->r_idx)
{
- if (teleport_barrier(m_idx))
+ if (teleport_barrier(subject_ptr, m_idx))
{
if (see_m)
{
}
else if (known)
{
- p_ptr->current_floor_ptr->monster_noise = TRUE;
+ subject_ptr->current_floor_ptr->monster_noise = TRUE;
}
}
else
}
else if (known)
{
- p_ptr->current_floor_ptr->monster_noise = TRUE;
+ subject_ptr->current_floor_ptr->monster_noise = TRUE;
}
- teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
+ teleport_away(subject_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
}
}
if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
{
- if (is_pet(&p_ptr->current_floor_ptr->m_list[who]) && !player_bold(m_ptr->target_y, m_ptr->target_x))
+ if (is_pet(&p_ptr->current_floor_ptr->m_list[who]) && !player_bold(p_ptr, m_ptr->target_y, m_ptr->target_x))
{
set_target(m_ptr, p_ptr->current_floor_ptr->m_list[who].fy, p_ptr->current_floor_ptr->m_list[who].fx);
}
if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
if (rakuba(p_ptr, (dam > 200) ? 200 : dam, FALSE))
{
- msg_format(_("%^sに振り落とされた!", "You have thrown off from %s!"), m_name);
+ msg_format(_("%^sに振り落とされた!", "You have been thrown off from %s!"), m_name);
}
}