OSDN Git Service

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