OSDN Git Service

[Refactor] #40634 Separated activate_breath_*() from activation-switcher.c to activat...
[hengband/hengband.git] / src / object-activation / activation-switcher.c
1 /*!
2  * @brief プレイヤーの発動コマンド実装
3  * @date 2018/09/07
4  * @author deskull
5  */
6
7 #include "object-activation/activation-switcher.h"
8 #include "action/action-limited.h"
9 #include "action/activation-execution.h"
10 #include "art-definition/art-bow-types.h"
11 #include "art-definition/art-sword-types.h"
12 #include "art-definition/art-weapon-types.h"
13 #include "art-definition/random-art-effects.h"
14 #include "artifact/artifact-info.h"
15 #include "cmd-io/cmd-save.h"
16 #include "core/asking-player.h"
17 #include "core/hp-mp-processor.h"
18 #include "core/player-update-types.h"
19 #include "core/window-redrawer.h"
20 #include "effect/effect-characteristics.h"
21 #include "effect/spells-effect-util.h"
22 #include "floor/cave.h"
23 #include "floor/floor-object.h"
24 #include "floor/floor.h"
25 #include "game-option/disturbance-options.h"
26 #include "game-option/input-options.h"
27 #include "game-option/special-options.h"
28 #include "grid/feature-flag-types.h"
29 #include "grid/grid.h"
30 #include "main/sound-definitions-table.h"
31 #include "main/sound-of-music.h"
32 #include "monster-floor/monster-generator.h"
33 #include "monster-floor/monster-summon.h"
34 #include "monster-floor/place-monster-types.h"
35 #include "monster-race/monster-race.h"
36 #include "monster-race/race-flags1.h"
37 #include "monster/monster-info.h"
38 #include "monster/monster-status.h"
39 #include "monster/monster-util.h"
40 #include "monster/smart-learn-types.h"
41 #include "object-activation/activation-breath.h"
42 #include "object-enchant/activation-info-table.h"
43 #include "object-enchant/dragon-breaths-table.h"
44 #include "object-enchant/object-ego.h"
45 #include "object-hook/hook-enchant.h"
46 #include "object-hook/hook-magic.h"
47 #include "object/item-tester-hooker.h"
48 #include "object/item-use-flags.h"
49 #include "object/object-flags.h"
50 #include "object/object-info.h"
51 #include "object/object-kind.h"
52 #include "player-attack/player-attack.h"
53 #include "player/attack-defense-types.h"
54 #include "player/avatar.h"
55 #include "player/digestion-processor.h"
56 #include "player/player-damage.h"
57 #include "player/player-race-types.h"
58 #include "player/special-defense-types.h"
59 #include "racial/racial-android.h"
60 #include "specific-object/death-crimson.h"
61 #include "spell-kind/earthquake.h"
62 #include "spell-kind/magic-item-recharger.h"
63 #include "spell-kind/spells-beam.h"
64 #include "spell-kind/spells-charm.h"
65 #include "spell-kind/spells-curse-removal.h"
66 #include "spell-kind/spells-detection.h"
67 #include "spell-kind/spells-fetcher.h"
68 #include "spell-kind/spells-floor.h"
69 #include "spell-kind/spells-genocide.h"
70 #include "spell-kind/spells-grid.h"
71 #include "spell-kind/spells-launcher.h"
72 #include "spell-kind/spells-lite.h"
73 #include "spell-kind/spells-neighbor.h"
74 #include "spell-kind/spells-perception.h"
75 #include "spell-kind/spells-random.h"
76 #include "spell-kind/spells-sight.h"
77 #include "spell-kind/spells-specific-bolt.h"
78 #include "spell-kind/spells-teleport.h"
79 #include "spell-kind/spells-world.h"
80 #include "spell-realm/spells-hex.h"
81 #include "spell-realm/spells-sorcery.h"
82 #include "spell/process-effect.h"
83 #include "spell/spell-types.h"
84 #include "spell/spells-object.h"
85 #include "spell/spells-status.h"
86 #include "spell/spells-summon.h"
87 #include "status/action-setter.h"
88 #include "status/bad-status-setter.h"
89 #include "status/base-status.h"
90 #include "status/body-improvement.h"
91 #include "status/buff-setter.h"
92 #include "status/element-resistance.h"
93 #include "status/experience.h"
94 #include "status/shape-changer.h"
95 #include "status/sight-setter.h"
96 #include "status/temporary-resistance.h"
97 #include "sv-definition/sv-lite-types.h"
98 #include "sv-definition/sv-ring-types.h"
99 #include "system/artifact-type-definition.h"
100 #include "system/floor-type-definition.h"
101 #include "target/target-getter.h"
102 #include "term/screen-processor.h"
103 #include "util/bit-flags-calculator.h"
104 #include "util/quarks.h"
105 #include "util/sort.h"
106 #include "view/display-messages.h"
107 #include "world/world.h"
108
109 bool activate_sunlight(player_type *user_ptr)
110 {
111     DIRECTION dir;
112     if (!get_aim_dir(user_ptr, &dir))
113         return FALSE;
114
115     msg_print(_("太陽光線が放たれた。", "A line of sunlight appears."));
116     (void)lite_line(user_ptr, dir, damroll(6, 8));
117     return TRUE;
118 }
119
120 bool activate_missile_1(player_type *user_ptr)
121 {
122     DIRECTION dir;
123     msg_print(_("それは眩しいくらいに明るく輝いている...", "It glows extremely brightly..."));
124     if (!get_aim_dir(user_ptr, &dir))
125         return FALSE;
126
127     (void)fire_bolt(user_ptr, GF_MISSILE, dir, damroll(2, 6));
128     return TRUE;
129 }
130
131 bool activate_ball_pois_1(player_type *user_ptr)
132 {
133     DIRECTION dir;
134     msg_print(_("それは濃緑色に脈動している...", "It throbs deep green..."));
135     if (!get_aim_dir(user_ptr, &dir))
136         return FALSE;
137
138     (void)fire_ball(user_ptr, GF_POIS, dir, 12, 3);
139     return TRUE;
140 }
141
142 bool activate_bolt_elec_1(player_type *user_ptr)
143 {
144     DIRECTION dir;
145     msg_print(_("それは火花に覆われた...", "It is covered in sparks..."));
146     if (!get_aim_dir(user_ptr, &dir))
147         return FALSE;
148
149     (void)fire_bolt(user_ptr, GF_ELEC, dir, damroll(4, 8));
150     return TRUE;
151 }
152
153 bool activate_bolt_acid_1(player_type *user_ptr)
154 {
155     DIRECTION dir;
156     msg_print(_("それは酸に覆われた...", "It is covered in acid..."));
157     if (!get_aim_dir(user_ptr, &dir))
158         return FALSE;
159
160     (void)fire_bolt(user_ptr, GF_ACID, dir, damroll(5, 8));
161     return TRUE;
162 }
163
164 bool activate_bolt_cold_1(player_type *user_ptr)
165 {
166     DIRECTION dir;
167     msg_print(_("それは霜に覆われた...", "It is covered in frost..."));
168     if (!get_aim_dir(user_ptr, &dir))
169         return FALSE;
170
171     (void)fire_bolt(user_ptr, GF_COLD, dir, damroll(6, 8));
172     return TRUE;
173 }
174
175 bool activate_bolt_fire_1(player_type *user_ptr)
176 {
177     DIRECTION dir;
178     msg_print(_("それは炎に覆われた...", "It is covered in fire..."));
179     if (!get_aim_dir(user_ptr, &dir))
180         return FALSE;
181
182     (void)fire_bolt(user_ptr, GF_FIRE, dir, damroll(9, 8));
183     return TRUE;
184 }
185
186 bool activate_ball_cold_1(player_type *user_ptr)
187 {
188     DIRECTION dir;
189     msg_print(_("それは霜に覆われた...", "It is covered in frost..."));
190     if (!get_aim_dir(user_ptr, &dir))
191         return FALSE;
192
193     (void)fire_ball(user_ptr, GF_COLD, dir, 48, 2);
194     return TRUE;
195 }
196
197 bool activate_ball_cold_2(player_type *user_ptr)
198 {
199     DIRECTION dir;
200     msg_print(_("それは青く激しく輝いた...", "It glows an intense blue..."));
201     if (!get_aim_dir(user_ptr, &dir))
202         return FALSE;
203
204     (void)fire_ball(user_ptr, GF_COLD, dir, 100, 2);
205     return TRUE;
206 }
207
208 bool activate_ball_cold_3(player_type *user_ptr)
209 {
210     DIRECTION dir;
211     msg_print(_("明るく白色に輝いている...", "It glows bright white..."));
212     if (!get_aim_dir(user_ptr, &dir))
213         return FALSE;
214
215     (void)fire_ball(user_ptr, GF_COLD, dir, 400, 3);
216     return TRUE;
217 }
218
219 bool activate_ball_fire_1(player_type *user_ptr)
220 {
221     DIRECTION dir;
222     msg_print(_("それは赤く激しく輝いた...", "It glows an intense red..."));
223     if (!get_aim_dir(user_ptr, &dir))
224         return FALSE;
225
226     (void)fire_ball(user_ptr, GF_FIRE, dir, 72, 2);
227     return TRUE;
228 }
229
230 bool activate_ball_fire_2(player_type *user_ptr, concptr name)
231 {
232     DIRECTION dir;
233     msg_format(_("%sから炎が吹き出した...", "The %s rages in fire..."), name);
234     if (!get_aim_dir(user_ptr, &dir))
235         return FALSE;
236
237     (void)fire_ball(user_ptr, GF_FIRE, dir, 120, 3);
238     return TRUE;
239 }
240
241 bool activate_ball_fire_3(player_type *user_ptr)
242 {
243     DIRECTION dir;
244     msg_print(_("深赤色に輝いている...", "It glows deep red..."));
245     if (!get_aim_dir(user_ptr, &dir))
246         return FALSE;
247
248     (void)fire_ball(user_ptr, GF_FIRE, dir, 300, 3);
249     return TRUE;
250 }
251
252 bool activate_ball_fire_4(player_type *user_ptr)
253 {
254     DIRECTION dir;
255     msg_print(_("それは赤く激しく輝いた...", "It glows an intense red..."));
256     if (!get_aim_dir(user_ptr, &dir))
257         return FALSE;
258
259     (void)fire_ball(user_ptr, GF_FIRE, dir, 100, 2);
260     return TRUE;
261 }
262
263 bool activate_ball_elec_2(player_type *user_ptr)
264 {
265     DIRECTION dir;
266     msg_print(_("電気がパチパチ音を立てた...", "It crackles with electricity..."));
267     if (!get_aim_dir(user_ptr, &dir))
268         return FALSE;
269
270     (void)fire_ball(user_ptr, GF_ELEC, dir, 100, 3);
271     return TRUE;
272 }
273
274 bool activate_ball_elec_3(player_type *user_ptr)
275 {
276     DIRECTION dir;
277     msg_print(_("深青色に輝いている...", "It glows deep blue..."));
278     if (!get_aim_dir(user_ptr, &dir))
279         return FALSE;
280
281     (void)fire_ball(user_ptr, GF_ELEC, dir, 500, 3);
282     return TRUE;
283 }
284
285 bool activate_ball_acid_1(player_type *user_ptr)
286 {
287     DIRECTION dir;
288     msg_print(_("それは黒く激しく輝いた...", "It glows an intense black..."));
289     if (!get_aim_dir(user_ptr, &dir))
290         return FALSE;
291
292     (void)fire_ball(user_ptr, GF_ACID, dir, 100, 2);
293     return TRUE;
294 }
295
296 bool activate_ball_nuke_1(player_type *user_ptr)
297 {
298     DIRECTION dir;
299     msg_print(_("それは緑に激しく輝いた...", "It glows an intense green..."));
300     if (!get_aim_dir(user_ptr, &dir))
301         return FALSE;
302
303     (void)fire_ball(user_ptr, GF_NUKE, dir, 100, 2);
304     return TRUE;
305 }
306
307 bool activate_bolt_hypodynamia_1(player_type *user_ptr, concptr name)
308 {
309     DIRECTION dir;
310     msg_format(_("あなたは%sに敵を締め殺すよう命じた。", "You order the %s to strangle your opponent."), name);
311     if (!get_aim_dir(user_ptr, &dir))
312         return FALSE;
313
314     hypodynamic_bolt(user_ptr, dir, 100);
315     return TRUE;
316 }
317
318 bool activate_bolt_hypodynamia_2(player_type *user_ptr)
319 {
320     DIRECTION dir;
321     msg_print(_("黒く輝いている...", "It glows black..."));
322     if (!get_aim_dir(user_ptr, &dir))
323         return FALSE;
324
325     hypodynamic_bolt(user_ptr, dir, 120);
326     return TRUE;
327 }
328
329 bool activate_bolt_drain_1(player_type *user_ptr)
330 {
331     DIRECTION dir;
332     if (!get_aim_dir(user_ptr, &dir))
333         return FALSE;
334
335     for (int dummy = 0; dummy < 3; dummy++)
336         if (hypodynamic_bolt(user_ptr, dir, 50))
337             hp_player(user_ptr, 50);
338
339     return TRUE;
340 }
341
342 bool activate_missile_2(player_type *user_ptr)
343 {
344     DIRECTION dir;
345     msg_print(_("魔法のトゲが現れた...", "It grows magical spikes..."));
346     if (!get_aim_dir(user_ptr, &dir))
347         return FALSE;
348
349     (void)fire_bolt(user_ptr, GF_ARROW, dir, 150);
350     return TRUE;
351 }
352
353 bool activate_bolt_drain_2(player_type *user_ptr)
354 {
355     DIRECTION dir;
356     if (!get_aim_dir(user_ptr, &dir))
357         return FALSE;
358
359     for (int dummy = 0; dummy < 3; dummy++)
360         if (hypodynamic_bolt(user_ptr, dir, 100))
361             hp_player(user_ptr, 100);
362
363     return TRUE;
364 }
365
366 bool activate_rocket(player_type *user_ptr)
367 {
368     DIRECTION dir;
369     if (!get_aim_dir(user_ptr, &dir))
370         return FALSE;
371
372     msg_print(_("ロケットを発射した!", "You launch a rocket!"));
373     (void)fire_ball(user_ptr, GF_ROCKET, dir, 250 + user_ptr->lev * 3, 2);
374     return TRUE;
375 }
376
377 bool activate_missile_3(player_type *user_ptr)
378 {
379     DIRECTION dir;
380     if (!get_aim_dir(user_ptr, &dir))
381         return FALSE;
382
383     msg_print(_("あなたはエレメントのブレスを吐いた。", "You breathe the elements."));
384     fire_breath(user_ptr, GF_MISSILE, dir, 300, 4);
385     return TRUE;
386 }
387
388 bool activate_bolt_mana(player_type *user_ptr, concptr name)
389 {
390     DIRECTION dir;
391     msg_format(_("%sに魔法のトゲが現れた...", "The %s grows magical spikes..."), name);
392     if (!get_aim_dir(user_ptr, &dir))
393         return FALSE;
394
395     (void)fire_bolt(user_ptr, GF_ARROW, dir, 150);
396     return TRUE;
397 }
398
399 bool activate_ball_water(player_type *user_ptr, concptr name)
400 {
401     DIRECTION dir;
402     msg_format(_("%sが深い青色に鼓動している...", "The %s throbs deep blue..."), name);
403     if (!get_aim_dir(user_ptr, &dir))
404         return FALSE;
405
406     (void)fire_ball(user_ptr, GF_WATER, dir, 200, 3);
407     return TRUE;
408 }
409
410 bool activate_ball_dark(player_type *user_ptr, concptr name)
411 {
412     DIRECTION dir;
413     msg_format(_("%sが深い闇に覆われた...", "The %s is coverd in pitch-darkness..."), name);
414     if (!get_aim_dir(user_ptr, &dir))
415         return FALSE;
416
417     (void)fire_ball(user_ptr, GF_DARK, dir, 250, 4);
418     return TRUE;
419 }
420
421 bool activate_ball_mana(player_type *user_ptr, concptr name)
422 {
423     DIRECTION dir;
424     msg_format(_("%sが青白く光った...", "The %s glows pale..."), name);
425     if (!get_aim_dir(user_ptr, &dir))
426         return FALSE;
427
428     (void)fire_ball(user_ptr, GF_MANA, dir, 250, 4);
429     return TRUE;
430 }
431
432 bool activate_ring_of_power(player_type *user_ptr, concptr name)
433 {
434     DIRECTION dir;
435     msg_format(_("%sは漆黒に輝いた...", "The %s glows intensely black..."), name);
436     if (!get_aim_dir(user_ptr, &dir))
437         return FALSE;
438
439     ring_of_power(user_ptr, dir);
440     return TRUE;
441 }
442
443 bool activate_ball_lite(player_type *user_ptr, concptr name)
444 {
445     HIT_POINT num = damroll(5, 3);
446     POSITION y = 0, x = 0;
447     msg_format(_("%sが稲妻で覆われた...", "The %s is surrounded by lightning..."), name);
448     for (int k = 0; k < num; k++) {
449         int attempts = 1000;
450         while (attempts--) {
451             scatter(user_ptr, &y, &x, user_ptr->y, user_ptr->x, 4, 0);
452             if (!cave_have_flag_bold(user_ptr->current_floor_ptr, y, x, FF_PROJECT))
453                 continue;
454
455             if (!player_bold(user_ptr, y, x))
456                 break;
457         }
458
459         project(user_ptr, 0, 3, y, x, 150, GF_ELEC, (PROJECT_THRU | PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
460     }
461
462     return TRUE;
463 }
464
465 bool activate_bladeturner(player_type *user_ptr)
466 {
467     DIRECTION dir;
468     if (!get_aim_dir(user_ptr, &dir))
469         return FALSE;
470
471     msg_print(_("あなたはエレメントのブレスを吐いた。", "You breathe the elements."));
472     fire_breath(user_ptr, GF_MISSILE, dir, 300, 4);
473     msg_print(_("鎧が様々な色に輝いた...", "Your armor glows many colours..."));
474     (void)set_afraid(user_ptr, 0);
475     (void)set_hero(user_ptr, randint1(50) + 50, FALSE);
476     (void)hp_player(user_ptr, 10);
477     (void)set_blessed(user_ptr, randint1(50) + 50, FALSE);
478     (void)set_oppose_acid(user_ptr, randint1(50) + 50, FALSE);
479     (void)set_oppose_elec(user_ptr, randint1(50) + 50, FALSE);
480     (void)set_oppose_fire(user_ptr, randint1(50) + 50, FALSE);
481     (void)set_oppose_cold(user_ptr, randint1(50) + 50, FALSE);
482     (void)set_oppose_pois(user_ptr, randint1(50) + 50, FALSE);
483     return TRUE;
484 }
485
486 bool switch_activation(player_type *user_ptr, object_type *o_ptr, const activation_type *const act_ptr, concptr name)
487 {
488     DIRECTION dir;
489     switch (act_ptr->index) {
490     case ACT_SUNLIGHT:
491         return activate_sunlight(user_ptr);
492     case ACT_BO_MISS_1:
493         return activate_missile_1(user_ptr);
494     case ACT_BA_POIS_1:
495         return activate_ball_pois_1(user_ptr);
496     case ACT_BO_ELEC_1:
497         return activate_bolt_elec_1(user_ptr);
498     case ACT_BO_ACID_1:
499         return activate_bolt_acid_1(user_ptr);
500     case ACT_BO_COLD_1:
501         return activate_bolt_cold_1(user_ptr);
502     case ACT_BO_FIRE_1:
503         return activate_bolt_fire_1(user_ptr);
504     case ACT_BA_COLD_1:
505         return activate_ball_cold_1(user_ptr);
506     case ACT_BA_COLD_2:
507         return activate_ball_cold_2(user_ptr);
508     case ACT_BA_COLD_3:
509         return activate_ball_cold_2(user_ptr);
510     case ACT_BA_FIRE_1:
511         return activate_ball_fire_1(user_ptr);
512     case ACT_BA_FIRE_2:
513         return activate_ball_fire_2(user_ptr, name);
514     case ACT_BA_FIRE_3:
515         return activate_ball_fire_3(user_ptr);
516     case ACT_BA_FIRE_4:
517         return activate_ball_fire_4(user_ptr);
518     case ACT_BA_ELEC_2:
519         return activate_ball_elec_2(user_ptr);
520     case ACT_BA_ELEC_3:
521         return activate_ball_elec_3(user_ptr);
522     case ACT_BA_ACID_1:
523         return activate_ball_acid_1(user_ptr);
524     case ACT_BA_NUKE_1:
525         return activate_ball_nuke_1(user_ptr);
526     case ACT_HYPODYNAMIA_1:
527         return activate_bolt_hypodynamia_1(user_ptr, name);
528     case ACT_HYPODYNAMIA_2:
529         return activate_bolt_hypodynamia_2(user_ptr);
530     case ACT_DRAIN_1:
531         return activate_bolt_drain_1(user_ptr);
532     case ACT_BO_MISS_2:
533         return activate_missile_2(user_ptr);
534     case ACT_WHIRLWIND:
535         massacre(user_ptr);
536         return TRUE;
537     case ACT_DRAIN_2:
538         return activate_bolt_drain_2(user_ptr);
539     case ACT_CALL_CHAOS:
540         msg_print(_("様々な色の火花を発している...", "It glows in scintillating colours..."));
541         call_chaos(user_ptr);
542         return TRUE;
543     case ACT_ROCKET:
544         return activate_rocket(user_ptr);
545     case ACT_DISP_EVIL:
546         msg_print(_("神聖な雰囲気が充満した...", "It floods the area with goodness..."));
547         dispel_evil(user_ptr, user_ptr->lev * 5);
548         return TRUE;
549     case ACT_BA_MISS_3:
550         return activate_missile_3(user_ptr);
551     case ACT_DISP_GOOD:
552         msg_print(_("邪悪な雰囲気が充満した...", "It floods the area with evil..."));
553         dispel_good(user_ptr, user_ptr->lev * 5);
554         return TRUE;
555     case ACT_BO_MANA:
556         return activate_bolt_mana(user_ptr, name);
557     case ACT_BA_WATER:
558         return activate_ball_water(user_ptr, name);
559     case ACT_BA_DARK:
560         return activate_ball_dark(user_ptr, name);
561     case ACT_BA_MANA:
562         return activate_ball_mana(user_ptr, name);
563     case ACT_PESTICIDE:
564         msg_print(_("あなたは害虫を一掃した。", "You exterminate small life."));
565         (void)dispel_monsters(user_ptr, 4);
566         return TRUE;
567     case ACT_BLINDING_LIGHT:
568         msg_format(_("%sが眩しい光で輝いた...", "The %s gleams with blinding light..."), name);
569         (void)fire_ball(user_ptr, GF_LITE, 0, 300, 6);
570         confuse_monsters(user_ptr, 3 * user_ptr->lev / 2);
571         return TRUE;
572     case ACT_BIZARRE:
573         return activate_ring_of_power(user_ptr, name);
574     case ACT_CAST_BA_STAR:
575         return activate_ball_lite(user_ptr, name);
576     case ACT_BLADETURNER:
577         return activate_bladeturner(user_ptr);
578     case ACT_BR_FIRE:
579         return activate_breath_fire(user_ptr, o_ptr);
580     case ACT_BR_COLD:
581         return activate_breath_cold(user_ptr, o_ptr);
582     case ACT_BR_DRAGON:
583         return activate_dragon_breath(user_ptr, o_ptr);
584     case ACT_CONFUSE:
585         msg_print(_("様々な色の火花を発している...", "It glows in scintillating colours..."));
586         if (!get_aim_dir(user_ptr, &dir))
587             return FALSE;
588
589         confuse_monster(user_ptr, dir, 20);
590         return TRUE;
591     case ACT_SLEEP:
592         msg_print(_("深青色に輝いている...", "It glows deep blue..."));
593         sleep_monsters_touch(user_ptr);
594         return TRUE;
595     case ACT_QUAKE:
596         earthquake(user_ptr, user_ptr->y, user_ptr->x, 5, 0);
597         return TRUE;
598     case ACT_TERROR:
599         turn_monsters(user_ptr, 40 + user_ptr->lev);
600         return TRUE;
601     case ACT_TELE_AWAY:
602         if (!get_aim_dir(user_ptr, &dir))
603             return FALSE;
604
605         (void)fire_beam(user_ptr, GF_AWAY_ALL, dir, user_ptr->lev);
606         return TRUE;
607     case ACT_BANISH_EVIL:
608         if (banish_evil(user_ptr, 100))
609             msg_print(_("アーティファクトの力が邪悪を打ち払った!", "The power of the artifact banishes evil!"));
610
611         return TRUE;
612     case ACT_GENOCIDE:
613         msg_print(_("深青色に輝いている...", "It glows deep blue..."));
614         (void)symbol_genocide(user_ptr, 200, TRUE);
615         return TRUE;
616     case ACT_MASS_GENO:
617         msg_print(_("ひどく鋭い音が流れ出た...", "It lets out a long, shrill note..."));
618         (void)mass_genocide(user_ptr, 200, TRUE);
619         return TRUE;
620     case ACT_SCARE_AREA:
621         if (music_singing_any(user_ptr))
622             stop_singing(user_ptr);
623
624         if (hex_spelling_any(user_ptr))
625             stop_hex_spell_all(user_ptr);
626
627         msg_print(_("あなたは力強い突風を吹き鳴らした。周囲の敵が震え上っている!", "You wind a mighty blast; your enemies tremble!"));
628         (void)turn_monsters(user_ptr, (3 * user_ptr->lev / 2) + 10);
629         return TRUE;
630     case ACT_AGGRAVATE:
631         if (o_ptr->name1 == ART_HYOUSIGI)
632             msg_print(_("拍子木を打った。", "You beat your wooden clappers."));
633         else
634             msg_format(_("%sは不快な物音を立てた。", "The %s sounds an unpleasant noise."), name);
635
636         aggravate_monsters(user_ptr, 0);
637         return TRUE;
638     case ACT_CHARM_ANIMAL:
639         if (!get_aim_dir(user_ptr, &dir))
640             return FALSE;
641
642         (void)charm_animal(user_ptr, dir, user_ptr->lev);
643         return TRUE;
644     case ACT_CHARM_UNDEAD:
645         if (!get_aim_dir(user_ptr, &dir))
646             return FALSE;
647
648         (void)control_one_undead(user_ptr, dir, user_ptr->lev);
649         return TRUE;
650     case ACT_CHARM_OTHER:
651         if (!get_aim_dir(user_ptr, &dir))
652             return FALSE;
653
654         (void)charm_monster(user_ptr, dir, user_ptr->lev * 2);
655         return TRUE;
656     case ACT_CHARM_ANIMALS:
657         (void)charm_animals(user_ptr, user_ptr->lev * 2);
658         return TRUE;
659     case ACT_CHARM_OTHERS:
660         (void)charm_monsters(user_ptr, user_ptr->lev * 2);
661         return TRUE;
662     case ACT_SUMMON_ANIMAL:
663         (void)summon_specific(user_ptr, -1, user_ptr->y, user_ptr->x, user_ptr->lev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET));
664         return TRUE;
665     case ACT_SUMMON_PHANTOM:
666         msg_print(_("幻霊を召喚した。", "You summon a phantasmal servant."));
667         (void)summon_specific(user_ptr, -1, user_ptr->y, user_ptr->x, user_ptr->current_floor_ptr->dun_level, SUMMON_PHANTOM, (PM_ALLOW_GROUP | PM_FORCE_PET));
668         return TRUE;
669     case ACT_SUMMON_ELEMENTAL:
670         return cast_summon_elemental(user_ptr, (user_ptr->lev * 3) / 2);
671     case ACT_SUMMON_DEMON:
672         cast_summon_demon(user_ptr, (user_ptr->lev * 3) / 2);
673         return TRUE;
674     case ACT_SUMMON_UNDEAD:
675         return cast_summon_undead(user_ptr, (user_ptr->lev * 3) / 2);
676     case ACT_SUMMON_HOUND:
677         return cast_summon_hound(user_ptr, (user_ptr->lev * 3) / 2);
678     case ACT_SUMMON_DAWN:
679         msg_print(_("暁の師団を召喚した。", "You summon the Legion of the Dawn."));
680         (void)summon_specific(user_ptr, -1, user_ptr->y, user_ptr->x, user_ptr->current_floor_ptr->dun_level, SUMMON_DAWN, (PM_ALLOW_GROUP | PM_FORCE_PET));
681         return TRUE;
682     case ACT_SUMMON_OCTOPUS:
683         return cast_summon_octopus(user_ptr);
684     case ACT_CHOIR_SINGS:
685         msg_print(_("天国の歌が聞こえる...", "A heavenly choir sings..."));
686         (void)cure_critical_wounds(user_ptr, 777);
687         (void)set_hero(user_ptr, randint1(25) + 25, FALSE);
688         return TRUE;
689     case ACT_CURE_LW:
690         (void)set_afraid(user_ptr, 0);
691         (void)hp_player(user_ptr, 30);
692         return TRUE;
693     case ACT_CURE_MW:
694         msg_print(_("深紫色の光を発している...", "It radiates deep purple..."));
695         (void)cure_serious_wounds(user_ptr, 4, 8);
696         return TRUE;
697     case ACT_CURE_POISON:
698         msg_print(_("深青色に輝いている...", "It glows deep blue..."));
699         (void)set_afraid(user_ptr, 0);
700         (void)set_poisoned(user_ptr, 0);
701         return TRUE;
702     case ACT_REST_EXP:
703         msg_print(_("深紅に輝いている...", "It glows a deep red..."));
704         restore_level(user_ptr);
705         return TRUE;
706     case ACT_REST_ALL:
707         msg_print(_("濃緑色に輝いている...", "It glows a deep green..."));
708         (void)restore_all_status(user_ptr);
709         (void)restore_level(user_ptr);
710         return TRUE;
711     case ACT_CURE_700:
712         msg_print(_("深青色に輝いている...", "It glows deep blue..."));
713         msg_print(_("体内に暖かい鼓動が感じられる...", "You feel a warm tingling inside..."));
714         (void)cure_critical_wounds(user_ptr, 700);
715         return TRUE;
716     case ACT_CURE_1000:
717         msg_print(_("白く明るく輝いている...", "It glows a bright white..."));
718         msg_print(_("ひじょうに気分がよい...", "You feel much better..."));
719         (void)cure_critical_wounds(user_ptr, 1000);
720         return TRUE;
721     case ACT_CURING:
722         msg_format(_("%sの優しさに癒される...", "the %s cures you affectionately ..."), name);
723         true_healing(user_ptr, 0);
724         return TRUE;
725     case ACT_CURE_MANA_FULL:
726         msg_format(_("%sが青白く光った...", "The %s glows pale..."), name);
727         restore_mana(user_ptr, TRUE);
728         return TRUE;
729     case ACT_ESP:
730         (void)set_tim_esp(user_ptr, randint1(30) + 25, FALSE);
731         return TRUE;
732     case ACT_BERSERK:
733         (void)berserk(user_ptr, randint1(25) + 25);
734         return TRUE;
735     case ACT_PROT_EVIL:
736         msg_format(_("%sから鋭い音が流れ出た...", "The %s lets out a shrill wail..."), name);
737         (void)set_protevil(user_ptr, randint1(25) + user_ptr->lev * 3, FALSE);
738         return TRUE;
739     case ACT_RESIST_ALL:
740         msg_print(_("様々な色に輝いている...", "It glows many colours..."));
741         (void)set_oppose_acid(user_ptr, randint1(40) + 40, FALSE);
742         (void)set_oppose_elec(user_ptr, randint1(40) + 40, FALSE);
743         (void)set_oppose_fire(user_ptr, randint1(40) + 40, FALSE);
744         (void)set_oppose_cold(user_ptr, randint1(40) + 40, FALSE);
745         (void)set_oppose_pois(user_ptr, randint1(40) + 40, FALSE);
746         return TRUE;
747     case ACT_SPEED:
748         msg_print(_("明るく緑色に輝いている...", "It glows bright green..."));
749         (void)set_fast(user_ptr, randint1(20) + 20, FALSE);
750         return TRUE;
751     case ACT_XTRA_SPEED:
752         msg_print(_("明るく輝いている...", "It glows brightly..."));
753         (void)set_fast(user_ptr, randint1(75) + 75, FALSE);
754         return TRUE;
755     case ACT_WRAITH:
756         set_wraith_form(user_ptr, randint1(user_ptr->lev / 2) + (user_ptr->lev / 2), FALSE);
757         return TRUE;
758     case ACT_INVULN:
759         (void)set_invuln(user_ptr, randint1(8) + 8, FALSE);
760         return TRUE;
761     case ACT_HERO:
762         (void)heroism(user_ptr, 25);
763         return TRUE;
764     case ACT_HERO_SPEED:
765         (void)set_fast(user_ptr, randint1(50) + 50, FALSE);
766         (void)heroism(user_ptr, 50);
767         return TRUE;
768     case ACT_RESIST_ACID:
769         msg_format(_("%sが黒く輝いた...", "The %s grows black."), name);
770         if ((o_ptr->tval != TV_RING) || (o_ptr->sval != SV_RING_ACID))
771             return TRUE;
772
773         if (!get_aim_dir(user_ptr, &dir))
774             return FALSE;
775
776         (void)fire_ball(user_ptr, GF_ACID, dir, 100, 2);
777         (void)set_oppose_acid(user_ptr, randint1(20) + 20, FALSE);
778         return TRUE;
779     case ACT_RESIST_FIRE:
780         msg_format(_("%sが赤く輝いた...", "The %s grows red."), name);
781         if ((o_ptr->tval != TV_RING) || (o_ptr->sval != SV_RING_FLAMES))
782             return TRUE;
783
784         if (!get_aim_dir(user_ptr, &dir))
785             return FALSE;
786
787         (void)fire_ball(user_ptr, GF_FIRE, dir, 100, 2);
788         (void)set_oppose_fire(user_ptr, randint1(20) + 20, FALSE);
789         return TRUE;
790     case ACT_RESIST_COLD:
791         msg_format(_("%sが白く輝いた...", "The %s grows white."), name);
792         if ((o_ptr->tval != TV_RING) || (o_ptr->sval != SV_RING_ICE))
793             return TRUE;
794
795         if (!get_aim_dir(user_ptr, &dir))
796             return FALSE;
797
798         (void)fire_ball(user_ptr, GF_COLD, dir, 100, 2);
799         (void)set_oppose_cold(user_ptr, randint1(20) + 20, FALSE);
800         return TRUE;
801     case ACT_RESIST_ELEC:
802         msg_format(_("%sが青く輝いた...", "The %s grows blue."), name);
803         if ((o_ptr->tval != TV_RING) || (o_ptr->sval != SV_RING_ELEC))
804             return TRUE;
805
806         if (!get_aim_dir(user_ptr, &dir))
807             return FALSE;
808
809         (void)fire_ball(user_ptr, GF_ELEC, dir, 100, 2);
810         (void)set_oppose_elec(user_ptr, randint1(20) + 20, FALSE);
811         return TRUE;
812     case ACT_RESIST_POIS:
813         msg_format(_("%sが緑に輝いた...", "The %s grows green."), name);
814         (void)set_oppose_pois(user_ptr, randint1(20) + 20, FALSE);
815         return TRUE;
816     case ACT_LIGHT:
817         msg_format(_("%sから澄んだ光があふれ出た...", "The %s wells with clear light..."), name);
818         lite_area(user_ptr, damroll(2, 15), 3);
819         return TRUE;
820     case ACT_MAP_LIGHT:
821         msg_print(_("眩しく輝いた...", "It shines brightly..."));
822         map_area(user_ptr, DETECT_RAD_MAP);
823         lite_area(user_ptr, damroll(2, 15), 3);
824         return TRUE;
825     case ACT_DETECT_ALL:
826         msg_print(_("白く明るく輝いている...", "It glows bright white..."));
827         msg_print(_("心にイメージが浮かんできた...", "An image forms in your mind..."));
828         detect_all(user_ptr, DETECT_RAD_DEFAULT);
829         return TRUE;
830     case ACT_DETECT_XTRA:
831         msg_print(_("明るく輝いている...", "It glows brightly..."));
832         detect_all(user_ptr, DETECT_RAD_DEFAULT);
833         probing(user_ptr);
834         identify_fully(user_ptr, FALSE, 0);
835         return TRUE;
836     case ACT_ID_FULL:
837         msg_print(_("黄色く輝いている...", "It glows yellow..."));
838         identify_fully(user_ptr, FALSE, 0);
839         return TRUE;
840     case ACT_ID_PLAIN:
841         return ident_spell(user_ptr, FALSE, 0);
842     case ACT_RUNE_EXPLO:
843         msg_print(_("明るい赤色に輝いている...", "It glows bright red..."));
844         explosive_rune(user_ptr, user_ptr->y, user_ptr->x);
845         return TRUE;
846     case ACT_RUNE_PROT:
847         msg_print(_("ブルーに明るく輝いている...", "It glows light blue..."));
848         warding_glyph(user_ptr);
849         return TRUE;
850     case ACT_SATIATE:
851         (void)set_food(user_ptr, PY_FOOD_MAX - 1);
852         return TRUE;
853     case ACT_DEST_DOOR:
854         msg_print(_("明るい赤色に輝いている...", "It glows bright red..."));
855         destroy_doors_touch(user_ptr);
856         return TRUE;
857     case ACT_STONE_MUD:
858         msg_print(_("鼓動している...", "It pulsates..."));
859         if (!get_aim_dir(user_ptr, &dir))
860             return FALSE;
861
862         wall_to_mud(user_ptr, dir, 20 + randint1(30));
863         return TRUE;
864     case ACT_RECHARGE:
865         recharge(user_ptr, 130);
866         return TRUE;
867     case ACT_ALCHEMY:
868         msg_print(_("明るい黄色に輝いている...", "It glows bright yellow..."));
869         (void)alchemy(user_ptr);
870         return TRUE;
871     case ACT_DIM_DOOR:
872         msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
873         return dimension_door(user_ptr);
874     case ACT_TELEPORT:
875         msg_print(_("周りの空間が歪んでいる...", "It twists space around you..."));
876         teleport_player(user_ptr, 100, TELEPORT_SPONTANEOUS);
877         return TRUE;
878     case ACT_RECALL:
879         msg_print(_("やわらかな白色に輝いている...", "It glows soft white..."));
880         return recall_player(user_ptr, randint0(21) + 15);
881     case ACT_JUDGE:
882         msg_format(_("%sは赤く明るく光った!", "The %s flashes bright red!"), name);
883         chg_virtue(user_ptr, V_KNOWLEDGE, 1);
884         chg_virtue(user_ptr, V_ENLIGHTEN, 1);
885         wiz_lite(user_ptr, FALSE);
886
887         msg_format(_("%sはあなたの体力を奪った...", "The %s drains your vitality..."), name);
888         take_hit(user_ptr, DAMAGE_LOSELIFE, damroll(3, 8), _("審判の宝石", "the Jewel of Judgement"), -1);
889
890         (void)detect_traps(user_ptr, DETECT_RAD_DEFAULT, TRUE);
891         (void)detect_doors(user_ptr, DETECT_RAD_DEFAULT);
892         (void)detect_stairs(user_ptr, DETECT_RAD_DEFAULT);
893
894         if (get_check(_("帰還の力を使いますか?", "Activate recall? ")))
895             (void)recall_player(user_ptr, randint0(21) + 15);
896
897         return TRUE;
898     case ACT_TELEKINESIS:
899         if (!get_aim_dir(user_ptr, &dir))
900             return FALSE;
901
902         msg_format(_("%sを伸ばした。", "You stretched your %s."), name);
903         fetch_item(user_ptr, dir, 500, TRUE);
904         return TRUE;
905     case ACT_DETECT_UNIQUE: {
906         monster_type *m_ptr;
907         monster_race *r_ptr;
908         msg_print(_("奇妙な場所が頭の中に浮かんだ...", "Some strange places show up in your mind. And you see ..."));
909         for (int i = user_ptr->current_floor_ptr->m_max - 1; i >= 1; i--) {
910             m_ptr = &user_ptr->current_floor_ptr->m_list[i];
911             if (!monster_is_valid(m_ptr))
912                 continue;
913
914             r_ptr = &r_info[m_ptr->r_idx];
915             if (r_ptr->flags1 & RF1_UNIQUE)
916                 msg_format(_("%s. ", "%s. "), r_name + r_ptr->name);
917         }
918
919         return TRUE;
920     }
921     case ACT_ESCAPE:
922         switch (randint1(13)) {
923         case 1:
924         case 2:
925         case 3:
926         case 4:
927         case 5:
928             teleport_player(user_ptr, 10, TELEPORT_SPONTANEOUS);
929             return TRUE;
930         case 6:
931         case 7:
932         case 8:
933         case 9:
934         case 10:
935             teleport_player(user_ptr, 222, TELEPORT_SPONTANEOUS);
936             return TRUE;
937         case 11:
938         case 12:
939             (void)stair_creation(user_ptr);
940             return TRUE;
941         default:
942             if (!get_check(_("この階を去りますか?", "Leave this level? ")))
943                 return TRUE;
944
945             if (autosave_l)
946                 do_cmd_save_game(user_ptr, TRUE);
947
948             user_ptr->leaving = TRUE;
949             return TRUE;
950         }
951     case ACT_DISP_CURSE_XTRA:
952         msg_format(_("%sが真実を照らし出す...", "The %s exhibits the truth..."), name);
953         (void)remove_all_curse(user_ptr);
954         (void)probing(user_ptr);
955         return TRUE;
956     case ACT_BRAND_FIRE_BOLTS:
957         msg_format(_("%sが深紅に輝いた...", "Your %s glows deep red..."), name);
958         brand_bolts(user_ptr);
959         return TRUE;
960     case ACT_RECHARGE_XTRA:
961         msg_format(_("%sが白く輝いた...", "The %s gleams with blinding light..."), name);
962         return recharge(user_ptr, 1000);
963     case ACT_LORE:
964         msg_print(_("石が隠された秘密を写し出した...", "The stone reveals hidden mysteries..."));
965         return perilous_secrets(user_ptr);
966     case ACT_SHIKOFUMI:
967         msg_print(_("力強く四股を踏んだ。", "You stamp. (as if you are in a ring.)"));
968         (void)set_afraid(user_ptr, 0);
969         (void)set_hero(user_ptr, randint1(20) + 20, FALSE);
970         (void)dispel_evil(user_ptr, user_ptr->lev * 3);
971         return TRUE;
972     case ACT_PHASE_DOOR:
973         teleport_player(user_ptr, 10, TELEPORT_SPONTANEOUS);
974         return TRUE;
975     case ACT_DETECT_ALL_MONS:
976         (void)detect_monsters_invis(user_ptr, 255);
977         (void)detect_monsters_normal(user_ptr, 255);
978         return TRUE;
979     case ACT_ULTIMATE_RESIST: {
980         TIME_EFFECT v = randint1(25) + 25;
981         (void)set_afraid(user_ptr, 0);
982         (void)set_hero(user_ptr, v, FALSE);
983         (void)hp_player(user_ptr, 10);
984         (void)set_blessed(user_ptr, v, FALSE);
985         (void)set_oppose_acid(user_ptr, v, FALSE);
986         (void)set_oppose_elec(user_ptr, v, FALSE);
987         (void)set_oppose_fire(user_ptr, v, FALSE);
988         (void)set_oppose_cold(user_ptr, v, FALSE);
989         (void)set_oppose_pois(user_ptr, v, FALSE);
990         (void)set_ultimate_res(user_ptr, v, FALSE);
991         return TRUE;
992     }
993     case ACT_CAST_OFF:
994         cosmic_cast_off(user_ptr, o_ptr);
995         return TRUE;
996     case ACT_FALLING_STAR:
997         msg_print(_("あなたは妖刀に魅入られた…", "You are enchanted by cursed blade..."));
998         msg_print(_("「狂ほしく 血のごとき 月はのぼれり 秘めおきし 魔剣 いずこぞや」", "'Behold the blade arts.'"));
999         massacre(user_ptr);
1000         return TRUE;
1001     case ACT_GRAND_CROSS:
1002         msg_print(_("「闇に還れ!」", "You say, 'Return to darkness!'"));
1003         project(user_ptr, 0, 8, user_ptr->y, user_ptr->x, (randint1(100) + 200) * 2, GF_HOLY_FIRE, PROJECT_KILL | PROJECT_ITEM | PROJECT_GRID, -1);
1004         return TRUE;
1005     case ACT_TELEPORT_LEVEL:
1006         if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)")))
1007             return FALSE;
1008
1009         teleport_level(user_ptr, 0);
1010         return TRUE;
1011     case ACT_STRAIN_HASTE:
1012         msg_format(_("%sはあなたの体力を奪った...", "The %s drains your vitality..."), name);
1013         take_hit(user_ptr, DAMAGE_LOSELIFE, damroll(3, 8), _("加速した疲労", "the strain of haste"), -1);
1014         (void)set_fast(user_ptr, user_ptr->fast + 25 + randint1(25), FALSE);
1015         return TRUE;
1016     case ACT_FISHING:
1017         return fishing(user_ptr);
1018     case ACT_INROU:
1019         mitokohmon(user_ptr);
1020         return TRUE;
1021     case ACT_MURAMASA:
1022         if (o_ptr->name1 != ART_MURAMASA)
1023             return FALSE;
1024
1025         if (!get_check(_("本当に使いますか?", "Are you sure?!")))
1026             return TRUE;
1027
1028         msg_print(_("村正が震えた...", "The Muramasa pulsates..."));
1029         do_inc_stat(user_ptr, A_STR);
1030         if (one_in_(2)) {
1031             msg_print(_("村正は壊れた!", "The Muramasa is destroyed!"));
1032             curse_weapon_object(user_ptr, TRUE, o_ptr);
1033         }
1034
1035         return TRUE;
1036     case ACT_BLOODY_MOON:
1037         if (o_ptr->name1 != ART_BLOOD)
1038             return FALSE;
1039
1040         msg_print(_("鎌が明るく輝いた...", "Your scythe glows brightly!"));
1041         get_bloody_moon_flags(o_ptr);
1042         if (user_ptr->prace == RACE_ANDROID)
1043             calc_android_exp(user_ptr);
1044
1045         user_ptr->update |= (PU_BONUS | PU_HP);
1046         return TRUE;
1047     case ACT_CRIMSON:
1048         if (o_ptr->name1 != ART_CRIMSON)
1049             return FALSE;
1050
1051         msg_print(_("せっかくだから『クリムゾン』をぶっぱなすぜ!", "I'll fire CRIMSON! SEKKAKUDAKARA!"));
1052         return fire_crimson(user_ptr);
1053     default:
1054         msg_format(_("Unknown activation effect: %d.", "Unknown activation effect: %d."), act_ptr->index);
1055         return FALSE;
1056     }
1057 }
1058
1059 /*!
1060  * @brief アイテムの発動効果を処理する。
1061  * @param user_ptr プレーヤーへの参照ポインタ
1062  * @param o_ptr 対象のオブジェクト構造体ポインタ
1063  * @return 発動実行の是非を返す。
1064  */
1065 bool activate_artifact(player_type *user_ptr, object_type *o_ptr)
1066 {
1067     concptr name = k_name + k_info[o_ptr->k_idx].name;
1068     const activation_type *const act_ptr = find_activation_info(user_ptr, o_ptr);
1069     if (!act_ptr) {
1070         msg_print("Activation information is not found.");
1071         return FALSE;
1072     }
1073
1074     if (!switch_activation(user_ptr, o_ptr, act_ptr, name))
1075         return FALSE;
1076
1077     if (act_ptr->timeout.constant >= 0) {
1078         o_ptr->timeout = (s16b)act_ptr->timeout.constant;
1079         if (act_ptr->timeout.dice > 0)
1080             o_ptr->timeout += randint1(act_ptr->timeout.dice);
1081
1082         return TRUE;
1083     }
1084
1085     switch (act_ptr->index) {
1086     case ACT_BR_FIRE:
1087         o_ptr->timeout = ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_FLAMES)) ? 200 : 250;
1088         return TRUE;
1089     case ACT_BR_COLD:
1090         o_ptr->timeout = ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ICE)) ? 200 : 250;
1091         return TRUE;
1092     case ACT_TERROR:
1093         o_ptr->timeout = 3 * (user_ptr->lev + 10);
1094         return TRUE;
1095     case ACT_MURAMASA:
1096         return TRUE;
1097     default:
1098         msg_format("Special timeout is not implemented: %d.", act_ptr->index);
1099         return FALSE;
1100     }
1101 }