OSDN Git Service

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