OSDN Git Service

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