OSDN Git Service

bbfe1165b7dd665fc9990e6c5962e8b3a4ad864b
[hengbandforosx/hengbandosx.git] / src / mspell / mspell-ball.cpp
1 #include "mspell/mspell-ball.h"
2 #include "effect/attribute-types.h"
3 #include "effect/effect-processor.h"
4 #include "main/sound-of-music.h"
5 #include "mind/drs-types.h"
6 #include "monster-race/race-ability-flags.h"
7 #include "monster-race/race-indice-types.h"
8 #include "monster/monster-info.h"
9 #include "monster/monster-status.h"
10 #include "monster/monster-update.h"
11 #include "mspell/mspell-checker.h"
12 #include "mspell/mspell-damage-calculator.h"
13 #include "mspell/mspell-result.h"
14 #include "mspell/mspell-util.h"
15 #include "system/floor-type-definition.h"
16 #include "system/monster-type-definition.h"
17 #include "system/player-type-definition.h"
18 #include "view/display-messages.h"
19
20 /*!
21  * @brief RF4_BA_NUKEの処理。放射能球。 /
22  * @param player_ptr プレイヤーへの参照ポインタ
23  * @param y 対象の地点のy座標
24  * @param x 対象の地点のx座標
25  * @param m_idx 呪文を唱えるモンスターID
26  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
27  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
28  *
29  * プレイヤーに当たったらラーニング可。
30  */
31 MonsterSpellResult spell_RF4_BA_NUKE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
32 {
33     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが放射能球を放った。", "%^s casts a ball of radiation."),
34         _("%^sが%sに放射能球を放った。", "%^s casts a ball of radiation at %s."));
35
36     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
37
38     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_NUKE, m_idx, DAM_ROLL);
39     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::NUKE, dam, 2, false, TARGET_TYPE);
40     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
41         update_smart_learn(player_ptr, m_idx, DRS_POIS);
42     }
43
44     auto res = MonsterSpellResult::make_valid(dam);
45     res.learnable = proj_res.affected_player;
46
47     return res;
48 }
49
50 /*!
51  * @brief RF4_BA_CHAOの処理。純ログルス。 /
52  * @param player_ptr プレイヤーへの参照ポインタ
53  * @param y 対象の地点のy座標
54  * @param x 対象の地点のx座標
55  * @param m_idx 呪文を唱えるモンスターID
56  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
57  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
58  *
59  * プレイヤーに当たったらラーニング可。
60  */
61 MonsterSpellResult spell_RF4_BA_CHAO(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
62 {
63     mspell_cast_msg_blind msg(_("%^sが恐ろしげにつぶやいた。", "%^s mumbles frighteningly."),
64         _("%^sが純ログルスを放った。", "%^s invokes a raw Logrus."), _("%^sが%sに純ログルスを放った。", "%^s invokes raw Logrus upon %s."));
65
66     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
67
68     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_CHAO, m_idx, DAM_ROLL);
69     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::CHAOS, dam, 4, false, TARGET_TYPE);
70     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
71         update_smart_learn(player_ptr, m_idx, DRS_CHAOS);
72     }
73
74     auto res = MonsterSpellResult::make_valid(dam);
75     res.learnable = proj_res.affected_player;
76
77     return res;
78 }
79
80 /*!
81  * @brief RF5_BA_ACIDの処理。アシッド・ボール。 /
82  * @param player_ptr プレイヤーへの参照ポインタ
83  * @param y 対象の地点のy座標
84  * @param x 対象の地点のx座標
85  * @param m_idx 呪文を唱えるモンスターID
86  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
87  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
88  *
89  * プレイヤーに当たったらラーニング可。
90  */
91 MonsterSpellResult spell_RF5_BA_ACID(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
92 {
93     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."),
94         _("%^sがアシッド・ボールの呪文を唱えた。", "%^s casts an acid ball."),
95         _("%^sが%sに向かってアシッド・ボールの呪文を唱えた。", "%^s casts an acid ball at %s."));
96
97     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
98
99     const auto rad = monster_is_powerful(player_ptr->current_floor_ptr, m_idx) ? 4 : 2;
100     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_ACID, m_idx, DAM_ROLL);
101     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::ACID, dam, rad, false, TARGET_TYPE);
102     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
103         update_smart_learn(player_ptr, m_idx, DRS_ACID);
104     }
105
106     auto res = MonsterSpellResult::make_valid(dam);
107     res.learnable = proj_res.affected_player;
108
109     return res;
110 }
111
112 /*!
113  * @brief RF5_BA_ELECの処理。サンダー・ボール。 /
114  * @param player_ptr プレイヤーへの参照ポインタ
115  * @param y 対象の地点のy座標
116  * @param x 対象の地点のx座標
117  * @param m_idx 呪文を唱えるモンスターID
118  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
119  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
120  *
121  * プレイヤーに当たったらラーニング可。
122  */
123 MonsterSpellResult spell_RF5_BA_ELEC(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
124 {
125     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."),
126         _("%^sがサンダー・ボールの呪文を唱えた。", "%^s casts a lightning ball."),
127         _("%^sが%sに向かってサンダー・ボールの呪文を唱えた。", "%^s casts a lightning ball at %s."));
128
129     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
130
131     const auto rad = monster_is_powerful(player_ptr->current_floor_ptr, m_idx) ? 4 : 2;
132     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_ELEC, m_idx, DAM_ROLL);
133     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::ELEC, dam, rad, false, TARGET_TYPE);
134     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
135         update_smart_learn(player_ptr, m_idx, DRS_ELEC);
136     }
137
138     auto res = MonsterSpellResult::make_valid(dam);
139     res.learnable = proj_res.affected_player;
140
141     return res;
142 }
143
144 /*!
145  * @brief RF5_BA_FIREの処理。ファイア・ボール。 /
146  * @param player_ptr プレイヤーへの参照ポインタ
147  * @param y 対象の地点のy座標
148  * @param x 対象の地点のx座標
149  * @param m_idx 呪文を唱えるモンスターID
150  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
151  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
152  *
153  * プレイヤーに当たったらラーニング可。
154  */
155 MonsterSpellResult spell_RF5_BA_FIRE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
156 {
157     mspell_cast_msg_blind msg;
158     auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
159
160     if (m_ptr->r_idx == MON_ROLENTO) {
161         msg.blind = _("%sが何かを投げた。", "%^s throws something.");
162         msg.to_player = _("%sは手榴弾を投げた。", "%^s throws a hand grenade.");
163         msg.to_mons = _("%^sが%^sに向かって手榴弾を投げた。", "%^s throws a hand grenade.");
164     } else {
165         msg.blind = _("%^sが何かをつぶやいた。", "%^s mumbles.");
166         msg.to_player = _("%^sがファイア・ボールの呪文を唱えた。", "%^s casts a fire ball.");
167         msg.to_mons = _("%^sが%sに向かってファイア・ボールの呪文を唱えた。", "%^s casts a fire ball at %s.");
168     }
169
170     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
171
172     const auto rad = monster_is_powerful(player_ptr->current_floor_ptr, m_idx) ? 4 : 2;
173     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_FIRE, m_idx, DAM_ROLL);
174     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::FIRE, dam, rad, false, TARGET_TYPE);
175     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
176         update_smart_learn(player_ptr, m_idx, DRS_FIRE);
177     }
178
179     auto res = MonsterSpellResult::make_valid(dam);
180     res.learnable = proj_res.affected_player;
181
182     return res;
183 }
184
185 /*!
186  * @brief RF5_BA_COLDの処理。アイス・ボール。 /
187  * @param player_ptr プレイヤーへの参照ポインタ
188  * @param y 対象の地点のy座標
189  * @param x 対象の地点のx座標
190  * @param m_idx 呪文を唱えるモンスターID
191  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
192  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
193  *
194  * プレイヤーに当たったらラーニング可。
195  */
196 MonsterSpellResult spell_RF5_BA_COLD(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
197 {
198     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."),
199         _("%^sがアイス・ボールの呪文を唱えた。", "%^s casts a frost ball."),
200         _("%^sが%sに向かってアイス・ボールの呪文を唱えた。", "%^s casts a frost ball at %s."));
201
202     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
203
204     const auto rad = monster_is_powerful(player_ptr->current_floor_ptr, m_idx) ? 4 : 2;
205     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_COLD, m_idx, DAM_ROLL);
206     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::COLD, dam, rad, false, TARGET_TYPE);
207     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
208         update_smart_learn(player_ptr, m_idx, DRS_COLD);
209     }
210
211     auto res = MonsterSpellResult::make_valid(dam);
212     res.learnable = proj_res.affected_player;
213
214     return res;
215 }
216
217 /*!
218  * @brief RF5_BA_POISの処理。悪臭雲。 /
219  * @param player_ptr プレイヤーへの参照ポインタ
220  * @param y 対象の地点のy座標
221  * @param x 対象の地点のx座標
222  * @param m_idx 呪文を唱えるモンスターID
223  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
224  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
225  *
226  * プレイヤーに当たったらラーニング可。
227  */
228 MonsterSpellResult spell_RF5_BA_POIS(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
229 {
230     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが悪臭雲の呪文を唱えた。", "%^s casts a stinking cloud."),
231         _("%^sが%sに向かって悪臭雲の呪文を唱えた。", "%^s casts a stinking cloud at %s."));
232
233     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
234
235     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_POIS, m_idx, DAM_ROLL);
236     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::POIS, dam, 2, false, TARGET_TYPE);
237     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
238         update_smart_learn(player_ptr, m_idx, DRS_POIS);
239     }
240
241     auto res = MonsterSpellResult::make_valid(dam);
242     res.learnable = proj_res.affected_player;
243
244     return res;
245 }
246
247 /*!
248  * @brief RF5_BA_NETHの処理。地獄球。 /
249  * @param player_ptr プレイヤーへの参照ポインタ
250  * @param y 対象の地点のy座標
251  * @param x 対象の地点のx座標
252  * @param m_idx 呪文を唱えるモンスターID
253  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
254  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
255  *
256  * プレイヤーに当たったらラーニング可。
257  */
258 MonsterSpellResult spell_RF5_BA_NETH(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
259 {
260     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが地獄球の呪文を唱えた。", "%^s casts a nether ball."),
261         _("%^sが%sに向かって地獄球の呪文を唱えた。", "%^s casts a nether ball at %s."));
262
263     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
264
265     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_NETH, m_idx, DAM_ROLL);
266     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::NETHER, dam, 2, false, TARGET_TYPE);
267     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
268         update_smart_learn(player_ptr, m_idx, DRS_NETH);
269     }
270
271     auto res = MonsterSpellResult::make_valid(dam);
272     res.learnable = proj_res.affected_player;
273
274     return res;
275 }
276
277 /*!
278  * @brief RF5_BA_WATEの処理。ウォーター・ボール。 /
279  * @param player_ptr プレイヤーへの参照ポインタ
280  * @param y 対象の地点のy座標
281  * @param x 対象の地点のx座標
282  * @param m_idx 呪文を唱えるモンスターID
283  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
284  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
285  *
286  * プレイヤーに当たったらラーニング可。
287  */
288 MonsterSpellResult spell_RF5_BA_WATE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
289 {
290     bool known = monster_near_player(player_ptr->current_floor_ptr, m_idx, t_idx);
291     bool see_either = see_monster(player_ptr, m_idx) || see_monster(player_ptr, t_idx);
292     bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
293     bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
294     GAME_TEXT t_name[MAX_NLEN];
295     monster_name(player_ptr, t_idx, t_name);
296
297     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが流れるような身振りをした。", "%^s gestures fluidly."),
298         _("%^sが%sに対して流れるような身振りをした。", "%^s gestures fluidly at %s."));
299
300     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
301
302     if (mon_to_player) {
303         msg_format(_("あなたは渦巻きに飲み込まれた。", "You are engulfed in a whirlpool."));
304     } else if (mon_to_mon && known && see_either && !player_ptr->blind) {
305         msg_format(_("%^sは渦巻に飲み込まれた。", "%^s is engulfed in a whirlpool."), t_name);
306     }
307
308     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_WATE, m_idx, DAM_ROLL);
309     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::WATER, dam, 4, false, TARGET_TYPE);
310
311     auto res = MonsterSpellResult::make_valid(dam);
312     res.learnable = proj_res.affected_player;
313
314     return res;
315 }
316
317 /*!
318  * @brief RF5_BA_MANAの処理。魔力の嵐。 /
319  * @param player_ptr プレイヤーへの参照ポインタ
320  * @param y 対象の地点のy座標
321  * @param x 対象の地点のx座標
322  * @param m_idx 呪文を唱えるモンスターID
323  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
324  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
325  *
326  * プレイヤーに当たったらラーニング可。
327  */
328 MonsterSpellResult spell_RF5_BA_MANA(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
329 {
330     mspell_cast_msg_blind msg(_("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
331         _("%^sが魔力の嵐の呪文を念じた。", "%^s invokes a mana storm."), _("%^sが%sに対して魔力の嵐の呪文を念じた。", "%^s invokes a mana storm upon %s."));
332
333     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
334
335     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_MANA, m_idx, DAM_ROLL);
336     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::MANA, dam, 4, false, TARGET_TYPE);
337
338     auto res = MonsterSpellResult::make_valid(dam);
339     res.learnable = proj_res.affected_player;
340
341     return res;
342 }
343
344 /*!
345  * @brief RF5_BA_DARKの処理。暗黒の嵐。 /
346  * @param player_ptr プレイヤーへの参照ポインタ
347  * @param y 対象の地点のy座標
348  * @param x 対象の地点のx座標
349  * @param m_idx 呪文を唱えるモンスターID
350  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
351  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
352  *
353  * プレイヤーに当たったらラーニング可。
354  */
355 MonsterSpellResult spell_RF5_BA_DARK(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
356 {
357     mspell_cast_msg_blind msg(_("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
358         _("%^sが暗黒の嵐の呪文を念じた。", "%^s invokes a darkness storm."),
359         _("%^sが%sに対して暗黒の嵐の呪文を念じた。", "%^s invokes a darkness storm upon %s."));
360
361     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
362
363     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_DARK, m_idx, DAM_ROLL);
364     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::DARK, dam, 4, false, TARGET_TYPE);
365     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
366         update_smart_learn(player_ptr, m_idx, DRS_DARK);
367     }
368
369     auto res = MonsterSpellResult::make_valid(dam);
370     res.learnable = proj_res.affected_player;
371
372     return res;
373 }
374
375 /*!
376  * @brief RF5_BA_LITEの処理。スターバースト。 /
377  * @param player_ptr プレイヤーへの参照ポインタ
378  * @param y 対象の地点のy座標
379  * @param x 対象の地点のx座標
380  * @param m_idx 呪文を唱えるモンスターID
381  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
382  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
383  *
384  * プレイヤーに当たったらラーニング可。
385  */
386 MonsterSpellResult spell_RF5_BA_LITE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
387 {
388     mspell_cast_msg_blind msg(_("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
389         _("%^sがスターバーストの呪文を念じた。", "%^s invokes a starburst."),
390         _("%^sが%sに対してスターバーストの呪文を念じた。", "%^s invokes a starburst upon %s."));
391
392     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
393
394     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_LITE, m_idx, DAM_ROLL);
395     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::LITE, dam, 4, false, TARGET_TYPE);
396     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
397         update_smart_learn(player_ptr, m_idx, DRS_LITE);
398     }
399
400     auto res = MonsterSpellResult::make_valid(dam);
401     res.learnable = proj_res.affected_player;
402
403     return res;
404 }
405
406 /*!
407  * @brief RF5_BA_VOIDの処理。虚無の嵐。 /
408  * @param player_ptr プレイヤーへの参照ポインタ
409  * @param y 対象の地点のy座標
410  * @param x 対象の地点のx座標
411  * @param m_idx 呪文を唱えるモンスターID
412  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
413  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
414  *
415  * プレイヤーに当たったらラーニング可。
416  */
417 MonsterSpellResult spell_RF5_BA_VOID(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
418 {
419     mspell_cast_msg_blind msg(_("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
420         _("%^sが虚無の嵐の呪文を念じた。", "%^s invokes a void storm."),
421         _("%^sが%sに対して虚無の嵐の呪文を念じた。", "%^s invokes a void storm upon %s."));
422
423     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
424
425     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_VOID, m_idx, DAM_ROLL);
426     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::VOID_MAGIC, dam, 4, false, TARGET_TYPE);
427
428     auto res = MonsterSpellResult::make_valid(dam);
429     res.learnable = proj_res.affected_player;
430
431     return res;
432 }
433
434 /*!
435  * @brief RF5_BA_ABYSSの処理。アビス・ボール。 /
436  * @param player_ptr プレイヤーへの参照ポインタ
437  * @param y 対象の地点のy座標
438  * @param x 対象の地点のx座標
439  * @param m_idx 呪文を唱えるモンスターID
440  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
441  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
442  *
443  * プレイヤーに当たったらラーニング可。
444  */
445 MonsterSpellResult spell_RF5_BA_ABYSS(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
446 {
447     mspell_cast_msg_blind msg(_("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
448         _("%^sが深淵の嵐の呪文を念じた。", "%^s invokes a abyss storm."),
449         _("%^sが%sに対して深淵の嵐の呪文を念じた。", "%^s invokes a void abyss upon %s."));
450
451     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
452
453     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BA_ABYSS, m_idx, DAM_ROLL);
454     const auto proj_res = breath(player_ptr, y, x, m_idx, AttributeType::ABYSS, dam, 4, false, TARGET_TYPE);
455     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
456         update_smart_learn(player_ptr, m_idx, DRS_DARK);
457     }
458
459     auto res = MonsterSpellResult::make_valid(dam);
460     res.learnable = proj_res.affected_player;
461
462     return res;
463 }