OSDN Git Service

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