OSDN Git Service

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