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"
19 * @brief RF4_SHOOTの処理。射撃。 /
20 * @param player_ptr プレイヤーへの参照ポインタ
23 * @param m_idx 呪文を唱えるモンスターID
24 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
25 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
29 MonsterSpellResult spell_RF4_SHOOT(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
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."));
35 bool notice = monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
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);
44 auto res = MonsterSpellResult::make_valid(dam);
45 res.learnable = proj_res.affected_player;
51 * @brief RF5_BO_ACIDの処理。アシッド・ボルト。 /
52 * @param player_ptr プレイヤーへの参照ポインタ
55 * @param m_idx 呪文を唱えるモンスターID
56 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
57 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
61 MonsterSpellResult spell_RF5_BO_ACID(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
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."));
67 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
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);
76 auto res = MonsterSpellResult::make_valid(dam);
77 res.learnable = proj_res.affected_player;
83 * @brief RF5_BO_ELECの処理。サンダー・ボルト。 /
84 * @param player_ptr プレイヤーへの参照ポインタ
87 * @param m_idx 呪文を唱えるモンスターID
88 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
89 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
93 MonsterSpellResult spell_RF5_BO_ELEC(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
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."));
99 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
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);
108 auto res = MonsterSpellResult::make_valid(dam);
109 res.learnable = proj_res.affected_player;
115 * @brief RF5_BO_FIREの処理。ファイア・ボルト。 /
116 * @param player_ptr プレイヤーへの参照ポインタ
119 * @param m_idx 呪文を唱えるモンスターID
120 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
121 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
125 MonsterSpellResult spell_RF5_BO_FIRE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
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."));
131 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
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);
140 auto res = MonsterSpellResult::make_valid(dam);
141 res.learnable = proj_res.affected_player;
147 * @brief RF5_BO_COLDの処理。アイス・ボルト。 /
148 * @param player_ptr プレイヤーへの参照ポインタ
151 * @param m_idx 呪文を唱えるモンスターID
152 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
153 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
157 MonsterSpellResult spell_RF5_BO_COLD(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
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."));
163 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
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);
172 auto res = MonsterSpellResult::make_valid(dam);
173 res.learnable = proj_res.affected_player;
179 * @brief RF5_BO_NETHの処理。地獄の矢。 /
180 * @param player_ptr プレイヤーへの参照ポインタ
183 * @param m_idx 呪文を唱えるモンスターID
184 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
185 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
189 MonsterSpellResult spell_RF5_BO_NETH(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
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."));
194 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
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);
203 auto res = MonsterSpellResult::make_valid(dam);
204 res.learnable = proj_res.affected_player;
210 * @brief RF5_BO_WATEの処理。ウォーター・ボルト。 /
211 * @param player_ptr プレイヤーへの参照ポインタ
214 * @param m_idx 呪文を唱えるモンスターID
215 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
216 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
220 MonsterSpellResult spell_RF5_BO_WATE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
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."));
226 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
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);
234 auto res = MonsterSpellResult::make_valid(dam);
235 res.learnable = proj_res.affected_player;
241 * @brief RF5_BO_MANAの処理。魔力の矢。 /
242 * @param player_ptr プレイヤーへの参照ポインタ
245 * @param m_idx 呪文を唱えるモンスターID
246 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
247 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
251 MonsterSpellResult spell_RF5_BO_MANA(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
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."));
256 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
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);
264 auto res = MonsterSpellResult::make_valid(dam);
265 res.learnable = proj_res.affected_player;
271 * @brief RF5_BO_PLASの処理。プラズマ・ボルト。 /
272 * @param player_ptr プレイヤーへの参照ポインタ
275 * @param m_idx 呪文を唱えるモンスターID
276 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
277 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
281 MonsterSpellResult spell_RF5_BO_PLAS(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
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."));
287 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
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);
295 auto res = MonsterSpellResult::make_valid(dam);
296 res.learnable = proj_res.affected_player;
302 * @brief RF5_BO_ICEEの処理。極寒の矢。 /
303 * @param player_ptr プレイヤーへの参照ポインタ
306 * @param m_idx 呪文を唱えるモンスターID
307 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
308 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
312 MonsterSpellResult spell_RF5_BO_ICEE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
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."));
317 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
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);
326 auto res = MonsterSpellResult::make_valid(dam);
327 res.learnable = proj_res.affected_player;
333 * @brief RF5_MISSILEの処理。マジック・ミサイル。 /
334 * @param player_ptr プレイヤーへの参照ポインタ
337 * @param m_idx 呪文を唱えるモンスターID
338 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
339 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
343 MonsterSpellResult spell_RF5_MISSILE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
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."));
349 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
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);
357 auto res = MonsterSpellResult::make_valid(dam);
358 res.learnable = proj_res.affected_player;