OSDN Git Service

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