1 #include "mspell/mspell-ball.h"
2 #include "main/sound-of-music.h"
3 #include "mind/drs-types.h"
4 #include "monster-race/race-indice-types.h"
5 #include "monster/monster-info.h"
6 #include "monster/monster-status.h"
7 #include "monster/monster-update.h"
8 #include "mspell/mspell-checker.h"
9 #include "mspell/mspell-damage-calculator.h"
10 #include "mspell/mspell-type.h"
11 #include "mspell/mspell-util.h"
12 #include "spell/spell-types.h"
13 #include "system/floor-type-definition.h"
14 #include "view/display-messages.h"
17 * @brief RF4_BA_NUKEの処理。放射能球。 /
18 * @param target_ptr プレーヤーへの参照ポインタ
21 * @param m_idx 呪文を唱えるモンスターID
22 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
23 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
26 HIT_POINT spell_RF4_BA_NUKE(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
30 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが放射能球を放った。", "%^s casts a ball of radiation."),
31 _("%^sが%sに放射能球を放った。", "%^s casts a ball of radiation at %s."), TARGET_TYPE);
33 dam = monspell_damage(target_ptr, (MS_BALL_NUKE), m_idx, DAM_ROLL);
34 breath(target_ptr, y, x, m_idx, GF_NUKE, dam, 2, FALSE, MS_BALL_NUKE, TARGET_TYPE);
35 if (TARGET_TYPE == MONSTER_TO_PLAYER)
36 update_smart_learn(target_ptr, m_idx, DRS_POIS);
42 * @brief RF4_BA_CHAOの処理。純ログルス。 /
43 * @param target_ptr プレーヤーへの参照ポインタ
46 * @param m_idx 呪文を唱えるモンスターID
47 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
48 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
51 HIT_POINT spell_RF4_BA_CHAO(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
55 monspell_message(target_ptr, m_idx, t_idx, _("%^sが恐ろしげにつぶやいた。", "%^s mumbles frighteningly."),
56 _("%^sが純ログルスを放った。", "%^s invokes a raw Logrus."), _("%^sが%sに純ログルスを放った。", "%^s invokes raw Logrus upon %s."), TARGET_TYPE);
58 dam = monspell_damage(target_ptr, (MS_BALL_CHAOS), m_idx, DAM_ROLL);
59 breath(target_ptr, y, x, m_idx, GF_CHAOS, dam, 4, FALSE, MS_BALL_CHAOS, TARGET_TYPE);
60 if (TARGET_TYPE == MONSTER_TO_PLAYER)
61 update_smart_learn(target_ptr, m_idx, DRS_CHAOS);
67 * @brief RF5_BA_ACIDの処理。アシッド・ボール。 /
68 * @param target_ptr プレーヤーへの参照ポインタ
71 * @param m_idx 呪文を唱えるモンスターID
72 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
73 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
76 HIT_POINT spell_RF5_BA_ACID(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
80 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
81 _("%^sがアシッド・ボールの呪文を唱えた。", "%^s casts an acid ball."),
82 _("%^sが%sに向かってアシッド・ボールの呪文を唱えた。", "%^s casts an acid ball at %s."), TARGET_TYPE);
84 rad = monster_is_powerful(target_ptr->current_floor_ptr, m_idx) ? 4 : 2;
85 dam = monspell_damage(target_ptr, (MS_BALL_ACID), m_idx, DAM_ROLL);
86 breath(target_ptr, y, x, m_idx, GF_ACID, dam, rad, FALSE, MS_BALL_ACID, TARGET_TYPE);
87 if (TARGET_TYPE == MONSTER_TO_PLAYER)
88 update_smart_learn(target_ptr, m_idx, DRS_ACID);
94 * @brief RF5_BA_ELECの処理。サンダー・ボール。 /
95 * @param target_ptr プレーヤーへの参照ポインタ
98 * @param m_idx 呪文を唱えるモンスターID
99 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
100 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
103 HIT_POINT spell_RF5_BA_ELEC(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
107 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
108 _("%^sがサンダー・・ボールの呪文を唱えた。", "%^s casts a lightning ball."),
109 _("%^sが%sに向かってサンダー・ボールの呪文を唱えた。", "%^s casts a lightning ball at %s."), TARGET_TYPE);
111 rad = monster_is_powerful(target_ptr->current_floor_ptr, m_idx) ? 4 : 2;
112 dam = monspell_damage(target_ptr, (MS_BALL_ELEC), m_idx, DAM_ROLL);
113 breath(target_ptr, y, x, m_idx, GF_ELEC, dam, rad, FALSE, MS_BALL_ELEC, TARGET_TYPE);
114 if (TARGET_TYPE == MONSTER_TO_PLAYER)
115 update_smart_learn(target_ptr, m_idx, DRS_ELEC);
121 * @brief RF5_BA_FIREの処理。ファイア・ボール。 /
122 * @param target_ptr プレーヤーへの参照ポインタ
125 * @param m_idx 呪文を唱えるモンスターID
126 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
127 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
130 HIT_POINT spell_RF5_BA_FIRE(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
133 monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx];
135 if (m_ptr->r_idx == MON_ROLENTO) {
136 monspell_message(target_ptr, m_idx, t_idx, _("%sが何かを投げた。", "%^s throws something."), _("%sは手榴弾を投げた。", "%^s throws a hand grenade."),
137 _("%^sが%^sに向かって手榴弾を投げた。", "%^s throws a hand grenade."), TARGET_TYPE);
139 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
140 _("%^sがファイア・ボールの呪文を唱えた。", "%^s casts a fire ball."),
141 _("%^sが%sに向かってファイア・ボールの呪文を唱えた。", "%^s casts a fire ball at %s."), TARGET_TYPE);
143 rad = monster_is_powerful(target_ptr->current_floor_ptr, m_idx) ? 4 : 2;
144 dam = monspell_damage(target_ptr, (MS_BALL_FIRE), m_idx, DAM_ROLL);
145 breath(target_ptr, y, x, m_idx, GF_FIRE, dam, rad, FALSE, MS_BALL_FIRE, TARGET_TYPE);
146 if (TARGET_TYPE == MONSTER_TO_PLAYER)
147 update_smart_learn(target_ptr, m_idx, DRS_FIRE);
153 * @brief RF5_BA_COLDの処理。アイス・ボール。 /
154 * @param target_ptr プレーヤーへの参照ポインタ
157 * @param m_idx 呪文を唱えるモンスターID
158 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
159 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
162 HIT_POINT spell_RF5_BA_COLD(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
166 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
167 _("%^sがアイス・ボールの呪文を唱えた。", "%^s casts a frost ball."),
168 _("%^sが%sに向かってアイス・ボールの呪文を唱えた。", "%^s casts a frost ball at %s."), TARGET_TYPE);
170 rad = monster_is_powerful(target_ptr->current_floor_ptr, m_idx) ? 4 : 2;
171 dam = monspell_damage(target_ptr, (MS_BALL_COLD), m_idx, DAM_ROLL);
172 breath(target_ptr, y, x, m_idx, GF_COLD, dam, rad, FALSE, MS_BALL_COLD, TARGET_TYPE);
173 if (TARGET_TYPE == MONSTER_TO_PLAYER)
174 update_smart_learn(target_ptr, m_idx, DRS_COLD);
180 * @brief RF5_BA_POISの処理。悪臭雲。 /
181 * @param target_ptr プレーヤーへの参照ポインタ
184 * @param m_idx 呪文を唱えるモンスターID
185 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
186 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
189 HIT_POINT spell_RF5_BA_POIS(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
193 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが悪臭雲の呪文を唱えた。", "%^s casts a stinking cloud."),
194 _("%^sが%sに向かって悪臭雲の呪文を唱えた。", "%^s casts a stinking cloud at %s."), TARGET_TYPE);
196 dam = monspell_damage(target_ptr, (MS_BALL_POIS), m_idx, DAM_ROLL);
197 breath(target_ptr, y, x, m_idx, GF_POIS, dam, 2, FALSE, MS_BALL_POIS, TARGET_TYPE);
198 if (TARGET_TYPE == MONSTER_TO_PLAYER)
199 update_smart_learn(target_ptr, m_idx, DRS_POIS);
205 * @brief RF5_BA_NETHの処理。地獄球。 /
206 * @param target_ptr プレーヤーへの参照ポインタ
209 * @param m_idx 呪文を唱えるモンスターID
210 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
211 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
214 HIT_POINT spell_RF5_BA_NETH(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
218 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが地獄球の呪文を唱えた。", "%^s casts a nether ball."),
219 _("%^sが%sに向かって地獄球の呪文を唱えた。", "%^s casts a nether ball at %s."), TARGET_TYPE);
221 dam = monspell_damage(target_ptr, (MS_BALL_NETHER), m_idx, DAM_ROLL);
222 breath(target_ptr, y, x, m_idx, GF_NETHER, dam, 2, FALSE, MS_BALL_NETHER, TARGET_TYPE);
223 if (TARGET_TYPE == MONSTER_TO_PLAYER)
224 update_smart_learn(target_ptr, m_idx, DRS_NETH);
230 * @brief RF5_BA_WATEの処理。ウォーター・ボール。 /
231 * @param target_ptr プレーヤーへの参照ポインタ
234 * @param m_idx 呪文を唱えるモンスターID
235 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
236 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
239 HIT_POINT spell_RF5_BA_WATE(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
242 bool known = monster_near_player(target_ptr->current_floor_ptr, m_idx, t_idx);
243 bool see_either = see_monster(target_ptr, m_idx) || see_monster(target_ptr, t_idx);
244 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
245 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
246 GAME_TEXT t_name[MAX_NLEN];
247 monster_name(target_ptr, t_idx, t_name);
249 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが流れるような身振りをした。", "%^s gestures fluidly."),
250 _("%^sが%sに対して流れるような身振りをした。", "%^s gestures fluidly at %s."), TARGET_TYPE);
253 msg_format(_("あなたは渦巻きに飲み込まれた。", "You are engulfed in a whirlpool."));
254 } else if (mon_to_mon && known && see_either && !target_ptr->blind) {
255 msg_format(_("%^sは渦巻に飲み込まれた。", "%^s is engulfed in a whirlpool."), t_name);
258 dam = monspell_damage(target_ptr, (MS_BALL_WATER), m_idx, DAM_ROLL);
259 breath(target_ptr, y, x, m_idx, GF_WATER, dam, 4, FALSE, MS_BALL_WATER, TARGET_TYPE);
264 * @brief RF5_BA_MANAの処理。魔力の嵐。 /
265 * @param target_ptr プレーヤーへの参照ポインタ
268 * @param m_idx 呪文を唱えるモンスターID
269 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
270 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
273 HIT_POINT spell_RF5_BA_MANA(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
277 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
278 _("%^sが魔力の嵐の呪文を念じた。", "%^s invokes a mana storm."), _("%^sが%sに対して魔力の嵐の呪文を念じた。", "%^s invokes a mana storm upon %s."),
281 dam = monspell_damage(target_ptr, (MS_BALL_MANA), m_idx, DAM_ROLL);
282 breath(target_ptr, y, x, m_idx, GF_MANA, dam, 4, FALSE, MS_BALL_MANA, TARGET_TYPE);
287 * @brief RF5_BA_DARKの処理。暗黒の嵐。 /
288 * @param target_ptr プレーヤーへの参照ポインタ
291 * @param m_idx 呪文を唱えるモンスターID
292 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
293 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
296 HIT_POINT spell_RF5_BA_DARK(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
300 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
301 _("%^sが暗黒の嵐の呪文を念じた。", "%^s invokes a darkness storm."),
302 _("%^sが%sに対して暗黒の嵐の呪文を念じた。", "%^s invokes a darkness storm upon %s."), TARGET_TYPE);
304 dam = monspell_damage(target_ptr, (MS_BALL_DARK), m_idx, DAM_ROLL);
305 breath(target_ptr, y, x, m_idx, GF_DARK, dam, 4, FALSE, MS_BALL_DARK, TARGET_TYPE);
306 if (TARGET_TYPE == MONSTER_TO_PLAYER)
307 update_smart_learn(target_ptr, m_idx, DRS_DARK);
313 * @brief RF5_BA_LITEの処理。スターバースト。 /
314 * @param target_ptr プレーヤーへの参照ポインタ
317 * @param m_idx 呪文を唱えるモンスターID
318 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
319 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
322 HIT_POINT spell_RF5_BA_LITE(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
326 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
327 _("%^sがスターバーストの呪文を念じた。", "%^s invokes a starburst."),
328 _("%^sが%sに対してスターバーストの呪文を念じた。", "%^s invokes a starburst upon %s."), TARGET_TYPE);
330 dam = monspell_damage(target_ptr, (MS_STARBURST), m_idx, DAM_ROLL);
331 breath(target_ptr, y, x, m_idx, GF_LITE, dam, 4, FALSE, MS_STARBURST, TARGET_TYPE);
332 if (TARGET_TYPE == MONSTER_TO_PLAYER)
333 update_smart_learn(target_ptr, m_idx, DRS_LITE);