OSDN Git Service

Merge pull request #2013 from sikabane-works/release/3.0.0Alpha51
[hengbandforosx/hengbandosx.git] / src / mspell / mspell-bolt.cpp
1 #include "mspell/mspell-bolt.h"
2 #include "effect/effect-processor.h"
3 #include "main/sound-definitions-table.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/monster-info.h"
8 #include "monster/monster-update.h"
9 #include "mspell/mspell-checker.h"
10 #include "mspell/mspell-damage-calculator.h"
11 #include "mspell/mspell-result.h"
12 #include "mspell/mspell-util.h"
13 #include "mspell/mspell-result.h"
14 #include "effect/attribute-types.h"
15 #include "system/floor-type-definition.h"
16 #include "system/player-type-definition.h"
17
18 /*!
19  * @brief RF4_SHOOTの処理。射撃。 /
20  * @param player_ptr プレイヤーへの参照ポインタ
21  * @param y 対象の地点のy座標
22  * @param x 対象の地点のx座標
23  * @param m_idx 呪文を唱えるモンスターID
24  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
25  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
26  *
27  * プレイヤーに当たったらラーニング可。
28  */
29 MonsterSpellResult spell_RF4_SHOOT(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
30 {
31     mspell_cast_msg_blind msg(_("%^sが奇妙な音を発した。", "%^s makes a strange noise."),
32         _("%^sが矢を放った。", "%^s fires an arrow."),
33         _("%^sが%sに矢を放った。", "%^s fires an arrow at %s."));
34
35     bool notice = monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
36
37     if (notice) {
38         sound(SOUND_SHOOT);
39     }
40
41     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::SHOOT, m_idx, DAM_ROLL);
42     const auto proj_res = bolt(player_ptr, m_idx, y, x, AttributeType::MONSTER_SHOOT, dam, TARGET_TYPE);
43
44     auto res = MonsterSpellResult::make_valid(dam);
45     res.learnable = proj_res.affected_player;
46
47     return res;
48 }
49
50 /*!
51  * @brief RF5_BO_ACIDの処理。アシッド・ボルト。 /
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_RF5_BO_ACID(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."),
64         _("%^sがアシッド・ボルトの呪文を唱えた。", "%^s casts an acid bolt."),
65         _("%sが%sに向かってアシッド・ボルトの呪文を唱えた。", "%^s casts an acid bolt at %s."));
66
67     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
68
69     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BO_ACID, m_idx, DAM_ROLL);
70     const auto proj_res = bolt(player_ptr, m_idx, y, x, AttributeType::ACID, dam, TARGET_TYPE);
71     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
72         update_smart_learn(player_ptr, m_idx, DRS_ACID);
73         update_smart_learn(player_ptr, m_idx, DRS_REFLECT);
74     }
75
76     auto res = MonsterSpellResult::make_valid(dam);
77     res.learnable = proj_res.affected_player;
78
79     return res;
80 }
81
82 /*!
83  * @brief RF5_BO_ELECの処理。サンダー・ボルト。 /
84  * @param player_ptr プレイヤーへの参照ポインタ
85  * @param y 対象の地点のy座標
86  * @param x 対象の地点のx座標
87  * @param m_idx 呪文を唱えるモンスターID
88  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
89  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
90  *
91  * プレイヤーに当たったらラーニング可。
92  */
93 MonsterSpellResult spell_RF5_BO_ELEC(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
94 {
95     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."),
96         _("%^sがサンダー・ボルトの呪文を唱えた。", "%^s casts a lightning bolt."),
97         _("%^sが%sに向かってサンダー・ボルトの呪文を唱えた。", "%^s casts a lightning bolt at %s."));
98
99     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
100
101     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BO_ELEC, m_idx, DAM_ROLL);
102     const auto proj_res = bolt(player_ptr, m_idx, y, x, AttributeType::ELEC, dam, TARGET_TYPE);
103     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
104         update_smart_learn(player_ptr, m_idx, DRS_ELEC);
105         update_smart_learn(player_ptr, m_idx, DRS_REFLECT);
106     }
107
108     auto res = MonsterSpellResult::make_valid(dam);
109     res.learnable = proj_res.affected_player;
110
111     return res;
112 }
113
114 /*!
115  * @brief RF5_BO_FIREの処理。ファイア・ボルト。 /
116  * @param player_ptr プレイヤーへの参照ポインタ
117  * @param y 対象の地点のy座標
118  * @param x 対象の地点のx座標
119  * @param m_idx 呪文を唱えるモンスターID
120  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
121  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
122  *
123  * プレイヤーに当たったらラーニング可。
124  */
125 MonsterSpellResult spell_RF5_BO_FIRE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
126 {
127     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."),
128         _("%^sがファイア・ボルトの呪文を唱えた。", "%^s casts a fire bolt."),
129         _("%^sが%sに向かってファイア・ボルトの呪文を唱えた。", "%^s casts a fire bolt at %s."));
130
131     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
132
133     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BO_FIRE, m_idx, DAM_ROLL);
134     const auto proj_res = bolt(player_ptr, m_idx, y, x, AttributeType::FIRE, dam, TARGET_TYPE);
135     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
136         update_smart_learn(player_ptr, m_idx, DRS_FIRE);
137         update_smart_learn(player_ptr, m_idx, DRS_REFLECT);
138     }
139
140     auto res = MonsterSpellResult::make_valid(dam);
141     res.learnable = proj_res.affected_player;
142
143     return res;
144 }
145
146 /*!
147  * @brief RF5_BO_COLDの処理。アイス・ボルト。 /
148  * @param player_ptr プレイヤーへの参照ポインタ
149  * @param y 対象の地点のy座標
150  * @param x 対象の地点のx座標
151  * @param m_idx 呪文を唱えるモンスターID
152  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
153  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
154  *
155  * プレイヤーに当たったらラーニング可。
156  */
157 MonsterSpellResult spell_RF5_BO_COLD(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
158 {
159     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."),
160         _("%^sがアイス・ボルトの呪文を唱えた。", "%^s casts a frost bolt."),
161         _("%^sが%sに向かってアイス・ボルトの呪文を唱えた。", "%^s casts a frost bolt at %s."));
162
163     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
164
165     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BO_COLD, m_idx, DAM_ROLL);
166     const auto proj_res = bolt(player_ptr, m_idx, y, x, AttributeType::COLD, dam, TARGET_TYPE);
167     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
168         update_smart_learn(player_ptr, m_idx, DRS_COLD);
169         update_smart_learn(player_ptr, m_idx, DRS_REFLECT);
170     }
171
172     auto res = MonsterSpellResult::make_valid(dam);
173     res.learnable = proj_res.affected_player;
174
175     return res;
176 }
177
178 /*!
179  * @brief RF5_BO_NETHの処理。地獄の矢。 /
180  * @param player_ptr プレイヤーへの参照ポインタ
181  * @param y 対象の地点のy座標
182  * @param x 対象の地点のx座標
183  * @param m_idx 呪文を唱えるモンスターID
184  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
185  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
186  *
187  * プレイヤーに当たったらラーニング可。
188  */
189 MonsterSpellResult spell_RF5_BO_NETH(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
190 {
191     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが地獄の矢の呪文を唱えた。", "%^s casts a nether bolt."),
192         _("%^sが%sに向かって地獄の矢の呪文を唱えた。", "%^s casts a nether bolt at %s."));
193
194     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
195
196     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BO_NETH, m_idx, DAM_ROLL);
197     const auto proj_res = bolt(player_ptr, m_idx, y, x, AttributeType::NETHER, dam, TARGET_TYPE);
198     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
199         update_smart_learn(player_ptr, m_idx, DRS_NETH);
200         update_smart_learn(player_ptr, m_idx, DRS_REFLECT);
201     }
202
203     auto res = MonsterSpellResult::make_valid(dam);
204     res.learnable = proj_res.affected_player;
205
206     return res;
207 }
208
209 /*!
210  * @brief RF5_BO_WATEの処理。ウォーター・ボルト。 /
211  * @param player_ptr プレイヤーへの参照ポインタ
212  * @param y 対象の地点のy座標
213  * @param x 対象の地点のx座標
214  * @param m_idx 呪文を唱えるモンスターID
215  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
216  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
217  *
218  * プレイヤーに当たったらラーニング可。
219  */
220 MonsterSpellResult spell_RF5_BO_WATE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
221 {
222     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."),
223         _("%^sがウォーター・ボルトの呪文を唱えた。", "%^s casts a water bolt."),
224         _("%^sが%sに向かってウォーター・ボルトの呪文を唱えた。", "%^s casts a water bolt at %s."));
225
226     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
227
228     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BO_WATE, m_idx, DAM_ROLL);
229     const auto proj_res = bolt(player_ptr, m_idx, y, x, AttributeType::WATER, dam, TARGET_TYPE);
230     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
231         update_smart_learn(player_ptr, m_idx, DRS_REFLECT);
232     }
233
234     auto res = MonsterSpellResult::make_valid(dam);
235     res.learnable = proj_res.affected_player;
236
237     return res;
238 }
239
240 /*!
241  * @brief RF5_BO_MANAの処理。魔力の矢。 /
242  * @param player_ptr プレイヤーへの参照ポインタ
243  * @param y 対象の地点のy座標
244  * @param x 対象の地点のx座標
245  * @param m_idx 呪文を唱えるモンスターID
246  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
247  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
248  *
249  * プレイヤーに当たったらラーニング可。
250  */
251 MonsterSpellResult spell_RF5_BO_MANA(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
252 {
253     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが魔力の矢の呪文を唱えた。", "%^s casts a mana bolt."),
254         _("%^sが%sに向かって魔力の矢の呪文を唱えた。", "%^s casts a mana bolt at %s."));
255
256     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
257
258     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BO_MANA, m_idx, DAM_ROLL);
259     const auto proj_res = bolt(player_ptr, m_idx, y, x, AttributeType::MANA, dam, TARGET_TYPE);
260     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
261         update_smart_learn(player_ptr, m_idx, DRS_REFLECT);
262     }
263
264     auto res = MonsterSpellResult::make_valid(dam);
265     res.learnable = proj_res.affected_player;
266
267     return res;
268 }
269
270 /*!
271  * @brief RF5_BO_PLASの処理。プラズマ・ボルト。 /
272  * @param player_ptr プレイヤーへの参照ポインタ
273  * @param y 対象の地点のy座標
274  * @param x 対象の地点のx座標
275  * @param m_idx 呪文を唱えるモンスターID
276  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
277  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
278  *
279  * プレイヤーに当たったらラーニング可。
280  */
281 MonsterSpellResult spell_RF5_BO_PLAS(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
282 {
283     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."),
284         _("%^sがプラズマ・ボルトの呪文を唱えた。", "%^s casts a plasma bolt."),
285         _("%^sが%sに向かってプラズマ・ボルトの呪文を唱えた。", "%^s casts a plasma bolt at %s."));
286
287     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
288
289     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BO_PLAS, m_idx, DAM_ROLL);
290     const auto proj_res = bolt(player_ptr, m_idx, y, x, AttributeType::PLASMA, dam, TARGET_TYPE);
291     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
292         update_smart_learn(player_ptr, m_idx, DRS_REFLECT);
293     }
294
295     auto res = MonsterSpellResult::make_valid(dam);
296     res.learnable = proj_res.affected_player;
297
298     return res;
299 }
300
301 /*!
302  * @brief RF5_BO_ICEEの処理。極寒の矢。 /
303  * @param player_ptr プレイヤーへの参照ポインタ
304  * @param y 対象の地点のy座標
305  * @param x 対象の地点のx座標
306  * @param m_idx 呪文を唱えるモンスターID
307  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
308  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
309  *
310  * プレイヤーに当たったらラーニング可。
311  */
312 MonsterSpellResult spell_RF5_BO_ICEE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
313 {
314     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが極寒の矢の呪文を唱えた。", "%^s casts an ice bolt."),
315         _("%^sが%sに向かって極寒の矢の呪文を唱えた。", "%^s casts an ice bolt at %s."));
316
317     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
318
319     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::BO_ICEE, m_idx, DAM_ROLL);
320     const auto proj_res = bolt(player_ptr, m_idx, y, x, AttributeType::ICE, dam, TARGET_TYPE);
321     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
322         update_smart_learn(player_ptr, m_idx, DRS_COLD);
323         update_smart_learn(player_ptr, m_idx, DRS_REFLECT);
324     }
325
326     auto res = MonsterSpellResult::make_valid(dam);
327     res.learnable = proj_res.affected_player;
328
329     return res;
330 }
331
332 /*!
333  * @brief RF5_MISSILEの処理。マジック・ミサイル。 /
334  * @param player_ptr プレイヤーへの参照ポインタ
335  * @param y 対象の地点のy座標
336  * @param x 対象の地点のx座標
337  * @param m_idx 呪文を唱えるモンスターID
338  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
339  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
340  *
341  * プレイヤーに当たったらラーニング可。
342  */
343 MonsterSpellResult spell_RF5_MISSILE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
344 {
345     mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."),
346         _("%^sがマジック・ミサイルの呪文を唱えた。", "%^s casts a magic missile."),
347         _("%^sが%sに向かってマジック・ミサイルの呪文を唱えた。", "%^s casts a magic missile at %s."));
348
349     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
350
351     const auto dam = monspell_damage(player_ptr, MonsterAbilityType::MISSILE, m_idx, DAM_ROLL);
352     const auto proj_res = bolt(player_ptr, m_idx, y, x, AttributeType::MISSILE, dam, TARGET_TYPE);
353     if (TARGET_TYPE == MONSTER_TO_PLAYER) {
354         update_smart_learn(player_ptr, m_idx, DRS_REFLECT);
355     }
356
357     auto res = MonsterSpellResult::make_valid(dam);
358     res.learnable = proj_res.affected_player;
359
360     return res;
361 }