OSDN Git Service

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