OSDN Git Service

[Fix] #37353 文字コード修正中。
[hengband/hengband.git] / src / realm-chaos.c
1 #include "angband.h"
2 #include "cmd-spell.h"
3
4 /*!
5 * @brief カオス領域魔法の各処理を行う
6 * @param spell 魔法ID
7 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
8 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
9 */
10 cptr do_chaos_spell(SPELL_IDX spell, BIT_FLAGS mode)
11 {
12         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
13         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
14         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
15         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
16
17         static const char s_dam[] = _("損傷:", "dam ");
18         static const char s_random[] = _("ランダム", "random");
19
20         int dir;
21         int plev = p_ptr->lev;
22
23         switch (spell)
24         {
25         case 0:
26                 if (name) return _("マジック・ミサイル", "Magic Missile");
27                 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
28
29                 {
30                         int dice = 3 + ((plev - 1) / 5);
31                         int sides = 4;
32
33                         if (info) return info_damage(dice, sides, 0);
34
35                         if (cast)
36                         {
37                                 if (!get_aim_dir(&dir)) return NULL;
38
39                                 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
40                         }
41                 }
42                 break;
43
44         case 1:
45                 if (name) return _("トラップ/ドア破壊", "Trap / Door Destruction");
46                 if (desc) return _("隣接する罠と扉を破壊する。", "Destroys all traps in adjacent squares.");
47
48                 {
49                         int rad = 1;
50
51                         if (info) return info_radius(rad);
52
53                         if (cast)
54                         {
55                                 destroy_doors_touch();
56                         }
57                 }
58                 break;
59
60         case 2:
61                 if (name) return _("閃光", "Flash of Light");
62                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
63
64                 {
65                         int dice = 2;
66                         int sides = plev / 2;
67                         int rad = (plev / 10) + 1;
68
69                         if (info) return info_damage(dice, sides, 0);
70
71                         if (cast)
72                         {
73                                 lite_area(damroll(dice, sides), rad);
74                         }
75                 }
76                 break;
77
78         case 3:
79                 if (name) return _("混乱の手", "Touch of Confusion");
80                 if (desc) return _("相手を混乱させる攻撃をできるようにする。", "Attempts to confuse the next monster that you hit.");
81
82                 {
83                         if (cast)
84                         {
85                                 if (!(p_ptr->special_attack & ATTACK_CONFUSE))
86                                 {
87                                         msg_print(_("あなたの手は光り始めた。", "Your hands start glowing."));
88                                         p_ptr->special_attack |= ATTACK_CONFUSE;
89                                         p_ptr->redraw |= (PR_STATUS);
90                                 }
91                         }
92                 }
93                 break;
94
95         case 4:
96                 if (name) return _("魔力炸裂", "Mana Burst");
97                 if (desc) return _("魔法の球を放つ。", "Fires a ball of magic.");
98
99                 {
100                         int dice = 3;
101                         int sides = 5;
102                         int rad = (plev < 30) ? 2 : 3;
103                         int base;
104
105                         if (IS_WIZARD_CLASS())
106                                 base = plev + plev / 2;
107                         else
108                                 base = plev + plev / 4;
109
110
111                         if (info) return info_damage(dice, sides, base);
112
113                         if (cast)
114                         {
115                                 if (!get_aim_dir(&dir)) return NULL;
116
117                                 fire_ball(GF_MISSILE, dir, damroll(dice, sides) + base, rad);
118
119                                 /*
120                                 * Shouldn't actually use GF_MANA, as
121                                 * it will destroy all items on the
122                                 * floor
123                                 */
124                         }
125                 }
126                 break;
127
128         case 5:
129                 if (name) return _("ファイア・ボルト", "Fire Bolt");
130                 if (desc) return _("炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
131
132                 {
133                         int dice = 8 + (plev - 5) / 4;
134                         int sides = 8;
135
136                         if (info) return info_damage(dice, sides, 0);
137
138                         if (cast)
139                         {
140                                 if (!get_aim_dir(&dir)) return NULL;
141
142                                 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, damroll(dice, sides));
143                         }
144                 }
145                 break;
146
147         case 6:
148                 if (name) return _("力の拳", "Fist of Force");
149                 if (desc) return _("ごく小さな分解の球を放つ。", "Fires a tiny ball of disintegration.");
150
151                 {
152                         int dice = 8 + ((plev - 5) / 4);
153                         int sides = 8;
154
155                         if (info) return info_damage(dice, sides, 0);
156
157                         if (cast)
158                         {
159                                 if (!get_aim_dir(&dir)) return NULL;
160
161                                 fire_ball(GF_DISINTEGRATE, dir, damroll(dice, sides), 0);
162                         }
163                 }
164                 break;
165
166         case 7:
167                 if (name) return _("テレポート", "Teleport Self");
168                 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
169
170                 {
171                         POSITION range = plev * 5;
172
173                         if (info) return info_range(range);
174
175                         if (cast)
176                         {
177                                 teleport_player(range, 0L);
178                         }
179                 }
180                 break;
181
182         case 8:
183                 if (name) return _("ワンダー", "Wonder");
184                 if (desc) return _("モンスターにランダムな効果を与える。", "Fires something with random effects.");
185
186                 {
187                         if (info) return s_random;
188
189                         if (cast)
190                         {
191
192                                 if (!get_aim_dir(&dir)) return NULL;
193
194                                 cast_wonder(dir);
195                         }
196                 }
197                 break;
198
199         case 9:
200                 if (name) return _("カオス・ボルト", "Chaos Bolt");
201                 if (desc) return _("カオスのボルトもしくはビームを放つ。", "Fires a bolt or ball of chaos.");
202
203                 {
204                         int dice = 10 + (plev - 5) / 4;
205                         int sides = 8;
206
207                         if (info) return info_damage(dice, sides, 0);
208
209                         if (cast)
210                         {
211                                 if (!get_aim_dir(&dir)) return NULL;
212
213                                 fire_bolt_or_beam(beam_chance(), GF_CHAOS, dir, damroll(dice, sides));
214                         }
215                 }
216                 break;
217
218         case 10:
219                 if (name) return _("ソニック・ブーム", "Sonic Boom");
220                 if (desc) return _("自分を中心とした轟音の球を発生させる。", "Generates a ball of sound centered on you.");
221
222                 {
223                         HIT_POINT dam = 60 + plev;
224                         int rad = plev / 10 + 2;
225
226                         if (info) return info_damage(0, 0, dam / 2);
227
228                         if (cast)
229                         {
230                                 msg_print(_("ドーン!部屋が揺れた!", "BOOM! Shake the room!"));
231                                 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1);
232                         }
233                 }
234                 break;
235
236         case 11:
237                 if (name) return _("破滅の矢", "Doom Bolt");
238                 if (desc) return _("純粋な魔力のビームを放つ。", "Fires a beam of pure mana.");
239
240                 {
241                         int dice = 11 + (plev - 5) / 4;
242                         int sides = 8;
243
244                         if (info) return info_damage(dice, sides, 0);
245
246                         if (cast)
247                         {
248                                 if (!get_aim_dir(&dir)) return NULL;
249
250                                 fire_beam(GF_MANA, 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                         int rad = 2;
262
263                         if (info) return info_damage(0, 0, dam);
264
265                         if (cast)
266                         {
267                                 if (!get_aim_dir(&dir)) return NULL;
268
269                                 fire_ball(GF_FIRE, dir, dam, rad);
270                         }
271                 }
272                 break;
273
274         case 13:
275                 if (name) return _("テレポート・アウェイ", "Teleport Other");
276                 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
277
278                 {
279                         int power = plev;
280
281                         if (info) return info_power(power);
282
283                         if (cast)
284                         {
285                                 if (!get_aim_dir(&dir)) return NULL;
286
287                                 fire_beam(GF_AWAY_ALL, dir, power);
288                         }
289                 }
290                 break;
291
292         case 14:
293                 if (name) return _("破壊の言葉", "Word of Destruction");
294                 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
295
296                 {
297                         int base = 12;
298                         int sides = 4;
299
300                         if (cast)
301                         {
302                                 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
303                         }
304                 }
305                 break;
306
307         case 15:
308                 if (name) return _("ログルス発動", "Invoke Logrus");
309                 if (desc) return _("巨大なカオスの球を放つ。", "Fires a huge ball of chaos.");
310
311                 {
312                         HIT_POINT dam = plev * 2 + 99;
313                         int rad = plev / 5;
314
315                         if (info) return info_damage(0, 0, dam);
316
317                         if (cast)
318                         {
319                                 if (!get_aim_dir(&dir)) return NULL;
320
321                                 fire_ball(GF_CHAOS, dir, dam, rad);
322                         }
323                 }
324                 break;
325
326         case 16:
327                 if (name) return _("他者変容", "Polymorph Other");
328                 if (desc) return _("モンスター1体を変身させる。抵抗されると無効。", "Attempts to polymorph a monster.");
329
330                 {
331                         int power = plev;
332
333                         if (info) return info_power(power);
334
335                         if (cast)
336                         {
337                                 if (!get_aim_dir(&dir)) return NULL;
338
339                                 poly_monster(dir, plev);
340                         }
341                 }
342                 break;
343
344         case 17:
345                 if (name) return _("連鎖稲妻", "Chain Lightning");
346                 if (desc) return _("全方向に対して電撃のビームを放つ。", "Fires lightning beams in all directions.");
347
348                 {
349                         int dice = 5 + plev / 10;
350                         int sides = 8;
351
352                         if (info) return info_damage(dice, sides, 0);
353
354                         if (cast)
355                         {
356                                 for (dir = 0; dir <= 9; dir++)
357                                         fire_beam(GF_ELEC, dir, damroll(dice, sides));
358                         }
359                 }
360                 break;
361
362         case 18:
363                 if (name) return _("魔力封入", "Arcane Binding");
364                 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
365
366                 {
367                         int power = 90;
368
369                         if (info) return info_power(power);
370                         if (cast)
371                         {
372                                 if (!recharge(power)) return NULL;
373                         }
374                 }
375                 break;
376
377         case 19:
378                 if (name) return _("原子分解", "Disintegrate");
379                 if (desc) return _("巨大な分解の球を放つ。", "Fires a huge ball of disintegration.");
380
381                 {
382                         HIT_POINT dam = plev + 70;
383                         int rad = 3 + plev / 40;
384
385                         if (info) return info_damage(0, 0, dam);
386
387                         if (cast)
388                         {
389                                 if (!get_aim_dir(&dir)) return NULL;
390
391                                 fire_ball(GF_DISINTEGRATE, dir, dam, rad);
392                         }
393                 }
394                 break;
395
396         case 20:
397                 if (name) return _("現実変容", "Alter Reality");
398                 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
399
400                 {
401                         int base = 15;
402                         int sides = 20;
403
404                         if (info) return info_delay(base, sides);
405
406                         if (cast)
407                         {
408                                 alter_reality();
409                         }
410                 }
411                 break;
412
413         case 21:
414                 if (name) return _("マジック・ロケット", "Magic Rocket");
415                 if (desc) return _("ロケットを発射する。", "Fires a magic rocket.");
416
417                 {
418                         HIT_POINT dam = 120 + plev * 2;
419                         int rad = 2;
420
421                         if (info) return info_damage(0, 0, dam);
422
423                         if (cast)
424                         {
425                                 if (!get_aim_dir(&dir)) return NULL;
426
427                                 msg_print(_("ロケット発射!", "You launch a rocket!"));
428                                 fire_rocket(GF_ROCKET, dir, dam, rad);
429                         }
430                 }
431                 break;
432
433         case 22:
434                 if (name) return _("混沌の刃", "Chaos Branding");
435                 if (desc) return _("武器にカオスの属性をつける。", "Makes current weapon a Chaotic weapon.");
436
437                 {
438                         if (cast)
439                         {
440                                 brand_weapon(2);
441                         }
442                 }
443                 break;
444
445         case 23:
446                 if (name) return _("悪魔召喚", "Summon Demon");
447                 if (desc) return _("悪魔を1体召喚する。", "Summons a demon.");
448
449                 {
450                         if (cast)
451                         {
452                                 u32b flg = 0L;
453                                 bool pet = !one_in_(3);
454
455                                 if (pet) flg |= PM_FORCE_PET;
456                                 else flg |= PM_NO_PET;
457                                 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
458
459                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_DEMON, flg))
460                                 {
461                                         msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
462                                         if (pet)
463                                         {
464                                                 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
465                                         }
466                                         else
467                                         {
468                                                 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
469                                                         "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
470                                         }
471                                 }
472                         }
473                 }
474                 break;
475
476         case 24:
477                 if (name) return _("重力光線", "Beam of Gravity");
478                 if (desc) return _("重力のビームを放つ。", "Fires a beam of gravity.");
479
480                 {
481                         int dice = 9 + (plev - 5) / 4;
482                         int sides = 8;
483
484                         if (info) return info_damage(dice, sides, 0);
485
486                         if (cast)
487                         {
488                                 if (!get_aim_dir(&dir)) return NULL;
489                                 fire_beam(GF_GRAVITY, dir, damroll(dice, sides));
490                         }
491                 }
492                 break;
493
494         case 25:
495                 if (name) return _("流星群", "Meteor Swarm");
496                 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
497
498                 {
499                         HIT_POINT dam = plev * 2;
500                         int rad = 2;
501
502                         if (info) return info_multi_damage(dam);
503
504                         if (cast)
505                         {
506                                 cast_meteor(dam, rad);
507                         }
508                 }
509                 break;
510
511         case 26:
512                 if (name) return _("焔の一撃", "Flame Strike");
513                 if (desc) return _("自分を中心とした超巨大な炎の球を発生させる。", "Generate a huge ball of fire centered on you.");
514
515                 {
516                         HIT_POINT dam = 300 + 3 * plev;
517                         int rad = 8;
518
519                         if (info) return info_damage(0, 0, dam / 2);
520
521                         if (cast)
522                         {
523                                 fire_ball(GF_FIRE, 0, dam, rad);
524                         }
525                 }
526                 break;
527
528         case 27:
529                 if (name) return _("混沌召来", "Call Chaos");
530                 if (desc) return _("ランダムな属性の球やビームを発生させる。", "Generate random kind of balls or beams.");
531
532                 {
533                         if (info) return format("%s150 / 250", s_dam);
534
535                         if (cast)
536                         {
537                                 call_chaos();
538                         }
539                 }
540                 break;
541
542         case 28:
543                 if (name) return _("自己変容", "Polymorph Self");
544                 if (desc) return _("自分を変身させようとする。", "Polymorphs yourself.");
545
546                 {
547                         if (cast)
548                         {
549                                 if (!get_check(_("変身します。よろしいですか?", "You will polymorph yourself. Are you sure? "))) return NULL;
550                                 do_poly_self();
551                         }
552                 }
553                 break;
554
555         case 29:
556                 if (name) return _("魔力の嵐", "Mana Storm");
557                 if (desc) return _("非常に強力で巨大な純粋な魔力の球を放つ。", "Fires an extremely powerful huge ball of pure mana.");
558
559                 {
560                         HIT_POINT dam = 300 + plev * 4;
561                         int rad = 4;
562
563                         if (info) return info_damage(0, 0, dam);
564
565                         if (cast)
566                         {
567                                 if (!get_aim_dir(&dir)) return NULL;
568                                 fire_ball(GF_MANA, dir, dam, rad);
569                         }
570                 }
571                 break;
572
573         case 30:
574                 if (name) return _("ログルスのブレス", "Breathe Logrus");
575                 if (desc) return _("非常に強力なカオスの球を放つ。", "Fires an extremely powerful ball of chaos.");
576
577                 {
578                         HIT_POINT dam = p_ptr->chp;
579                         int rad = 2;
580
581                         if (info) return info_damage(0, 0, dam);
582
583                         if (cast)
584                         {
585                                 if (!get_aim_dir(&dir)) return NULL;
586
587                                 fire_ball(GF_CHAOS, dir, dam, rad);
588                         }
589                 }
590                 break;
591
592         case 31:
593                 if (name) return _("虚無召来", "Call the Void");
594                 if (desc) return _("自分の周囲に向かって、ロケット、純粋な魔力の球、放射性廃棄物の球を放つ。ただし、壁に隣接して使用すると広範囲を破壊する。",
595                         "Fires rockets, mana balls and nuclear waste balls in all directions each unless you are not adjacent to any walls. Otherwise *destroys* huge area.");
596
597                 {
598                         if (info) return format("%s3 * 175", s_dam);
599
600                         if (cast)
601                         {
602                                 call_the_();
603                         }
604                 }
605                 break;
606         }
607
608         return "";
609 }