OSDN Git Service

Merge branch 'develop' into macos-develop
[hengbandforosx/hengbandosx.git] / src / object-activation / activation-bolt-ball.cpp
1 #include "object-activation/activation-bolt-ball.h"
2 #include "effect/attribute-types.h"
3 #include "effect/effect-characteristics.h"
4 #include "effect/effect-processor.h"
5 #include "floor/cave.h"
6 #include "floor/floor-util.h"
7 #include "grid/feature-flag-types.h"
8 #include "hpmp/hp-mp-processor.h"
9 #include "spell-kind/spells-launcher.h"
10 #include "spell-kind/spells-specific-bolt.h"
11 #include "system/player-type-definition.h"
12 #include "target/target-getter.h"
13 #include "view/display-messages.h"
14
15 bool activate_missile_1(PlayerType *player_ptr)
16 {
17     DIRECTION dir;
18     msg_print(_("それは眩しいくらいに明るく輝いている...", "It glows extremely brightly..."));
19     if (!get_aim_dir(player_ptr, &dir)) {
20         return false;
21     }
22
23     (void)fire_bolt(player_ptr, AttributeType::MISSILE, dir, damroll(2, 6));
24     return true;
25 }
26
27 bool activate_missile_2(PlayerType *player_ptr)
28 {
29     DIRECTION dir;
30     msg_print(_("魔法のトゲが現れた...", "It grows magical spikes..."));
31     if (!get_aim_dir(player_ptr, &dir)) {
32         return false;
33     }
34
35     (void)fire_bolt(player_ptr, AttributeType::MISSILE, dir, 150);
36     return true;
37 }
38
39 bool activate_missile_3(PlayerType *player_ptr)
40 {
41     DIRECTION dir;
42     if (!get_aim_dir(player_ptr, &dir)) {
43         return false;
44     }
45
46     msg_print(_("あなたはエレメントのブレスを吐いた。", "You breathe the elements."));
47     fire_breath(player_ptr, AttributeType::MISSILE, dir, 300, 4);
48     return true;
49 }
50
51 bool activate_bolt_acid_1(PlayerType *player_ptr)
52 {
53     DIRECTION dir;
54     msg_print(_("それは酸に覆われた...", "It is covered in acid..."));
55     if (!get_aim_dir(player_ptr, &dir)) {
56         return false;
57     }
58
59     (void)fire_bolt(player_ptr, AttributeType::ACID, dir, damroll(5, 8));
60     return true;
61 }
62
63 bool activate_bolt_elec_1(PlayerType *player_ptr)
64 {
65     DIRECTION dir;
66     msg_print(_("それは火花に覆われた...", "It is covered in sparks..."));
67     if (!get_aim_dir(player_ptr, &dir)) {
68         return false;
69     }
70
71     (void)fire_bolt(player_ptr, AttributeType::ELEC, dir, damroll(4, 8));
72     return true;
73 }
74
75 bool activate_bolt_fire_1(PlayerType *player_ptr)
76 {
77     DIRECTION dir;
78     msg_print(_("それは炎に覆われた...", "It is covered in fire..."));
79     if (!get_aim_dir(player_ptr, &dir)) {
80         return false;
81     }
82
83     (void)fire_bolt(player_ptr, AttributeType::FIRE, dir, damroll(9, 8));
84     return true;
85 }
86
87 bool activate_bolt_cold_1(PlayerType *player_ptr)
88 {
89     DIRECTION dir;
90     msg_print(_("それは霜に覆われた...", "It is covered in frost..."));
91     if (!get_aim_dir(player_ptr, &dir)) {
92         return false;
93     }
94
95     (void)fire_bolt(player_ptr, AttributeType::COLD, dir, damroll(6, 8));
96     return true;
97 }
98
99 bool activate_bolt_hypodynamia_1(PlayerType *player_ptr, concptr name)
100 {
101     DIRECTION dir;
102     msg_format(_("あなたは%sに敵を締め殺すよう命じた。", "You order the %s to strangle your opponent."), name);
103     if (!get_aim_dir(player_ptr, &dir)) {
104         return false;
105     }
106
107     hypodynamic_bolt(player_ptr, dir, 100);
108     return true;
109 }
110
111 bool activate_bolt_hypodynamia_2(PlayerType *player_ptr)
112 {
113     DIRECTION dir;
114     msg_print(_("黒く輝いている...", "It glows black..."));
115     if (!get_aim_dir(player_ptr, &dir)) {
116         return false;
117     }
118
119     hypodynamic_bolt(player_ptr, dir, 120);
120     return true;
121 }
122
123 bool activate_bolt_drain_1(PlayerType *player_ptr)
124 {
125     DIRECTION dir;
126     if (!get_aim_dir(player_ptr, &dir)) {
127         return false;
128     }
129
130     for (int dummy = 0; dummy < 3; dummy++) {
131         if (hypodynamic_bolt(player_ptr, dir, 50)) {
132             hp_player(player_ptr, 50);
133         }
134     }
135
136     return true;
137 }
138
139 bool activate_bolt_drain_2(PlayerType *player_ptr)
140 {
141     DIRECTION dir;
142     if (!get_aim_dir(player_ptr, &dir)) {
143         return false;
144     }
145
146     for (int dummy = 0; dummy < 3; dummy++) {
147         if (hypodynamic_bolt(player_ptr, dir, 100)) {
148             hp_player(player_ptr, 100);
149         }
150     }
151
152     return true;
153 }
154
155 bool activate_bolt_mana(PlayerType *player_ptr, concptr name)
156 {
157     DIRECTION dir;
158     msg_format(_("%sに魔法のトゲが現れた...", "The %s grows magical spikes..."), name);
159     if (!get_aim_dir(player_ptr, &dir)) {
160         return false;
161     }
162
163     (void)fire_bolt(player_ptr, AttributeType::MISSILE, dir, 150);
164     return true;
165 }
166
167 bool activate_ball_pois_1(PlayerType *player_ptr)
168 {
169     DIRECTION dir;
170     msg_print(_("それは濃緑色に脈動している...", "It throbs deep green..."));
171     if (!get_aim_dir(player_ptr, &dir)) {
172         return false;
173     }
174
175     (void)fire_ball(player_ptr, AttributeType::POIS, dir, 12, 3);
176     return true;
177 }
178
179 bool activate_ball_cold_1(PlayerType *player_ptr)
180 {
181     DIRECTION dir;
182     msg_print(_("それは霜に覆われた...", "It is covered in frost..."));
183     if (!get_aim_dir(player_ptr, &dir)) {
184         return false;
185     }
186
187     (void)fire_ball(player_ptr, AttributeType::COLD, dir, 48, 2);
188     return true;
189 }
190
191 bool activate_ball_cold_2(PlayerType *player_ptr)
192 {
193     DIRECTION dir;
194     msg_print(_("それは青く激しく輝いた...", "It glows an intense blue..."));
195     if (!get_aim_dir(player_ptr, &dir)) {
196         return false;
197     }
198
199     (void)fire_ball(player_ptr, AttributeType::COLD, dir, 100, 2);
200     return true;
201 }
202
203 bool activate_ball_cold_3(PlayerType *player_ptr)
204 {
205     DIRECTION dir;
206     msg_print(_("明るく白色に輝いている...", "It glows bright white..."));
207     if (!get_aim_dir(player_ptr, &dir)) {
208         return false;
209     }
210
211     (void)fire_ball(player_ptr, AttributeType::COLD, dir, 400, 3);
212     return true;
213 }
214
215 bool activate_ball_fire_1(PlayerType *player_ptr)
216 {
217     DIRECTION dir;
218     msg_print(_("それは赤く激しく輝いた...", "It glows an intense red..."));
219     if (!get_aim_dir(player_ptr, &dir)) {
220         return false;
221     }
222
223     (void)fire_ball(player_ptr, AttributeType::FIRE, dir, 72, 2);
224     return true;
225 }
226
227 bool activate_ball_fire_2(PlayerType *player_ptr, concptr name)
228 {
229     DIRECTION dir;
230     msg_format(_("%sから炎が吹き出した...", "The %s rages in fire..."), name);
231     if (!get_aim_dir(player_ptr, &dir)) {
232         return false;
233     }
234
235     (void)fire_ball(player_ptr, AttributeType::FIRE, dir, 120, 3);
236     return true;
237 }
238
239 bool activate_ball_fire_3(PlayerType *player_ptr)
240 {
241     DIRECTION dir;
242     msg_print(_("深赤色に輝いている...", "It glows deep red..."));
243     if (!get_aim_dir(player_ptr, &dir)) {
244         return false;
245     }
246
247     (void)fire_ball(player_ptr, AttributeType::FIRE, dir, 300, 3);
248     return true;
249 }
250
251 bool activate_ball_fire_4(PlayerType *player_ptr)
252 {
253     DIRECTION dir;
254     msg_print(_("それは赤く激しく輝いた...", "It glows an intense red..."));
255     if (!get_aim_dir(player_ptr, &dir)) {
256         return false;
257     }
258
259     (void)fire_ball(player_ptr, AttributeType::FIRE, dir, 100, 2);
260     return true;
261 }
262
263 bool activate_ball_elec_2(PlayerType *player_ptr)
264 {
265     DIRECTION dir;
266     msg_print(_("電気がパチパチ音を立てた...", "It crackles with electricity..."));
267     if (!get_aim_dir(player_ptr, &dir)) {
268         return false;
269     }
270
271     (void)fire_ball(player_ptr, AttributeType::ELEC, dir, 100, 3);
272     return true;
273 }
274
275 bool activate_ball_elec_3(PlayerType *player_ptr)
276 {
277     DIRECTION dir;
278     msg_print(_("深青色に輝いている...", "It glows deep blue..."));
279     if (!get_aim_dir(player_ptr, &dir)) {
280         return false;
281     }
282
283     (void)fire_ball(player_ptr, AttributeType::ELEC, dir, 500, 3);
284     return true;
285 }
286
287 bool activate_ball_acid_1(PlayerType *player_ptr)
288 {
289     DIRECTION dir;
290     msg_print(_("それは黒く激しく輝いた...", "It glows an intense black..."));
291     if (!get_aim_dir(player_ptr, &dir)) {
292         return false;
293     }
294
295     (void)fire_ball(player_ptr, AttributeType::ACID, dir, 100, 2);
296     return true;
297 }
298
299 bool activate_ball_nuke_1(PlayerType *player_ptr)
300 {
301     DIRECTION dir;
302     msg_print(_("それは緑に激しく輝いた...", "It glows an intense green..."));
303     if (!get_aim_dir(player_ptr, &dir)) {
304         return false;
305     }
306
307     (void)fire_ball(player_ptr, AttributeType::NUKE, dir, 100, 2);
308     return true;
309 }
310
311 bool activate_rocket(PlayerType *player_ptr)
312 {
313     DIRECTION dir;
314     if (!get_aim_dir(player_ptr, &dir)) {
315         return false;
316     }
317
318     msg_print(_("ロケットを発射した!", "You launch a rocket!"));
319     (void)fire_ball(player_ptr, AttributeType::ROCKET, dir, 250 + player_ptr->lev * 3, 2);
320     return true;
321 }
322
323 bool activate_ball_water(PlayerType *player_ptr, concptr name)
324 {
325     DIRECTION dir;
326     msg_format(_("%sが深い青色に鼓動している...", "The %s throbs deep blue..."), name);
327     if (!get_aim_dir(player_ptr, &dir)) {
328         return false;
329     }
330
331     (void)fire_ball(player_ptr, AttributeType::WATER, dir, 200, 3);
332     return true;
333 }
334
335 bool activate_ball_lite(PlayerType *player_ptr, concptr name)
336 {
337     int num = damroll(5, 3);
338     POSITION y = 0, x = 0;
339     msg_format(_("%sが稲妻で覆われた...", "The %s is surrounded by lightning..."), name);
340     for (int k = 0; k < num; k++) {
341         int attempts = 1000;
342         while (attempts--) {
343             scatter(player_ptr, &y, &x, player_ptr->y, player_ptr->x, 4, PROJECT_NONE);
344             if (!cave_has_flag_bold(player_ptr->current_floor_ptr, y, x, TerrainCharacteristics::PROJECT)) {
345                 continue;
346             }
347
348             if (!player_ptr->is_located_at({ y, x })) {
349                 break;
350             }
351         }
352
353         project(player_ptr, 0, 3, y, x, 150, AttributeType::ELEC, PROJECT_THRU | PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL);
354     }
355
356     return true;
357 }
358
359 bool activate_ball_dark(PlayerType *player_ptr, concptr name)
360 {
361     DIRECTION dir;
362     msg_format(_("%sが深い闇に覆われた...", "The %s is covered in pitch-darkness..."), name);
363     if (!get_aim_dir(player_ptr, &dir)) {
364         return false;
365     }
366
367     (void)fire_ball(player_ptr, AttributeType::DARK, dir, 250, 4);
368     return true;
369 }
370
371 bool activate_ball_mana(PlayerType *player_ptr, concptr name)
372 {
373     DIRECTION dir;
374     msg_format(_("%sが青白く光った...", "The %s becomes pale..."), name);
375     if (!get_aim_dir(player_ptr, &dir)) {
376         return false;
377     }
378
379     (void)fire_ball(player_ptr, AttributeType::MANA, dir, 250, 4);
380     return true;
381 }