OSDN Git Service

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