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-race-definition.h"
16 #include "system/monster-type-definition.h"
17 #include "system/player-type-definition.h"
20 * @brief モンスター魅了用セービングスロー共通部(汎用系)
22 * @param m_ptr 対象モンスター
23 * @return 魅了に抵抗したらTRUE
25 bool common_saving_throw_charm(PlayerType *player_ptr, HIT_POINT pow, monster_type *m_ptr)
27 auto *r_ptr = &r_info[m_ptr->r_idx];
29 if (player_ptr->current_floor_ptr->inside_arena)
33 if (r_ptr->flagsr & RFR_RES_ALL) {
34 if (is_original_ap_and_seen(player_ptr, m_ptr))
35 r_ptr->r_flagsr |= (RFR_RES_ALL);
39 if (r_ptr->flags3 & RF3_NO_CONF) {
40 if (is_original_ap_and_seen(player_ptr, m_ptr))
41 r_ptr->r_flags3 |= (RF3_NO_CONF);
45 if (r_ptr->flags1 & RF1_QUESTOR || m_ptr->mflag2.has(MonsterConstantFlagType::NOPET))
48 pow += (adj_chr_chm[player_ptr->stat_index[A_CHR]] - 1);
49 if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL))
51 return (r_ptr->level > randint1((pow - 10) < 1 ? 1 : (pow - 10)) + 5);
55 * @brief モンスター服従用セービングスロー共通部(部族依存系)
57 * @param m_ptr 対象モンスター
58 * @return 服従に抵抗したらTRUE
60 bool common_saving_throw_control(PlayerType *player_ptr, HIT_POINT pow, monster_type *m_ptr)
62 auto *r_ptr = &r_info[m_ptr->r_idx];
64 if (player_ptr->current_floor_ptr->inside_arena)
68 if (r_ptr->flagsr & RFR_RES_ALL) {
69 if (is_original_ap_and_seen(player_ptr, m_ptr))
70 r_ptr->r_flagsr |= (RFR_RES_ALL);
74 if (r_ptr->flags1 & RF1_QUESTOR || m_ptr->mflag2.has(MonsterConstantFlagType::NOPET))
77 pow += adj_chr_chm[player_ptr->stat_index[A_CHR]] - 1;
78 if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL))
80 return (r_ptr->level > randint1((pow - 10) < 1 ? 1 : (pow - 10)) + 5);
84 * @brief 一部ボルト魔法のビーム化確率を算出する / Prepare standard probability to become beam for fire_bolt_or_beam()
87 * ハードコーティングによる実装が行われている。
88 * メイジは(レベル)%、ハイメイジ、スペルマスターは(レベル)%、それ以外の職業は(レベル/2)%
90 PERCENTAGE beam_chance(PlayerType *player_ptr)
92 PlayerClass pc(player_ptr);
93 if (pc.equals(PlayerClassType::MAGE))
94 return (PERCENTAGE)(player_ptr->lev);
95 if (pc.equals(PlayerClassType::HIGH_MAGE) || pc.equals(PlayerClassType::SORCERER))
96 return (PERCENTAGE)(player_ptr->lev + 10);
98 return (PERCENTAGE)(player_ptr->lev / 2);