OSDN Git Service

Merge remote-tracking branch 'remotes/hengbandosx/english-mspell-edits' into feature...
[hengband/hengband.git] / src / mspell / mspell-ball.c
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"
15
16 /*!
17  * @brief RF4_BA_NUKEの処理。放射能球。 /
18  * @param target_ptr プレーヤーへの参照ポインタ
19  * @param y 対象の地点のy座標
20  * @param x 対象の地点のx座標
21  * @param m_idx 呪文を唱えるモンスターID
22  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
23  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
24  * @return ダメージ量を返す。
25  */
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)
27 {
28     HIT_POINT dam;
29
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);
32
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);
37
38     return dam;
39 }
40
41 /*!
42  * @brief RF4_BA_CHAOの処理。純ログルス。 /
43  * @param target_ptr プレーヤーへの参照ポインタ
44  * @param y 対象の地点のy座標
45  * @param x 対象の地点のx座標
46  * @param m_idx 呪文を唱えるモンスターID
47  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
48  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
49  * @return ダメージ量を返す。
50  */
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)
52 {
53     HIT_POINT dam;
54
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);
57
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);
62
63     return dam;
64 }
65
66 /*!
67  * @brief RF5_BA_ACIDの処理。アシッド・ボール。 /
68  * @param target_ptr プレーヤーへの参照ポインタ
69  * @param y 対象の地点のy座標
70  * @param x 対象の地点のx座標
71  * @param m_idx 呪文を唱えるモンスターID
72  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
73  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
74  * @return ダメージ量を返す。
75  */
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)
77 {
78     HIT_POINT dam, rad;
79
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);
83
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);
89
90     return dam;
91 }
92
93 /*!
94  * @brief RF5_BA_ELECの処理。サンダー・ボール。 /
95  * @param target_ptr プレーヤーへの参照ポインタ
96  * @param y 対象の地点のy座標
97  * @param x 対象の地点のx座標
98  * @param m_idx 呪文を唱えるモンスターID
99  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
100  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
101  * @return ダメージ量を返す。
102  */
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)
104 {
105     HIT_POINT dam, rad;
106
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);
110
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);
116
117     return dam;
118 }
119
120 /*!
121  * @brief RF5_BA_FIREの処理。ファイア・ボール。 /
122  * @param target_ptr プレーヤーへの参照ポインタ
123  * @param y 対象の地点のy座標
124  * @param x 対象の地点のx座標
125  * @param m_idx 呪文を唱えるモンスターID
126  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
127  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
128  * @return ダメージ量を返す。
129  */
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)
131 {
132     HIT_POINT dam, rad;
133     monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx];
134
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);
138     } else {
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);
142     }
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);
148
149     return dam;
150 }
151
152 /*!
153  * @brief RF5_BA_COLDの処理。アイス・ボール。 /
154  * @param target_ptr プレーヤーへの参照ポインタ
155  * @param y 対象の地点のy座標
156  * @param x 対象の地点のx座標
157  * @param m_idx 呪文を唱えるモンスターID
158  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
159  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
160  * @return ダメージ量を返す。
161  */
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)
163 {
164     HIT_POINT dam, rad;
165
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);
169
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);
175
176     return dam;
177 }
178
179 /*!
180  * @brief RF5_BA_POISの処理。悪臭雲。 /
181  * @param target_ptr プレーヤーへの参照ポインタ
182  * @param y 対象の地点のy座標
183  * @param x 対象の地点のx座標
184  * @param m_idx 呪文を唱えるモンスターID
185  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
186  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
187  * @return ダメージ量を返す。
188  */
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)
190 {
191     HIT_POINT dam;
192
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);
195
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);
200
201     return dam;
202 }
203
204 /*!
205  * @brief RF5_BA_NETHの処理。地獄球。 /
206  * @param target_ptr プレーヤーへの参照ポインタ
207  * @param y 対象の地点のy座標
208  * @param x 対象の地点のx座標
209  * @param m_idx 呪文を唱えるモンスターID
210  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
211  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
212  * @return ダメージ量を返す。
213  */
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)
215 {
216     HIT_POINT dam;
217
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);
220
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);
225
226     return dam;
227 }
228
229 /*!
230  * @brief RF5_BA_WATEの処理。ウォーター・ボール。 /
231  * @param target_ptr プレーヤーへの参照ポインタ
232  * @param y 対象の地点のy座標
233  * @param x 対象の地点のx座標
234  * @param m_idx 呪文を唱えるモンスターID
235  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
236  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
237  * @return ダメージ量を返す。
238  */
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)
240 {
241     HIT_POINT dam;
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);
248
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);
251
252     if (mon_to_player) {
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);
256     }
257
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);
260     return dam;
261 }
262
263 /*!
264  * @brief RF5_BA_MANAの処理。魔力の嵐。 /
265  * @param target_ptr プレーヤーへの参照ポインタ
266  * @param y 対象の地点のy座標
267  * @param x 対象の地点のx座標
268  * @param m_idx 呪文を唱えるモンスターID
269  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
270  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
271  * @return ダメージ量を返す。
272  */
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)
274 {
275     HIT_POINT dam;
276
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."),
279         TARGET_TYPE);
280
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);
283     return dam;
284 }
285
286 /*!
287  * @brief RF5_BA_DARKの処理。暗黒の嵐。 /
288  * @param target_ptr プレーヤーへの参照ポインタ
289  * @param y 対象の地点のy座標
290  * @param x 対象の地点のx座標
291  * @param m_idx 呪文を唱えるモンスターID
292  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
293  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
294  * @return ダメージ量を返す。
295  */
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)
297 {
298     HIT_POINT dam;
299
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);
303
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);
308
309     return dam;
310 }
311
312 /*!
313  * @brief RF5_BA_LITEの処理。スターバースト。 /
314  * @param target_ptr プレーヤーへの参照ポインタ
315  * @param y 対象の地点のy座標
316  * @param x 対象の地点のx座標
317  * @param m_idx 呪文を唱えるモンスターID
318  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
319  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
320  * @return ダメージ量を返す。
321  */
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)
323 {
324     HIT_POINT dam;
325
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);
329
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);
334
335     return dam;
336 }