OSDN Git Service

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