OSDN Git Service

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