OSDN Git Service

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