OSDN Git Service

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