OSDN Git Service

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