OSDN Git Service

Merge pull request #1411 from sikabane-works/feature/refactor-ego-id-enum-class
[hengbandforosx/hengbandosx.git] / src / mspell / mspell-curse.cpp
1 #include "mspell/mspell-curse.h"
2 #include "core/disturbance.h"
3 #include "effect/effect-processor.h"
4 #include "monster-race/race-ability-flags.h"
5 #include "monster/monster-info.h"
6 #include "monster/monster-list.h"
7 #include "mspell/mspell-checker.h"
8 #include "mspell/mspell-damage-calculator.h"
9 #include "mspell/mspell-result.h"
10 #include "mspell/mspell-util.h"
11 #include "mspell/mspell-result.h"
12 #include "effect/attribute-types.h"
13 #include "system/floor-type-definition.h"
14 #include "system/player-type-definition.h"
15 #include "view/display-messages.h"
16
17 /*!
18  * @brief RF5_CAUSE_* の処理関数
19  * @param player_ptr プレイヤーへの参照ポインタ
20  * @param GF_TYPE 攻撃に使用する属性
21  * @param dam 攻撃に使用するダメージ量
22  * @param y 対象の地点のy座標
23  * @param x 対象の地点のx座標
24  * @param m_idx 呪文を唱えるモンスターID
25  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
26  * @param msg1 対プレイヤー、盲目時メッセージ
27  * @param msg2 対プレイヤー、非盲目時メッセージ
28  * @param msg3 対モンスターのメッセージ
29  * @param MS_TYPE 呪文の番号
30  * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
31  */
32 static MonsterSpellResult spell_RF5_CAUSE(PlayerType *player_ptr, AttributeType GF_TYPE, int dam, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx,
33     concptr msg1, concptr msg2, concptr msg3, int target_type)
34 {
35     auto res = MonsterSpellResult::make_valid(dam);
36     res.learnable = target_type == MONSTER_TO_PLAYER;
37
38     GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
39     monster_name(player_ptr, m_idx, m_name);
40     monster_name(player_ptr, t_idx, t_name);
41
42     if (target_type == MONSTER_TO_PLAYER) {
43         disturb(player_ptr, true, true);
44         if (player_ptr->blind)
45             msg_format(msg1, m_name);
46         else
47             msg_format(msg2, m_name);
48         breath(player_ptr, y, x, m_idx, GF_TYPE, dam, 0, false, target_type);
49         return res;
50     }
51
52     if (target_type == MONSTER_TO_MONSTER) {
53         if (see_monster(player_ptr, m_idx)) {
54             msg_format(msg3, m_name, t_name);
55         } else {
56             player_ptr->current_floor_ptr->monster_noise = true;
57         }
58     }
59
60     breath(player_ptr, y, x, m_idx, GF_TYPE, dam, 0, false, target_type);
61
62     return res;
63 }
64
65 /*!
66  * @brief RF5_CAUSE_1の処理。軽傷の呪い。 /
67  * @param player_ptr プレイヤーへの参照ポインタ
68  * @param y 対象の地点のy座標
69  * @param x 対象の地点のx座標
70  * @param m_idx 呪文を唱えるモンスターID
71  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
72  * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
73  *
74  * プレイヤーが対象ならラーニング可。
75  */
76 MonsterSpellResult spell_RF5_CAUSE_1(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int target_type)
77 {
78     concptr msg1 = _("%^sが何かをつぶやいた。", "%^s mumbles.");
79     concptr msg2 = _("%^sがあなたを指さして呪った。", "%^s points at you and curses.");
80     concptr msg3 = _("%^sは%sを指さして呪いをかけた。", "%^s points at %s and curses.");
81
82     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::CAUSE_1, m_idx, DAM_ROLL);
83
84     return spell_RF5_CAUSE(player_ptr, AttributeType::CAUSE_1, dam, y, x, m_idx, t_idx, msg1, msg2, msg3, target_type);
85 }
86
87 /*!
88  * @brief RF5_CAUSE_2の処理。重傷の呪い。 /
89  * @param player_ptr プレイヤーへの参照ポインタ
90  * @param y 対象の地点のy座標
91  * @param x 対象の地点のx座標
92  * @param m_idx 呪文を唱えるモンスターID
93  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
94  * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
95  *
96  * プレイヤーが対象ならラーニング可。
97  */
98 MonsterSpellResult spell_RF5_CAUSE_2(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int target_type)
99 {
100     concptr msg1 = _("%^sが何かをつぶやいた。", "%^s mumbles.");
101     concptr msg2 = _("%^sがあなたを指さして恐ろしげに呪った。", "%^s points at you and curses horribly.");
102     concptr msg3 = _("%^sは%sを指さして恐ろしげに呪いをかけた。", "%^s points at %s and curses horribly.");
103
104     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::CAUSE_2, m_idx, DAM_ROLL);
105
106     return spell_RF5_CAUSE(player_ptr, AttributeType::CAUSE_2, dam, y, x, m_idx, t_idx, msg1, msg2, msg3, target_type);
107 }
108
109 /*!
110  * @brief RF5_CAUSE_3の処理。致命傷の呪い。 /
111  * @param player_ptr プレイヤーへの参照ポインタ
112  * @param y 対象の地点のy座標
113  * @param x 対象の地点のx座標
114  * @param m_idx 呪文を唱えるモンスターID
115  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
116  * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
117  *
118  * プレイヤーが対象ならラーニング可。
119  */
120 MonsterSpellResult spell_RF5_CAUSE_3(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int target_type)
121 {
122     concptr msg1 = _("%^sが何かを大声で叫んだ。", "%^s mumbles loudly.");
123     concptr msg2 = _("%^sがあなたを指さして恐ろしげに呪文を唱えた!", "%^s points at you, incanting terribly!");
124     concptr msg3 = _("%^sは%sを指さし、恐ろしげに呪文を唱えた!", "%^s points at %s, incanting terribly!");
125
126     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::CAUSE_3, m_idx, DAM_ROLL);
127
128     return spell_RF5_CAUSE(player_ptr, AttributeType::CAUSE_3, dam, y, x, m_idx, t_idx, msg1, msg2, msg3, target_type);
129 }
130
131 /*!
132  * @brief RF5_CAUSE_4の処理。秘孔を突く。 /
133  * @param player_ptr プレイヤーへの参照ポインタ
134  * @param y 対象の地点のy座標
135  * @param x 対象の地点のx座標
136  * @param m_idx 呪文を唱えるモンスターID
137  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
138  * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
139  *
140  * プレイヤーが対象ならラーニング可。
141  */
142 MonsterSpellResult spell_RF5_CAUSE_4(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int target_type)
143 {
144     concptr msg1 = _("%^sが「お前は既に死んでいる」と叫んだ。", "%^s screams the word 'DIE!'");
145     concptr msg2 = _("%^sがあなたの秘孔を突いて「お前は既に死んでいる」と叫んだ。", "%^s points at you, screaming the word DIE!");
146     concptr msg3 = _("%^sが%sの秘孔を突いて、「お前は既に死んでいる」と叫んだ。", "%^s points at %s, screaming the word, 'DIE!'");
147
148     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::CAUSE_4, m_idx, DAM_ROLL);
149
150     return spell_RF5_CAUSE(player_ptr, AttributeType::CAUSE_4, dam, y, x, m_idx, t_idx, msg1, msg2, msg3, target_type);
151 }