OSDN Git Service

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