OSDN Git Service

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