OSDN Git Service

[Refactor] #39963 Separated spells-type.h from spells.h
[hengband/hengband.git] / src / realm / realm-daemon.c
1 #include "angband.h"
2 #include "util.h"
3
4 #include "player-class.h"
5 #include "cmd-spell.h"
6 #include "spell/spells-type.h"
7 #include "spells-summon.h"
8 #include "spells-floor.h"
9 #include "spells-status.h"
10 #include "spells-object.h"
11 #include "spells-diceroll.h"
12 #include "player-effects.h"
13 #include "player-race.h"
14 #include "player-damage.h"
15 #include "targeting.h"
16 #include "realm/realm-daemon.h"
17
18 /*!
19 * @brief 悪魔領域魔法の各処理を行う
20 * @param caster_ptr プレーヤーへの参照ポインタ
21 * @param spell 魔法ID
22 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
23 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
24 */
25 concptr do_daemon_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
26 {
27         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
28         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
29         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
30         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
31
32         DIRECTION dir;
33         PLAYER_LEVEL plev = caster_ptr->lev;
34
35         switch (spell)
36         {
37         case 0:
38                 if (name) return _("マジック・ミサイル", "Magic Missile");
39                 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
40
41                 {
42                         DICE_NUMBER dice = 3 + (plev - 1) / 5;
43                         DICE_SID sides = 4;
44
45                         if (info) return info_damage(dice, sides, 0);
46
47                         if (cast)
48                         {
49                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
50
51                                 fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_MISSILE, dir, damroll(dice, sides));
52                         }
53                 }
54                 break;
55
56         case 1:
57                 if (name) return _("無生命感知", "Detect Unlife");
58                 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
59
60                 {
61                         POSITION rad = DETECT_RAD_DEFAULT;
62
63                         if (info) return info_radius(rad);
64
65                         if (cast)
66                         {
67                                 detect_monsters_nonliving(caster_ptr, rad);
68                         }
69                 }
70                 break;
71
72         case 2:
73                 if (name) return _("邪なる祝福", "Evil Bless");
74                 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives a bonus to hit and AC for a few turns.");
75
76                 {
77                         int base = 12;
78
79                         if (info) return info_duration(base, base);
80
81                         if (cast)
82                         {
83                                 set_blessed(caster_ptr, randint1(base) + base, FALSE);
84                         }
85                 }
86                 break;
87
88         case 3:
89                 if (name) return _("耐火炎", "Resist Fire");
90                 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
91                         "Gives resistance to fire, cold and electricity for a while. These resistances can be added to those from equipment for more powerful resistances.");
92
93                 {
94                         int base = 20;
95
96                         if (info) return info_duration(base, base);
97
98                         if (cast)
99                         {
100                                 set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
101                         }
102                 }
103                 break;
104
105         case 4:
106                 if (name) return _("恐慌", "Horrify");
107                 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
108
109                 {
110                         PLAYER_LEVEL power = plev;
111
112                         if (info) return info_power(power);
113
114                         if (cast)
115                         {
116                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
117
118                                 fear_monster(caster_ptr, dir, power);
119                                 stun_monster(caster_ptr, dir, power);
120                         }
121                 }
122                 break;
123
124         case 5:
125                 if (name) return _("地獄の矢", "Nether Bolt");
126                 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
127
128                 {
129                         DICE_NUMBER dice = 6 + (plev - 5) / 4;
130                         DICE_SID sides = 8;
131
132                         if (info) return info_damage(dice, sides, 0);
133
134                         if (cast)
135                         {
136                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
137
138                                 fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_NETHER, dir, damroll(dice, sides));
139                         }
140                 }
141                 break;
142
143         case 6:
144                 if (name) return _("古代の死霊召喚", "Summon Manes");
145                 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
146
147                 {
148                         if (cast)
149                         {
150                                 if (!summon_specific(caster_ptr, -1, caster_ptr->y, caster_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
151                                 {
152                                         msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
153                                 }
154                         }
155                 }
156                 break;
157
158         case 7:
159                 if (name) return _("地獄の焔", "Hellish Flame");
160                 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
161                         "Fires a ball of evil power. Hurts good monsters greatly.");
162
163                 {
164                         DICE_NUMBER dice = 3;
165                         DICE_SID sides = 6;
166                         POSITION rad = (plev < 30) ? 2 : 3;
167                         int base;
168
169                         if (IS_WIZARD_CLASS(caster_ptr))
170                                 base = plev + plev / 2;
171                         else
172                                 base = plev + plev / 4;
173
174
175                         if (info) return info_damage(dice, sides, base);
176
177                         if (cast)
178                         {
179                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
180
181                                 fire_ball(caster_ptr, GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
182                         }
183                 }
184                 break;
185
186         case 8:
187                 if (name) return _("デーモン支配", "Dominate Demon");
188                 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
189
190                 {
191                         int power = plev;
192
193                         if (info) return info_power(power);
194
195                         if (cast)
196                         {
197                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
198
199                                 control_one_demon(caster_ptr, dir, plev);
200                         }
201                 }
202                 break;
203
204         case 9:
205                 if (name) return _("ビジョン", "Vision");
206                 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
207
208                 {
209                         POSITION rad = DETECT_RAD_MAP;
210
211                         if (info) return info_radius(rad);
212
213                         if (cast)
214                         {
215                                 map_area(caster_ptr, rad);
216                         }
217                 }
218                 break;
219
220         case 10:
221                 if (name) return _("耐地獄", "Resist Nether");
222                 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
223
224                 {
225                         int base = 20;
226
227                         if (info) return info_duration(base, base);
228
229                         if (cast)
230                         {
231                                 set_tim_res_nether(caster_ptr, randint1(base) + base, FALSE);
232                         }
233                 }
234                 break;
235
236         case 11:
237                 if (name) return _("プラズマ・ボルト", "Plasma bolt");
238                 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
239
240                 {
241                         DICE_NUMBER dice = 11 + (plev - 5) / 4;
242                         DICE_SID sides = 8;
243
244                         if (info) return info_damage(dice, sides, 0);
245
246                         if (cast)
247                         {
248                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
249
250                                 fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_PLASMA, dir, damroll(dice, sides));
251                         }
252                 }
253                 break;
254
255         case 12:
256                 if (name) return _("ファイア・ボール", "Fire Ball");
257                 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
258
259                 {
260                         HIT_POINT dam = plev + 55;
261                         POSITION rad = 2;
262
263                         if (info) return info_damage(0, 0, dam);
264
265                         if (cast)
266                         {
267                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
268
269                                 fire_ball(caster_ptr, GF_FIRE, dir, dam, rad);
270                         }
271                 }
272                 break;
273
274         case 13:
275                 if (name) return _("炎の刃", "Fire Branding");
276                 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
277
278                 {
279                         if (cast)
280                         {
281                                 brand_weapon(caster_ptr, 1);
282                         }
283                 }
284                 break;
285
286         case 14:
287                 if (name) return _("地獄球", "Nether Ball");
288                 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
289
290                 {
291                         HIT_POINT dam = plev * 3 / 2 + 100;
292                         POSITION rad = plev / 20 + 2;
293
294                         if (info) return info_damage(0, 0, dam);
295
296                         if (cast)
297                         {
298                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
299
300                                 fire_ball(caster_ptr, GF_NETHER, dir, dam, rad);
301                         }
302                 }
303                 break;
304
305         case 15:
306                 if (name) return _("デーモン召喚", "Summon Demon");
307                 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
308
309                 {
310                         if (cast)
311                         {
312                                 cast_summon_demon(caster_ptr, plev * 2 / 3 + randint1(plev / 2));
313                         }
314                 }
315                 break;
316
317         case 16:
318                 if (name) return _("悪魔の目", "Devilish Eye");
319                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
320
321                 {
322                         int base = 30;
323                         DICE_SID sides = 25;
324
325                         if (info) return info_duration(base, sides);
326
327                         if (cast)
328                         {
329                                 set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
330                         }
331                 }
332                 break;
333
334         case 17:
335                 if (name) return _("悪魔のクローク", "Devil Cloak");
336                 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
337                         "Removes fear. Gives resistance to fire and cold, and aura of fire. These resistances can be added to those from equipment for more powerful resistances.");
338
339                 {
340                         TIME_EFFECT base = 20;
341
342                         if (info) return info_duration(base, base);
343
344                         if (cast)
345                         {
346                                 TIME_EFFECT dur = randint1(base) + base;
347
348                                 set_oppose_fire(caster_ptr, dur, FALSE);
349                                 set_oppose_cold(caster_ptr, dur, FALSE);
350                                 set_tim_sh_fire(caster_ptr, dur, FALSE);
351                                 set_afraid(caster_ptr, 0);
352                                 break;
353                         }
354                 }
355                 break;
356
357         case 18:
358                 if (name) return _("溶岩流", "The Flow of Lava");
359                 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
360                         "Generates a ball of fire centered on you which transforms floors to magma.");
361
362                 {
363                         HIT_POINT dam = (55 + plev) * 2;
364                         POSITION rad = 3;
365
366                         if (info) return info_damage(0, 0, dam / 2);
367
368                         if (cast)
369                         {
370                                 fire_ball(caster_ptr, GF_FIRE, 0, dam, rad);
371                                 fire_ball_hide(caster_ptr, GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
372                         }
373                 }
374                 break;
375
376         case 19:
377                 if (name) return _("プラズマ球", "Plasma Ball");
378                 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
379
380                 {
381                         HIT_POINT dam = plev * 3 / 2 + 80;
382                         POSITION rad = 2 + plev / 40;
383
384                         if (info) return info_damage(0, 0, dam);
385
386                         if (cast)
387                         {
388                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
389
390                                 fire_ball(caster_ptr, GF_PLASMA, dir, dam, rad);
391                         }
392                 }
393                 break;
394
395         case 20:
396                 if (name) return _("悪魔変化", "Polymorph Demon");
397                 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
398                         "Causes you to mimic a demon for a while. You lose the abilities of your original race and get the abilities of a demon for that time.");
399
400                 {
401                         int base = 10 + plev / 2;
402
403                         if (info) return info_duration(base, base);
404
405                         if (cast)
406                         {
407                                 set_mimic(caster_ptr, base + randint1(base), MIMIC_DEMON, FALSE);
408                         }
409                 }
410                 break;
411
412         case 21:
413                 if (name) return _("地獄の波動", "Nather Wave");
414                 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
415                         "Damages all monsters in sight. Hurts good monsters greatly.");
416
417                 {
418                         int sides1 = plev * 2;
419                         int sides2 = plev * 2;
420
421                         if (info) return format("%sd%d+d%d", KWD_DAM, sides1, sides2);
422
423                         if (cast)
424                         {
425                                 dispel_monsters(caster_ptr, randint1(sides1));
426                                 dispel_good(caster_ptr, randint1(sides2));
427                         }
428                 }
429                 break;
430
431         case 22:
432                 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
433                 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
434
435                 {
436                         HIT_POINT dam = 100 + plev * 2;
437                         POSITION rad = 4;
438
439                         if (info) return info_damage(0, 0, dam);
440
441                         if (cast)
442                         {
443                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
444                                 fire_ball(caster_ptr, GF_NEXUS, dir, dam, rad);
445                         }
446                 }
447                 break;
448
449         case 23:
450                 if (name) return _("破滅の手", "Doom Hand");
451                 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to cut a monster's HP roughly in half.");
452
453                 {
454                         if (cast)
455                         {
456                                 if (!get_aim_dir(caster_ptr, &dir))
457                                         return NULL;
458                                 else
459                                         msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
460
461                                 fire_ball_hide(caster_ptr, GF_HAND_DOOM, dir, plev * 2, 0);
462                         }
463                 }
464                 break;
465
466         case 24:
467                 if (name) return _("士気高揚", "Raise the Morale");
468                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear. Gives a bonus to hit for a while. Heals you for 10 HP.");
469
470                 {
471                         int base = 25;
472                         if (info) return info_duration(base, base);
473                         if (cast)heroism(caster_ptr, base);
474                 }
475                 break;
476
477         case 25:
478                 if (name) return _("不滅の肉体", "Immortal Body");
479                 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
480
481                 {
482                         int base = 20;
483
484                         if (info) return info_duration(base, base);
485
486                         if (cast)
487                         {
488                                 set_tim_res_time(caster_ptr, randint1(base) + base, FALSE);
489                         }
490                 }
491                 break;
492
493         case 26:
494                 if (name) return _("狂気の円環", "Insanity Circle");
495                 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
496                         "Generates balls of chaos, confusion and charm centered on you.");
497
498                 {
499                         HIT_POINT dam = 50 + plev;
500                         int power = 20 + plev;
501                         POSITION rad = 3 + plev / 20;
502
503                         if (info) return format("%s%d+%d", KWD_DAM, dam / 2, dam / 2);
504
505                         if (cast)
506                         {
507                                 fire_ball(caster_ptr, GF_CHAOS, 0, dam, rad);
508                                 fire_ball(caster_ptr, GF_CONFUSION, 0, dam, rad);
509                                 fire_ball(caster_ptr, GF_CHARM, 0, power, rad);
510                         }
511                 }
512                 break;
513
514         case 27:
515                 if (name) return _("ペット爆破", "Explode Pets");
516                 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
517
518                 {
519                         if (cast)
520                         {
521                                 discharge_minion(caster_ptr);
522                         }
523                 }
524                 break;
525
526         case 28:
527                 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
528                 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
529                         "Summons greater demon. Requires the sacrifice of a human corpse ('p', 'h' or 't').");
530
531                 {
532                         if (cast)
533                         {
534                                 if (!cast_summon_greater_demon(caster_ptr)) return NULL;
535                         }
536                 }
537                 break;
538
539         case 29:
540                 if (name) return _("地獄嵐", "Nether Storm");
541                 if (desc) return _("超巨大な地獄の球を放つ。", "Generates a huge ball of nether.");
542
543                 {
544                         HIT_POINT dam = plev * 15;
545                         POSITION rad = plev / 5;
546
547                         if (info) return info_damage(0, 0, dam);
548
549                         if (cast)
550                         {
551                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
552
553                                 fire_ball(caster_ptr, GF_NETHER, dir, dam, rad);
554                         }
555                 }
556                 break;
557
558         case 30:
559                 if (name) return _("血の呪い", "Bloody Curse");
560                 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
561                         "Puts blood curse, which damages and causes various effects, on a monster. You also take damage.");
562
563                 {
564                         HIT_POINT dam = 600;
565                         POSITION rad = 0;
566
567                         if (info) return info_damage(0, 0, dam);
568
569                         if (cast)
570                         {
571                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
572
573                                 fire_ball_hide(caster_ptr, GF_BLOOD_CURSE, dir, dam, rad);
574                                 take_hit(caster_ptr, DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
575                         }
576                 }
577                 break;
578
579         case 31:
580                 if (name) return _("魔王変化", "Polymorph Demonlord");
581                 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
582                         "Causes you to mimic a demon lord for a while. You lose the abilities of your original race and get the great abilities of a demon lord for that time. Even hard walls can't stop your walking.");
583
584                 {
585                         int base = 15;
586
587                         if (info) return info_duration(base, base);
588
589                         if (cast)
590                         {
591                                 set_mimic(caster_ptr, base + randint1(base), MIMIC_DEMON_LORD, FALSE);
592                         }
593                 }
594                 break;
595         }
596
597         return "";
598 }
599