OSDN Git Service

Merge pull request #3569 from sikabane-works/release/3.0.0.88-alpha
[hengbandforosx/hengbandosx.git] / src / blue-magic / blue-magic-breath.cpp
1 /*!
2  * @file blue-magic-breath.cpp
3  * @brief 青魔法のブレス系呪文定義
4  */
5
6 #include "blue-magic/blue-magic-breath.h"
7 #include "blue-magic/blue-magic-util.h"
8 #include "effect/attribute-types.h"
9 #include "mind/mind-blue-mage.h"
10 #include "monster-race/race-ability-flags.h"
11 #include "mspell/mspell-damage-calculator.h"
12 #include "spell-kind/spells-launcher.h"
13 #include "system/player-type-definition.h"
14 #include "target/target-getter.h"
15 #include "view/display-messages.h"
16
17 bool cast_blue_breath_acid(PlayerType *player_ptr, bmc_type *bmc_ptr)
18 {
19     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
20         return false;
21     }
22
23     msg_print(_("酸のブレスを吐いた。", "You breathe acid."));
24     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_ACID, bmc_ptr->plev, DAM_ROLL);
25     fire_breath(player_ptr, AttributeType::ACID, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
26     return true;
27 }
28
29 bool cast_blue_breath_elec(PlayerType *player_ptr, bmc_type *bmc_ptr)
30 {
31     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
32         return false;
33     }
34
35     msg_print(_("稲妻のブレスを吐いた。", "You breathe lightning."));
36     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_ELEC, bmc_ptr->plev, DAM_ROLL);
37     fire_breath(player_ptr, AttributeType::ELEC, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
38     return true;
39 }
40
41 bool cast_blue_breath_fire(PlayerType *player_ptr, bmc_type *bmc_ptr)
42 {
43     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
44         return false;
45     }
46
47     msg_print(_("火炎のブレスを吐いた。", "You breathe fire."));
48     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_FIRE, bmc_ptr->plev, DAM_ROLL);
49     fire_breath(player_ptr, AttributeType::FIRE, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
50     return true;
51 }
52
53 bool cast_blue_breath_cold(PlayerType *player_ptr, bmc_type *bmc_ptr)
54 {
55     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
56         return false;
57     }
58
59     msg_print(_("冷気のブレスを吐いた。", "You breathe frost."));
60     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_COLD, bmc_ptr->plev, DAM_ROLL);
61     fire_breath(player_ptr, AttributeType::COLD, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
62     return true;
63 }
64
65 bool cast_blue_breath_pois(PlayerType *player_ptr, bmc_type *bmc_ptr)
66 {
67     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
68         return false;
69     }
70
71     msg_print(_("ガスのブレスを吐いた。", "You breathe gas."));
72     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_POIS, bmc_ptr->plev, DAM_ROLL);
73     fire_breath(player_ptr, AttributeType::POIS, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
74     return true;
75 }
76
77 bool cast_blue_breath_nether(PlayerType *player_ptr, bmc_type *bmc_ptr)
78 {
79     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
80         return false;
81     }
82
83     msg_print(_("地獄のブレスを吐いた。", "You breathe nether."));
84     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_NETH, bmc_ptr->plev, DAM_ROLL);
85     fire_breath(player_ptr, AttributeType::NETHER, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
86     return true;
87 }
88
89 bool cast_blue_breath_lite(PlayerType *player_ptr, bmc_type *bmc_ptr)
90 {
91     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
92         return false;
93     }
94
95     msg_print(_("閃光のブレスを吐いた。", "You breathe light."));
96     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_LITE, bmc_ptr->plev, DAM_ROLL);
97     fire_breath(player_ptr, AttributeType::LITE, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
98     return true;
99 }
100
101 bool cast_blue_breath_dark(PlayerType *player_ptr, bmc_type *bmc_ptr)
102 {
103     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
104         return false;
105     }
106
107     msg_print(_("暗黒のブレスを吐いた。", "You breathe darkness."));
108     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_DARK, bmc_ptr->plev, DAM_ROLL);
109     fire_breath(player_ptr, AttributeType::DARK, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
110     return true;
111 }
112
113 bool cast_blue_breath_conf(PlayerType *player_ptr, bmc_type *bmc_ptr)
114 {
115     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
116         return false;
117     }
118
119     msg_print(_("混乱のブレスを吐いた。", "You breathe confusion."));
120     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_CONF, bmc_ptr->plev, DAM_ROLL);
121     fire_breath(player_ptr, AttributeType::CONFUSION, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
122     return true;
123 }
124
125 bool cast_blue_breath_sound(PlayerType *player_ptr, bmc_type *bmc_ptr)
126 {
127     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
128         return false;
129     }
130
131     msg_print(_("轟音のブレスを吐いた。", "You breathe sound."));
132     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_SOUN, bmc_ptr->plev, DAM_ROLL);
133     fire_breath(player_ptr, AttributeType::SOUND, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
134     return true;
135 }
136
137 bool cast_blue_breath_chaos(PlayerType *player_ptr, bmc_type *bmc_ptr)
138 {
139     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
140         return false;
141     }
142
143     msg_print(_("カオスのブレスを吐いた。", "You breathe chaos."));
144     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_CHAO, bmc_ptr->plev, DAM_ROLL);
145     fire_breath(player_ptr, AttributeType::CHAOS, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
146     return true;
147 }
148
149 bool cast_blue_breath_disenchant(PlayerType *player_ptr, bmc_type *bmc_ptr)
150 {
151     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
152         return false;
153     }
154
155     msg_print(_("劣化のブレスを吐いた。", "You breathe disenchantment."));
156     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_DISE, bmc_ptr->plev, DAM_ROLL);
157     fire_breath(player_ptr, AttributeType::DISENCHANT, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
158     return true;
159 }
160
161 bool cast_blue_breath_nexus(PlayerType *player_ptr, bmc_type *bmc_ptr)
162 {
163     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
164         return false;
165     }
166
167     msg_print(_("因果混乱のブレスを吐いた。", "You breathe nexus."));
168     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_NEXU, bmc_ptr->plev, DAM_ROLL);
169     fire_breath(player_ptr, AttributeType::NEXUS, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
170     return true;
171 }
172
173 bool cast_blue_breath_time(PlayerType *player_ptr, bmc_type *bmc_ptr)
174 {
175     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
176         return false;
177     }
178
179     msg_print(_("時間逆転のブレスを吐いた。", "You breathe time."));
180     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_TIME, bmc_ptr->plev, DAM_ROLL);
181     fire_breath(player_ptr, AttributeType::TIME, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
182     return true;
183 }
184
185 bool cast_blue_breath_inertia(PlayerType *player_ptr, bmc_type *bmc_ptr)
186 {
187     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
188         return false;
189     }
190
191     msg_print(_("遅鈍のブレスを吐いた。", "You breathe inertia."));
192     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_INER, bmc_ptr->plev, DAM_ROLL);
193     fire_breath(player_ptr, AttributeType::INERTIAL, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
194     return true;
195 }
196
197 bool cast_blue_breath_gravity(PlayerType *player_ptr, bmc_type *bmc_ptr)
198 {
199     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
200         return false;
201     }
202
203     msg_print(_("重力のブレスを吐いた。", "You breathe gravity."));
204     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_GRAV, bmc_ptr->plev, DAM_ROLL);
205     fire_breath(player_ptr, AttributeType::GRAVITY, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
206     return true;
207 }
208
209 bool cast_blue_breath_shards(PlayerType *player_ptr, bmc_type *bmc_ptr)
210 {
211     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
212         return false;
213     }
214
215     msg_print(_("破片のブレスを吐いた。", "You breathe shards."));
216     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_SHAR, bmc_ptr->plev, DAM_ROLL);
217     fire_breath(player_ptr, AttributeType::SHARDS, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
218     return true;
219 }
220
221 bool cast_blue_breath_plasma(PlayerType *player_ptr, bmc_type *bmc_ptr)
222 {
223     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
224         return false;
225     }
226
227     msg_print(_("プラズマのブレスを吐いた。", "You breathe plasma."));
228     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_PLAS, bmc_ptr->plev, DAM_ROLL);
229     fire_breath(player_ptr, AttributeType::PLASMA, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
230     return true;
231 }
232
233 bool cast_blue_breath_force(PlayerType *player_ptr, bmc_type *bmc_ptr)
234 {
235     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
236         return false;
237     }
238
239     msg_print(_("フォースのブレスを吐いた。", "You breathe force."));
240     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_FORC, bmc_ptr->plev, DAM_ROLL);
241     fire_breath(player_ptr, AttributeType::FORCE, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
242     return true;
243 }
244
245 bool cast_blue_breath_mana(PlayerType *player_ptr, bmc_type *bmc_ptr)
246 {
247     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
248         return false;
249     }
250
251     msg_print(_("魔力のブレスを吐いた。", "You breathe mana."));
252     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_MANA, bmc_ptr->plev, DAM_ROLL);
253     fire_breath(player_ptr, AttributeType::MANA, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
254     return true;
255 }
256
257 bool cast_blue_breath_nuke(PlayerType *player_ptr, bmc_type *bmc_ptr)
258 {
259     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
260         return false;
261     }
262
263     msg_print(_("放射性廃棄物のブレスを吐いた。", "You breathe toxic waste."));
264     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_NUKE, bmc_ptr->plev, DAM_ROLL);
265     fire_breath(player_ptr, AttributeType::NUKE, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
266     return true;
267 }
268
269 /*!
270  * @brief 分解のブレスの青魔法
271  * @param player_ptr プレイヤーへの参照ポインタ
272  * @param bmc_ptr 青魔法詠唱への参照ポインタ
273  * @details 永久の刻は過ぎ去れリ.
274  */
275 bool cast_blue_breath_disintegration(PlayerType *player_ptr, bmc_type *bmc_ptr)
276 {
277     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
278         return false;
279     }
280
281     msg_print(_("分解のブレスを吐いた。", "You breathe disintegration."));
282     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_DISI, bmc_ptr->plev, DAM_ROLL);
283     fire_breath(player_ptr, AttributeType::DISINTEGRATE, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
284     return true;
285 }
286
287 /*!
288  * @brief 虚無のブレスの青魔法
289  * @param player_ptr プレイヤーへの参照ポインタ
290  * @param bmc_ptr 青魔法詠唱への参照ポインタ
291  */
292 bool cast_blue_breath_void(PlayerType *player_ptr, bmc_type *bmc_ptr)
293 {
294     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
295         return false;
296     }
297
298     msg_print(_("虚無のブレスを吐いた。", "You breathe void."));
299     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_VOID, bmc_ptr->plev, DAM_ROLL);
300     fire_breath(player_ptr, AttributeType::VOID_MAGIC, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
301     return true;
302 }
303
304 /*!
305  * @brief 深淵のブレスの青魔法
306  * @param player_ptr プレイヤーへの参照ポインタ
307  * @param bmc_ptr 青魔法詠唱への参照ポインタ
308  */
309 bool cast_blue_breath_abyss(PlayerType *player_ptr, bmc_type *bmc_ptr)
310 {
311     if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
312         return false;
313     }
314
315     msg_print(_("深淵のブレスを吐いた。", "You breathe abyss."));
316     bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BR_ABYSS, bmc_ptr->plev, DAM_ROLL);
317     fire_breath(player_ptr, AttributeType::ABYSS, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
318     return true;
319 }