OSDN Git Service

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