OSDN Git Service

[Refactor] #38997 teleport_level() に player_type * 引数を追加. / Add player_type * argumen...
[hengband/hengband.git] / src / realm-trump.c
1 #include "angband.h"
2 #include "util.h"
3
4 #include "cmd-spell.h"
5 #include "mutation.h"
6 #include "spells.h"
7 #include "spells-summon.h"
8 #include "spells-status.h"
9 #include "spells-object.h"
10 #include "player-effects.h"
11 #include "player-class.h"
12 #include "targeting.h"
13
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_trump_spell(player_type *caster_ptr, 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         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
28
29         DIRECTION dir;
30         PLAYER_LEVEL plev = caster_ptr->lev;
31
32         switch (spell)
33         {
34         case 0:
35                 if (name) return _("ショート・テレポート", "Phase Door");
36                 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
37
38                 {
39                         POSITION range = 10;
40
41                         if (info) return info_range(range);
42
43                         if (cast)
44                         {
45                                 teleport_player(range, 0L);
46                         }
47                 }
48                 break;
49
50         case 1:
51                 if (name) return _("蜘蛛のカード", "Trump Spiders");
52                 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
53
54                 {
55                         if (cast || fail)
56                         {
57                                 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
58                                 if (trump_summoning(1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
59                                 {
60                                         if (fail)
61                                         {
62                                                 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
63                                         }
64                                 }
65                         }
66                 }
67                 break;
68
69         case 2:
70                 if (name) return _("シャッフル", "Shuffle");
71                 if (desc) return _("カードの占いをする。", "Causes random effects.");
72
73                 {
74                         if (info) return KWD_RANDOM;
75
76                         if (cast)
77                         {
78                                 cast_shuffle();
79                         }
80                 }
81                 break;
82
83         case 3:
84                 if (name) return _("フロア・リセット", "Reset Recall");
85                 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
86
87                 {
88                         if (cast)
89                         {
90                                 if (!reset_recall()) return NULL;
91                         }
92                 }
93                 break;
94
95         case 4:
96                 if (name) return _("テレポート", "Teleport");
97                 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
98
99                 {
100                         POSITION range = plev * 4;
101
102                         if (info) return info_range(range);
103
104                         if (cast)
105                         {
106                                 teleport_player(range, 0L);
107                         }
108                 }
109                 break;
110
111         case 5:
112                 if (name) return _("感知のカード", "Trump Spying");
113                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
114
115                 {
116                         int base = 25;
117                         DICE_SID sides = 30;
118
119                         if (info) return info_duration(base, sides);
120
121                         if (cast)
122                         {
123                                 set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
124                         }
125                 }
126                 break;
127
128         case 6:
129                 if (name) return _("テレポート・モンスター", "Teleport Away");
130                 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
131
132                 {
133                         int power = plev;
134
135                         if (info) return info_power(power);
136
137                         if (cast)
138                         {
139                                 if (!get_aim_dir(&dir)) return NULL;
140
141                                 fire_beam(GF_AWAY_ALL, dir, power);
142                         }
143                 }
144                 break;
145
146         case 7:
147                 if (name) return _("動物のカード", "Trump Animals");
148                 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
149
150                 {
151                         if (cast || fail)
152                         {
153                                 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
154                                 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
155                                 if (trump_summoning(1, !fail, caster_ptr->y, caster_ptr->x, 0, type, 0L))
156                                 {
157                                         if (fail)
158                                         {
159                                                 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
160                                         }
161                                 }
162                         }
163                 }
164                 break;
165
166         case 8:
167                 if (name) return _("移動のカード", "Trump Reach");
168                 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
169
170                 {
171                         WEIGHT weight = plev * 15;
172
173                         if (info) return info_weight(weight);
174
175                         if (cast)
176                         {
177                                 if (!get_aim_dir(&dir)) return NULL;
178
179                                 fetch(caster_ptr, dir, weight, FALSE);
180                         }
181                 }
182                 break;
183
184         case 9:
185                 if (name) return _("カミカゼのカード", "Trump Kamikaze");
186                 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
187
188                 {
189                         if (cast || fail)
190                         {
191                                 POSITION x, y;
192                                 int type;
193
194                                 if (cast)
195                                 {
196                                         if (!target_set(TARGET_KILL)) return NULL;
197                                         x = target_col;
198                                         y = target_row;
199                                 }
200                                 else
201                                 {
202                                         /* Summons near player when failed */
203                                         x = caster_ptr->x;
204                                         y = caster_ptr->y;
205                                 }
206
207                                 if (caster_ptr->pclass == CLASS_BEASTMASTER)
208                                         type = SUMMON_KAMIKAZE_LIVING;
209                                 else
210                                         type = SUMMON_KAMIKAZE;
211
212                                 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
213                                 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
214                                 {
215                                         if (fail)
216                                         {
217                                                 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
218                                         }
219                                 }
220                         }
221                 }
222                 break;
223
224         case 10:
225                 if (name) return _("幻霊召喚", "Phantasmal Servant");
226                 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
227
228                 {
229                         /* Phantasmal Servant is not summoned as enemy when failed */
230                         if (cast)
231                         {
232                                 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
233
234                                 if (trump_summoning(1, !fail, caster_ptr->y, caster_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
235                                 {
236                                         msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
237                                 }
238                         }
239                 }
240                 break;
241
242         case 11:
243                 if (name) return _("スピード・モンスター", "Haste Monster");
244                 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
245
246                 {
247                         if (cast)
248                         {
249                                 bool result;
250
251                                 /* Temporary enable target_pet option */
252                                 bool old_target_pet = target_pet;
253                                 target_pet = TRUE;
254
255                                 result = get_aim_dir(&dir);
256
257                                 /* Restore target_pet option */
258                                 target_pet = old_target_pet;
259
260                                 if (!result) return NULL;
261
262                                 speed_monster(dir, plev);
263                         }
264                 }
265                 break;
266
267         case 12:
268                 if (name) return _("テレポート・レベル", "Teleport Level");
269                 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
270
271                 {
272                         if (cast)
273                         {
274                                 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
275                                 teleport_level(caster_ptr, 0);
276                         }
277                 }
278                 break;
279
280         case 13:
281                 if (name) return _("次元の扉", "Dimension Door");
282                 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
283
284                 {
285                         POSITION range = plev / 2 + 10;
286
287                         if (info) return info_range(range);
288
289                         if (cast)
290                         {
291                                 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
292                                 if (!dimension_door()) return NULL;
293                         }
294                 }
295                 break;
296
297         case 14:
298                 if (name) return _("帰還の呪文", "Word of Recall");
299                 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
300                         "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
301
302                 {
303                         int base = 15;
304                         DICE_SID sides = 20;
305
306                         if (info) return info_delay(base, sides);
307
308                         if (cast)
309                         {
310                                 if (!recall_player(caster_ptr, randint0(21) + 15)) return NULL;
311                         }
312                 }
313                 break;
314
315         case 15:
316                 if (name) return _("怪物追放", "Banish");
317                 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
318
319                 {
320                         int power = plev * 4;
321
322                         if (info) return info_power(power);
323
324                         if (cast)
325                         {
326                                 banish_monsters(power);
327                         }
328                 }
329                 break;
330
331         case 16:
332                 if (name) return _("位置交換のカード", "Swap Position");
333                 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
334
335                 {
336                         if (cast)
337                         {
338                                 bool result;
339
340                                 /* HACK -- No range limit */
341                                 project_length = -1;
342
343                                 result = get_aim_dir(&dir);
344
345                                 /* Restore range to default */
346                                 project_length = 0;
347
348                                 if (!result) return NULL;
349
350                                 teleport_swap(dir);
351                         }
352                 }
353                 break;
354
355         case 17:
356                 if (name) return _("アンデッドのカード", "Trump Undead");
357                 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
358
359                 {
360                         if (cast || fail)
361                         {
362                                 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
363                                 if (trump_summoning(1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_UNDEAD, 0L))
364                                 {
365                                         if (fail)
366                                         {
367                                                 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
368                                         }
369                                 }
370                         }
371                 }
372                 break;
373
374         case 18:
375                 if (name) return _("爬虫類のカード", "Trump Reptiles");
376                 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
377
378                 {
379                         if (cast || fail)
380                         {
381                                 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
382                                 if (trump_summoning(1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HYDRA, 0L))
383                                 {
384                                         if (fail)
385                                         {
386                                                 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
387                                         }
388                                 }
389                         }
390                 }
391                 break;
392
393         case 19:
394                 if (name) return _("モンスターのカード", "Trump Monsters");
395                 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
396
397                 {
398                         if (cast || fail)
399                         {
400                                 int type;
401                                 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
402                                 if (caster_ptr->pclass == CLASS_BEASTMASTER)
403                                         type = SUMMON_LIVING;
404                                 else
405                                         type = 0;
406
407                                 if (trump_summoning((1 + (plev - 15) / 10), !fail, caster_ptr->y, caster_ptr->x, 0, type, 0L))
408                                 {
409                                         if (fail)
410                                         {
411                                                 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
412                                         }
413                                 }
414
415                         }
416                 }
417                 break;
418
419         case 20:
420                 if (name) return _("ハウンドのカード", "Trump Hounds");
421                 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
422
423                 {
424                         if (cast || fail)
425                         {
426                                 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
427                                 if (trump_summoning(1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
428                                 {
429                                         if (fail)
430                                         {
431                                                 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
432                                         }
433                                 }
434                         }
435                 }
436                 break;
437
438         case 21:
439                 if (name) return _("トランプの刃", "Trump Branding");
440                 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
441
442                 {
443                         if (cast)
444                         {
445                                 brand_weapon(5);
446                         }
447                 }
448                 break;
449
450         case 22:
451                 if (name) return _("人間トランプ", "Living Trump");
452                 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
453                         "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
454                 if (cast) become_living_trump(caster_ptr);
455                 break;
456
457         case 23:
458                 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
459                 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
460
461                 {
462                         if (cast || fail)
463                         {
464                                 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
465                                 if (trump_summoning(1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_CYBER, 0L))
466                                 {
467                                         if (fail)
468                                         {
469                                                 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
470                                         }
471                                 }
472                         }
473                 }
474                 break;
475
476         case 24:
477                 if (name) return _("予見のカード", "Trump Divination");
478                 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
479                         "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
480
481                 {
482                         POSITION rad = DETECT_RAD_DEFAULT;
483
484                         if (info) return info_radius(rad);
485
486                         if (cast)
487                         {
488                                 detect_all(rad);
489                         }
490                 }
491                 break;
492
493         case 25:
494                 if (name) return _("知識のカード", "Trump Lore");
495                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
496
497                 {
498                         if (cast)
499                         {
500                                 if (!identify_fully(FALSE)) return NULL;
501                         }
502                 }
503                 break;
504
505         case 26:
506                 if (name) return _("回復モンスター", "Heal Monster");
507                 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");
508
509                 {
510                         int heal = plev * 10 + 200;
511
512                         if (info) return info_heal(0, 0, heal);
513
514                         if (cast)
515                         {
516                                 bool result;
517
518                                 /* Temporary enable target_pet option */
519                                 bool old_target_pet = target_pet;
520                                 target_pet = TRUE;
521
522                                 result = get_aim_dir(&dir);
523
524                                 /* Restore target_pet option */
525                                 target_pet = old_target_pet;
526
527                                 if (!result) return NULL;
528
529                                 heal_monster(dir, heal);
530                         }
531                 }
532                 break;
533
534         case 27:
535                 if (name) return _("ドラゴンのカード", "Trump Dragon");
536                 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
537
538                 {
539                         if (cast || fail)
540                         {
541                                 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
542                                 if (trump_summoning(1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_DRAGON, 0L))
543                                 {
544                                         if (fail)
545                                         {
546                                                 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
547                                         }
548                                 }
549                         }
550                 }
551                 break;
552
553         case 28:
554                 if (name) return _("隕石のカード", "Trump Meteor");
555                 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
556
557                 {
558                         HIT_POINT dam = plev * 2;
559                         POSITION rad = 2;
560
561                         if (info) return info_multi_damage(dam);
562
563                         if (cast)
564                         {
565                                 cast_meteor(dam, rad);
566                         }
567                 }
568                 break;
569
570         case 29:
571                 if (name) return _("デーモンのカード", "Trump Demon");
572                 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
573
574                 {
575                         if (cast || fail)
576                         {
577                                 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
578                                 if (trump_summoning(1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_DEMON, 0L))
579                                 {
580                                         if (fail)
581                                         {
582                                                 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
583                                         }
584                                 }
585                         }
586                 }
587                 break;
588
589         case 30:
590                 if (name) return _("地獄のカード", "Trump Greater Undead");
591                 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
592
593                 {
594                         if (cast || fail)
595                         {
596                                 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
597                                 /* May allow unique depend on level and dice roll */
598                                 if (trump_summoning(1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
599                                 {
600                                         if (fail)
601                                         {
602                                                 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
603                                         }
604                                 }
605                         }
606                 }
607                 break;
608
609         case 31:
610                 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
611                 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
612
613                 {
614                         if (cast)
615                         {
616                                 int type;
617
618                                 if (caster_ptr->pclass == CLASS_BEASTMASTER)
619                                         type = SUMMON_HI_DRAGON_LIVING;
620                                 else
621                                         type = SUMMON_HI_DRAGON;
622
623                                 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
624                                 /* May allow unique depend on level and dice roll */
625                                 if (trump_summoning(1, !fail, caster_ptr->y, caster_ptr->x, 0, type, PM_ALLOW_UNIQUE))
626                                 {
627                                         if (fail)
628                                         {
629                                                 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
630                                         }
631                                 }
632                         }
633                 }
634                 break;
635         }
636
637         return "";
638 }