OSDN Git Service

Merge pull request #3569 from sikabane-works/release/3.0.0.88-alpha
[hengbandforosx/hengbandosx.git] / src / spell / spells-diceroll.cpp
1 #include "spell/spells-diceroll.h"
2 #include "monster-race/monster-race-hook.h"
3 #include "monster-race/monster-race.h"
4 #include "monster-race/race-flags-resistance.h"
5 #include "monster-race/race-flags1.h"
6 #include "monster-race/race-flags3.h"
7 #include "monster-race/race-flags7.h"
8 #include "monster/monster-flag-types.h"
9 #include "monster/monster-info.h"
10 #include "player-base/player-class.h"
11 #include "player-info/class-info.h"
12 #include "player/player-status-table.h"
13 #include "room/rooms-builder.h"
14 #include "system/floor-type-definition.h"
15 #include "system/monster-entity.h"
16 #include "system/monster-race-info.h"
17 #include "system/player-type-definition.h"
18
19 /*!
20  * @brief モンスター魅了用セービングスロー共通部(汎用系)
21  * @param pow 魅了パワー
22  * @param m_ptr 対象モンスター
23  * @return 魅了に抵抗したらTRUE
24  */
25 bool common_saving_throw_charm(PlayerType *player_ptr, int pow, MonsterEntity *m_ptr)
26 {
27     auto *r_ptr = &monraces_info[m_ptr->r_idx];
28
29     if (player_ptr->current_floor_ptr->inside_arena) {
30         return true;
31     }
32
33     /* Memorize a flag */
34     if (r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_ALL)) {
35         if (is_original_ap_and_seen(player_ptr, m_ptr)) {
36             r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_ALL);
37         }
38         return true;
39     }
40
41     if (r_ptr->flags3 & RF3_NO_CONF) {
42         if (is_original_ap_and_seen(player_ptr, m_ptr)) {
43             r_ptr->r_flags3 |= (RF3_NO_CONF);
44         }
45         return true;
46     }
47
48     if (r_ptr->flags1 & RF1_QUESTOR || m_ptr->mflag2.has(MonsterConstantFlagType::NOPET)) {
49         return true;
50     }
51
52     pow += (adj_chr_chm[player_ptr->stat_index[A_CHR]] - 1);
53     if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE) || (r_ptr->population_flags.has(MonsterPopulationType::NAZGUL))) {
54         pow = pow * 2 / 3;
55     }
56     return (r_ptr->level > randint1((pow - 10) < 1 ? 1 : (pow - 10)) + 5);
57 }
58
59 /*!
60  * @brief モンスター服従用セービングスロー共通部(部族依存系)
61  * @param pow 服従パワー
62  * @param m_ptr 対象モンスター
63  * @return 服従に抵抗したらTRUE
64  */
65 bool common_saving_throw_control(PlayerType *player_ptr, int pow, MonsterEntity *m_ptr)
66 {
67     auto *r_ptr = &monraces_info[m_ptr->r_idx];
68
69     if (player_ptr->current_floor_ptr->inside_arena) {
70         return true;
71     }
72
73     /* Memorize a flag */
74     if (r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_ALL)) {
75         if (is_original_ap_and_seen(player_ptr, m_ptr)) {
76             r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_ALL);
77         }
78         return true;
79     }
80
81     if (r_ptr->flags1 & RF1_QUESTOR || m_ptr->mflag2.has(MonsterConstantFlagType::NOPET)) {
82         return true;
83     }
84
85     pow += adj_chr_chm[player_ptr->stat_index[A_CHR]] - 1;
86     if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE) || (r_ptr->population_flags.has(MonsterPopulationType::NAZGUL))) {
87         pow = pow * 2 / 3;
88     }
89     return (r_ptr->level > randint1((pow - 10) < 1 ? 1 : (pow - 10)) + 5);
90 }
91
92 /*!
93  * @brief 一部ボルト魔法のビーム化確率を算出する / Prepare standard probability to become beam for fire_bolt_or_beam()
94  * @return ビーム化確率(%)
95  * @details
96  * ハードコーティングによる実装が行われている。
97  * メイジは(レベル)%、ハイメイジ、スペルマスターは(レベル)%、それ以外の職業は(レベル/2)%
98  */
99 PERCENTAGE beam_chance(PlayerType *player_ptr)
100 {
101     PlayerClass pc(player_ptr);
102     if (pc.equals(PlayerClassType::MAGE)) {
103         return (PERCENTAGE)(player_ptr->lev);
104     }
105     if (pc.equals(PlayerClassType::HIGH_MAGE) || pc.equals(PlayerClassType::SORCERER)) {
106         return (PERCENTAGE)(player_ptr->lev + 10);
107     }
108
109     return (PERCENTAGE)(player_ptr->lev / 2);
110 }