OSDN Git Service

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