OSDN Git Service

[Refactor] #37353 spells1.c から spell-diceroll.c を分離。 / Separate spell-diceroll.c...
[hengband/hengband.git] / src / spells-diceroll.c
1 #include "angband.h"
2
3 #include "spells-diceroll.h"
4
5 #include "monster.h"
6 #include "monsterrace-hook.h"
7 #include "mutation.h"
8 #include "projection.h"
9 #include "rooms.h"
10
11
12 /*!
13  * @brief モンスター魅了用セービングスロー共通部(汎用系)
14  * @param pow 魅了パワー
15  * @param m_ptr 対象モンスター
16  * @return 魅了に抵抗したらTRUE
17  */
18 bool_hack common_saving_throw_charm(player_type *player_ptr, HIT_POINT pow, monster_type *m_ptr)
19 {
20         monster_race *r_ptr = &r_info[m_ptr->r_idx];
21
22         if (p_ptr->inside_arena) return TRUE;
23
24         /* Memorize a flag */
25         if (r_ptr->flagsr & RFR_RES_ALL)
26         {
27                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
28                 return TRUE;
29         }
30
31         if (r_ptr->flags3 & RF3_NO_CONF)
32         {
33                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF);
34                 return TRUE;
35         }
36
37         if (r_ptr->flags1 & RF1_QUESTOR || m_ptr->mflag2 & MFLAG2_NOPET) return TRUE;
38
39         pow += (adj_chr_chm[player_ptr->stat_ind[A_CHR]] - 1);
40         if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) pow = pow * 2 / 3;
41         return (r_ptr->level > randint1((pow - 10) < 1 ? 1 : (pow - 10)) + 5);
42 }
43
44 /*!
45  * @brief モンスター服従用セービングスロー共通部(部族依存系)
46  * @param pow 服従パワー
47  * @param m_ptr 対象モンスター
48  * @return 服従に抵抗したらTRUE
49  */
50 bool_hack common_saving_throw_control(player_type *player_ptr, HIT_POINT pow, monster_type *m_ptr)
51 {
52         monster_race *r_ptr = &r_info[m_ptr->r_idx];
53
54         if (p_ptr->inside_arena) return TRUE;
55
56         /* Memorize a flag */
57         if (r_ptr->flagsr & RFR_RES_ALL)
58         {
59                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
60                 return TRUE;
61         }
62
63         if (r_ptr->flags1 & RF1_QUESTOR || m_ptr->mflag2 & MFLAG2_NOPET) return TRUE;
64
65         pow += adj_chr_chm[player_ptr->stat_ind[A_CHR]] - 1;
66         if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) pow = pow * 2 / 3;
67         return (r_ptr->level > randint1((pow - 10) < 1 ? 1 : (pow - 10)) + 5);
68 }
69
70 /*!
71 * @brief 一部ボルト魔法のビーム化確率を算出する / Prepare standard probability to become beam for fire_bolt_or_beam()
72 * @return ビーム化確率(%)
73 * @details
74 * ハードコーティングによる実装が行われている。
75 * メイジは(レベル)%、ハイメイジ、スペルマスターは(レベル)%、それ以外の職業は(レベル/2)%
76 */
77 PERCENTAGE beam_chance(void)
78 {
79         if (p_ptr->pclass == CLASS_MAGE)
80                 return (PERCENTAGE)(p_ptr->lev);
81         if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
82                 return (PERCENTAGE)(p_ptr->lev + 10);
83
84         return (PERCENTAGE)(p_ptr->lev / 2);
85 }