*/
#include "angband.h"
+#include "cmd-pet.h"
-/* ToDo: Make this global */
-#define HURT_CHANCE 16 /*!< 属性攻撃を受けた際に能力値低下を起こす確率(1/X) / 1/x chance of reducing stats (for elemental attacks) */
static int rakubadam_m; /*!< 振り落とされた際のダメージ量 */
static int rakubadam_p; /*!< 落馬した際のダメージ量 */
/*!
- * @brief モンスター魅了用セービングスロー共通部
+ * @brief モンスター魅了用セービングスロー共通部(汎用系)
* @param pow 魅了パワー
* @param m_ptr 対象モンスター
* @return 魅了に抵抗したらTRUE
{
monster_race *r_ptr = &r_info[m_ptr->r_idx];
- if(r_ptr->flagsr & RFR_RES_ALL || p_ptr->inside_arena) return TRUE;
+ if(p_ptr->inside_arena) return TRUE;
- pow += (adj_chr_chm[player_ptr->stat_ind[A_CHR]] - 1);
+ /* Memorize a flag */
+ if (r_ptr->flagsr & RFR_RES_ALL)
+ {
+ if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
+ return TRUE;
+ }
+ if (r_ptr->flags3 & RF3_NO_CONF)
+ {
+ if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF);
+ return TRUE;
+ }
+
+ if (r_ptr->flags1 & RF1_QUESTOR || m_ptr->mflag2 & MFLAG2_NOPET) return TRUE;
+
+ pow += (adj_chr_chm[player_ptr->stat_ind[A_CHR]] - 1);
if((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) pow = pow * 2 / 3;
+ return (r_ptr->level > randint1((pow - 10) < 1 ? 1 : (pow - 10)) + 5);
+}
+
+/*!
+ * @brief モンスター服従用セービングスロー共通部(部族依存系)
+ * @param pow 服従パワー
+ * @param m_ptr 対象モンスター
+ * @return 服従に抵抗したらTRUE
+ */
+static bool_hack common_saving_throw_control(player_type *player_ptr, HIT_POINT pow, monster_type *m_ptr)
+{
+ monster_race *r_ptr = &r_info[m_ptr->r_idx];
+
+ if (p_ptr->inside_arena) return TRUE;
+
+ /* Memorize a flag */
+ if (r_ptr->flagsr & RFR_RES_ALL)
+ {
+ if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
+ return TRUE;
+ }
+
+ if (r_ptr->flags1 & RF1_QUESTOR || m_ptr->mflag2 & MFLAG2_NOPET) return TRUE;
- return (r_ptr->flags1 & RF1_QUESTOR) ||
- (r_ptr->flags3 & RF3_NO_CONF) ||
- (m_ptr->mflag2 & MFLAG2_NOPET) ||
- (r_ptr->level > randint1((pow - 10) < 1 ? 1 : (pow - 10)) + 5);
+ pow += adj_chr_chm[player_ptr->stat_ind[A_CHR]] - 1;
+ if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) pow = pow * 2 / 3;
+ return (r_ptr->level > randint1((pow - 10) < 1 ? 1 : (pow - 10)) + 5);
}
/*!
+* @brief 一部ボルト魔法のビーム化確率を算出する / Prepare standard probability to become beam for fire_bolt_or_beam()
+* @return ビーム化確率(%)
+* @details
+* ハードコーティングによる実装が行われている。
+* メイジは(レベル)%、ハイメイジ、スペルマスターは(レベル)%、それ以外の職業は(レベル/2)%
+*/
+int beam_chance(void)
+{
+ if (p_ptr->pclass == CLASS_MAGE)
+ return p_ptr->lev;
+ if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
+ return p_ptr->lev + 10;
+
+ return p_ptr->lev / 2;
+}
+
+
+/*!
* @brief 配置した鏡リストの次を取得する /
* Get another mirror. for SEEKER
* @param next_y 次の鏡のy座標を返す参照ポインタ
}
else
{
- if ((dam > 29) && (randint1(100) < dam))
+ if (!common_saving_throw_charm(p_ptr, dam, m_ptr))
{
note = _("があなたに隷属した。", " is in your thrall!");
set_pet(m_ptr);
if (common_saving_throw_charm(p_ptr, dam, m_ptr))
{
- /* Memorize a flag */
- if (r_ptr->flagsr & RFR_RES_ALL)
- {
- if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
- }
-
- if (r_ptr->flags3 & RF3_NO_CONF)
- {
- if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
/* Resist */
/* No obvious effect */
note = _("には効果がなかった。", " is unaffected.");
case GF_CONTROL_UNDEAD:
{
int vir;
- dam += (adj_chr_chm[p_ptr->stat_ind[A_CHR]] - 1);
if (seen) obvious = TRUE;
vir = virtue_number(V_UNLIFE);
dam -= p_ptr->virtues[vir-1]/20;
}
- if ((r_ptr->flagsr & RFR_RES_ALL) || p_ptr->inside_arena)
- {
- note = _("には効果がなかった。", " is unaffected.");
- dam = 0;
- if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
- break;
- }
-
- if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL))
- dam = dam * 2 / 3;
-
/* Attempt a saving throw */
- if ((r_ptr->flags1 & RF1_QUESTOR) ||
- (!(r_ptr->flags3 & RF3_UNDEAD)) ||
- (m_ptr->mflag2 & MFLAG2_NOPET) ||
- (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
+ if (common_saving_throw_control(p_ptr, dam, m_ptr) ||
+ !(r_ptr->flags3 & RF3_UNDEAD))
{
/* No obvious effect */
note = _("には効果がなかった。", " is unaffected.");
case GF_CONTROL_DEMON:
{
int vir;
- dam += (adj_chr_chm[p_ptr->stat_ind[A_CHR]] - 1);
if (seen) obvious = TRUE;
vir = virtue_number(V_UNLIFE);
dam -= p_ptr->virtues[vir-1]/20;
}
- if ((r_ptr->flagsr & RFR_RES_ALL) || p_ptr->inside_arena)
- {
- note = _("には効果がなかった。", " is unaffected.");
- dam = 0;
- if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
- break;
- }
-
- if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL))
- dam = dam * 2 / 3;
-
/* Attempt a saving throw */
- if ((r_ptr->flags1 & RF1_QUESTOR) ||
- (!(r_ptr->flags3 & RF3_DEMON)) ||
- (m_ptr->mflag2 & MFLAG2_NOPET) ||
- (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
+ if (common_saving_throw_control(p_ptr, dam, m_ptr) ||
+ !(r_ptr->flags3 & RF3_DEMON))
{
/* No obvious effect */
note = _("には効果がなかった。", " is unaffected.");
-
obvious = FALSE;
if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET;
}
case GF_CONTROL_ANIMAL:
{
int vir;
- dam += (adj_chr_chm[p_ptr->stat_ind[A_CHR]] - 1);
-
if (seen) obvious = TRUE;
vir = virtue_number(V_NATURE);
dam -= p_ptr->virtues[vir-1]/20;
}
- if ((r_ptr->flagsr & RFR_RES_ALL) || p_ptr->inside_arena)
- {
- note = _("には効果がなかった。", " is unaffected.");
- dam = 0;
- if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
- break;
- }
-
- if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL))
- dam = dam * 2 / 3;
-
/* Attempt a saving throw */
- if ((r_ptr->flags1 & (RF1_QUESTOR)) ||
- (!(r_ptr->flags3 & (RF3_ANIMAL))) ||
- (m_ptr->mflag2 & MFLAG2_NOPET) ||
- (r_ptr->flags3 & (RF3_NO_CONF)) ||
- (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
+ if (common_saving_throw_control(p_ptr, dam, m_ptr) ||
+ !(r_ptr->flags3 & RF3_ANIMAL))
{
- /* Memorize a flag */
- if (r_ptr->flags3 & (RF3_NO_CONF))
- {
- if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
/* Resist */
/* No obvious effect */
note = _("には効果がなかった。", " is unaffected.");
-
obvious = FALSE;
if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET;
}
{
note = _("はなついた。", " is tamed!");
set_pet(m_ptr);
-
if (r_ptr->flags3 & RF3_ANIMAL)
chg_virtue(V_NATURE, 1);
}
}
/* Tame animal */
- case GF_CONTROL_LIVING:
+ case GF_CHARM_LIVING:
{
int vir;
- dam += (adj_chr_chm[p_ptr->stat_ind[A_CHR]] - 1);
vir = virtue_number(V_UNLIFE);
if (seen) obvious = TRUE;
dam -= p_ptr->virtues[vir-1]/20;
}
- if (r_ptr->flags3 & (RF3_NO_CONF)) dam -= 30;
- if (dam < 1) dam = 1;
msg_format(_("%sを見つめた。", "You stare into %s."), m_name);
- if ((r_ptr->flagsr & RFR_RES_ALL) || p_ptr->inside_arena)
- {
- note = _("には効果がなかった。", " is unaffected.");
- dam = 0;
- if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
- break;
- }
-
- if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL))
- dam = dam * 2 / 3;
/* Attempt a saving throw */
- if ((r_ptr->flags1 & (RF1_QUESTOR)) ||
- (m_ptr->mflag2 & MFLAG2_NOPET) ||
- !monster_living(r_ptr) ||
- ((r_ptr->level+10) > randint1(dam)))
+ if (common_saving_throw_charm(p_ptr, dam, m_ptr) ||
+ !monster_living(r_ptr))
{
/* Resist */
/* No obvious effect */
note = _("には効果がなかった。", " is unaffected.");
-
obvious = FALSE;
if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET;
}
{
note = _("を支配した。", " is tamed!");
set_pet(m_ptr);
-
if (r_ptr->flags3 & RF3_ANIMAL)
chg_virtue(V_NATURE, 1);
}