if (monap_ptr->explode)
return;
- if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !check_multishadow(target_ptr)
+ if (!(has_resist_pois(target_ptr) || is_oppose_pois(target_ptr)) && !check_multishadow(target_ptr)
&& set_poisoned(target_ptr, target_ptr->poisoned + randint1(monap_ptr->rlev) + 5))
monap_ptr->obvious = TRUE;
if (monap_ptr->explode)
return;
- if (!target_ptr->resist_disen && !check_multishadow(target_ptr) && apply_disenchant(target_ptr, 0)) {
+ if (!has_resist_disen(target_ptr) && !check_multishadow(target_ptr) && apply_disenchant(target_ptr, 0)) {
update_creature(target_ptr);
monap_ptr->obvious = TRUE;
}
- if (is_resist_disen(target_ptr))
+ if (has_resist_disen(target_ptr))
monap_ptr->damage = monap_ptr->damage * (randint1(4) + 4) / 9;
monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
}
/*!
+ * @brief 魔道具吸収ダメージを計算する (消費魔力減少、呪文失敗率減少、魔道具使用能力向上があればそれぞれ-7.5%)
+ * @param target_ptr プレーヤーへの参照ポインタ
+ * @param monap_ptr モンスターからプレーヤーへの直接攻撃構造体への参照ポインタ
+ * @return なし
+ * @detals 魔道具使用能力向上フラグがあれば、吸収対象のアイテムをスキャンされる回数が半分で済む
+ */
+static void calc_blow_un_power(player_type *target_ptr, monap_type *monap_ptr)
+{
+ int damage_ratio = 1000;
+ if (has_dec_mana(target_ptr))
+ damage_ratio -= 75;
+
+ if (has_easy_spell(target_ptr))
+ damage_ratio -= 75;
+
+ bool is_magic_mastery = has_magic_mastery(target_ptr) != 0;
+ if (is_magic_mastery)
+ damage_ratio -= 75;
+
+ monap_ptr->damage = monap_ptr->damage * damage_ratio / 1000;
+ monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
+ if (target_ptr->is_dead || check_multishadow(target_ptr))
+ return;
+
+ int max_draining_item = is_magic_mastery ? 5 : 10;
+ for (int i = 0; i < max_draining_item; i++) {
+ INVENTORY_IDX i_idx = (INVENTORY_IDX)randint0(INVEN_PACK);
+ monap_ptr->o_ptr = &target_ptr->inventory_list[i_idx];
+ if (monap_ptr->o_ptr->k_idx == 0)
+ continue;
+
+ if (process_un_power(target_ptr, monap_ptr))
+ break;
+ }
+}
+
+/*!
* @brief 盲目ダメージを計算する (耐性があれば、(1d4 + 3) / 8になる)
* @param target_ptr プレーヤーへの参照ポインタ
* @param monap_ptr モンスターからプレーヤーへの直接攻撃構造体への参照ポインタ
*/
static void calc_blow_blind(player_type *target_ptr, monap_type *monap_ptr)
{
- if (is_resist_blind(target_ptr))
+ if (has_resist_blind(target_ptr))
monap_ptr->damage = monap_ptr->damage * (randint1(4) + 3) / 8;
monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
if (monap_ptr->explode)
return;
- if (is_resist_conf(target_ptr))
+ if (has_resist_conf(target_ptr))
monap_ptr->damage = monap_ptr->damage * (randint1(4) + 3) / 8;
monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
if (target_ptr->is_dead)
return;
- if (!target_ptr->resist_conf && !check_multishadow(target_ptr) && set_confused(target_ptr, target_ptr->confused + 3 + randint1(monap_ptr->rlev)))
+ if (!has_resist_conf(target_ptr) && !check_multishadow(target_ptr) && set_confused(target_ptr, target_ptr->confused + 3 + randint1(monap_ptr->rlev)))
monap_ptr->obvious = TRUE;
update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_CONF);
*/
static void calc_blow_fear(player_type *target_ptr, monap_type *monap_ptr)
{
- if (is_resist_fear(target_ptr))
+ if (has_resist_fear(target_ptr))
monap_ptr->damage = monap_ptr->damage * (randint1(4) + 3) / 8;
monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
if (has_hold_exp(target_ptr))
damage_ratio -= 75;
- if (is_resist_neth(target_ptr))
+ if (has_resist_neth(target_ptr))
damage_ratio -= 75;
monap_ptr->damage = monap_ptr->damage * damage_ratio / 1000;
return;
process_monster_attack_time(target_ptr, monap_ptr);
- if (is_resist_time(target_ptr))
+ if (has_resist_time(target_ptr))
monap_ptr->damage = monap_ptr->damage * (randint1(4) + 4) / 9;
monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
process_drain_life(target_ptr, monap_ptr, resist_drain);
}
+/*!
+ * @brief MPダメージを計算する (消費魔力減少、呪文失敗率減少、魔道具使用能力向上があればそれぞれ-5%)
+ * @param target_ptr プレーヤーへの参照ポインタ
+ * @param monap_ptr モンスターからプレーヤーへの直接攻撃構造体への参照ポインタ
+ * @return なし
+ */
+static void calc_blow_drain_mana(player_type *target_ptr, monap_type *monap_ptr)
+{
+ monap_ptr->obvious = TRUE;
+ int damage_ratio = 100;
+ if (has_dec_mana(target_ptr))
+ damage_ratio -= 5;
+
+ if (has_easy_spell(target_ptr))
+ damage_ratio -= 5;
+
+ if (has_magic_mastery(target_ptr))
+ damage_ratio -= 5;
+
+ monap_ptr->damage = monap_ptr->damage * damage_ratio / 100;
+ process_drain_mana(target_ptr, monap_ptr);
+ update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_MANA);
+}
+
static void calc_blow_inertia(player_type *target_ptr, monap_type *monap_ptr)
{
if ((target_ptr->fast > 0) || (target_ptr->pspeed >= 130))
case RBE_UN_BONUS:
calc_blow_disenchant(target_ptr, monap_ptr);
break;
- case RBE_UN_POWER: {
- monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
- if (target_ptr->is_dead || check_multishadow(target_ptr))
- break;
-
- for (int i = 0; i < 10; i++) {
- INVENTORY_IDX i_idx = (INVENTORY_IDX)randint0(INVEN_PACK);
- monap_ptr->o_ptr = &target_ptr->inventory_list[i_idx];
- if (monap_ptr->o_ptr->k_idx == 0)
- continue;
-
- if (process_un_power(target_ptr, monap_ptr))
- break;
- }
-
+ case RBE_UN_POWER:
+ calc_blow_un_power(target_ptr, monap_ptr);
break;
- }
- case RBE_EAT_GOLD: {
+ case RBE_EAT_GOLD:
monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
- if (monster_confused_remaining(monap_ptr->m_ptr))
- break;
-
- if (target_ptr->is_dead || check_multishadow(target_ptr))
+ if (monster_confused_remaining(monap_ptr->m_ptr) || target_ptr->is_dead || check_multishadow(target_ptr))
break;
monap_ptr->obvious = TRUE;
process_eat_gold(target_ptr, monap_ptr);
break;
- }
case RBE_EAT_ITEM: {
monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
if (!check_eat_item(target_ptr, monap_ptr))
case RBE_DR_LIFE:
calc_blow_drain_life(target_ptr, monap_ptr);
break;
- case RBE_DR_MANA: {
- monap_ptr->obvious = TRUE;
- process_drain_mana(target_ptr, monap_ptr);
- update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_MANA);
+ case RBE_DR_MANA:
+ calc_blow_drain_mana(target_ptr, monap_ptr);
break;
- }
case RBE_INERTIA:
calc_blow_inertia(target_ptr, monap_ptr);
break;
- case RBE_STUN: {
+ case RBE_STUN:
monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
if (target_ptr->is_dead)
break;
process_stun_attack(target_ptr, monap_ptr);
break;
}
- }
}