OSDN Git Service

[Refactor] #40571 Moved targeting.c/h from io/ to target/
[hengband/hengband.git] / src / realm / realm-crusade.c
1 #include "realm/realm-crusade.h"
2 #include "cmd-action/cmd-spell.h"
3 #include "core/hp-mp-processor.h"
4 #include "effect/effect-characteristics.h"
5 #include "floor/cave.h"
6 #include "floor/floor.h"
7 #include "monster-floor/monster-summon.h"
8 #include "monster-floor/place-monster-types.h"
9 #include "player/player-class.h"
10 #include "spell-kind/spells-beam.h"
11 #include "spell-kind/spells-curse-removal.h"
12 #include "spell-kind/spells-detection.h"
13 #include "spell-kind/spells-floor.h"
14 #include "spell-kind/spells-launcher.h"
15 #include "spell-kind/spells-neighbor.h"
16 #include "spell-kind/spells-sight.h"
17 #include "spell-kind/spells-teleport.h"
18 #include "spell-realm/spells-crusade.h"
19 #include "spell/process-effect.h"
20 #include "spell/spell-types.h"
21 #include "spell/spells-diceroll.h"
22 #include "spell/spells-object.h"
23 #include "spell/spells-status.h"
24 #include "spell/spells-summon.h"
25 #include "status/bad-status-setter.h"
26 #include "status/body-improvement.h"
27 #include "status/buff-setter.h"
28 #include "status/sight-setter.h"
29 #include "target/targeting.h"
30 #include "view/display-messages.h"
31 #include "world/world.h"
32
33 /*!
34  * @brief 破邪領域魔法の各処理を行う
35  * @param caster_ptr プレーヤーへの参照ポインタ
36  * @param spell 魔法ID
37  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
38  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
39  */
40 concptr do_crusade_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
41 {
42     bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
43     bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
44     bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
45     bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
46
47     DIRECTION dir;
48     PLAYER_LEVEL plev = caster_ptr->lev;
49
50     switch (spell) {
51     case 0:
52         if (name)
53             return _("懲罰", "Punishment");
54         if (desc)
55             return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
56         {
57             DICE_NUMBER dice = 3 + (plev - 1) / 5;
58             DICE_SID sides = 4;
59             if (info)
60                 return info_damage(dice, sides, 0);
61             if (cast) {
62                 if (!get_aim_dir(caster_ptr, &dir))
63                     return NULL;
64                 fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_ELEC, dir, damroll(dice, sides));
65             }
66         }
67         break;
68
69     case 1:
70         if (name)
71             return _("邪悪存在感知", "Detect Evil");
72         if (desc)
73             return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
74         {
75             POSITION rad = DETECT_RAD_DEFAULT;
76             if (info)
77                 return info_radius(rad);
78             if (cast) {
79                 detect_monsters_evil(caster_ptr, rad);
80             }
81         }
82         break;
83
84     case 2:
85         if (name)
86             return _("恐怖除去", "Remove Fear");
87         if (desc)
88             return _("恐怖を取り除く。", "Removes fear.");
89         {
90             if (cast)
91                 set_afraid(caster_ptr, 0);
92         }
93         break;
94
95     case 3:
96         if (name)
97             return _("威圧", "Scare Monster");
98         if (desc)
99             return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
100
101         {
102             PLAYER_LEVEL power = plev;
103             if (info)
104                 return info_power(power);
105             if (cast) {
106                 if (!get_aim_dir(caster_ptr, &dir))
107                     return NULL;
108                 fear_monster(caster_ptr, dir, power);
109             }
110         }
111         break;
112
113     case 4:
114         if (name)
115             return _("聖域", "Sanctuary");
116         if (desc)
117             return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to put to sleep monsters in the adjacent squares.");
118         {
119             PLAYER_LEVEL power = plev;
120             if (info)
121                 return info_power(power);
122             if (cast)
123                 sleep_monsters_touch(caster_ptr);
124         }
125         break;
126
127     case 5:
128         if (name)
129             return _("入口", "Portal");
130         if (desc)
131             return _("中距離のテレポートをする。", "Teleports you a medium distance.");
132
133         {
134             POSITION range = 25 + plev / 2;
135             if (info)
136                 return info_range(range);
137             if (cast)
138                 teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
139         }
140         break;
141
142     case 6:
143         if (name)
144             return _("スターダスト", "Star Dust");
145         if (desc)
146             return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
147
148         {
149             DICE_NUMBER dice = 3 + (plev - 1) / 9;
150             DICE_SID sides = 2;
151             if (info)
152                 return info_multi_damage_dice(dice, sides);
153             if (cast) {
154                 if (!get_aim_dir(caster_ptr, &dir))
155                     return NULL;
156                 fire_blast(caster_ptr, GF_LITE, dir, dice, sides, 10, 3);
157             }
158         }
159         break;
160
161     case 7:
162         if (name)
163             return _("身体浄化", "Purify");
164         if (desc)
165             return _("傷、毒、朦朧から全快する。", "Heals all cuts, poisons and being stunned.");
166         {
167             if (cast) {
168                 set_cut(caster_ptr, 0);
169                 set_poisoned(caster_ptr, 0);
170                 set_stun(caster_ptr, 0);
171             }
172         }
173         break;
174
175     case 8:
176         if (name)
177             return _("邪悪飛ばし", "Scatter Evil");
178         if (desc)
179             return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
180
181         {
182             int power = MAX_SIGHT * 5;
183             if (info)
184                 return info_power(power);
185             if (cast) {
186                 if (!get_aim_dir(caster_ptr, &dir))
187                     return NULL;
188                 fire_ball(caster_ptr, GF_AWAY_EVIL, dir, power, 0);
189             }
190         }
191         break;
192
193     case 9:
194         if (name)
195             return _("聖なる光球", "Holy Orb");
196         if (desc)
197             return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
198                 "Fires a ball with holy power. Hurts evil monsters greatly but doesn't affect good monsters.");
199
200         {
201             DICE_NUMBER dice = 3;
202             DICE_SID sides = 6;
203             POSITION rad = (plev < 30) ? 2 : 3;
204             int base;
205             if (caster_ptr->pclass == CLASS_PRIEST || caster_ptr->pclass == CLASS_HIGH_MAGE || caster_ptr->pclass == CLASS_SORCERER)
206                 base = plev + plev / 2;
207             else
208                 base = plev + plev / 4;
209
210             if (info)
211                 return info_damage(dice, sides, base);
212
213             if (cast) {
214                 if (!get_aim_dir(caster_ptr, &dir))
215                     return NULL;
216
217                 fire_ball(caster_ptr, GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
218             }
219         }
220         break;
221
222     case 10:
223         if (name)
224             return _("悪魔払い", "Exorcism");
225         if (desc)
226             return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
227                 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
228         {
229             DICE_SID sides = plev;
230             int power = plev;
231             if (info)
232                 return info_damage(1, sides, 0);
233             if (cast) {
234                 dispel_undead(caster_ptr, randint1(sides));
235                 dispel_demons(caster_ptr, randint1(sides));
236                 turn_evil(caster_ptr, power);
237             }
238         }
239         break;
240
241     case 11:
242         if (name)
243             return _("解呪", "Remove Curse");
244         if (desc)
245             return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
246         {
247             if (cast)
248                 (void)remove_curse(caster_ptr);
249         }
250         break;
251
252     case 12:
253         if (name)
254             return _("透明視認", "Sense Unseen");
255         if (desc)
256             return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
257
258         {
259             int base = 24;
260
261             if (info)
262                 return info_duration(base, base);
263
264             if (cast) {
265                 set_tim_invis(caster_ptr, randint1(base) + base, FALSE);
266             }
267         }
268         break;
269
270     case 13:
271         if (name)
272             return _("対邪悪結界", "Protection from Evil");
273         if (desc)
274             return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protects you from evil monster's physical attack.");
275
276         {
277             int base = 25;
278             DICE_SID sides = 3 * plev;
279
280             if (info)
281                 return info_duration(base, sides);
282
283             if (cast) {
284                 set_protevil(caster_ptr, randint1(sides) + base, FALSE);
285             }
286         }
287         break;
288
289     case 14:
290         if (name)
291             return _("裁きの雷", "Judgment Thunder");
292         if (desc)
293             return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
294
295         {
296             HIT_POINT dam = plev * 5;
297
298             if (info)
299                 return info_damage(0, 0, dam);
300
301             if (cast) {
302                 if (!get_aim_dir(caster_ptr, &dir))
303                     return NULL;
304                 fire_bolt(caster_ptr, GF_ELEC, dir, dam);
305             }
306         }
307         break;
308
309     case 15:
310         if (name)
311             return _("聖なる御言葉", "Holy Word");
312         if (desc)
313             return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
314                 "Damages all evil monsters in sight, heals HP somewhat and completely cures fear, poisons, cuts and being stunned.");
315
316         {
317             int dam_sides = plev * 6;
318             int heal = 100;
319
320             if (info)
321                 return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
322             if (cast) {
323                 dispel_evil(caster_ptr, randint1(dam_sides));
324                 hp_player(caster_ptr, heal);
325                 set_afraid(caster_ptr, 0);
326                 set_poisoned(caster_ptr, 0);
327                 set_stun(caster_ptr, 0);
328                 set_cut(caster_ptr, 0);
329             }
330         }
331         break;
332
333     case 16:
334         if (name)
335             return _("開かれた道", "Unbarring Ways");
336         if (desc)
337             return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
338
339         {
340             if (cast) {
341                 if (!get_aim_dir(caster_ptr, &dir))
342                     return NULL;
343
344                 destroy_door(caster_ptr, dir);
345             }
346         }
347         break;
348
349     case 17:
350         if (name)
351             return _("封魔", "Arrest");
352         if (desc)
353             return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
354
355         {
356             int power = plev * 2;
357
358             if (info)
359                 return info_power(power);
360
361             if (cast) {
362                 if (!get_aim_dir(caster_ptr, &dir))
363                     return NULL;
364                 stasis_evil(caster_ptr, dir);
365             }
366         }
367         break;
368
369     case 18:
370         if (name)
371             return _("聖なるオーラ", "Holy Aura");
372         if (desc)
373             return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
374                 "Gives aura of holy power that injures evil monsters which attacked you for a while.");
375
376         {
377             int base = 20;
378
379             if (info)
380                 return info_duration(base, base);
381
382             if (cast) {
383                 set_tim_sh_holy(caster_ptr, randint1(base) + base, FALSE);
384             }
385         }
386         break;
387
388     case 19:
389         if (name)
390             return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
391         if (desc)
392             return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
393
394         {
395             DICE_SID sides = plev * 4;
396
397             if (info)
398                 return info_damage(1, sides, 0);
399
400             if (cast) {
401                 dispel_undead(caster_ptr, randint1(sides));
402                 dispel_demons(caster_ptr, randint1(sides));
403             }
404         }
405         break;
406
407     case 20:
408         if (name)
409             return _("邪悪退散", "Dispel Evil");
410         if (desc)
411             return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
412
413         {
414             DICE_SID sides = plev * 4;
415
416             if (info)
417                 return info_damage(1, sides, 0);
418
419             if (cast) {
420                 dispel_evil(caster_ptr, randint1(sides));
421             }
422         }
423         break;
424
425     case 21:
426         if (name)
427             return _("聖なる刃", "Holy Blade");
428         if (desc)
429             return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
430
431         {
432             if (cast) {
433                 brand_weapon(caster_ptr, 13);
434             }
435         }
436         break;
437
438     case 22:
439         if (name)
440             return _("スターバースト", "Star Burst");
441         if (desc)
442             return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
443
444         {
445             HIT_POINT dam = 100 + plev * 2;
446             POSITION rad = 4;
447
448             if (info)
449                 return info_damage(0, 0, dam);
450
451             if (cast) {
452                 if (!get_aim_dir(caster_ptr, &dir))
453                     return NULL;
454
455                 fire_ball(caster_ptr, GF_LITE, dir, dam, rad);
456             }
457         }
458         break;
459
460     case 23:
461         if (name)
462             return _("天使召喚", "Summon Angel");
463         if (desc)
464             return _("天使を1体召喚する。", "Summons an angel.");
465
466         {
467             if (cast) {
468                 bool pet = !one_in_(3);
469                 u32b flg = 0L;
470
471                 if (pet)
472                     flg |= PM_FORCE_PET;
473                 else
474                     flg |= PM_NO_PET;
475                 if (!(pet && (plev < 50)))
476                     flg |= PM_ALLOW_GROUP;
477
478                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg)) {
479                     if (pet) {
480                         msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
481                     } else {
482                         msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
483                     }
484                 }
485             }
486         }
487         break;
488
489     case 24:
490         if (name)
491             return _("士気高揚", "Heroism");
492         if (desc)
493             return _("一定時間、ヒーロー気分になる。", "Removes fear. Gives a bonus to hit for a while. Heals you for 10 HP.");
494
495         {
496             int base = 25;
497
498             if (info)
499                 return info_duration(base, base);
500
501             if (cast) {
502                 (void)heroism(caster_ptr, base);
503             }
504         }
505         break;
506
507     case 25:
508         if (name)
509             return _("呪い退散", "Dispel Curse");
510         if (desc)
511             return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
512
513         {
514             if (cast)
515                 (void)remove_all_curse(caster_ptr);
516         }
517         break;
518
519     case 26:
520         if (name)
521             return _("邪悪追放", "Banish Evil");
522         if (desc)
523             return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。", "Teleports all evil monsters in sight away unless resisted.");
524
525         {
526             int power = 100;
527
528             if (info)
529                 return info_power(power);
530
531             if (cast) {
532                 if (banish_evil(caster_ptr, power)) {
533                     msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
534                 }
535             }
536         }
537         break;
538
539     case 27:
540         if (name)
541             return _("ハルマゲドン", "Armageddon");
542         if (desc)
543             return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroys everything in nearby area.");
544
545         {
546             int base = 12;
547             DICE_SID sides = 4;
548
549             if (cast) {
550                 destroy_area(caster_ptr, caster_ptr->y, caster_ptr->x, base + randint1(sides), FALSE);
551             }
552         }
553         break;
554
555     case 28:
556         if (name)
557             return _("目には目を", "An Eye for an Eye");
558         if (desc)
559             return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
560                 "Gives special aura for a while. When you are attacked by a monster, the monster is injured with same amount of damage as you took.");
561
562         {
563             int base = 10;
564
565             if (info)
566                 return info_duration(base, base);
567
568             if (cast) {
569                 set_tim_eyeeye(caster_ptr, randint1(base) + base, FALSE);
570             }
571         }
572         break;
573
574     case 29:
575         if (name)
576             return _("神の怒り", "Wrath of the God");
577         if (desc)
578             return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
579
580         {
581             HIT_POINT dam = plev * 3 + 25;
582             POSITION rad = 2;
583
584             if (info)
585                 return info_multi_damage(dam);
586
587             if (cast) {
588                 if (!cast_wrath_of_the_god(caster_ptr, dam, rad))
589                     return NULL;
590             }
591         }
592         break;
593
594     case 30:
595         if (name)
596             return _("神威", "Divine Intervention");
597         if (desc)
598             return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
599                 "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals "
600                 "HP.");
601
602         {
603             int b_dam = plev * 11;
604             int d_dam = plev * 4;
605             int heal = 100;
606             int power = plev * 4;
607
608             if (info)
609                 return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam / 2);
610             if (cast) {
611                 project(caster_ptr, 0, 1, caster_ptr->y, caster_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
612                 dispel_monsters(caster_ptr, d_dam);
613                 slow_monsters(caster_ptr, plev);
614                 stun_monsters(caster_ptr, power);
615                 confuse_monsters(caster_ptr, power);
616                 turn_monsters(caster_ptr, power);
617                 stasis_monsters(caster_ptr, power);
618                 hp_player(caster_ptr, heal);
619             }
620         }
621         break;
622
623     case 31:
624         if (name)
625             return _("聖戦", "Crusade");
626         if (desc)
627             return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、"
628                      "ヒーロー、祝福、加速、対邪悪結界を得る。",
629                 "Attempts to charm all good monsters in sight and scares all non-charmed monsters. Summons a great number of knights. Gives heroism, bless, "
630                 "speed and protection from evil to the caster.");
631
632         {
633             if (cast) {
634                 int base = 25;
635                 int sp_sides = 20 + plev;
636                 int sp_base = plev;
637
638                 int i;
639                 crusade(caster_ptr);
640                 for (i = 0; i < 12; i++) {
641                     int attempt = 10;
642                     POSITION my = 0, mx = 0;
643
644                     while (attempt--) {
645                         scatter(caster_ptr, &my, &mx, caster_ptr->y, caster_ptr->x, 4, 0);
646
647                         /* Require empty grids */
648                         if (is_cave_empty_bold2(caster_ptr, my, mx))
649                             break;
650                     }
651                     if (attempt < 0)
652                         continue;
653                     summon_specific(caster_ptr, -1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
654                 }
655                 set_hero(caster_ptr, randint1(base) + base, FALSE);
656                 set_blessed(caster_ptr, randint1(base) + base, FALSE);
657                 set_fast(caster_ptr, randint1(sp_sides) + sp_base, FALSE);
658                 set_protevil(caster_ptr, randint1(base) + base, FALSE);
659                 set_afraid(caster_ptr, 0);
660             }
661         }
662         break;
663     }
664
665     return "";
666 }